From b3087d1e6f425f6ade22048e490d36f949b98afb Mon Sep 17 00:00:00 2001 From: Jeremie Date: Fri, 26 May 2023 14:03:45 +0200 Subject: [PATCH 001/182] Definitions for FlashForge Adventure 3 & 4 family --- .../flashforge_adventurer3.def.json | 15 ++++++++ .../flashforge_adventurer3c.def.json | 24 +++++++++++++ .../flashforge_adventurer4.def.json | 25 ++++++++++++++ .../flashforge_adventurer4lite.def.json | 14 ++++++++ .../flashforge_adventurer_base.def.json | 34 +++++++++++++++++++ .../flashforge_adventurer_extruder_0.def.json | 16 +++++++++ .../flashforge_adventurer3_0.3.inst.cfg | 12 +++++++ .../flashforge_adventurer3_0.4.inst.cfg | 12 +++++++ .../flashforge_adventurer3_0.6.inst.cfg | 12 +++++++ .../flashforge_adventurer3c_0.3.inst.cfg | 12 +++++++ .../flashforge_adventurer3c_0.4.inst.cfg | 12 +++++++ .../flashforge_adventurer3c_0.6.inst.cfg | 12 +++++++ .../flashforge_adventurer4_0.3.inst.cfg | 12 +++++++ .../flashforge_adventurer4_0.4.inst.cfg | 12 +++++++ .../flashforge_adventurer4_0.6.inst.cfg | 12 +++++++ .../flashforge_adventurer4lite_0.3.inst.cfg | 12 +++++++ .../flashforge_adventurer4lite_0.4.inst.cfg | 12 +++++++ .../flashforge_adventurer4lite_0.6.inst.cfg | 12 +++++++ 18 files changed, 272 insertions(+) create mode 100644 resources/definitions/flashforge_adventurer3.def.json create mode 100644 resources/definitions/flashforge_adventurer3c.def.json create mode 100644 resources/definitions/flashforge_adventurer4.def.json create mode 100644 resources/definitions/flashforge_adventurer4lite.def.json create mode 100644 resources/definitions/flashforge_adventurer_base.def.json create mode 100644 resources/extruders/flashforge_adventurer_extruder_0.def.json create mode 100644 resources/variants/flashforge/flashforge_adventurer3_0.3.inst.cfg create mode 100644 resources/variants/flashforge/flashforge_adventurer3_0.4.inst.cfg create mode 100644 resources/variants/flashforge/flashforge_adventurer3_0.6.inst.cfg create mode 100644 resources/variants/flashforge/flashforge_adventurer3c_0.3.inst.cfg create mode 100644 resources/variants/flashforge/flashforge_adventurer3c_0.4.inst.cfg create mode 100644 resources/variants/flashforge/flashforge_adventurer3c_0.6.inst.cfg create mode 100644 resources/variants/flashforge/flashforge_adventurer4_0.3.inst.cfg create mode 100644 resources/variants/flashforge/flashforge_adventurer4_0.4.inst.cfg create mode 100644 resources/variants/flashforge/flashforge_adventurer4_0.6.inst.cfg create mode 100644 resources/variants/flashforge/flashforge_adventurer4lite_0.3.inst.cfg create mode 100644 resources/variants/flashforge/flashforge_adventurer4lite_0.4.inst.cfg create mode 100644 resources/variants/flashforge/flashforge_adventurer4lite_0.6.inst.cfg diff --git a/resources/definitions/flashforge_adventurer3.def.json b/resources/definitions/flashforge_adventurer3.def.json new file mode 100644 index 0000000000..5787958401 --- /dev/null +++ b/resources/definitions/flashforge_adventurer3.def.json @@ -0,0 +1,15 @@ +{ + "version": 2, + "name": "Adventurer 3", + "inherits": "flashforge_adventurer3c", + "metadata": + { + "author": "Jeremie-C", + "visible": true, + "supports_network_connection": true + }, + "overrides": + { + "machine_name": {"default_value": "Adventurer 3"} + } +} \ No newline at end of file diff --git a/resources/definitions/flashforge_adventurer3c.def.json b/resources/definitions/flashforge_adventurer3c.def.json new file mode 100644 index 0000000000..9321c2ca40 --- /dev/null +++ b/resources/definitions/flashforge_adventurer3c.def.json @@ -0,0 +1,24 @@ +{ + "version": 2, + "name": "Adventurer 3C", + "inherits": "flashforge_adventurer_base", + "metadata": { + "author": "Jeremie-C", + "visible": true, + "quality_definition": "flashforge_adventurer3" + }, + "overrides": + { + "default_material_bed_temperature": {"maximum_value_warning": "100"}, + "gantry_height": {"value": "150"}, + "machine_center_is_zero": {"default_value": true}, + "machine_depth": {"default_value": 150}, + "machine_end_gcode": {"default_value": ";end gcode\nM104 S0 T0\nM140 S0 T0\nG162 Z F1800\nG28 X Y\nM132 X Y A B\nM652\nG91\nM18"}, + "machine_head_with_fans_polygon": {"default_value": [[-20, 10], [-20, -10], [10, 10], [10, -10]]}, + "machine_height": {"default_value": 150}, + "machine_name": {"default_value": "Adventurer 3C"}, + "machine_start_gcode": {"default_value": ";Start Gcode\nG28\nM132 X Y Z A B\nG1 Z50.000 F420\nG161 X Y F3300\nM7 T0\nM6 T0\nM651 S255\n;End Start"}, + "machine_width": {"default_value": 150}, + "speed_print": {"maximum_value_warning": 100} + } +} \ No newline at end of file diff --git a/resources/definitions/flashforge_adventurer4.def.json b/resources/definitions/flashforge_adventurer4.def.json new file mode 100644 index 0000000000..d3b29c4f4a --- /dev/null +++ b/resources/definitions/flashforge_adventurer4.def.json @@ -0,0 +1,25 @@ +{ + "version": 2, + "name": "Adventurer 4", + "inherits": "flashforge_adventurer_base", + "metadata": + { + "author": "Jeremie-C", + "visible": true, + "quality_definition": "flashforge_adventurer4", + "supports_network_connection": true + }, + "overrides": + { + "default_material_bed_temperature": {"maximum_value_warning": "110"}, + "gantry_height": {"value": "250"}, + "machine_depth": {"default_value": 200}, + "machine_end_gcode": {"default_value": ";End Gcode\nM104 S0 T0\nM140 S0 T0\nG162 Z F1800\nG28 X Y\nM132 X Y A B\nM652\nG91\nM18"}, + "machine_head_with_fans_polygon": {"default_value": [[-20, 10], [-20, -10], [10, 10], [10, -10]]}, + "machine_height": {"default_value": 250}, + "machine_name": {"default_value": "Adventurer 4"}, + "machine_start_gcode": {"default_value": ";Start Gcode\nG28\nM132 X Y Z A B\nG1 Z50.000 F420\nG161 X Y F3300\nM7 T0\nM6 T0\nM651 S255\n;End Start"}, + "machine_use_extruder_offset_to_offset_coords": {"default_value": false}, + "machine_width": {"default_value": 220} + } +} \ No newline at end of file diff --git a/resources/definitions/flashforge_adventurer4lite.def.json b/resources/definitions/flashforge_adventurer4lite.def.json new file mode 100644 index 0000000000..05534793d8 --- /dev/null +++ b/resources/definitions/flashforge_adventurer4lite.def.json @@ -0,0 +1,14 @@ +{ + "version": 2, + "name": "Adventurer 4 Lite", + "inherits": "flashforge_adventurer4", + "metadata": + { + "author": "Jeremie-C", + "visible": true + }, + "overrides": + { + "machine_name": { "default_value": "Adventurer 4 Lite" } + } +} \ No newline at end of file diff --git a/resources/definitions/flashforge_adventurer_base.def.json b/resources/definitions/flashforge_adventurer_base.def.json new file mode 100644 index 0000000000..7a31d6400f --- /dev/null +++ b/resources/definitions/flashforge_adventurer_base.def.json @@ -0,0 +1,34 @@ +{ + "version": 2, + "name": "Flashforge Adventurer Base", + "inherits": "fdmprinter", + "metadata": + { + "author": "Jeremie-C", + "manufacturer": "Flashforge", + "visible": false, + "file_formats": "application/gx;text/x-gcode", + "first_start_actions": ["MachineSettingsAction"], + "has_machine_quality": true, + "has_materials": true, + "has_variants": true, + "machine_extruder_trains": {"0": "flashforge_adventurer_extruder_0"}, + "preferred_material": "generic_pla", + "preferred_quality_type": "normal", + "preferred_variant_name": "0.4mm Nozzle", + "variants_name": "Nozzle Size" + }, + "overrides": + { + "adhesion_type": {"default_value": "skirt"}, + "default_material_print_temperature": {"maximum_value_warning": "265"}, + "layer_height": + { + "minimum_value_warning": "0.1", + "maximum_value_warning": "0.4" + }, + "machine_center_is_zero": {"default_value": true}, + "machine_gcode_flavor": {"default_value": "RepRap (Marlin/Sprinter)"}, + "machine_heated_bed": {"default_value": true} + } +} \ No newline at end of file diff --git a/resources/extruders/flashforge_adventurer_extruder_0.def.json b/resources/extruders/flashforge_adventurer_extruder_0.def.json new file mode 100644 index 0000000000..d8b902a97b --- /dev/null +++ b/resources/extruders/flashforge_adventurer_extruder_0.def.json @@ -0,0 +1,16 @@ +{ + "version": 2, + "name": "Extruder", + "inherits": "fdmextruder", + "metadata": + { + "machine": "flashforge_adventurer_base", + "position": "0" + }, + "overrides": + { + "extruder_nr": { "default_value": 0 }, + "machine_nozzle_size": { "default_value": 0.4 }, + "material_diameter": { "default_value": 1.75 } + } +} \ No newline at end of file diff --git a/resources/variants/flashforge/flashforge_adventurer3_0.3.inst.cfg b/resources/variants/flashforge/flashforge_adventurer3_0.3.inst.cfg new file mode 100644 index 0000000000..98319a87a7 --- /dev/null +++ b/resources/variants/flashforge/flashforge_adventurer3_0.3.inst.cfg @@ -0,0 +1,12 @@ +[general] +definition = flashforge_adventurer3 +name = 0.3mm Nozzle +version = 4 + +[metadata] +hardware_type = nozzle +setting_version = 21 +type = variant + +[values] +machine_nozzle_size = 0.3 diff --git a/resources/variants/flashforge/flashforge_adventurer3_0.4.inst.cfg b/resources/variants/flashforge/flashforge_adventurer3_0.4.inst.cfg new file mode 100644 index 0000000000..3357045ab6 --- /dev/null +++ b/resources/variants/flashforge/flashforge_adventurer3_0.4.inst.cfg @@ -0,0 +1,12 @@ +[general] +definition = flashforge_adventurer3 +name = 0.4mm Nozzle +version = 4 + +[metadata] +hardware_type = nozzle +setting_version = 21 +type = variant + +[values] +machine_nozzle_size = 0.4 diff --git a/resources/variants/flashforge/flashforge_adventurer3_0.6.inst.cfg b/resources/variants/flashforge/flashforge_adventurer3_0.6.inst.cfg new file mode 100644 index 0000000000..aaf69b516d --- /dev/null +++ b/resources/variants/flashforge/flashforge_adventurer3_0.6.inst.cfg @@ -0,0 +1,12 @@ +[general] +definition = flashforge_adventurer3 +name = 0.6mm Nozzle +version = 4 + +[metadata] +hardware_type = nozzle +setting_version = 21 +type = variant + +[values] +machine_nozzle_size = 0.6 diff --git a/resources/variants/flashforge/flashforge_adventurer3c_0.3.inst.cfg b/resources/variants/flashforge/flashforge_adventurer3c_0.3.inst.cfg new file mode 100644 index 0000000000..56f983be94 --- /dev/null +++ b/resources/variants/flashforge/flashforge_adventurer3c_0.3.inst.cfg @@ -0,0 +1,12 @@ +[general] +definition = flashforge_adventurer3c +name = 0.3mm Nozzle +version = 4 + +[metadata] +hardware_type = nozzle +setting_version = 21 +type = variant + +[values] +machine_nozzle_size = 0.3 diff --git a/resources/variants/flashforge/flashforge_adventurer3c_0.4.inst.cfg b/resources/variants/flashforge/flashforge_adventurer3c_0.4.inst.cfg new file mode 100644 index 0000000000..c45a46dbc6 --- /dev/null +++ b/resources/variants/flashforge/flashforge_adventurer3c_0.4.inst.cfg @@ -0,0 +1,12 @@ +[general] +definition = flashforge_adventurer3c +name = 0.4mm Nozzle +version = 4 + +[metadata] +hardware_type = nozzle +setting_version = 21 +type = variant + +[values] +machine_nozzle_size = 0.4 diff --git a/resources/variants/flashforge/flashforge_adventurer3c_0.6.inst.cfg b/resources/variants/flashforge/flashforge_adventurer3c_0.6.inst.cfg new file mode 100644 index 0000000000..15bfd3f8be --- /dev/null +++ b/resources/variants/flashforge/flashforge_adventurer3c_0.6.inst.cfg @@ -0,0 +1,12 @@ +[general] +definition = flashforge_adventurer3c +name = 0.6mm Nozzle +version = 4 + +[metadata] +hardware_type = nozzle +setting_version = 21 +type = variant + +[values] +machine_nozzle_size = 0.6 diff --git a/resources/variants/flashforge/flashforge_adventurer4_0.3.inst.cfg b/resources/variants/flashforge/flashforge_adventurer4_0.3.inst.cfg new file mode 100644 index 0000000000..57a9dab4b1 --- /dev/null +++ b/resources/variants/flashforge/flashforge_adventurer4_0.3.inst.cfg @@ -0,0 +1,12 @@ +[general] +definition = flashforge_adventurer4 +name = 0.3mm Nozzle +version = 4 + +[metadata] +hardware_type = nozzle +setting_version = 21 +type = variant + +[values] +machine_nozzle_size = 0.3 diff --git a/resources/variants/flashforge/flashforge_adventurer4_0.4.inst.cfg b/resources/variants/flashforge/flashforge_adventurer4_0.4.inst.cfg new file mode 100644 index 0000000000..b451d4e681 --- /dev/null +++ b/resources/variants/flashforge/flashforge_adventurer4_0.4.inst.cfg @@ -0,0 +1,12 @@ +[general] +definition = flashforge_adventurer4 +name = 0.4mm Nozzle +version = 4 + +[metadata] +hardware_type = nozzle +setting_version = 21 +type = variant + +[values] +machine_nozzle_size = 0.4 diff --git a/resources/variants/flashforge/flashforge_adventurer4_0.6.inst.cfg b/resources/variants/flashforge/flashforge_adventurer4_0.6.inst.cfg new file mode 100644 index 0000000000..2f9568d49c --- /dev/null +++ b/resources/variants/flashforge/flashforge_adventurer4_0.6.inst.cfg @@ -0,0 +1,12 @@ +[general] +definition = flashforge_adventurer4 +name = 0.6mm Nozzle +version = 4 + +[metadata] +hardware_type = nozzle +setting_version = 21 +type = variant + +[values] +machine_nozzle_size = 0.6 diff --git a/resources/variants/flashforge/flashforge_adventurer4lite_0.3.inst.cfg b/resources/variants/flashforge/flashforge_adventurer4lite_0.3.inst.cfg new file mode 100644 index 0000000000..bc12e7191d --- /dev/null +++ b/resources/variants/flashforge/flashforge_adventurer4lite_0.3.inst.cfg @@ -0,0 +1,12 @@ +[general] +definition = flashforge_adventurer4lite +name = 0.3mm Nozzle +version = 4 + +[metadata] +hardware_type = nozzle +setting_version = 21 +type = variant + +[values] +machine_nozzle_size = 0.3 diff --git a/resources/variants/flashforge/flashforge_adventurer4lite_0.4.inst.cfg b/resources/variants/flashforge/flashforge_adventurer4lite_0.4.inst.cfg new file mode 100644 index 0000000000..2fc42fbb12 --- /dev/null +++ b/resources/variants/flashforge/flashforge_adventurer4lite_0.4.inst.cfg @@ -0,0 +1,12 @@ +[general] +definition = flashforge_adventurer4lite +name = 0.4mm Nozzle +version = 4 + +[metadata] +hardware_type = nozzle +setting_version = 21 +type = variant + +[values] +machine_nozzle_size = 0.4 diff --git a/resources/variants/flashforge/flashforge_adventurer4lite_0.6.inst.cfg b/resources/variants/flashforge/flashforge_adventurer4lite_0.6.inst.cfg new file mode 100644 index 0000000000..8da55dd9d1 --- /dev/null +++ b/resources/variants/flashforge/flashforge_adventurer4lite_0.6.inst.cfg @@ -0,0 +1,12 @@ +[general] +definition = flashforge_adventurer4lite +name = 0.6mm Nozzle +version = 4 + +[metadata] +hardware_type = nozzle +setting_version = 21 +type = variant + +[values] +machine_nozzle_size = 0.6 From 80ab3d22bbba7eea2fc63e1396e90063cb768e5c Mon Sep 17 00:00:00 2001 From: Jeremie Date: Fri, 26 May 2023 14:06:19 +0200 Subject: [PATCH 002/182] Quality for FlashForge Adventure 3 & 4 family --- ...ashforge_adventurer3_abs_0.3_fine.inst.cfg | 16 +++++++++++++++ ...shforge_adventurer3_abs_0.3_vfine.inst.cfg | 16 +++++++++++++++ ...shforge_adventurer3_abs_0.4_draft.inst.cfg | 16 +++++++++++++++ ...ashforge_adventurer3_abs_0.4_fast.inst.cfg | 16 +++++++++++++++ ...ashforge_adventurer3_abs_0.4_fine.inst.cfg | 16 +++++++++++++++ ...hforge_adventurer3_abs_0.4_normal.inst.cfg | 16 +++++++++++++++ ...shforge_adventurer3_abs_0.4_vfast.inst.cfg | 16 +++++++++++++++ ...shforge_adventurer3_abs_0.4_vfine.inst.cfg | 16 +++++++++++++++ ...shforge_adventurer3_abs_0.6_draft.inst.cfg | 16 +++++++++++++++ ...ashforge_adventurer3_abs_0.6_fast.inst.cfg | 16 +++++++++++++++ ...shforge_adventurer3_abs_0.6_vfast.inst.cfg | 16 +++++++++++++++ ...ashforge_adventurer4_abs_0.3_fine.inst.cfg | 18 +++++++++++++++++ ...shforge_adventurer4_abs_0.3_vfine.inst.cfg | 18 +++++++++++++++++ ...shforge_adventurer4_abs_0.4_draft.inst.cfg | 18 +++++++++++++++++ ...ashforge_adventurer4_abs_0.4_fast.inst.cfg | 18 +++++++++++++++++ ...ashforge_adventurer4_abs_0.4_fine.inst.cfg | 18 +++++++++++++++++ ...hforge_adventurer4_abs_0.4_normal.inst.cfg | 18 +++++++++++++++++ ...shforge_adventurer4_abs_0.4_vfast.inst.cfg | 18 +++++++++++++++++ ...shforge_adventurer4_abs_0.4_vfine.inst.cfg | 18 +++++++++++++++++ ...shforge_adventurer4_abs_0.6_draft.inst.cfg | 18 +++++++++++++++++ ...ashforge_adventurer4_abs_0.6_fast.inst.cfg | 18 +++++++++++++++++ ...shforge_adventurer4_abs_0.6_vfast.inst.cfg | 18 +++++++++++++++++ ...ashforge_adventurer4_asa_0.4_fast.inst.cfg | 18 +++++++++++++++++ ...ashforge_adventurer4_asa_0.4_fine.inst.cfg | 18 +++++++++++++++++ ...hforge_adventurer4_asa_0.4_normal.inst.cfg | 18 +++++++++++++++++ .../flashforge_adventurer3_draft.inst.cfg | 20 +++++++++++++++++++ .../flashforge_adventurer3_fast.inst.cfg | 20 +++++++++++++++++++ .../flashforge_adventurer3_fine.inst.cfg | 20 +++++++++++++++++++ .../flashforge_adventurer3_normal.inst.cfg | 20 +++++++++++++++++++ .../flashforge_adventurer3_vfast.inst.cfg | 20 +++++++++++++++++++ .../flashforge_adventurer3_vfine.inst.cfg | 20 +++++++++++++++++++ .../flashforge_adventurer4_draft.inst.cfg | 18 +++++++++++++++++ .../flashforge_adventurer4_fast.inst.cfg | 18 +++++++++++++++++ .../flashforge_adventurer4_fine.inst.cfg | 18 +++++++++++++++++ .../flashforge_adventurer4_normal.inst.cfg | 18 +++++++++++++++++ .../flashforge_adventurer4_vfast.inst.cfg | 18 +++++++++++++++++ .../flashforge_adventurer4_vfine.inst.cfg | 18 +++++++++++++++++ ...ashforge_adventurer3_pc_0.4_draft.inst.cfg | 16 +++++++++++++++ ...lashforge_adventurer3_pc_0.4_fast.inst.cfg | 16 +++++++++++++++ ...shforge_adventurer3_pc_0.4_normal.inst.cfg | 16 +++++++++++++++ ...ashforge_adventurer3_pc_0.4_vfast.inst.cfg | 16 +++++++++++++++ ...ashforge_adventurer3_pc_0.6_draft.inst.cfg | 16 +++++++++++++++ ...lashforge_adventurer3_pc_0.6_fast.inst.cfg | 16 +++++++++++++++ ...ashforge_adventurer3_pc_0.6_vfast.inst.cfg | 16 +++++++++++++++ ...ashforge_adventurer4_pc_0.4_draft.inst.cfg | 18 +++++++++++++++++ ...lashforge_adventurer4_pc_0.4_fast.inst.cfg | 18 +++++++++++++++++ ...shforge_adventurer4_pc_0.4_normal.inst.cfg | 18 +++++++++++++++++ ...ashforge_adventurer4_pc_0.4_vfast.inst.cfg | 18 +++++++++++++++++ ...ashforge_adventurer4_pc_0.6_draft.inst.cfg | 18 +++++++++++++++++ ...lashforge_adventurer4_pc_0.6_fast.inst.cfg | 18 +++++++++++++++++ ...ashforge_adventurer4_pc_0.6_vfast.inst.cfg | 18 +++++++++++++++++ ...shforge_adventurer3_petg_0.3_fine.inst.cfg | 16 +++++++++++++++ ...hforge_adventurer3_petg_0.3_vfine.inst.cfg | 16 +++++++++++++++ ...hforge_adventurer3_petg_0.4_draft.inst.cfg | 16 +++++++++++++++ ...shforge_adventurer3_petg_0.4_fast.inst.cfg | 16 +++++++++++++++ ...shforge_adventurer3_petg_0.4_fine.inst.cfg | 16 +++++++++++++++ ...forge_adventurer3_petg_0.4_normal.inst.cfg | 16 +++++++++++++++ ...hforge_adventurer3_petg_0.4_vfast.inst.cfg | 16 +++++++++++++++ ...hforge_adventurer3_petg_0.4_vfine.inst.cfg | 16 +++++++++++++++ ...hforge_adventurer3_petg_0.6_draft.inst.cfg | 16 +++++++++++++++ ...shforge_adventurer3_petg_0.6_fast.inst.cfg | 16 +++++++++++++++ ...hforge_adventurer3_petg_0.6_vfast.inst.cfg | 16 +++++++++++++++ ...shforge_adventurer4_petg_0.3_fine.inst.cfg | 18 +++++++++++++++++ ...hforge_adventurer4_petg_0.3_vfine.inst.cfg | 18 +++++++++++++++++ ...hforge_adventurer4_petg_0.4_draft.inst.cfg | 18 +++++++++++++++++ ...shforge_adventurer4_petg_0.4_fast.inst.cfg | 18 +++++++++++++++++ ...shforge_adventurer4_petg_0.4_fine.inst.cfg | 18 +++++++++++++++++ ...forge_adventurer4_petg_0.4_normal.inst.cfg | 18 +++++++++++++++++ ...hforge_adventurer4_petg_0.4_vfast.inst.cfg | 18 +++++++++++++++++ ...hforge_adventurer4_petg_0.4_vfine.inst.cfg | 18 +++++++++++++++++ ...hforge_adventurer4_petg_0.6_draft.inst.cfg | 18 +++++++++++++++++ ...shforge_adventurer4_petg_0.6_fast.inst.cfg | 18 +++++++++++++++++ ...hforge_adventurer4_petg_0.6_vfast.inst.cfg | 18 +++++++++++++++++ ...ashforge_adventurer3_pla_0.3_fine.inst.cfg | 16 +++++++++++++++ ...shforge_adventurer3_pla_0.3_vfine.inst.cfg | 16 +++++++++++++++ ...shforge_adventurer3_pla_0.4_draft.inst.cfg | 16 +++++++++++++++ ...ashforge_adventurer3_pla_0.4_fast.inst.cfg | 16 +++++++++++++++ ...ashforge_adventurer3_pla_0.4_fine.inst.cfg | 16 +++++++++++++++ ...hforge_adventurer3_pla_0.4_normal.inst.cfg | 16 +++++++++++++++ ...shforge_adventurer3_pla_0.4_vfast.inst.cfg | 16 +++++++++++++++ ...shforge_adventurer3_pla_0.4_vfine.inst.cfg | 16 +++++++++++++++ ...shforge_adventurer3_pla_0.6_draft.inst.cfg | 16 +++++++++++++++ ...ashforge_adventurer3_pla_0.6_fast.inst.cfg | 16 +++++++++++++++ ...shforge_adventurer3_pla_0.6_vfast.inst.cfg | 16 +++++++++++++++ ...ashforge_adventurer4_pla_0.3_fine.inst.cfg | 18 +++++++++++++++++ ...shforge_adventurer4_pla_0.3_vfine.inst.cfg | 18 +++++++++++++++++ ...shforge_adventurer4_pla_0.4_draft.inst.cfg | 18 +++++++++++++++++ ...ashforge_adventurer4_pla_0.4_fast.inst.cfg | 18 +++++++++++++++++ ...ashforge_adventurer4_pla_0.4_fine.inst.cfg | 18 +++++++++++++++++ ...hforge_adventurer4_pla_0.4_normal.inst.cfg | 18 +++++++++++++++++ ...shforge_adventurer4_pla_0.4_vfast.inst.cfg | 18 +++++++++++++++++ ...shforge_adventurer4_pla_0.4_vfine.inst.cfg | 18 +++++++++++++++++ ...shforge_adventurer4_pla_0.6_draft.inst.cfg | 18 +++++++++++++++++ ...ashforge_adventurer4_pla_0.6_fast.inst.cfg | 18 +++++++++++++++++ ...shforge_adventurer4_pla_0.6_vfast.inst.cfg | 18 +++++++++++++++++ 95 files changed, 1642 insertions(+) create mode 100644 resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.3_fine.inst.cfg create mode 100644 resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.3_vfine.inst.cfg create mode 100644 resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.4_draft.inst.cfg create mode 100644 resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.4_fast.inst.cfg create mode 100644 resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.4_fine.inst.cfg create mode 100644 resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.4_normal.inst.cfg create mode 100644 resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.4_vfast.inst.cfg create mode 100644 resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.4_vfine.inst.cfg create mode 100644 resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.6_draft.inst.cfg create mode 100644 resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.6_fast.inst.cfg create mode 100644 resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.6_vfast.inst.cfg create mode 100644 resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.3_fine.inst.cfg create mode 100644 resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.3_vfine.inst.cfg create mode 100644 resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.4_draft.inst.cfg create mode 100644 resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.4_fast.inst.cfg create mode 100644 resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.4_fine.inst.cfg create mode 100644 resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.4_normal.inst.cfg create mode 100644 resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.4_vfast.inst.cfg create mode 100644 resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.4_vfine.inst.cfg create mode 100644 resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.6_draft.inst.cfg create mode 100644 resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.6_fast.inst.cfg create mode 100644 resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.6_vfast.inst.cfg create mode 100644 resources/quality/flashforge/asa/flashforge_adventurer4_asa_0.4_fast.inst.cfg create mode 100644 resources/quality/flashforge/asa/flashforge_adventurer4_asa_0.4_fine.inst.cfg create mode 100644 resources/quality/flashforge/asa/flashforge_adventurer4_asa_0.4_normal.inst.cfg create mode 100644 resources/quality/flashforge/flashforge_adventurer3_draft.inst.cfg create mode 100644 resources/quality/flashforge/flashforge_adventurer3_fast.inst.cfg create mode 100644 resources/quality/flashforge/flashforge_adventurer3_fine.inst.cfg create mode 100644 resources/quality/flashforge/flashforge_adventurer3_normal.inst.cfg create mode 100644 resources/quality/flashforge/flashforge_adventurer3_vfast.inst.cfg create mode 100644 resources/quality/flashforge/flashforge_adventurer3_vfine.inst.cfg create mode 100644 resources/quality/flashforge/flashforge_adventurer4_draft.inst.cfg create mode 100644 resources/quality/flashforge/flashforge_adventurer4_fast.inst.cfg create mode 100644 resources/quality/flashforge/flashforge_adventurer4_fine.inst.cfg create mode 100644 resources/quality/flashforge/flashforge_adventurer4_normal.inst.cfg create mode 100644 resources/quality/flashforge/flashforge_adventurer4_vfast.inst.cfg create mode 100644 resources/quality/flashforge/flashforge_adventurer4_vfine.inst.cfg create mode 100644 resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.4_draft.inst.cfg create mode 100644 resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.4_fast.inst.cfg create mode 100644 resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.4_normal.inst.cfg create mode 100644 resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.4_vfast.inst.cfg create mode 100644 resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.6_draft.inst.cfg create mode 100644 resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.6_fast.inst.cfg create mode 100644 resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.6_vfast.inst.cfg create mode 100644 resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.4_draft.inst.cfg create mode 100644 resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.4_fast.inst.cfg create mode 100644 resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.4_normal.inst.cfg create mode 100644 resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.4_vfast.inst.cfg create mode 100644 resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.6_draft.inst.cfg create mode 100644 resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.6_fast.inst.cfg create mode 100644 resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.6_vfast.inst.cfg create mode 100644 resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.3_fine.inst.cfg create mode 100644 resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.3_vfine.inst.cfg create mode 100644 resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.4_draft.inst.cfg create mode 100644 resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.4_fast.inst.cfg create mode 100644 resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.4_fine.inst.cfg create mode 100644 resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.4_normal.inst.cfg create mode 100644 resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.4_vfast.inst.cfg create mode 100644 resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.4_vfine.inst.cfg create mode 100644 resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.6_draft.inst.cfg create mode 100644 resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.6_fast.inst.cfg create mode 100644 resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.6_vfast.inst.cfg create mode 100644 resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.3_fine.inst.cfg create mode 100644 resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.3_vfine.inst.cfg create mode 100644 resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.4_draft.inst.cfg create mode 100644 resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.4_fast.inst.cfg create mode 100644 resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.4_fine.inst.cfg create mode 100644 resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.4_normal.inst.cfg create mode 100644 resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.4_vfast.inst.cfg create mode 100644 resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.4_vfine.inst.cfg create mode 100644 resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.6_draft.inst.cfg create mode 100644 resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.6_fast.inst.cfg create mode 100644 resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.6_vfast.inst.cfg create mode 100644 resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.3_fine.inst.cfg create mode 100644 resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.3_vfine.inst.cfg create mode 100644 resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.4_draft.inst.cfg create mode 100644 resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.4_fast.inst.cfg create mode 100644 resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.4_fine.inst.cfg create mode 100644 resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.4_normal.inst.cfg create mode 100644 resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.4_vfast.inst.cfg create mode 100644 resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.4_vfine.inst.cfg create mode 100644 resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.6_draft.inst.cfg create mode 100644 resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.6_fast.inst.cfg create mode 100644 resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.6_vfast.inst.cfg create mode 100644 resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.3_fine.inst.cfg create mode 100644 resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.3_vfine.inst.cfg create mode 100644 resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.4_draft.inst.cfg create mode 100644 resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.4_fast.inst.cfg create mode 100644 resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.4_fine.inst.cfg create mode 100644 resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.4_normal.inst.cfg create mode 100644 resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.4_vfast.inst.cfg create mode 100644 resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.4_vfine.inst.cfg create mode 100644 resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.6_draft.inst.cfg create mode 100644 resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.6_fast.inst.cfg create mode 100644 resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.6_vfast.inst.cfg diff --git a/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.3_fine.inst.cfg b/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.3_fine.inst.cfg new file mode 100644 index 0000000000..17d9129838 --- /dev/null +++ b/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.3_fine.inst.cfg @@ -0,0 +1,16 @@ +[general] +definition = flashforge_adventurer3 +name = Fine +version = 4 + +[metadata] +material = generic_abs +quality_type = fine +setting_version = 21 +type = quality +variant = 0.3mm Nozzle +weight = 1 + +[values] +speed_print = 50 +speed_travel = 100 diff --git a/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.3_vfine.inst.cfg b/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.3_vfine.inst.cfg new file mode 100644 index 0000000000..d081363cde --- /dev/null +++ b/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.3_vfine.inst.cfg @@ -0,0 +1,16 @@ +[general] +definition = flashforge_adventurer3 +name = Very Fine +version = 4 + +[metadata] +material = generic_abs +quality_type = veryfine +setting_version = 21 +type = quality +variant = 0.3mm Nozzle +weight = 2 + +[values] +speed_print = 45 +speed_travel = 100 diff --git a/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.4_draft.inst.cfg b/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.4_draft.inst.cfg new file mode 100644 index 0000000000..f392ad07fa --- /dev/null +++ b/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.4_draft.inst.cfg @@ -0,0 +1,16 @@ +[general] +definition = flashforge_adventurer3 +name = Draft +version = 4 + +[metadata] +material = generic_abs +quality_type = draft +setting_version = 21 +type = quality +variant = 0.4mm Nozzle +weight = -3 + +[values] +speed_print = 70 +speed_travel = 90 diff --git a/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.4_fast.inst.cfg b/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.4_fast.inst.cfg new file mode 100644 index 0000000000..4bba44bee9 --- /dev/null +++ b/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.4_fast.inst.cfg @@ -0,0 +1,16 @@ +[general] +definition = flashforge_adventurer3 +name = Fast +version = 4 + +[metadata] +material = generic_abs +quality_type = fast +setting_version = 21 +type = quality +variant = 0.4mm Nozzle +weight = -1 + +[values] +speed_print = 60 +speed_travel = 80 diff --git a/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.4_fine.inst.cfg b/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.4_fine.inst.cfg new file mode 100644 index 0000000000..7e46e9dd35 --- /dev/null +++ b/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.4_fine.inst.cfg @@ -0,0 +1,16 @@ +[general] +definition = flashforge_adventurer3 +name = Fine +version = 4 + +[metadata] +material = generic_abs +quality_type = fine +setting_version = 21 +type = quality +variant = 0.4mm Nozzle +weight = 1 + +[values] +speed_print = 40 +speed_travel = 70 diff --git a/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.4_normal.inst.cfg b/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.4_normal.inst.cfg new file mode 100644 index 0000000000..23b4fd2cb3 --- /dev/null +++ b/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.4_normal.inst.cfg @@ -0,0 +1,16 @@ +[general] +definition = flashforge_adventurer3 +name = Standard +version = 4 + +[metadata] +material = generic_abs +quality_type = normal +setting_version = 21 +type = quality +variant = 0.4mm Nozzle +weight = 0 + +[values] +speed_print = 60 +speed_travel = 80 diff --git a/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.4_vfast.inst.cfg b/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.4_vfast.inst.cfg new file mode 100644 index 0000000000..9370e5d647 --- /dev/null +++ b/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.4_vfast.inst.cfg @@ -0,0 +1,16 @@ +[general] +definition = flashforge_adventurer3 +name = Very Fast +version = 4 + +[metadata] +material = generic_abs +quality_type = veryfast +setting_version = 21 +type = quality +variant = 0.4mm Nozzle +weight = -2 + +[values] +speed_print = 60 +speed_travel = 90 diff --git a/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.4_vfine.inst.cfg b/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.4_vfine.inst.cfg new file mode 100644 index 0000000000..158014be49 --- /dev/null +++ b/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.4_vfine.inst.cfg @@ -0,0 +1,16 @@ +[general] +definition = flashforge_adventurer3 +name = Very Fine +version = 4 + +[metadata] +material = generic_abs +quality_type = veryfine +setting_version = 21 +type = quality +variant = 0.4mm Nozzle +weight = 2 + +[values] +speed_print = 35 +speed_travel = 70 diff --git a/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.6_draft.inst.cfg b/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.6_draft.inst.cfg new file mode 100644 index 0000000000..29bff5b090 --- /dev/null +++ b/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.6_draft.inst.cfg @@ -0,0 +1,16 @@ +[general] +definition = flashforge_adventurer3 +name = Draft +version = 4 + +[metadata] +material = generic_abs +quality_type = draft +setting_version = 21 +type = quality +variant = 0.6mm Nozzle +weight = -3 + +[values] +speed_print = 55 +speed_travel = 100 diff --git a/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.6_fast.inst.cfg b/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.6_fast.inst.cfg new file mode 100644 index 0000000000..30d4ee5af8 --- /dev/null +++ b/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.6_fast.inst.cfg @@ -0,0 +1,16 @@ +[general] +definition = flashforge_adventurer3 +name = Fast +version = 4 + +[metadata] +material = generic_abs +quality_type = fast +setting_version = 21 +type = quality +variant = 0.6mm Nozzle +weight = -1 + +[values] +speed_print = 50 +speed_travel = 100 diff --git a/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.6_vfast.inst.cfg b/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.6_vfast.inst.cfg new file mode 100644 index 0000000000..468aeb2244 --- /dev/null +++ b/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.6_vfast.inst.cfg @@ -0,0 +1,16 @@ +[general] +definition = flashforge_adventurer3 +name = Very Fast +version = 4 + +[metadata] +material = generic_abs +quality_type = veryfast +setting_version = 21 +type = quality +variant = 0.6mm Nozzle +weight = -2 + +[values] +speed_print = 50 +speed_travel = 100 diff --git a/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.3_fine.inst.cfg b/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.3_fine.inst.cfg new file mode 100644 index 0000000000..977fd8a7b4 --- /dev/null +++ b/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.3_fine.inst.cfg @@ -0,0 +1,18 @@ +[general] +definition = flashforge_adventurer4 +name = Fine +version = 4 + +[metadata] +material = generic_abs +quality_type = fine +setting_version = 21 +type = quality +variant = 0.3mm Nozzle +weight = 1 + +[values] +speed_print = 50 +speed_travel = 100 +retraction_amount = 5 +retraction_speed = 30 diff --git a/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.3_vfine.inst.cfg b/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.3_vfine.inst.cfg new file mode 100644 index 0000000000..880009f3da --- /dev/null +++ b/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.3_vfine.inst.cfg @@ -0,0 +1,18 @@ +[general] +definition = flashforge_adventurer4 +name = Very Fine +version = 4 + +[metadata] +material = generic_abs +quality_type = veryfine +setting_version = 21 +type = quality +variant = 0.3mm Nozzle +weight = 2 + +[values] +speed_print = 45 +speed_travel = 100 +retraction_amount = 5 +retraction_speed = 30 diff --git a/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.4_draft.inst.cfg b/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.4_draft.inst.cfg new file mode 100644 index 0000000000..2a8c1c2f6c --- /dev/null +++ b/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.4_draft.inst.cfg @@ -0,0 +1,18 @@ +[general] +definition = flashforge_adventurer4 +name = Draft +version = 4 + +[metadata] +material = generic_abs +quality_type = draft +setting_version = 21 +type = quality +variant = 0.4mm Nozzle +weight = -3 + +[values] +speed_print = 70 +speed_travel = 90 +retraction_amount = 5 +retraction_speed = 30 diff --git a/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.4_fast.inst.cfg b/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.4_fast.inst.cfg new file mode 100644 index 0000000000..873d134ee3 --- /dev/null +++ b/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.4_fast.inst.cfg @@ -0,0 +1,18 @@ +[general] +definition = flashforge_adventurer4 +name = Fast +version = 4 + +[metadata] +material = generic_abs +quality_type = fast +setting_version = 21 +type = quality +variant = 0.4mm Nozzle +weight = -1 + +[values] +speed_print = 60 +speed_travel = 80 +retraction_amount = 5 +retraction_speed = 30 diff --git a/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.4_fine.inst.cfg b/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.4_fine.inst.cfg new file mode 100644 index 0000000000..36f408498c --- /dev/null +++ b/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.4_fine.inst.cfg @@ -0,0 +1,18 @@ +[general] +definition = flashforge_adventurer3 +name = Fine +version = 4 + +[metadata] +material = generic_abs +quality_type = fine +setting_version = 21 +type = quality +variant = 0.4mm Nozzle +weight = 1 + +[values] +speed_print = 40 +speed_travel = 70 +retraction_amount = 5 +retraction_speed = 30 diff --git a/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.4_normal.inst.cfg b/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.4_normal.inst.cfg new file mode 100644 index 0000000000..f027fa295f --- /dev/null +++ b/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.4_normal.inst.cfg @@ -0,0 +1,18 @@ +[general] +definition = flashforge_adventurer4 +name = Standard +version = 4 + +[metadata] +material = generic_abs +quality_type = normal +setting_version = 21 +type = quality +variant = 0.4mm Nozzle +weight = 0 + +[values] +speed_print = 60 +speed_travel = 80 +retraction_amount = 5 +retraction_speed = 30 diff --git a/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.4_vfast.inst.cfg b/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.4_vfast.inst.cfg new file mode 100644 index 0000000000..4ed26f1ded --- /dev/null +++ b/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.4_vfast.inst.cfg @@ -0,0 +1,18 @@ +[general] +definition = flashforge_adventurer4 +name = Very Fast +version = 4 + +[metadata] +material = generic_abs +quality_type = veryfast +setting_version = 21 +type = quality +variant = 0.4mm Nozzle +weight = -2 + +[values] +speed_print = 60 +speed_travel = 90 +retraction_amount = 5 +retraction_speed = 30 diff --git a/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.4_vfine.inst.cfg b/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.4_vfine.inst.cfg new file mode 100644 index 0000000000..5bb99865c8 --- /dev/null +++ b/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.4_vfine.inst.cfg @@ -0,0 +1,18 @@ +[general] +definition = flashforge_adventurer4 +name = Very Fine +version = 4 + +[metadata] +material = generic_abs +quality_type = veryfine +setting_version = 21 +type = quality +variant = 0.4mm Nozzle +weight = 2 + +[values] +speed_print = 35 +speed_travel = 70 +retraction_amount = 5 +retraction_speed = 30 diff --git a/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.6_draft.inst.cfg b/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.6_draft.inst.cfg new file mode 100644 index 0000000000..29ee87d4ab --- /dev/null +++ b/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.6_draft.inst.cfg @@ -0,0 +1,18 @@ +[general] +definition = flashforge_adventurer4 +name = Draft +version = 4 + +[metadata] +material = generic_abs +quality_type = draft +setting_version = 21 +type = quality +variant = 0.6mm Nozzle +weight = -3 + +[values] +speed_print = 55 +speed_travel = 100 +retraction_amount = 6 +retraction_speed = 30 diff --git a/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.6_fast.inst.cfg b/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.6_fast.inst.cfg new file mode 100644 index 0000000000..37d421bcb0 --- /dev/null +++ b/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.6_fast.inst.cfg @@ -0,0 +1,18 @@ +[general] +definition = flashforge_adventurer4 +name = Fast +version = 4 + +[metadata] +material = generic_abs +quality_type = fast +setting_version = 21 +type = quality +variant = 0.6mm Nozzle +weight = -1 + +[values] +speed_print = 50 +speed_travel = 100 +retraction_amount = 6 +retraction_speed = 30 diff --git a/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.6_vfast.inst.cfg b/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.6_vfast.inst.cfg new file mode 100644 index 0000000000..ede2b19a6d --- /dev/null +++ b/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.6_vfast.inst.cfg @@ -0,0 +1,18 @@ +[general] +definition = flashforge_adventurer3 +name = Very Fast +version = 4 + +[metadata] +material = generic_abs +quality_type = veryfast +setting_version = 21 +type = quality +variant = 0.6mm Nozzle +weight = -2 + +[values] +speed_print = 50 +speed_travel = 100 +retraction_amount = 6 +retraction_speed = 30 diff --git a/resources/quality/flashforge/asa/flashforge_adventurer4_asa_0.4_fast.inst.cfg b/resources/quality/flashforge/asa/flashforge_adventurer4_asa_0.4_fast.inst.cfg new file mode 100644 index 0000000000..498ec3781b --- /dev/null +++ b/resources/quality/flashforge/asa/flashforge_adventurer4_asa_0.4_fast.inst.cfg @@ -0,0 +1,18 @@ +[general] +definition = flashforge_adventurer4 +name = Fast +version = 4 + +[metadata] +material = generic_asa +quality_type = fast +setting_version = 21 +type = quality +variant = 0.4mm Nozzle +weight = -1 + +[values] +speed_print = 45 +speed_travel = 100 +retraction_amount = 4.5 +retraction_speed = 30 diff --git a/resources/quality/flashforge/asa/flashforge_adventurer4_asa_0.4_fine.inst.cfg b/resources/quality/flashforge/asa/flashforge_adventurer4_asa_0.4_fine.inst.cfg new file mode 100644 index 0000000000..5ad56f447c --- /dev/null +++ b/resources/quality/flashforge/asa/flashforge_adventurer4_asa_0.4_fine.inst.cfg @@ -0,0 +1,18 @@ +[general] +definition = flashforge_adventurer4 +name = Fine +version = 4 + +[metadata] +material = generic_asa +quality_type = fine +setting_version = 21 +type = quality +variant = 0.4mm Nozzle +weight = -1 + +[values] +speed_print = 35 +speed_travel = 100 +retraction_amount = 4.5 +retraction_speed = 30 diff --git a/resources/quality/flashforge/asa/flashforge_adventurer4_asa_0.4_normal.inst.cfg b/resources/quality/flashforge/asa/flashforge_adventurer4_asa_0.4_normal.inst.cfg new file mode 100644 index 0000000000..210c3e6d6d --- /dev/null +++ b/resources/quality/flashforge/asa/flashforge_adventurer4_asa_0.4_normal.inst.cfg @@ -0,0 +1,18 @@ +[general] +definition = flashforge_adventurer4 +name = Standard +version = 4 + +[metadata] +material = generic_asa +quality_type = normal +setting_version = 21 +type = quality +variant = 0.4mm Nozzle +weight = 0 + +[values] +speed_print = 40 +speed_travel = 100 +retraction_amount = 4.5 +retraction_speed = 30 diff --git a/resources/quality/flashforge/flashforge_adventurer3_draft.inst.cfg b/resources/quality/flashforge/flashforge_adventurer3_draft.inst.cfg new file mode 100644 index 0000000000..21033c046b --- /dev/null +++ b/resources/quality/flashforge/flashforge_adventurer3_draft.inst.cfg @@ -0,0 +1,20 @@ +[general] +definition = flashforge_adventurer3 +name = Draft +version = 4 + +[metadata] +global_quality = True +quality_type = draft +setting_version = 21 +type = quality +weight = -3 + +[values] +layer_height = 0.4 +layer_height_0 = 0.4 +retraction_amount = 5 +retraction_speed = 25 +speed_infill = =speed_print +speed_layer_0 = 10 +speed_support = =math.ceil(speed_print * 0.6) diff --git a/resources/quality/flashforge/flashforge_adventurer3_fast.inst.cfg b/resources/quality/flashforge/flashforge_adventurer3_fast.inst.cfg new file mode 100644 index 0000000000..cad53fac1d --- /dev/null +++ b/resources/quality/flashforge/flashforge_adventurer3_fast.inst.cfg @@ -0,0 +1,20 @@ +[general] +definition = flashforge_adventurer3 +name = Fast +version = 4 + +[metadata] +global_quality = True +quality_type = fast +setting_version = 21 +type = quality +weight = -1 + +[values] +layer_height = 0.25 +layer_height_0 = 0.3 +retraction_amount = 5 +retraction_speed = 25 +speed_infill = =speed_print +speed_layer_0 = 10 +speed_support = =math.ceil(speed_print * 0.6) diff --git a/resources/quality/flashforge/flashforge_adventurer3_fine.inst.cfg b/resources/quality/flashforge/flashforge_adventurer3_fine.inst.cfg new file mode 100644 index 0000000000..0380146a38 --- /dev/null +++ b/resources/quality/flashforge/flashforge_adventurer3_fine.inst.cfg @@ -0,0 +1,20 @@ +[general] +definition = flashforge_adventurer3 +name = Fine +version = 4 + +[metadata] +global_quality = True +quality_type = fine +setting_version = 21 +type = quality +weight = 1 + +[values] +layer_height = 0.15 +layer_height_0 = 0.23 +retraction_amount = 5 +retraction_speed = 25 +speed_infill = =speed_print +speed_layer_0 = 10 +speed_support = =math.ceil(speed_print * 0.6) diff --git a/resources/quality/flashforge/flashforge_adventurer3_normal.inst.cfg b/resources/quality/flashforge/flashforge_adventurer3_normal.inst.cfg new file mode 100644 index 0000000000..4caa292116 --- /dev/null +++ b/resources/quality/flashforge/flashforge_adventurer3_normal.inst.cfg @@ -0,0 +1,20 @@ +[general] +definition = flashforge_adventurer3 +name = Standard +version = 4 + +[metadata] +global_quality = True +quality_type = normal +setting_version = 21 +type = quality +weight = 0 + +[values] +layer_height = 0.2 +layer_height_0 = 0.3 +retraction_amount = 5 +retraction_speed = 25 +speed_infill = =speed_print +speed_layer_0 = 10 +speed_support = =math.ceil(speed_print * 0.6) diff --git a/resources/quality/flashforge/flashforge_adventurer3_vfast.inst.cfg b/resources/quality/flashforge/flashforge_adventurer3_vfast.inst.cfg new file mode 100644 index 0000000000..1b229b4a99 --- /dev/null +++ b/resources/quality/flashforge/flashforge_adventurer3_vfast.inst.cfg @@ -0,0 +1,20 @@ +[general] +definition = flashforge_adventurer3 +name = Very Fast +version = 4 + +[metadata] +global_quality = True +quality_type = veryfast +setting_version = 21 +type = quality +weight = -2 + +[values] +layer_height = 0.3 +layer_height_0 = 0.3 +retraction_amount = 5 +retraction_speed = 25 +speed_infill = =speed_print +speed_layer_0 = 10 +speed_support = =math.ceil(speed_print * 0.6) diff --git a/resources/quality/flashforge/flashforge_adventurer3_vfine.inst.cfg b/resources/quality/flashforge/flashforge_adventurer3_vfine.inst.cfg new file mode 100644 index 0000000000..f379409c4d --- /dev/null +++ b/resources/quality/flashforge/flashforge_adventurer3_vfine.inst.cfg @@ -0,0 +1,20 @@ +[general] +definition = flashforge_adventurer3 +name = Very Fine +version = 4 + +[metadata] +global_quality = True +quality_type = veryfine +setting_version = 21 +type = quality +weight = 2 + +[values] +layer_height = 0.1 +layer_height_0 = 0.18 +retraction_amount = 5 +retraction_speed = 25 +speed_infill = =speed_print +speed_layer_0 = 10 +speed_support = =math.ceil(speed_print * 0.6) diff --git a/resources/quality/flashforge/flashforge_adventurer4_draft.inst.cfg b/resources/quality/flashforge/flashforge_adventurer4_draft.inst.cfg new file mode 100644 index 0000000000..4e03ee768d --- /dev/null +++ b/resources/quality/flashforge/flashforge_adventurer4_draft.inst.cfg @@ -0,0 +1,18 @@ +[general] +definition = flashforge_adventurer4 +name = Draft +version = 4 + +[metadata] +global_quality = True +quality_type = draft +setting_version = 21 +type = quality +weight = -3 + +[values] +layer_height = 0.4 +layer_height_0 = 0.4 +speed_infill = =speed_print +speed_layer_0 = 10 +speed_support = =math.ceil(speed_print * 0.6) diff --git a/resources/quality/flashforge/flashforge_adventurer4_fast.inst.cfg b/resources/quality/flashforge/flashforge_adventurer4_fast.inst.cfg new file mode 100644 index 0000000000..6a55f7c1e9 --- /dev/null +++ b/resources/quality/flashforge/flashforge_adventurer4_fast.inst.cfg @@ -0,0 +1,18 @@ +[general] +definition = flashforge_adventurer4 +name = Fast +version = 4 + +[metadata] +global_quality = True +quality_type = fast +setting_version = 21 +type = quality +weight = -1 + +[values] +layer_height = 0.25 +layer_height_0 = 0.3 +speed_infill = =speed_print +speed_layer_0 = 10 +speed_support = =math.ceil(speed_print * 0.6) diff --git a/resources/quality/flashforge/flashforge_adventurer4_fine.inst.cfg b/resources/quality/flashforge/flashforge_adventurer4_fine.inst.cfg new file mode 100644 index 0000000000..e6d44d631e --- /dev/null +++ b/resources/quality/flashforge/flashforge_adventurer4_fine.inst.cfg @@ -0,0 +1,18 @@ +[general] +definition = flashforge_adventurer4 +name = Fine +version = 4 + +[metadata] +global_quality = True +quality_type = fine +setting_version = 21 +type = quality +weight = 1 + +[values] +layer_height = 0.15 +layer_height_0 = 0.23 +speed_infill = =speed_print +speed_layer_0 = 10 +speed_support = =math.ceil(speed_print * 0.6) diff --git a/resources/quality/flashforge/flashforge_adventurer4_normal.inst.cfg b/resources/quality/flashforge/flashforge_adventurer4_normal.inst.cfg new file mode 100644 index 0000000000..0b0e69f8c6 --- /dev/null +++ b/resources/quality/flashforge/flashforge_adventurer4_normal.inst.cfg @@ -0,0 +1,18 @@ +[general] +definition = flashforge_adventurer4 +name = Standard +version = 4 + +[metadata] +global_quality = True +quality_type = normal +setting_version = 21 +type = quality +weight = 0 + +[values] +layer_height = 0.2 +layer_height_0 = 0.3 +speed_infill = =speed_print +speed_layer_0 = 10 +speed_support = =math.ceil(speed_print * 0.6) diff --git a/resources/quality/flashforge/flashforge_adventurer4_vfast.inst.cfg b/resources/quality/flashforge/flashforge_adventurer4_vfast.inst.cfg new file mode 100644 index 0000000000..a38f55477b --- /dev/null +++ b/resources/quality/flashforge/flashforge_adventurer4_vfast.inst.cfg @@ -0,0 +1,18 @@ +[general] +definition = flashforge_adventurer4 +name = Very Fast +version = 4 + +[metadata] +global_quality = True +quality_type = veryfast +setting_version = 21 +type = quality +weight = -2 + +[values] +layer_height = 0.3 +layer_height_0 = 0.3 +speed_infill = =speed_print +speed_layer_0 = 10 +speed_support = =math.ceil(speed_print * 0.6) diff --git a/resources/quality/flashforge/flashforge_adventurer4_vfine.inst.cfg b/resources/quality/flashforge/flashforge_adventurer4_vfine.inst.cfg new file mode 100644 index 0000000000..9ffcb1e44b --- /dev/null +++ b/resources/quality/flashforge/flashforge_adventurer4_vfine.inst.cfg @@ -0,0 +1,18 @@ +[general] +definition = flashforge_adventurer4 +name = Very Fine +version = 4 + +[metadata] +global_quality = True +quality_type = veryfine +setting_version = 21 +type = quality +weight = 2 + +[values] +layer_height = 0.1 +layer_height_0 = 0.18 +speed_infill = =speed_print +speed_layer_0 = 10 +speed_support = =math.ceil(speed_print * 0.6) diff --git a/resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.4_draft.inst.cfg b/resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.4_draft.inst.cfg new file mode 100644 index 0000000000..7a33b8e486 --- /dev/null +++ b/resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.4_draft.inst.cfg @@ -0,0 +1,16 @@ +[general] +definition = flashforge_adventurer3 +name = Draft +version = 4 + +[metadata] +material = generic_pc +quality_type = draft +setting_version = 21 +type = quality +variant = 0.4mm Nozzle +weight = -3 + +[values] +speed_print = 50 +speed_travel = 90 diff --git a/resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.4_fast.inst.cfg b/resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.4_fast.inst.cfg new file mode 100644 index 0000000000..d6ff4cac8e --- /dev/null +++ b/resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.4_fast.inst.cfg @@ -0,0 +1,16 @@ +[general] +definition = flashforge_adventurer3 +name = Fast +version = 4 + +[metadata] +material = generic_pc +quality_type = fast +setting_version = 21 +type = quality +variant = 0.4mm Nozzle +weight = -1 + +[values] +speed_print = 40 +speed_travel = 80 diff --git a/resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.4_normal.inst.cfg b/resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.4_normal.inst.cfg new file mode 100644 index 0000000000..6b44a5dfc3 --- /dev/null +++ b/resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.4_normal.inst.cfg @@ -0,0 +1,16 @@ +[general] +definition = flashforge_adventurer3 +name = Standard +version = 4 + +[metadata] +material = generic_pc +quality_type = normal +setting_version = 21 +type = quality +variant = 0.4mm Nozzle +weight = 0 + +[values] +speed_print = 40 +speed_travel = 80 diff --git a/resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.4_vfast.inst.cfg b/resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.4_vfast.inst.cfg new file mode 100644 index 0000000000..0e7691a28d --- /dev/null +++ b/resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.4_vfast.inst.cfg @@ -0,0 +1,16 @@ +[general] +definition = flashforge_adventurer3 +name = Very Fast +version = 4 + +[metadata] +material = generic_pc +quality_type = veryfast +setting_version = 21 +type = quality +variant = 0.4mm Nozzle +weight = -2 + +[values] +speed_print = 50 +speed_travel = 90 diff --git a/resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.6_draft.inst.cfg b/resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.6_draft.inst.cfg new file mode 100644 index 0000000000..d7afbddbcd --- /dev/null +++ b/resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.6_draft.inst.cfg @@ -0,0 +1,16 @@ +[general] +definition = flashforge_adventurer3 +name = Draft +version = 4 + +[metadata] +material = generic_pc +quality_type = draft +setting_version = 21 +type = quality +variant = 0.6mm Nozzle +weight = -3 + +[values] +speed_print = 60 +speed_travel = 100 diff --git a/resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.6_fast.inst.cfg b/resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.6_fast.inst.cfg new file mode 100644 index 0000000000..9267502a89 --- /dev/null +++ b/resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.6_fast.inst.cfg @@ -0,0 +1,16 @@ +[general] +definition = flashforge_adventurer3 +name = Fast +version = 4 + +[metadata] +material = generic_pc +quality_type = fast +setting_version = 21 +type = quality +variant = 0.6mm Nozzle +weight = -2 + +[values] +speed_print = 50 +speed_travel = 100 diff --git a/resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.6_vfast.inst.cfg b/resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.6_vfast.inst.cfg new file mode 100644 index 0000000000..41fbacd635 --- /dev/null +++ b/resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.6_vfast.inst.cfg @@ -0,0 +1,16 @@ +[general] +definition = flashforge_adventurer3 +name = Very Fast +version = 4 + +[metadata] +material = generic_pc +quality_type = veryfast +setting_version = 21 +type = quality +variant = 0.6mm Nozzle +weight = -2 + +[values] +speed_print = 50 +speed_travel = 100 diff --git a/resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.4_draft.inst.cfg b/resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.4_draft.inst.cfg new file mode 100644 index 0000000000..b2927df668 --- /dev/null +++ b/resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.4_draft.inst.cfg @@ -0,0 +1,18 @@ +[general] +definition = flashforge_adventurer4 +name = Draft +version = 4 + +[metadata] +material = generic_pc +quality_type = draft +setting_version = 21 +type = quality +variant = 0.4mm Nozzle +weight = -3 + +[values] +speed_print = 50 +speed_travel = 90 +retraction_amount = 6 +retraction_speed = 30 diff --git a/resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.4_fast.inst.cfg b/resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.4_fast.inst.cfg new file mode 100644 index 0000000000..f341d7724f --- /dev/null +++ b/resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.4_fast.inst.cfg @@ -0,0 +1,18 @@ +[general] +definition = flashforge_adventurer4 +name = Fast +version = 4 + +[metadata] +material = generic_pc +quality_type = fast +setting_version = 21 +type = quality +variant = 0.4mm Nozzle +weight = -1 + +[values] +speed_print = 40 +speed_travel = 80 +retraction_amount = 6 +retraction_speed = 30 diff --git a/resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.4_normal.inst.cfg b/resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.4_normal.inst.cfg new file mode 100644 index 0000000000..1e88648444 --- /dev/null +++ b/resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.4_normal.inst.cfg @@ -0,0 +1,18 @@ +[general] +definition = flashforge_adventurer4 +name = Standard +version = 4 + +[metadata] +material = generic_pc +quality_type = normal +setting_version = 21 +type = quality +variant = 0.4mm Nozzle +weight = 0 + +[values] +speed_print = 40 +speed_travel = 80 +retraction_amount = 6 +retraction_speed = 30 diff --git a/resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.4_vfast.inst.cfg b/resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.4_vfast.inst.cfg new file mode 100644 index 0000000000..2b3e88cdd7 --- /dev/null +++ b/resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.4_vfast.inst.cfg @@ -0,0 +1,18 @@ +[general] +definition = flashforge_adventurer4 +name = Very Fast +version = 4 + +[metadata] +material = generic_pc +quality_type = veryfast +setting_version = 21 +type = quality +variant = 0.4mm Nozzle +weight = -2 + +[values] +speed_print = 50 +speed_travel = 90 +retraction_amount = 6 +retraction_speed = 30 diff --git a/resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.6_draft.inst.cfg b/resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.6_draft.inst.cfg new file mode 100644 index 0000000000..3f6716dcff --- /dev/null +++ b/resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.6_draft.inst.cfg @@ -0,0 +1,18 @@ +[general] +definition = flashforge_adventurer4 +name = Draft +version = 4 + +[metadata] +material = generic_pc +quality_type = draft +setting_version = 21 +type = quality +variant = 0.6mm Nozzle +weight = -3 + +[values] +speed_print = 60 +speed_travel = 100 +retraction_amount = 6 +retraction_speed = 30 diff --git a/resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.6_fast.inst.cfg b/resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.6_fast.inst.cfg new file mode 100644 index 0000000000..1b712bfa46 --- /dev/null +++ b/resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.6_fast.inst.cfg @@ -0,0 +1,18 @@ +[general] +definition = flashforge_adventurer4 +name = Fast +version = 4 + +[metadata] +material = generic_pc +quality_type = fast +setting_version = 21 +type = quality +variant = 0.6mm Nozzle +weight = -2 + +[values] +speed_print = 50 +speed_travel = 100 +retraction_amount = 6 +retraction_speed = 30 diff --git a/resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.6_vfast.inst.cfg b/resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.6_vfast.inst.cfg new file mode 100644 index 0000000000..a39d97af60 --- /dev/null +++ b/resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.6_vfast.inst.cfg @@ -0,0 +1,18 @@ +[general] +definition = flashforge_adventurer4 +name = Very Fast +version = 4 + +[metadata] +material = generic_pc +quality_type = veryfast +setting_version = 21 +type = quality +variant = 0.6mm Nozzle +weight = -2 + +[values] +speed_print = 50 +speed_travel = 100 +retraction_amount = 6 +retraction_speed = 30 diff --git a/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.3_fine.inst.cfg b/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.3_fine.inst.cfg new file mode 100644 index 0000000000..3214b1e65f --- /dev/null +++ b/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.3_fine.inst.cfg @@ -0,0 +1,16 @@ +[general] +definition = flashforge_adventurer3 +name = Fine +version = 4 + +[metadata] +material = generic_petg +quality_type = fine +setting_version = 21 +type = quality +variant = 0.3mm Nozzle +weight = 1 + +[values] +speed_print = 50 +speed_travel = 80 diff --git a/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.3_vfine.inst.cfg b/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.3_vfine.inst.cfg new file mode 100644 index 0000000000..d47b336d62 --- /dev/null +++ b/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.3_vfine.inst.cfg @@ -0,0 +1,16 @@ +[general] +definition = flashforge_adventurer3 +name = Very Fine +version = 4 + +[metadata] +material = generic_petg +quality_type = veryfine +setting_version = 21 +type = quality +variant = 0.3mm Nozzle +weight = 2 + +[values] +speed_print = 50 +speed_travel = 80 diff --git a/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.4_draft.inst.cfg b/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.4_draft.inst.cfg new file mode 100644 index 0000000000..ac52407992 --- /dev/null +++ b/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.4_draft.inst.cfg @@ -0,0 +1,16 @@ +[general] +definition = flashforge_adventurer3 +name = Draft +version = 4 + +[metadata] +material = generic_petg +quality_type = draft +setting_version = 21 +type = quality +variant = 0.4mm Nozzle +weight = -3 + +[values] +speed_print = 65 +speed_travel = 100 diff --git a/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.4_fast.inst.cfg b/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.4_fast.inst.cfg new file mode 100644 index 0000000000..3650f3e826 --- /dev/null +++ b/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.4_fast.inst.cfg @@ -0,0 +1,16 @@ +[general] +definition = flashforge_adventurer3 +name = Fast +version = 4 + +[metadata] +material = generic_petg +quality_type = fast +setting_version = 21 +type = quality +variant = 0.4mm Nozzle +weight = -1 + +[values] +speed_print = 55 +speed_travel = 85 diff --git a/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.4_fine.inst.cfg b/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.4_fine.inst.cfg new file mode 100644 index 0000000000..ac4fc97e2e --- /dev/null +++ b/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.4_fine.inst.cfg @@ -0,0 +1,16 @@ +[general] +definition = flashforge_adventurer3 +name = Fine +version = 4 + +[metadata] +material = generic_petg +quality_type = fine +setting_version = 21 +type = quality +variant = 0.4mm Nozzle +weight = 1 + +[values] +speed_print = 40 +speed_travel = 80 diff --git a/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.4_normal.inst.cfg b/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.4_normal.inst.cfg new file mode 100644 index 0000000000..7008a176b1 --- /dev/null +++ b/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.4_normal.inst.cfg @@ -0,0 +1,16 @@ +[general] +definition = flashforge_adventurer3 +name = Standard +version = 4 + +[metadata] +material = generic_petg +quality_type = normal +setting_version = 21 +type = quality +variant = 0.4mm Nozzle +weight = 0 + +[values] +speed_print = 50 +speed_travel = 80 diff --git a/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.4_vfast.inst.cfg b/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.4_vfast.inst.cfg new file mode 100644 index 0000000000..5a694d0804 --- /dev/null +++ b/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.4_vfast.inst.cfg @@ -0,0 +1,16 @@ +[general] +definition = flashforge_adventurer3 +name = Very Fast +version = 4 + +[metadata] +material = generic_petg +quality_type = veryfast +setting_version = 21 +type = quality +variant = 0.4mm Nozzle +weight = -2 + +[values] +speed_print = 60 +speed_travel = 90 diff --git a/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.4_vfine.inst.cfg b/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.4_vfine.inst.cfg new file mode 100644 index 0000000000..1677dbd0be --- /dev/null +++ b/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.4_vfine.inst.cfg @@ -0,0 +1,16 @@ +[general] +definition = flashforge_adventurer3 +name = Very Fine +version = 4 + +[metadata] +material = generic_petg +quality_type = veryfine +setting_version = 21 +type = quality +variant = 0.4mm Nozzle +weight = 2 + +[values] +speed_print = 40 +speed_travel = 80 diff --git a/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.6_draft.inst.cfg b/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.6_draft.inst.cfg new file mode 100644 index 0000000000..70fad425e8 --- /dev/null +++ b/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.6_draft.inst.cfg @@ -0,0 +1,16 @@ +[general] +definition = flashforge_adventurer3 +name = Draft +version = 4 + +[metadata] +material = generic_petg +quality_type = draft +setting_version = 21 +type = quality +variant = 0.6mm Nozzle +weight = -3 + +[values] +speed_print = 65 +speed_travel = 100 diff --git a/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.6_fast.inst.cfg b/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.6_fast.inst.cfg new file mode 100644 index 0000000000..d13a93b251 --- /dev/null +++ b/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.6_fast.inst.cfg @@ -0,0 +1,16 @@ +[general] +definition = flashforge_adventurer3 +name = Fast +version = 4 + +[metadata] +material = generic_petg +quality_type = fast +setting_version = 21 +type = quality +variant = 0.6mm Nozzle +weight = -1 + +[values] +speed_print = 50 +speed_travel = 100 diff --git a/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.6_vfast.inst.cfg b/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.6_vfast.inst.cfg new file mode 100644 index 0000000000..5bbfb6e05e --- /dev/null +++ b/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.6_vfast.inst.cfg @@ -0,0 +1,16 @@ +[general] +definition = flashforge_adventurer3 +name = Very Fast +version = 4 + +[metadata] +material = generic_petg +quality_type = veryfast +setting_version = 21 +type = quality +variant = 0.6mm Nozzle +weight = -2 + +[values] +speed_print = 50 +speed_travel = 100 diff --git a/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.3_fine.inst.cfg b/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.3_fine.inst.cfg new file mode 100644 index 0000000000..434fc74717 --- /dev/null +++ b/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.3_fine.inst.cfg @@ -0,0 +1,18 @@ +[general] +definition = flashforge_adventurer4 +name = Fine +version = 4 + +[metadata] +material = generic_petg +quality_type = fine +setting_version = 21 +type = quality +variant = 0.3mm Nozzle +weight = 1 + +[values] +speed_print = 50 +speed_travel = 80 +retraction_amount = 5 +retraction_speed = 25 diff --git a/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.3_vfine.inst.cfg b/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.3_vfine.inst.cfg new file mode 100644 index 0000000000..e89b76891d --- /dev/null +++ b/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.3_vfine.inst.cfg @@ -0,0 +1,18 @@ +[general] +definition = flashforge_adventurer4 +name = Very Fine +version = 4 + +[metadata] +material = generic_petg +quality_type = veryfine +setting_version = 21 +type = quality +variant = 0.3mm Nozzle +weight = 2 + +[values] +speed_print = 50 +speed_travel = 80 +retraction_amount = 5 +retraction_speed = 25 diff --git a/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.4_draft.inst.cfg b/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.4_draft.inst.cfg new file mode 100644 index 0000000000..44444a4b1f --- /dev/null +++ b/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.4_draft.inst.cfg @@ -0,0 +1,18 @@ +[general] +definition = flashforge_adventurer4 +name = Draft +version = 4 + +[metadata] +material = generic_petg +quality_type = draft +setting_version = 21 +type = quality +variant = 0.4mm Nozzle +weight = -3 + +[values] +speed_print = 65 +speed_travel = 100 +retraction_amount = 5 +retraction_speed = 25 diff --git a/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.4_fast.inst.cfg b/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.4_fast.inst.cfg new file mode 100644 index 0000000000..6e5b64cd29 --- /dev/null +++ b/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.4_fast.inst.cfg @@ -0,0 +1,18 @@ +[general] +definition = flashforge_adventurer4 +name = Fast +version = 4 + +[metadata] +material = generic_petg +quality_type = fast +setting_version = 21 +type = quality +variant = 0.4mm Nozzle +weight = -1 + +[values] +speed_print = 55 +speed_travel = 85 +retraction_amount = 5 +retraction_speed = 25 diff --git a/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.4_fine.inst.cfg b/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.4_fine.inst.cfg new file mode 100644 index 0000000000..d3fb722875 --- /dev/null +++ b/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.4_fine.inst.cfg @@ -0,0 +1,18 @@ +[general] +definition = flashforge_adventurer4 +name = Fine +version = 4 + +[metadata] +material = generic_petg +quality_type = fine +setting_version = 21 +type = quality +variant = 0.4mm Nozzle +weight = 1 + +[values] +speed_print = 40 +speed_travel = 80 +retraction_amount = 5 +retraction_speed = 25 diff --git a/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.4_normal.inst.cfg b/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.4_normal.inst.cfg new file mode 100644 index 0000000000..8ebb7e12b2 --- /dev/null +++ b/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.4_normal.inst.cfg @@ -0,0 +1,18 @@ +[general] +definition = flashforge_adventurer4 +name = Standard +version = 4 + +[metadata] +material = generic_petg +quality_type = normal +setting_version = 21 +type = quality +variant = 0.4mm Nozzle +weight = 0 + +[values] +speed_print = 50 +speed_travel = 80 +retraction_amount = 5 +retraction_speed = 25 diff --git a/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.4_vfast.inst.cfg b/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.4_vfast.inst.cfg new file mode 100644 index 0000000000..4bf1f7d3a0 --- /dev/null +++ b/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.4_vfast.inst.cfg @@ -0,0 +1,18 @@ +[general] +definition = flashforge_adventurer4 +name = Very Fast +version = 4 + +[metadata] +material = generic_petg +quality_type = veryfast +setting_version = 21 +type = quality +variant = 0.4mm Nozzle +weight = -2 + +[values] +speed_print = 60 +speed_travel = 90 +retraction_amount = 5 +retraction_speed = 25 diff --git a/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.4_vfine.inst.cfg b/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.4_vfine.inst.cfg new file mode 100644 index 0000000000..17f75527f2 --- /dev/null +++ b/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.4_vfine.inst.cfg @@ -0,0 +1,18 @@ +[general] +definition = flashforge_adventurer4 +name = Very Fine +version = 4 + +[metadata] +material = generic_petg +quality_type = veryfine +setting_version = 21 +type = quality +variant = 0.4mm Nozzle +weight = 2 + +[values] +speed_print = 40 +speed_travel = 80 +retraction_amount = 5 +retraction_speed = 25 diff --git a/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.6_draft.inst.cfg b/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.6_draft.inst.cfg new file mode 100644 index 0000000000..1d7a88a4df --- /dev/null +++ b/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.6_draft.inst.cfg @@ -0,0 +1,18 @@ +[general] +definition = flashforge_adventurer4 +name = Draft +version = 4 + +[metadata] +material = generic_petg +quality_type = draft +setting_version = 21 +type = quality +variant = 0.6mm Nozzle +weight = -3 + +[values] +speed_print = 65 +speed_travel = 100 +retraction_amount = 5 +retraction_speed = 20 diff --git a/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.6_fast.inst.cfg b/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.6_fast.inst.cfg new file mode 100644 index 0000000000..428c853bab --- /dev/null +++ b/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.6_fast.inst.cfg @@ -0,0 +1,18 @@ +[general] +definition = flashforge_adventurer4 +name = Fast +version = 4 + +[metadata] +material = generic_petg +quality_type = fast +setting_version = 21 +type = quality +variant = 0.6mm Nozzle +weight = -1 + +[values] +speed_print = 50 +speed_travel = 100 +retraction_amount = 5 +retraction_speed = 20 diff --git a/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.6_vfast.inst.cfg b/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.6_vfast.inst.cfg new file mode 100644 index 0000000000..54fd9c2d6a --- /dev/null +++ b/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.6_vfast.inst.cfg @@ -0,0 +1,18 @@ +[general] +definition = flashforge_adventurer4 +name = Very Fast +version = 4 + +[metadata] +material = generic_petg +quality_type = veryfast +setting_version = 21 +type = quality +variant = 0.6mm Nozzle +weight = -2 + +[values] +speed_print = 50 +speed_travel = 100 +retraction_amount = 5 +retraction_speed = 20 diff --git a/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.3_fine.inst.cfg b/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.3_fine.inst.cfg new file mode 100644 index 0000000000..1816945692 --- /dev/null +++ b/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.3_fine.inst.cfg @@ -0,0 +1,16 @@ +[general] +definition = flashforge_adventurer3 +name = Fine +version = 4 + +[metadata] +material = generic_pla +quality_type = fine +setting_version = 21 +type = quality +variant = 0.3mm Nozzle +weight = 1 + +[values] +speed_print = 50 +speed_travel = 100 diff --git a/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.3_vfine.inst.cfg b/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.3_vfine.inst.cfg new file mode 100644 index 0000000000..803616ac35 --- /dev/null +++ b/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.3_vfine.inst.cfg @@ -0,0 +1,16 @@ +[general] +definition = flashforge_adventurer3 +name = Very Fine +version = 4 + +[metadata] +material = generic_pla +quality_type = veryfine +setting_version = 21 +type = quality +variant = 0.3mm Nozzle +weight = 2 + +[values] +speed_print = 45 +speed_travel = 100 diff --git a/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.4_draft.inst.cfg b/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.4_draft.inst.cfg new file mode 100644 index 0000000000..ea4e0e7e9a --- /dev/null +++ b/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.4_draft.inst.cfg @@ -0,0 +1,16 @@ +[general] +definition = flashforge_adventurer3 +name = Draft +version = 4 + +[metadata] +material = generic_pla +quality_type = draft +setting_version = 21 +type = quality +variant = 0.4mm Nozzle +weight = -3 + +[values] +speed_print = 75 +speed_travel = 100 diff --git a/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.4_fast.inst.cfg b/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.4_fast.inst.cfg new file mode 100644 index 0000000000..54d7d5e4e5 --- /dev/null +++ b/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.4_fast.inst.cfg @@ -0,0 +1,16 @@ +[general] +definition = flashforge_adventurer3 +name = Fast +version = 4 + +[metadata] +material = generic_pla +quality_type = fast +setting_version = 21 +type = quality +variant = 0.4mm Nozzle +weight = -1 + +[values] +speed_print = 65 +speed_travel = 100 diff --git a/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.4_fine.inst.cfg b/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.4_fine.inst.cfg new file mode 100644 index 0000000000..c8fcf7f463 --- /dev/null +++ b/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.4_fine.inst.cfg @@ -0,0 +1,16 @@ +[general] +definition = flashforge_adventurer3 +name = Fine +version = 4 + +[metadata] +material = generic_pla +quality_type = fine +setting_version = 21 +type = quality +variant = 0.4mm Nozzle +weight = 1 + +[values] +speed_print = 50 +speed_travel = 80 diff --git a/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.4_normal.inst.cfg b/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.4_normal.inst.cfg new file mode 100644 index 0000000000..f3c48970d8 --- /dev/null +++ b/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.4_normal.inst.cfg @@ -0,0 +1,16 @@ +[general] +definition = flashforge_adventurer3 +name = Standard +version = 4 + +[metadata] +material = generic_pla +quality_type = normal +setting_version = 21 +type = quality +variant = 0.4mm Nozzle +weight = 0 + +[values] +speed_print = 60 +speed_travel = 80 diff --git a/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.4_vfast.inst.cfg b/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.4_vfast.inst.cfg new file mode 100644 index 0000000000..101d2f5382 --- /dev/null +++ b/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.4_vfast.inst.cfg @@ -0,0 +1,16 @@ +[general] +definition = flashforge_adventurer3 +name = Very Fast +version = 4 + +[metadata] +material = generic_pla +quality_type = veryfast +setting_version = 21 +type = quality +variant = 0.4mm Nozzle +weight = -2 + +[values] +speed_print = 70 +speed_travel = 100 diff --git a/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.4_vfine.inst.cfg b/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.4_vfine.inst.cfg new file mode 100644 index 0000000000..bd044f5c75 --- /dev/null +++ b/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.4_vfine.inst.cfg @@ -0,0 +1,16 @@ +[general] +definition = flashforge_adventurer3 +name = Very Fine +version = 4 + +[metadata] +material = generic_pla +quality_type = veryfine +setting_version = 21 +type = quality +variant = 0.4mm Nozzle +weight = 2 + +[values] +speed_print = 40 +speed_travel = 70 diff --git a/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.6_draft.inst.cfg b/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.6_draft.inst.cfg new file mode 100644 index 0000000000..893f27f740 --- /dev/null +++ b/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.6_draft.inst.cfg @@ -0,0 +1,16 @@ +[general] +definition = flashforge_adventurer3 +name = Draft +version = 4 + +[metadata] +material = generic_pla +quality_type = draft +setting_version = 21 +type = quality +variant = 0.6mm Nozzle +weight = -2 + +[values] +speed_print = 60 +speed_travel = 100 diff --git a/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.6_fast.inst.cfg b/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.6_fast.inst.cfg new file mode 100644 index 0000000000..dc1dbb3290 --- /dev/null +++ b/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.6_fast.inst.cfg @@ -0,0 +1,16 @@ +[general] +definition = flashforge_adventurer3 +name = Fast +version = 4 + +[metadata] +material = generic_pla +quality_type = fast +setting_version = 21 +type = quality +variant = 0.6mm Nozzle +weight = -1 + +[values] +speed_print = 50 +speed_travel = 100 diff --git a/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.6_vfast.inst.cfg b/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.6_vfast.inst.cfg new file mode 100644 index 0000000000..d125db24b2 --- /dev/null +++ b/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.6_vfast.inst.cfg @@ -0,0 +1,16 @@ +[general] +definition = flashforge_adventurer3 +name = Very Fast +version = 4 + +[metadata] +material = generic_pla +quality_type = veryfast +setting_version = 21 +type = quality +variant = 0.6mm Nozzle +weight = -2 + +[values] +speed_print = 55 +speed_travel = 100 diff --git a/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.3_fine.inst.cfg b/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.3_fine.inst.cfg new file mode 100644 index 0000000000..73c214ba7b --- /dev/null +++ b/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.3_fine.inst.cfg @@ -0,0 +1,18 @@ +[general] +definition = flashforge_adventurer4 +name = Fine +version = 4 + +[metadata] +material = generic_pla +quality_type = fine +setting_version = 21 +type = quality +variant = 0.3mm Nozzle +weight = 1 + +[values] +speed_print = 50 +speed_travel = 100 +retraction_amount = 5 +retraction_speed = 30 diff --git a/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.3_vfine.inst.cfg b/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.3_vfine.inst.cfg new file mode 100644 index 0000000000..67674a8090 --- /dev/null +++ b/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.3_vfine.inst.cfg @@ -0,0 +1,18 @@ +[general] +definition = flashforge_adventurer4 +name = Very Fine +version = 4 + +[metadata] +material = generic_pla +quality_type = veryfine +setting_version = 21 +type = quality +variant = 0.3mm Nozzle +weight = 2 + +[values] +speed_print = 45 +speed_travel = 100 +retraction_amount = 5 +retraction_speed = 30 diff --git a/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.4_draft.inst.cfg b/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.4_draft.inst.cfg new file mode 100644 index 0000000000..38a42fd174 --- /dev/null +++ b/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.4_draft.inst.cfg @@ -0,0 +1,18 @@ +[general] +definition = flashforge_adventurer4 +name = Draft +version = 4 + +[metadata] +material = generic_pla +quality_type = draft +setting_version = 21 +type = quality +variant = 0.4mm Nozzle +weight = -2 + +[values] +speed_print = 65 +speed_travel = 100 +retraction_amount = 5.5 +retraction_speed = 25 diff --git a/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.4_fast.inst.cfg b/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.4_fast.inst.cfg new file mode 100644 index 0000000000..4f4fc97a51 --- /dev/null +++ b/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.4_fast.inst.cfg @@ -0,0 +1,18 @@ +[general] +definition = flashforge_adventurer4 +name = Fine +version = 4 + +[metadata] +material = generic_pla +quality_type = fine +setting_version = 21 +type = quality +variant = 0.4mm Nozzle +weight = -1 + +[values] +speed_print = 55 +speed_travel = 100 +retraction_amount = 5.5 +retraction_speed = 25 diff --git a/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.4_fine.inst.cfg b/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.4_fine.inst.cfg new file mode 100644 index 0000000000..e2923e6248 --- /dev/null +++ b/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.4_fine.inst.cfg @@ -0,0 +1,18 @@ +[general] +definition = flashforge_adventurer4 +name = Fine +version = 4 + +[metadata] +material = generic_pla +quality_type = fine +setting_version = 21 +type = quality +variant = 0.4mm Nozzle +weight = 1 + +[values] +speed_print = 45 +speed_travel = 90 +retraction_amount = 5.5 +retraction_speed = 25 diff --git a/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.4_normal.inst.cfg b/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.4_normal.inst.cfg new file mode 100644 index 0000000000..3c7d6d77ff --- /dev/null +++ b/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.4_normal.inst.cfg @@ -0,0 +1,18 @@ +[general] +definition = flashforge_adventurer4 +name = Standard +version = 4 + +[metadata] +material = generic_pla +quality_type = normal +setting_version = 21 +type = quality +variant = 0.4mm Nozzle +weight = 0 + +[values] +speed_print = 50 +speed_travel = 100 +retraction_amount = 5.5 +retraction_speed = 25 diff --git a/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.4_vfast.inst.cfg b/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.4_vfast.inst.cfg new file mode 100644 index 0000000000..3ec1e8214a --- /dev/null +++ b/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.4_vfast.inst.cfg @@ -0,0 +1,18 @@ +[general] +definition = flashforge_adventurer4 +name = Very Fast +version = 4 + +[metadata] +material = generic_pla +quality_type = veryfast +setting_version = 21 +type = quality +variant = 0.4mm Nozzle +weight = -2 + +[values] +speed_print = 60 +speed_travel = 100 +retraction_amount = 5.5 +retraction_speed = 25 diff --git a/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.4_vfine.inst.cfg b/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.4_vfine.inst.cfg new file mode 100644 index 0000000000..51a47cb739 --- /dev/null +++ b/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.4_vfine.inst.cfg @@ -0,0 +1,18 @@ +[general] +definition = flashforge_adventurer4 +name = Very Fine +version = 4 + +[metadata] +material = generic_pla +quality_type = veryfine +setting_version = 21 +type = quality +variant = 0.4mm Nozzle +weight = 2 + +[values] +speed_print = 40 +speed_travel = 80 +retraction_amount = 5.5 +retraction_speed = 25 diff --git a/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.6_draft.inst.cfg b/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.6_draft.inst.cfg new file mode 100644 index 0000000000..9ef5c56434 --- /dev/null +++ b/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.6_draft.inst.cfg @@ -0,0 +1,18 @@ +[general] +definition = flashforge_adventurer4 +name = Draft +version = 4 + +[metadata] +material = generic_pla +quality_type = draft +setting_version = 21 +type = quality +variant = 0.6mm Nozzle +weight = -2 + +[values] +speed_print = 65 +speed_travel = 100 +retraction_amount = 6 +retraction_speed = 30 diff --git a/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.6_fast.inst.cfg b/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.6_fast.inst.cfg new file mode 100644 index 0000000000..86790e1c93 --- /dev/null +++ b/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.6_fast.inst.cfg @@ -0,0 +1,18 @@ +[general] +definition = flashforge_adventurer4 +name = Fast +version = 4 + +[metadata] +material = generic_pla +quality_type = fast +setting_version = 21 +type = quality +variant = 0.6mm Nozzle +weight = -1 + +[values] +speed_print = 60 +speed_travel = 100 +retraction_amount = 6 +retraction_speed = 30 diff --git a/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.6_vfast.inst.cfg b/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.6_vfast.inst.cfg new file mode 100644 index 0000000000..a29696a8ff --- /dev/null +++ b/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.6_vfast.inst.cfg @@ -0,0 +1,18 @@ +[general] +definition = flashforge_adventurer4 +name = Very Fast +version = 4 + +[metadata] +material = generic_pla +quality_type = veryfast +setting_version = 21 +type = quality +variant = 0.6mm Nozzle +weight = -2 + +[values] +speed_print = 60 +speed_travel = 100 +retraction_amount = 6 +retraction_speed = 30 From dedfdb1d88b718c8cc92cf83338c53de7cd6e279 Mon Sep 17 00:00:00 2001 From: Jeremie Date: Fri, 26 May 2023 14:34:29 +0200 Subject: [PATCH 003/182] Variants to setting_version 22 --- .../variants/flashforge/flashforge_adventurer3_0.3.inst.cfg | 2 +- .../variants/flashforge/flashforge_adventurer3_0.4.inst.cfg | 2 +- .../variants/flashforge/flashforge_adventurer3_0.6.inst.cfg | 2 +- .../variants/flashforge/flashforge_adventurer3c_0.3.inst.cfg | 2 +- .../variants/flashforge/flashforge_adventurer3c_0.4.inst.cfg | 2 +- .../variants/flashforge/flashforge_adventurer3c_0.6.inst.cfg | 2 +- .../variants/flashforge/flashforge_adventurer4_0.3.inst.cfg | 2 +- .../variants/flashforge/flashforge_adventurer4_0.4.inst.cfg | 2 +- .../variants/flashforge/flashforge_adventurer4_0.6.inst.cfg | 2 +- .../variants/flashforge/flashforge_adventurer4lite_0.3.inst.cfg | 2 +- .../variants/flashforge/flashforge_adventurer4lite_0.4.inst.cfg | 2 +- .../variants/flashforge/flashforge_adventurer4lite_0.6.inst.cfg | 2 +- 12 files changed, 12 insertions(+), 12 deletions(-) diff --git a/resources/variants/flashforge/flashforge_adventurer3_0.3.inst.cfg b/resources/variants/flashforge/flashforge_adventurer3_0.3.inst.cfg index 98319a87a7..9233d066d2 100644 --- a/resources/variants/flashforge/flashforge_adventurer3_0.3.inst.cfg +++ b/resources/variants/flashforge/flashforge_adventurer3_0.3.inst.cfg @@ -5,7 +5,7 @@ version = 4 [metadata] hardware_type = nozzle -setting_version = 21 +setting_version = 22 type = variant [values] diff --git a/resources/variants/flashforge/flashforge_adventurer3_0.4.inst.cfg b/resources/variants/flashforge/flashforge_adventurer3_0.4.inst.cfg index 3357045ab6..9217a0a518 100644 --- a/resources/variants/flashforge/flashforge_adventurer3_0.4.inst.cfg +++ b/resources/variants/flashforge/flashforge_adventurer3_0.4.inst.cfg @@ -5,7 +5,7 @@ version = 4 [metadata] hardware_type = nozzle -setting_version = 21 +setting_version = 22 type = variant [values] diff --git a/resources/variants/flashforge/flashforge_adventurer3_0.6.inst.cfg b/resources/variants/flashforge/flashforge_adventurer3_0.6.inst.cfg index aaf69b516d..5e712bb0f5 100644 --- a/resources/variants/flashforge/flashforge_adventurer3_0.6.inst.cfg +++ b/resources/variants/flashforge/flashforge_adventurer3_0.6.inst.cfg @@ -5,7 +5,7 @@ version = 4 [metadata] hardware_type = nozzle -setting_version = 21 +setting_version = 22 type = variant [values] diff --git a/resources/variants/flashforge/flashforge_adventurer3c_0.3.inst.cfg b/resources/variants/flashforge/flashforge_adventurer3c_0.3.inst.cfg index 56f983be94..c7162ed63b 100644 --- a/resources/variants/flashforge/flashforge_adventurer3c_0.3.inst.cfg +++ b/resources/variants/flashforge/flashforge_adventurer3c_0.3.inst.cfg @@ -5,7 +5,7 @@ version = 4 [metadata] hardware_type = nozzle -setting_version = 21 +setting_version = 22 type = variant [values] diff --git a/resources/variants/flashforge/flashforge_adventurer3c_0.4.inst.cfg b/resources/variants/flashforge/flashforge_adventurer3c_0.4.inst.cfg index c45a46dbc6..75b8cf227d 100644 --- a/resources/variants/flashforge/flashforge_adventurer3c_0.4.inst.cfg +++ b/resources/variants/flashforge/flashforge_adventurer3c_0.4.inst.cfg @@ -5,7 +5,7 @@ version = 4 [metadata] hardware_type = nozzle -setting_version = 21 +setting_version = 22 type = variant [values] diff --git a/resources/variants/flashforge/flashforge_adventurer3c_0.6.inst.cfg b/resources/variants/flashforge/flashforge_adventurer3c_0.6.inst.cfg index 15bfd3f8be..07898deed7 100644 --- a/resources/variants/flashforge/flashforge_adventurer3c_0.6.inst.cfg +++ b/resources/variants/flashforge/flashforge_adventurer3c_0.6.inst.cfg @@ -5,7 +5,7 @@ version = 4 [metadata] hardware_type = nozzle -setting_version = 21 +setting_version = 22 type = variant [values] diff --git a/resources/variants/flashforge/flashforge_adventurer4_0.3.inst.cfg b/resources/variants/flashforge/flashforge_adventurer4_0.3.inst.cfg index 57a9dab4b1..36902259f1 100644 --- a/resources/variants/flashforge/flashforge_adventurer4_0.3.inst.cfg +++ b/resources/variants/flashforge/flashforge_adventurer4_0.3.inst.cfg @@ -5,7 +5,7 @@ version = 4 [metadata] hardware_type = nozzle -setting_version = 21 +setting_version = 22 type = variant [values] diff --git a/resources/variants/flashforge/flashforge_adventurer4_0.4.inst.cfg b/resources/variants/flashforge/flashforge_adventurer4_0.4.inst.cfg index b451d4e681..8433cc42d8 100644 --- a/resources/variants/flashforge/flashforge_adventurer4_0.4.inst.cfg +++ b/resources/variants/flashforge/flashforge_adventurer4_0.4.inst.cfg @@ -5,7 +5,7 @@ version = 4 [metadata] hardware_type = nozzle -setting_version = 21 +setting_version = 22 type = variant [values] diff --git a/resources/variants/flashforge/flashforge_adventurer4_0.6.inst.cfg b/resources/variants/flashforge/flashforge_adventurer4_0.6.inst.cfg index 2f9568d49c..39604fef55 100644 --- a/resources/variants/flashforge/flashforge_adventurer4_0.6.inst.cfg +++ b/resources/variants/flashforge/flashforge_adventurer4_0.6.inst.cfg @@ -5,7 +5,7 @@ version = 4 [metadata] hardware_type = nozzle -setting_version = 21 +setting_version = 22 type = variant [values] diff --git a/resources/variants/flashforge/flashforge_adventurer4lite_0.3.inst.cfg b/resources/variants/flashforge/flashforge_adventurer4lite_0.3.inst.cfg index bc12e7191d..8c1a1d6e2f 100644 --- a/resources/variants/flashforge/flashforge_adventurer4lite_0.3.inst.cfg +++ b/resources/variants/flashforge/flashforge_adventurer4lite_0.3.inst.cfg @@ -5,7 +5,7 @@ version = 4 [metadata] hardware_type = nozzle -setting_version = 21 +setting_version = 22 type = variant [values] diff --git a/resources/variants/flashforge/flashforge_adventurer4lite_0.4.inst.cfg b/resources/variants/flashforge/flashforge_adventurer4lite_0.4.inst.cfg index 2fc42fbb12..16d8876485 100644 --- a/resources/variants/flashforge/flashforge_adventurer4lite_0.4.inst.cfg +++ b/resources/variants/flashforge/flashforge_adventurer4lite_0.4.inst.cfg @@ -5,7 +5,7 @@ version = 4 [metadata] hardware_type = nozzle -setting_version = 21 +setting_version = 22 type = variant [values] diff --git a/resources/variants/flashforge/flashforge_adventurer4lite_0.6.inst.cfg b/resources/variants/flashforge/flashforge_adventurer4lite_0.6.inst.cfg index 8da55dd9d1..b9832c7d84 100644 --- a/resources/variants/flashforge/flashforge_adventurer4lite_0.6.inst.cfg +++ b/resources/variants/flashforge/flashforge_adventurer4lite_0.6.inst.cfg @@ -5,7 +5,7 @@ version = 4 [metadata] hardware_type = nozzle -setting_version = 21 +setting_version = 22 type = variant [values] From fb5da34a71ca9164ad5685f91092fa00bc3fe84a Mon Sep 17 00:00:00 2001 From: Jeremie Date: Fri, 26 May 2023 14:36:19 +0200 Subject: [PATCH 004/182] Quality to setting_version 22 --- .../flashforge/abs/flashforge_adventurer3_abs_0.3_fine.inst.cfg | 2 +- .../abs/flashforge_adventurer3_abs_0.3_vfine.inst.cfg | 2 +- .../abs/flashforge_adventurer3_abs_0.4_draft.inst.cfg | 2 +- .../flashforge/abs/flashforge_adventurer3_abs_0.4_fast.inst.cfg | 2 +- .../flashforge/abs/flashforge_adventurer3_abs_0.4_fine.inst.cfg | 2 +- .../abs/flashforge_adventurer3_abs_0.4_normal.inst.cfg | 2 +- .../abs/flashforge_adventurer3_abs_0.4_vfast.inst.cfg | 2 +- .../abs/flashforge_adventurer3_abs_0.4_vfine.inst.cfg | 2 +- .../abs/flashforge_adventurer3_abs_0.6_draft.inst.cfg | 2 +- .../flashforge/abs/flashforge_adventurer3_abs_0.6_fast.inst.cfg | 2 +- .../abs/flashforge_adventurer3_abs_0.6_vfast.inst.cfg | 2 +- .../flashforge/abs/flashforge_adventurer4_abs_0.3_fine.inst.cfg | 2 +- .../abs/flashforge_adventurer4_abs_0.3_vfine.inst.cfg | 2 +- .../abs/flashforge_adventurer4_abs_0.4_draft.inst.cfg | 2 +- .../flashforge/abs/flashforge_adventurer4_abs_0.4_fast.inst.cfg | 2 +- .../flashforge/abs/flashforge_adventurer4_abs_0.4_fine.inst.cfg | 2 +- .../abs/flashforge_adventurer4_abs_0.4_normal.inst.cfg | 2 +- .../abs/flashforge_adventurer4_abs_0.4_vfast.inst.cfg | 2 +- .../abs/flashforge_adventurer4_abs_0.4_vfine.inst.cfg | 2 +- .../abs/flashforge_adventurer4_abs_0.6_draft.inst.cfg | 2 +- .../flashforge/abs/flashforge_adventurer4_abs_0.6_fast.inst.cfg | 2 +- .../abs/flashforge_adventurer4_abs_0.6_vfast.inst.cfg | 2 +- .../flashforge/asa/flashforge_adventurer4_asa_0.4_fast.inst.cfg | 2 +- .../flashforge/asa/flashforge_adventurer4_asa_0.4_fine.inst.cfg | 2 +- .../asa/flashforge_adventurer4_asa_0.4_normal.inst.cfg | 2 +- .../quality/flashforge/flashforge_adventurer3_draft.inst.cfg | 2 +- .../quality/flashforge/flashforge_adventurer3_fast.inst.cfg | 2 +- .../quality/flashforge/flashforge_adventurer3_fine.inst.cfg | 2 +- .../quality/flashforge/flashforge_adventurer3_normal.inst.cfg | 2 +- .../quality/flashforge/flashforge_adventurer3_vfast.inst.cfg | 2 +- .../quality/flashforge/flashforge_adventurer3_vfine.inst.cfg | 2 +- .../quality/flashforge/flashforge_adventurer4_draft.inst.cfg | 2 +- .../quality/flashforge/flashforge_adventurer4_fast.inst.cfg | 2 +- .../quality/flashforge/flashforge_adventurer4_fine.inst.cfg | 2 +- .../quality/flashforge/flashforge_adventurer4_normal.inst.cfg | 2 +- .../quality/flashforge/flashforge_adventurer4_vfast.inst.cfg | 2 +- .../quality/flashforge/flashforge_adventurer4_vfine.inst.cfg | 2 +- .../flashforge/pc/flashforge_adventurer3_pc_0.4_draft.inst.cfg | 2 +- .../flashforge/pc/flashforge_adventurer3_pc_0.4_fast.inst.cfg | 2 +- .../flashforge/pc/flashforge_adventurer3_pc_0.4_normal.inst.cfg | 2 +- .../flashforge/pc/flashforge_adventurer3_pc_0.4_vfast.inst.cfg | 2 +- .../flashforge/pc/flashforge_adventurer3_pc_0.6_draft.inst.cfg | 2 +- .../flashforge/pc/flashforge_adventurer3_pc_0.6_fast.inst.cfg | 2 +- .../flashforge/pc/flashforge_adventurer3_pc_0.6_vfast.inst.cfg | 2 +- .../flashforge/pc/flashforge_adventurer4_pc_0.4_draft.inst.cfg | 2 +- .../flashforge/pc/flashforge_adventurer4_pc_0.4_fast.inst.cfg | 2 +- .../flashforge/pc/flashforge_adventurer4_pc_0.4_normal.inst.cfg | 2 +- .../flashforge/pc/flashforge_adventurer4_pc_0.4_vfast.inst.cfg | 2 +- .../flashforge/pc/flashforge_adventurer4_pc_0.6_draft.inst.cfg | 2 +- .../flashforge/pc/flashforge_adventurer4_pc_0.6_fast.inst.cfg | 2 +- .../flashforge/pc/flashforge_adventurer4_pc_0.6_vfast.inst.cfg | 2 +- .../petg/flashforge_adventurer3_petg_0.3_fine.inst.cfg | 2 +- .../petg/flashforge_adventurer3_petg_0.3_vfine.inst.cfg | 2 +- .../petg/flashforge_adventurer3_petg_0.4_draft.inst.cfg | 2 +- .../petg/flashforge_adventurer3_petg_0.4_fast.inst.cfg | 2 +- .../petg/flashforge_adventurer3_petg_0.4_fine.inst.cfg | 2 +- .../petg/flashforge_adventurer3_petg_0.4_normal.inst.cfg | 2 +- .../petg/flashforge_adventurer3_petg_0.4_vfast.inst.cfg | 2 +- .../petg/flashforge_adventurer3_petg_0.4_vfine.inst.cfg | 2 +- .../petg/flashforge_adventurer3_petg_0.6_draft.inst.cfg | 2 +- .../petg/flashforge_adventurer3_petg_0.6_fast.inst.cfg | 2 +- .../petg/flashforge_adventurer3_petg_0.6_vfast.inst.cfg | 2 +- .../petg/flashforge_adventurer4_petg_0.3_fine.inst.cfg | 2 +- .../petg/flashforge_adventurer4_petg_0.3_vfine.inst.cfg | 2 +- .../petg/flashforge_adventurer4_petg_0.4_draft.inst.cfg | 2 +- .../petg/flashforge_adventurer4_petg_0.4_fast.inst.cfg | 2 +- .../petg/flashforge_adventurer4_petg_0.4_fine.inst.cfg | 2 +- .../petg/flashforge_adventurer4_petg_0.4_normal.inst.cfg | 2 +- .../petg/flashforge_adventurer4_petg_0.4_vfast.inst.cfg | 2 +- .../petg/flashforge_adventurer4_petg_0.4_vfine.inst.cfg | 2 +- .../petg/flashforge_adventurer4_petg_0.6_draft.inst.cfg | 2 +- .../petg/flashforge_adventurer4_petg_0.6_fast.inst.cfg | 2 +- .../petg/flashforge_adventurer4_petg_0.6_vfast.inst.cfg | 2 +- .../flashforge/pla/flashforge_adventurer3_pla_0.3_fine.inst.cfg | 2 +- .../pla/flashforge_adventurer3_pla_0.3_vfine.inst.cfg | 2 +- .../pla/flashforge_adventurer3_pla_0.4_draft.inst.cfg | 2 +- .../flashforge/pla/flashforge_adventurer3_pla_0.4_fast.inst.cfg | 2 +- .../flashforge/pla/flashforge_adventurer3_pla_0.4_fine.inst.cfg | 2 +- .../pla/flashforge_adventurer3_pla_0.4_normal.inst.cfg | 2 +- .../pla/flashforge_adventurer3_pla_0.4_vfast.inst.cfg | 2 +- .../pla/flashforge_adventurer3_pla_0.4_vfine.inst.cfg | 2 +- .../pla/flashforge_adventurer3_pla_0.6_draft.inst.cfg | 2 +- .../flashforge/pla/flashforge_adventurer3_pla_0.6_fast.inst.cfg | 2 +- .../pla/flashforge_adventurer3_pla_0.6_vfast.inst.cfg | 2 +- .../flashforge/pla/flashforge_adventurer4_pla_0.3_fine.inst.cfg | 2 +- .../pla/flashforge_adventurer4_pla_0.3_vfine.inst.cfg | 2 +- .../pla/flashforge_adventurer4_pla_0.4_draft.inst.cfg | 2 +- .../flashforge/pla/flashforge_adventurer4_pla_0.4_fast.inst.cfg | 2 +- .../flashforge/pla/flashforge_adventurer4_pla_0.4_fine.inst.cfg | 2 +- .../pla/flashforge_adventurer4_pla_0.4_normal.inst.cfg | 2 +- .../pla/flashforge_adventurer4_pla_0.4_vfast.inst.cfg | 2 +- .../pla/flashforge_adventurer4_pla_0.4_vfine.inst.cfg | 2 +- .../pla/flashforge_adventurer4_pla_0.6_draft.inst.cfg | 2 +- .../flashforge/pla/flashforge_adventurer4_pla_0.6_fast.inst.cfg | 2 +- .../pla/flashforge_adventurer4_pla_0.6_vfast.inst.cfg | 2 +- 95 files changed, 95 insertions(+), 95 deletions(-) diff --git a/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.3_fine.inst.cfg b/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.3_fine.inst.cfg index 17d9129838..63488b25cf 100644 --- a/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.3_fine.inst.cfg +++ b/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.3_fine.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] material = generic_abs quality_type = fine -setting_version = 21 +setting_version = 22 type = quality variant = 0.3mm Nozzle weight = 1 diff --git a/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.3_vfine.inst.cfg b/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.3_vfine.inst.cfg index d081363cde..466e76686a 100644 --- a/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.3_vfine.inst.cfg +++ b/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.3_vfine.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] material = generic_abs quality_type = veryfine -setting_version = 21 +setting_version = 22 type = quality variant = 0.3mm Nozzle weight = 2 diff --git a/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.4_draft.inst.cfg b/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.4_draft.inst.cfg index f392ad07fa..678ab9d371 100644 --- a/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.4_draft.inst.cfg +++ b/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.4_draft.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] material = generic_abs quality_type = draft -setting_version = 21 +setting_version = 22 type = quality variant = 0.4mm Nozzle weight = -3 diff --git a/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.4_fast.inst.cfg b/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.4_fast.inst.cfg index 4bba44bee9..0b2e235d92 100644 --- a/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.4_fast.inst.cfg +++ b/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.4_fast.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] material = generic_abs quality_type = fast -setting_version = 21 +setting_version = 22 type = quality variant = 0.4mm Nozzle weight = -1 diff --git a/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.4_fine.inst.cfg b/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.4_fine.inst.cfg index 7e46e9dd35..b71dc27d96 100644 --- a/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.4_fine.inst.cfg +++ b/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.4_fine.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] material = generic_abs quality_type = fine -setting_version = 21 +setting_version = 22 type = quality variant = 0.4mm Nozzle weight = 1 diff --git a/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.4_normal.inst.cfg b/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.4_normal.inst.cfg index 23b4fd2cb3..9641fb7bef 100644 --- a/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.4_normal.inst.cfg +++ b/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.4_normal.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] material = generic_abs quality_type = normal -setting_version = 21 +setting_version = 22 type = quality variant = 0.4mm Nozzle weight = 0 diff --git a/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.4_vfast.inst.cfg b/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.4_vfast.inst.cfg index 9370e5d647..5c1c0138e8 100644 --- a/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.4_vfast.inst.cfg +++ b/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.4_vfast.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] material = generic_abs quality_type = veryfast -setting_version = 21 +setting_version = 22 type = quality variant = 0.4mm Nozzle weight = -2 diff --git a/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.4_vfine.inst.cfg b/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.4_vfine.inst.cfg index 158014be49..465ee99c88 100644 --- a/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.4_vfine.inst.cfg +++ b/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.4_vfine.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] material = generic_abs quality_type = veryfine -setting_version = 21 +setting_version = 22 type = quality variant = 0.4mm Nozzle weight = 2 diff --git a/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.6_draft.inst.cfg b/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.6_draft.inst.cfg index 29bff5b090..7fae92a487 100644 --- a/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.6_draft.inst.cfg +++ b/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.6_draft.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] material = generic_abs quality_type = draft -setting_version = 21 +setting_version = 22 type = quality variant = 0.6mm Nozzle weight = -3 diff --git a/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.6_fast.inst.cfg b/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.6_fast.inst.cfg index 30d4ee5af8..7f99640845 100644 --- a/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.6_fast.inst.cfg +++ b/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.6_fast.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] material = generic_abs quality_type = fast -setting_version = 21 +setting_version = 22 type = quality variant = 0.6mm Nozzle weight = -1 diff --git a/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.6_vfast.inst.cfg b/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.6_vfast.inst.cfg index 468aeb2244..c0212259a1 100644 --- a/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.6_vfast.inst.cfg +++ b/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.6_vfast.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] material = generic_abs quality_type = veryfast -setting_version = 21 +setting_version = 22 type = quality variant = 0.6mm Nozzle weight = -2 diff --git a/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.3_fine.inst.cfg b/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.3_fine.inst.cfg index 977fd8a7b4..ac6dfe5a33 100644 --- a/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.3_fine.inst.cfg +++ b/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.3_fine.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] material = generic_abs quality_type = fine -setting_version = 21 +setting_version = 22 type = quality variant = 0.3mm Nozzle weight = 1 diff --git a/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.3_vfine.inst.cfg b/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.3_vfine.inst.cfg index 880009f3da..4c4a0873d3 100644 --- a/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.3_vfine.inst.cfg +++ b/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.3_vfine.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] material = generic_abs quality_type = veryfine -setting_version = 21 +setting_version = 22 type = quality variant = 0.3mm Nozzle weight = 2 diff --git a/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.4_draft.inst.cfg b/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.4_draft.inst.cfg index 2a8c1c2f6c..62ad84398c 100644 --- a/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.4_draft.inst.cfg +++ b/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.4_draft.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] material = generic_abs quality_type = draft -setting_version = 21 +setting_version = 22 type = quality variant = 0.4mm Nozzle weight = -3 diff --git a/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.4_fast.inst.cfg b/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.4_fast.inst.cfg index 873d134ee3..b15ad40f22 100644 --- a/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.4_fast.inst.cfg +++ b/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.4_fast.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] material = generic_abs quality_type = fast -setting_version = 21 +setting_version = 22 type = quality variant = 0.4mm Nozzle weight = -1 diff --git a/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.4_fine.inst.cfg b/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.4_fine.inst.cfg index 36f408498c..1d325765ff 100644 --- a/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.4_fine.inst.cfg +++ b/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.4_fine.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] material = generic_abs quality_type = fine -setting_version = 21 +setting_version = 22 type = quality variant = 0.4mm Nozzle weight = 1 diff --git a/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.4_normal.inst.cfg b/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.4_normal.inst.cfg index f027fa295f..c4e43d5eac 100644 --- a/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.4_normal.inst.cfg +++ b/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.4_normal.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] material = generic_abs quality_type = normal -setting_version = 21 +setting_version = 22 type = quality variant = 0.4mm Nozzle weight = 0 diff --git a/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.4_vfast.inst.cfg b/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.4_vfast.inst.cfg index 4ed26f1ded..f3f8ada9d9 100644 --- a/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.4_vfast.inst.cfg +++ b/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.4_vfast.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] material = generic_abs quality_type = veryfast -setting_version = 21 +setting_version = 22 type = quality variant = 0.4mm Nozzle weight = -2 diff --git a/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.4_vfine.inst.cfg b/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.4_vfine.inst.cfg index 5bb99865c8..5eefe21407 100644 --- a/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.4_vfine.inst.cfg +++ b/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.4_vfine.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] material = generic_abs quality_type = veryfine -setting_version = 21 +setting_version = 22 type = quality variant = 0.4mm Nozzle weight = 2 diff --git a/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.6_draft.inst.cfg b/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.6_draft.inst.cfg index 29ee87d4ab..bf7f894937 100644 --- a/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.6_draft.inst.cfg +++ b/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.6_draft.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] material = generic_abs quality_type = draft -setting_version = 21 +setting_version = 22 type = quality variant = 0.6mm Nozzle weight = -3 diff --git a/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.6_fast.inst.cfg b/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.6_fast.inst.cfg index 37d421bcb0..e97b00157b 100644 --- a/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.6_fast.inst.cfg +++ b/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.6_fast.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] material = generic_abs quality_type = fast -setting_version = 21 +setting_version = 22 type = quality variant = 0.6mm Nozzle weight = -1 diff --git a/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.6_vfast.inst.cfg b/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.6_vfast.inst.cfg index ede2b19a6d..4ccdd81053 100644 --- a/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.6_vfast.inst.cfg +++ b/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.6_vfast.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] material = generic_abs quality_type = veryfast -setting_version = 21 +setting_version = 22 type = quality variant = 0.6mm Nozzle weight = -2 diff --git a/resources/quality/flashforge/asa/flashforge_adventurer4_asa_0.4_fast.inst.cfg b/resources/quality/flashforge/asa/flashforge_adventurer4_asa_0.4_fast.inst.cfg index 498ec3781b..5677c663f1 100644 --- a/resources/quality/flashforge/asa/flashforge_adventurer4_asa_0.4_fast.inst.cfg +++ b/resources/quality/flashforge/asa/flashforge_adventurer4_asa_0.4_fast.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] material = generic_asa quality_type = fast -setting_version = 21 +setting_version = 22 type = quality variant = 0.4mm Nozzle weight = -1 diff --git a/resources/quality/flashforge/asa/flashforge_adventurer4_asa_0.4_fine.inst.cfg b/resources/quality/flashforge/asa/flashforge_adventurer4_asa_0.4_fine.inst.cfg index 5ad56f447c..f9f6c6287d 100644 --- a/resources/quality/flashforge/asa/flashforge_adventurer4_asa_0.4_fine.inst.cfg +++ b/resources/quality/flashforge/asa/flashforge_adventurer4_asa_0.4_fine.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] material = generic_asa quality_type = fine -setting_version = 21 +setting_version = 22 type = quality variant = 0.4mm Nozzle weight = -1 diff --git a/resources/quality/flashforge/asa/flashforge_adventurer4_asa_0.4_normal.inst.cfg b/resources/quality/flashforge/asa/flashforge_adventurer4_asa_0.4_normal.inst.cfg index 210c3e6d6d..ba9bb86f37 100644 --- a/resources/quality/flashforge/asa/flashforge_adventurer4_asa_0.4_normal.inst.cfg +++ b/resources/quality/flashforge/asa/flashforge_adventurer4_asa_0.4_normal.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] material = generic_asa quality_type = normal -setting_version = 21 +setting_version = 22 type = quality variant = 0.4mm Nozzle weight = 0 diff --git a/resources/quality/flashforge/flashforge_adventurer3_draft.inst.cfg b/resources/quality/flashforge/flashforge_adventurer3_draft.inst.cfg index 21033c046b..61123554fb 100644 --- a/resources/quality/flashforge/flashforge_adventurer3_draft.inst.cfg +++ b/resources/quality/flashforge/flashforge_adventurer3_draft.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] global_quality = True quality_type = draft -setting_version = 21 +setting_version = 22 type = quality weight = -3 diff --git a/resources/quality/flashforge/flashforge_adventurer3_fast.inst.cfg b/resources/quality/flashforge/flashforge_adventurer3_fast.inst.cfg index cad53fac1d..f9d1cda998 100644 --- a/resources/quality/flashforge/flashforge_adventurer3_fast.inst.cfg +++ b/resources/quality/flashforge/flashforge_adventurer3_fast.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] global_quality = True quality_type = fast -setting_version = 21 +setting_version = 22 type = quality weight = -1 diff --git a/resources/quality/flashforge/flashforge_adventurer3_fine.inst.cfg b/resources/quality/flashforge/flashforge_adventurer3_fine.inst.cfg index 0380146a38..2d0d2d5b81 100644 --- a/resources/quality/flashforge/flashforge_adventurer3_fine.inst.cfg +++ b/resources/quality/flashforge/flashforge_adventurer3_fine.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] global_quality = True quality_type = fine -setting_version = 21 +setting_version = 22 type = quality weight = 1 diff --git a/resources/quality/flashforge/flashforge_adventurer3_normal.inst.cfg b/resources/quality/flashforge/flashforge_adventurer3_normal.inst.cfg index 4caa292116..b70f28c86f 100644 --- a/resources/quality/flashforge/flashforge_adventurer3_normal.inst.cfg +++ b/resources/quality/flashforge/flashforge_adventurer3_normal.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] global_quality = True quality_type = normal -setting_version = 21 +setting_version = 22 type = quality weight = 0 diff --git a/resources/quality/flashforge/flashforge_adventurer3_vfast.inst.cfg b/resources/quality/flashforge/flashforge_adventurer3_vfast.inst.cfg index 1b229b4a99..3f6379a6f5 100644 --- a/resources/quality/flashforge/flashforge_adventurer3_vfast.inst.cfg +++ b/resources/quality/flashforge/flashforge_adventurer3_vfast.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] global_quality = True quality_type = veryfast -setting_version = 21 +setting_version = 22 type = quality weight = -2 diff --git a/resources/quality/flashforge/flashforge_adventurer3_vfine.inst.cfg b/resources/quality/flashforge/flashforge_adventurer3_vfine.inst.cfg index f379409c4d..b2015d40ea 100644 --- a/resources/quality/flashforge/flashforge_adventurer3_vfine.inst.cfg +++ b/resources/quality/flashforge/flashforge_adventurer3_vfine.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] global_quality = True quality_type = veryfine -setting_version = 21 +setting_version = 22 type = quality weight = 2 diff --git a/resources/quality/flashforge/flashforge_adventurer4_draft.inst.cfg b/resources/quality/flashforge/flashforge_adventurer4_draft.inst.cfg index 4e03ee768d..b2f6dc976c 100644 --- a/resources/quality/flashforge/flashforge_adventurer4_draft.inst.cfg +++ b/resources/quality/flashforge/flashforge_adventurer4_draft.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] global_quality = True quality_type = draft -setting_version = 21 +setting_version = 22 type = quality weight = -3 diff --git a/resources/quality/flashforge/flashforge_adventurer4_fast.inst.cfg b/resources/quality/flashforge/flashforge_adventurer4_fast.inst.cfg index 6a55f7c1e9..a0a38c3655 100644 --- a/resources/quality/flashforge/flashforge_adventurer4_fast.inst.cfg +++ b/resources/quality/flashforge/flashforge_adventurer4_fast.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] global_quality = True quality_type = fast -setting_version = 21 +setting_version = 22 type = quality weight = -1 diff --git a/resources/quality/flashforge/flashforge_adventurer4_fine.inst.cfg b/resources/quality/flashforge/flashforge_adventurer4_fine.inst.cfg index e6d44d631e..8a5615287b 100644 --- a/resources/quality/flashforge/flashforge_adventurer4_fine.inst.cfg +++ b/resources/quality/flashforge/flashforge_adventurer4_fine.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] global_quality = True quality_type = fine -setting_version = 21 +setting_version = 22 type = quality weight = 1 diff --git a/resources/quality/flashforge/flashforge_adventurer4_normal.inst.cfg b/resources/quality/flashforge/flashforge_adventurer4_normal.inst.cfg index 0b0e69f8c6..64d0df68fc 100644 --- a/resources/quality/flashforge/flashforge_adventurer4_normal.inst.cfg +++ b/resources/quality/flashforge/flashforge_adventurer4_normal.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] global_quality = True quality_type = normal -setting_version = 21 +setting_version = 22 type = quality weight = 0 diff --git a/resources/quality/flashforge/flashforge_adventurer4_vfast.inst.cfg b/resources/quality/flashforge/flashforge_adventurer4_vfast.inst.cfg index a38f55477b..0b78e0e23e 100644 --- a/resources/quality/flashforge/flashforge_adventurer4_vfast.inst.cfg +++ b/resources/quality/flashforge/flashforge_adventurer4_vfast.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] global_quality = True quality_type = veryfast -setting_version = 21 +setting_version = 22 type = quality weight = -2 diff --git a/resources/quality/flashforge/flashforge_adventurer4_vfine.inst.cfg b/resources/quality/flashforge/flashforge_adventurer4_vfine.inst.cfg index 9ffcb1e44b..d3012d5975 100644 --- a/resources/quality/flashforge/flashforge_adventurer4_vfine.inst.cfg +++ b/resources/quality/flashforge/flashforge_adventurer4_vfine.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] global_quality = True quality_type = veryfine -setting_version = 21 +setting_version = 22 type = quality weight = 2 diff --git a/resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.4_draft.inst.cfg b/resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.4_draft.inst.cfg index 7a33b8e486..92467d9d57 100644 --- a/resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.4_draft.inst.cfg +++ b/resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.4_draft.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] material = generic_pc quality_type = draft -setting_version = 21 +setting_version = 22 type = quality variant = 0.4mm Nozzle weight = -3 diff --git a/resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.4_fast.inst.cfg b/resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.4_fast.inst.cfg index d6ff4cac8e..85811430f4 100644 --- a/resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.4_fast.inst.cfg +++ b/resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.4_fast.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] material = generic_pc quality_type = fast -setting_version = 21 +setting_version = 22 type = quality variant = 0.4mm Nozzle weight = -1 diff --git a/resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.4_normal.inst.cfg b/resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.4_normal.inst.cfg index 6b44a5dfc3..53431e511b 100644 --- a/resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.4_normal.inst.cfg +++ b/resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.4_normal.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] material = generic_pc quality_type = normal -setting_version = 21 +setting_version = 22 type = quality variant = 0.4mm Nozzle weight = 0 diff --git a/resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.4_vfast.inst.cfg b/resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.4_vfast.inst.cfg index 0e7691a28d..6d35450f90 100644 --- a/resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.4_vfast.inst.cfg +++ b/resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.4_vfast.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] material = generic_pc quality_type = veryfast -setting_version = 21 +setting_version = 22 type = quality variant = 0.4mm Nozzle weight = -2 diff --git a/resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.6_draft.inst.cfg b/resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.6_draft.inst.cfg index d7afbddbcd..bf0c0cce2d 100644 --- a/resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.6_draft.inst.cfg +++ b/resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.6_draft.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] material = generic_pc quality_type = draft -setting_version = 21 +setting_version = 22 type = quality variant = 0.6mm Nozzle weight = -3 diff --git a/resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.6_fast.inst.cfg b/resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.6_fast.inst.cfg index 9267502a89..c7599784fa 100644 --- a/resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.6_fast.inst.cfg +++ b/resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.6_fast.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] material = generic_pc quality_type = fast -setting_version = 21 +setting_version = 22 type = quality variant = 0.6mm Nozzle weight = -2 diff --git a/resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.6_vfast.inst.cfg b/resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.6_vfast.inst.cfg index 41fbacd635..7efde414c2 100644 --- a/resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.6_vfast.inst.cfg +++ b/resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.6_vfast.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] material = generic_pc quality_type = veryfast -setting_version = 21 +setting_version = 22 type = quality variant = 0.6mm Nozzle weight = -2 diff --git a/resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.4_draft.inst.cfg b/resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.4_draft.inst.cfg index b2927df668..a593db1ef2 100644 --- a/resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.4_draft.inst.cfg +++ b/resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.4_draft.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] material = generic_pc quality_type = draft -setting_version = 21 +setting_version = 22 type = quality variant = 0.4mm Nozzle weight = -3 diff --git a/resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.4_fast.inst.cfg b/resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.4_fast.inst.cfg index f341d7724f..7d7e937726 100644 --- a/resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.4_fast.inst.cfg +++ b/resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.4_fast.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] material = generic_pc quality_type = fast -setting_version = 21 +setting_version = 22 type = quality variant = 0.4mm Nozzle weight = -1 diff --git a/resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.4_normal.inst.cfg b/resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.4_normal.inst.cfg index 1e88648444..0806db424e 100644 --- a/resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.4_normal.inst.cfg +++ b/resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.4_normal.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] material = generic_pc quality_type = normal -setting_version = 21 +setting_version = 22 type = quality variant = 0.4mm Nozzle weight = 0 diff --git a/resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.4_vfast.inst.cfg b/resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.4_vfast.inst.cfg index 2b3e88cdd7..3556c8bf06 100644 --- a/resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.4_vfast.inst.cfg +++ b/resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.4_vfast.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] material = generic_pc quality_type = veryfast -setting_version = 21 +setting_version = 22 type = quality variant = 0.4mm Nozzle weight = -2 diff --git a/resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.6_draft.inst.cfg b/resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.6_draft.inst.cfg index 3f6716dcff..4cd2861cbe 100644 --- a/resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.6_draft.inst.cfg +++ b/resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.6_draft.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] material = generic_pc quality_type = draft -setting_version = 21 +setting_version = 22 type = quality variant = 0.6mm Nozzle weight = -3 diff --git a/resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.6_fast.inst.cfg b/resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.6_fast.inst.cfg index 1b712bfa46..14e162a1fc 100644 --- a/resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.6_fast.inst.cfg +++ b/resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.6_fast.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] material = generic_pc quality_type = fast -setting_version = 21 +setting_version = 22 type = quality variant = 0.6mm Nozzle weight = -2 diff --git a/resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.6_vfast.inst.cfg b/resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.6_vfast.inst.cfg index a39d97af60..f5a918d859 100644 --- a/resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.6_vfast.inst.cfg +++ b/resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.6_vfast.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] material = generic_pc quality_type = veryfast -setting_version = 21 +setting_version = 22 type = quality variant = 0.6mm Nozzle weight = -2 diff --git a/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.3_fine.inst.cfg b/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.3_fine.inst.cfg index 3214b1e65f..e640d316fe 100644 --- a/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.3_fine.inst.cfg +++ b/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.3_fine.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] material = generic_petg quality_type = fine -setting_version = 21 +setting_version = 22 type = quality variant = 0.3mm Nozzle weight = 1 diff --git a/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.3_vfine.inst.cfg b/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.3_vfine.inst.cfg index d47b336d62..7ef3d79fe8 100644 --- a/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.3_vfine.inst.cfg +++ b/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.3_vfine.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] material = generic_petg quality_type = veryfine -setting_version = 21 +setting_version = 22 type = quality variant = 0.3mm Nozzle weight = 2 diff --git a/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.4_draft.inst.cfg b/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.4_draft.inst.cfg index ac52407992..c51711ca2d 100644 --- a/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.4_draft.inst.cfg +++ b/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.4_draft.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] material = generic_petg quality_type = draft -setting_version = 21 +setting_version = 22 type = quality variant = 0.4mm Nozzle weight = -3 diff --git a/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.4_fast.inst.cfg b/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.4_fast.inst.cfg index 3650f3e826..abc16dfcb7 100644 --- a/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.4_fast.inst.cfg +++ b/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.4_fast.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] material = generic_petg quality_type = fast -setting_version = 21 +setting_version = 22 type = quality variant = 0.4mm Nozzle weight = -1 diff --git a/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.4_fine.inst.cfg b/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.4_fine.inst.cfg index ac4fc97e2e..6c39de897c 100644 --- a/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.4_fine.inst.cfg +++ b/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.4_fine.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] material = generic_petg quality_type = fine -setting_version = 21 +setting_version = 22 type = quality variant = 0.4mm Nozzle weight = 1 diff --git a/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.4_normal.inst.cfg b/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.4_normal.inst.cfg index 7008a176b1..be51926c7a 100644 --- a/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.4_normal.inst.cfg +++ b/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.4_normal.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] material = generic_petg quality_type = normal -setting_version = 21 +setting_version = 22 type = quality variant = 0.4mm Nozzle weight = 0 diff --git a/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.4_vfast.inst.cfg b/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.4_vfast.inst.cfg index 5a694d0804..1d8286d204 100644 --- a/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.4_vfast.inst.cfg +++ b/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.4_vfast.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] material = generic_petg quality_type = veryfast -setting_version = 21 +setting_version = 22 type = quality variant = 0.4mm Nozzle weight = -2 diff --git a/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.4_vfine.inst.cfg b/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.4_vfine.inst.cfg index 1677dbd0be..d06baed13c 100644 --- a/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.4_vfine.inst.cfg +++ b/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.4_vfine.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] material = generic_petg quality_type = veryfine -setting_version = 21 +setting_version = 22 type = quality variant = 0.4mm Nozzle weight = 2 diff --git a/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.6_draft.inst.cfg b/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.6_draft.inst.cfg index 70fad425e8..2f54c96ea4 100644 --- a/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.6_draft.inst.cfg +++ b/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.6_draft.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] material = generic_petg quality_type = draft -setting_version = 21 +setting_version = 22 type = quality variant = 0.6mm Nozzle weight = -3 diff --git a/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.6_fast.inst.cfg b/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.6_fast.inst.cfg index d13a93b251..aa55c43ad7 100644 --- a/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.6_fast.inst.cfg +++ b/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.6_fast.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] material = generic_petg quality_type = fast -setting_version = 21 +setting_version = 22 type = quality variant = 0.6mm Nozzle weight = -1 diff --git a/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.6_vfast.inst.cfg b/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.6_vfast.inst.cfg index 5bbfb6e05e..cb226be3c4 100644 --- a/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.6_vfast.inst.cfg +++ b/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.6_vfast.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] material = generic_petg quality_type = veryfast -setting_version = 21 +setting_version = 22 type = quality variant = 0.6mm Nozzle weight = -2 diff --git a/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.3_fine.inst.cfg b/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.3_fine.inst.cfg index 434fc74717..a17c8d9648 100644 --- a/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.3_fine.inst.cfg +++ b/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.3_fine.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] material = generic_petg quality_type = fine -setting_version = 21 +setting_version = 22 type = quality variant = 0.3mm Nozzle weight = 1 diff --git a/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.3_vfine.inst.cfg b/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.3_vfine.inst.cfg index e89b76891d..5091364e72 100644 --- a/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.3_vfine.inst.cfg +++ b/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.3_vfine.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] material = generic_petg quality_type = veryfine -setting_version = 21 +setting_version = 22 type = quality variant = 0.3mm Nozzle weight = 2 diff --git a/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.4_draft.inst.cfg b/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.4_draft.inst.cfg index 44444a4b1f..3a14489559 100644 --- a/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.4_draft.inst.cfg +++ b/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.4_draft.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] material = generic_petg quality_type = draft -setting_version = 21 +setting_version = 22 type = quality variant = 0.4mm Nozzle weight = -3 diff --git a/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.4_fast.inst.cfg b/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.4_fast.inst.cfg index 6e5b64cd29..b573bf5ea6 100644 --- a/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.4_fast.inst.cfg +++ b/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.4_fast.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] material = generic_petg quality_type = fast -setting_version = 21 +setting_version = 22 type = quality variant = 0.4mm Nozzle weight = -1 diff --git a/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.4_fine.inst.cfg b/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.4_fine.inst.cfg index d3fb722875..e00ff6968a 100644 --- a/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.4_fine.inst.cfg +++ b/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.4_fine.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] material = generic_petg quality_type = fine -setting_version = 21 +setting_version = 22 type = quality variant = 0.4mm Nozzle weight = 1 diff --git a/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.4_normal.inst.cfg b/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.4_normal.inst.cfg index 8ebb7e12b2..56df96187f 100644 --- a/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.4_normal.inst.cfg +++ b/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.4_normal.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] material = generic_petg quality_type = normal -setting_version = 21 +setting_version = 22 type = quality variant = 0.4mm Nozzle weight = 0 diff --git a/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.4_vfast.inst.cfg b/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.4_vfast.inst.cfg index 4bf1f7d3a0..7001124129 100644 --- a/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.4_vfast.inst.cfg +++ b/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.4_vfast.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] material = generic_petg quality_type = veryfast -setting_version = 21 +setting_version = 22 type = quality variant = 0.4mm Nozzle weight = -2 diff --git a/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.4_vfine.inst.cfg b/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.4_vfine.inst.cfg index 17f75527f2..a624956934 100644 --- a/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.4_vfine.inst.cfg +++ b/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.4_vfine.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] material = generic_petg quality_type = veryfine -setting_version = 21 +setting_version = 22 type = quality variant = 0.4mm Nozzle weight = 2 diff --git a/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.6_draft.inst.cfg b/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.6_draft.inst.cfg index 1d7a88a4df..5976fdf225 100644 --- a/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.6_draft.inst.cfg +++ b/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.6_draft.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] material = generic_petg quality_type = draft -setting_version = 21 +setting_version = 22 type = quality variant = 0.6mm Nozzle weight = -3 diff --git a/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.6_fast.inst.cfg b/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.6_fast.inst.cfg index 428c853bab..39d500ea83 100644 --- a/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.6_fast.inst.cfg +++ b/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.6_fast.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] material = generic_petg quality_type = fast -setting_version = 21 +setting_version = 22 type = quality variant = 0.6mm Nozzle weight = -1 diff --git a/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.6_vfast.inst.cfg b/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.6_vfast.inst.cfg index 54fd9c2d6a..0d7f397d7e 100644 --- a/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.6_vfast.inst.cfg +++ b/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.6_vfast.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] material = generic_petg quality_type = veryfast -setting_version = 21 +setting_version = 22 type = quality variant = 0.6mm Nozzle weight = -2 diff --git a/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.3_fine.inst.cfg b/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.3_fine.inst.cfg index 1816945692..ee221f5814 100644 --- a/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.3_fine.inst.cfg +++ b/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.3_fine.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] material = generic_pla quality_type = fine -setting_version = 21 +setting_version = 22 type = quality variant = 0.3mm Nozzle weight = 1 diff --git a/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.3_vfine.inst.cfg b/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.3_vfine.inst.cfg index 803616ac35..10861d3ac8 100644 --- a/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.3_vfine.inst.cfg +++ b/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.3_vfine.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] material = generic_pla quality_type = veryfine -setting_version = 21 +setting_version = 22 type = quality variant = 0.3mm Nozzle weight = 2 diff --git a/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.4_draft.inst.cfg b/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.4_draft.inst.cfg index ea4e0e7e9a..b31667ce5f 100644 --- a/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.4_draft.inst.cfg +++ b/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.4_draft.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] material = generic_pla quality_type = draft -setting_version = 21 +setting_version = 22 type = quality variant = 0.4mm Nozzle weight = -3 diff --git a/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.4_fast.inst.cfg b/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.4_fast.inst.cfg index 54d7d5e4e5..1517fb9086 100644 --- a/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.4_fast.inst.cfg +++ b/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.4_fast.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] material = generic_pla quality_type = fast -setting_version = 21 +setting_version = 22 type = quality variant = 0.4mm Nozzle weight = -1 diff --git a/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.4_fine.inst.cfg b/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.4_fine.inst.cfg index c8fcf7f463..b92f15246c 100644 --- a/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.4_fine.inst.cfg +++ b/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.4_fine.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] material = generic_pla quality_type = fine -setting_version = 21 +setting_version = 22 type = quality variant = 0.4mm Nozzle weight = 1 diff --git a/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.4_normal.inst.cfg b/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.4_normal.inst.cfg index f3c48970d8..cb7476638b 100644 --- a/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.4_normal.inst.cfg +++ b/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.4_normal.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] material = generic_pla quality_type = normal -setting_version = 21 +setting_version = 22 type = quality variant = 0.4mm Nozzle weight = 0 diff --git a/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.4_vfast.inst.cfg b/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.4_vfast.inst.cfg index 101d2f5382..970670b211 100644 --- a/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.4_vfast.inst.cfg +++ b/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.4_vfast.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] material = generic_pla quality_type = veryfast -setting_version = 21 +setting_version = 22 type = quality variant = 0.4mm Nozzle weight = -2 diff --git a/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.4_vfine.inst.cfg b/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.4_vfine.inst.cfg index bd044f5c75..a38658883b 100644 --- a/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.4_vfine.inst.cfg +++ b/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.4_vfine.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] material = generic_pla quality_type = veryfine -setting_version = 21 +setting_version = 22 type = quality variant = 0.4mm Nozzle weight = 2 diff --git a/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.6_draft.inst.cfg b/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.6_draft.inst.cfg index 893f27f740..620302a481 100644 --- a/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.6_draft.inst.cfg +++ b/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.6_draft.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] material = generic_pla quality_type = draft -setting_version = 21 +setting_version = 22 type = quality variant = 0.6mm Nozzle weight = -2 diff --git a/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.6_fast.inst.cfg b/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.6_fast.inst.cfg index dc1dbb3290..e2f91de812 100644 --- a/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.6_fast.inst.cfg +++ b/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.6_fast.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] material = generic_pla quality_type = fast -setting_version = 21 +setting_version = 22 type = quality variant = 0.6mm Nozzle weight = -1 diff --git a/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.6_vfast.inst.cfg b/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.6_vfast.inst.cfg index d125db24b2..b9f6ae4e88 100644 --- a/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.6_vfast.inst.cfg +++ b/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.6_vfast.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] material = generic_pla quality_type = veryfast -setting_version = 21 +setting_version = 22 type = quality variant = 0.6mm Nozzle weight = -2 diff --git a/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.3_fine.inst.cfg b/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.3_fine.inst.cfg index 73c214ba7b..3ef15e1736 100644 --- a/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.3_fine.inst.cfg +++ b/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.3_fine.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] material = generic_pla quality_type = fine -setting_version = 21 +setting_version = 22 type = quality variant = 0.3mm Nozzle weight = 1 diff --git a/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.3_vfine.inst.cfg b/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.3_vfine.inst.cfg index 67674a8090..cdd22c946f 100644 --- a/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.3_vfine.inst.cfg +++ b/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.3_vfine.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] material = generic_pla quality_type = veryfine -setting_version = 21 +setting_version = 22 type = quality variant = 0.3mm Nozzle weight = 2 diff --git a/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.4_draft.inst.cfg b/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.4_draft.inst.cfg index 38a42fd174..993064a6df 100644 --- a/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.4_draft.inst.cfg +++ b/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.4_draft.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] material = generic_pla quality_type = draft -setting_version = 21 +setting_version = 22 type = quality variant = 0.4mm Nozzle weight = -2 diff --git a/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.4_fast.inst.cfg b/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.4_fast.inst.cfg index 4f4fc97a51..2d4aff0fe6 100644 --- a/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.4_fast.inst.cfg +++ b/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.4_fast.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] material = generic_pla quality_type = fine -setting_version = 21 +setting_version = 22 type = quality variant = 0.4mm Nozzle weight = -1 diff --git a/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.4_fine.inst.cfg b/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.4_fine.inst.cfg index e2923e6248..37e0731f50 100644 --- a/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.4_fine.inst.cfg +++ b/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.4_fine.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] material = generic_pla quality_type = fine -setting_version = 21 +setting_version = 22 type = quality variant = 0.4mm Nozzle weight = 1 diff --git a/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.4_normal.inst.cfg b/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.4_normal.inst.cfg index 3c7d6d77ff..8e2fe1b043 100644 --- a/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.4_normal.inst.cfg +++ b/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.4_normal.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] material = generic_pla quality_type = normal -setting_version = 21 +setting_version = 22 type = quality variant = 0.4mm Nozzle weight = 0 diff --git a/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.4_vfast.inst.cfg b/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.4_vfast.inst.cfg index 3ec1e8214a..dc887117c0 100644 --- a/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.4_vfast.inst.cfg +++ b/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.4_vfast.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] material = generic_pla quality_type = veryfast -setting_version = 21 +setting_version = 22 type = quality variant = 0.4mm Nozzle weight = -2 diff --git a/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.4_vfine.inst.cfg b/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.4_vfine.inst.cfg index 51a47cb739..cdd5aae558 100644 --- a/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.4_vfine.inst.cfg +++ b/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.4_vfine.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] material = generic_pla quality_type = veryfine -setting_version = 21 +setting_version = 22 type = quality variant = 0.4mm Nozzle weight = 2 diff --git a/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.6_draft.inst.cfg b/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.6_draft.inst.cfg index 9ef5c56434..ac4966df73 100644 --- a/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.6_draft.inst.cfg +++ b/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.6_draft.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] material = generic_pla quality_type = draft -setting_version = 21 +setting_version = 22 type = quality variant = 0.6mm Nozzle weight = -2 diff --git a/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.6_fast.inst.cfg b/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.6_fast.inst.cfg index 86790e1c93..77538fb95e 100644 --- a/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.6_fast.inst.cfg +++ b/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.6_fast.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] material = generic_pla quality_type = fast -setting_version = 21 +setting_version = 22 type = quality variant = 0.6mm Nozzle weight = -1 diff --git a/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.6_vfast.inst.cfg b/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.6_vfast.inst.cfg index a29696a8ff..923d526e69 100644 --- a/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.6_vfast.inst.cfg +++ b/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.6_vfast.inst.cfg @@ -6,7 +6,7 @@ version = 4 [metadata] material = generic_pla quality_type = veryfast -setting_version = 21 +setting_version = 22 type = quality variant = 0.6mm Nozzle weight = -2 From 24a0ba3974933ab15d55c0e5a262aa22b9c19856 Mon Sep 17 00:00:00 2001 From: jellespijker Date: Tue, 10 Oct 2023 05:20:19 +0200 Subject: [PATCH 005/182] Update PyQt6 dependencies to latest versions PyQt6 and PyQt6-sip along with their dependencies are updated to newer versions (6.5.2 and 13.5.2) in both requirements.txt and Uranium/requirements.txt. This is to ensure the application uses the latest and most secure versions of the libraries, potentially improving application performance and security. These updates also ensure compatibility with current and upcoming features and bug fixes. Contributes to CURA-11137 --- requirements.txt | 75 ++++++++++++++++++++++++------------------------ 1 file changed, 38 insertions(+), 37 deletions(-) diff --git a/requirements.txt b/requirements.txt index dfa974ef7d..48ee3abcdc 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,41 +1,42 @@ ### Direct requirements for Uranium and libCharon ### -PyQt6-sip==13.4.1 \ - --hash=sha256:0df998f2b6ceeacfd10de773441572e215be0c9cae566cc7dd36e231bf714a12 \ - --hash=sha256:224575e84805c4317bacd5d1b8e93e0ad5c48685dadbbe1e902d4ebe16f22828 \ - --hash=sha256:36ae29cdc223cacc1257d0f5075cf81474550c6d26b728f922487a2aa935f130 \ - --hash=sha256:3a674c591d4274d4ea8127205290e927a7dab0eb87a0038d4f4ea1d430782649 \ - --hash=sha256:3ef9392e4ae29d393b79237d85840cdc6b8831f36eed5d56c7d9b329b380cc8d \ - --hash=sha256:43935873d60f57719632840d517afee04ef8f30e92cfe0dadc7e6326691920fc \ - --hash=sha256:5731f22618435654352ef07684549a17be82b75254227fc80b4b5b0b59fc6656 \ - --hash=sha256:5bc4beb6fb1de4c9ba8beee7b1a4a813fa888c3b095206dafcd25d7e6e4ed2a7 \ - --hash=sha256:5c36ab984402e96792eebf4b031abfaa589aa20af3190a79c54502c16964d97e \ - --hash=sha256:a2a0461992c6657f343308b150c4d6b57e9e7a0e5c2f79538434e7fb869ea827 \ - --hash=sha256:a81490ee84d7a41a126b116081bd97d758f41bf706aee0a8cec24d6e4c660184 \ - --hash=sha256:e00e287ea05bbc293fc6e2198301962af9b7b622bd2daf4288f925a88ae35dc9 \ - --hash=sha256:e670a7b2fb7e32204ce67d274017bfff3e21139d217d60cebbfcb75b019c91ee \ - --hash=sha256:ee06f255787a0b4957f357f93b78d2a11ca3761916833e3afa83f1381d4d1a46 \ - --hash=sha256:fbee0d554e0e98f56dbf6d94b00a28cc32425938ad7ae98fd91f8822c5b24d45 \ - --hash=sha256:fcc6d78314783f4a193f02353f431b7ea4d357f47c3c7a7d0740e723f69c64dc -PyQt6==6.4.2 \ - --hash=sha256:18d1daf98d9236d55102cdadafd1056f5802f3c9288fcf7238569937b71a89f0 \ - --hash=sha256:25bd399b4a95dce65d5f937c1aa85d3c7e14a21745ae2a4ca14c0116cd104290 \ - --hash=sha256:740244f608fe15ee1d89695c43f31a14caeca41c4f02ac36c86dfba4a5d5813d \ - --hash=sha256:c128bc0f17833e324593e3db83e99470d451a197dd17ff0333927b946c935bd9 -PyQt6-Qt6==6.4.2 \ - --hash=sha256:9f07c3c100cb46cca4074965e7494d4df4f0fc016497d5303c1fe135822876e1 \ - --hash=sha256:a29b8c858babd523e80c8db5f8fd19792641588ec04eab49af18b7a4423eb99f \ - --hash=sha256:c0e91d0275d428496cacff717a9b719c52bfa52b21f124d638b79cc2217bc81e \ - --hash=sha256:d19c4e72615762cd6f0b043f23fa5f0b02656091427ce6de1efccd58e10e6a53 -PyQt6-NetworkAuth==6.4.0 \ - --hash=sha256:ab6178b3b2902ae9939a148555cfcee8c7803d6b0d5924cd1bd8f3407b8b9210 \ - --hash=sha256:c16ec80232d88024b60d04386a23cc93067e5644a65f47f26ffb13d84dcd4a6d \ - --hash=sha256:c302cd0d838c7229eda5e26e0b1b3d3ec4f8720f8d9379472bce5a89ff0735c2 \ - --hash=sha256:d948fc0cf43b64afbda2acb5bf2392f785a1e7a2950d79ea850c1a3f4ae12f1a -PyQt6-NetworkAuth-Qt6==6.4.2 \ - --hash=sha256:179094bcb4d4d056316c22d3d067cd94d4591da23f804461bfb025ccfa29b2b4 \ - --hash=sha256:1de6abbb5fa6585b97ae49d3f64b0dfad40bd56b1a31744d9775ff26247241c8 \ - --hash=sha256:79ec4b0fc9450bbedbff03541b93b10d1c7e761cd2cc16ce70d2b09dcdf8c720 \ - --hash=sha256:d96d557fe61edb9b68d189f270f0393d6579c8d308e6b0d41bc0699371d7cb4e +PyQt6-sip==13.5.2 \ + --hash=sha256:1bdb1f7b5b2f6ac31d517a6f3a13c38055640ac0014f67a2e5422d2083ce69ec \ + --hash=sha256:318d4d1c7ef60f69c68227cef78fc439accc9028ec6149200eea3d34c433d373 \ + --hash=sha256:4b5b0c4b557e0293eba008021342459a0f91c69a7a2eb5231276d495d1d2960a \ + --hash=sha256:5b499eff7150d9f31fe835a73cc41f076bba2fcde0f5b0325b1284797f17c0ac \ + --hash=sha256:5d0fd42da765198b51d7fe12c29721cbe3e14b77ca4f68aa43618149ee7dbeff \ + --hash=sha256:831f5d606fc5296a80303ab30892c3308954c5766039bf7a96267488bb2524a5 \ + --hash=sha256:87d758ba999baa16459f0a3c7f7ed47a5b45e8991ad691f17345bf3c493a4281 \ + --hash=sha256:91812f0094443b816a74a89954d60bb50060807f54d7c016a4de7bd29454091e \ + --hash=sha256:94afb031db89159aa330891eba2c937b0378b4b264570998848c7a78eddf7c94 \ + --hash=sha256:9ad5b8c4c92d62e00ebf254a4c9656668b130f2a1d2792034e0d82b2d6571509 \ + --hash=sha256:9c9dac067710015895f523f5a2a4d59cbef8624a152b6f9a426e5b848d8c6d29 \ + --hash=sha256:ace942b78378bff8ae2d6bafccc84465f1ff0cf30720b8321e0bd6c95c36ede6 \ + --hash=sha256:b54b0d8d21c5835af8f6d6d8a323a23106e67b7cd4c31e23c35bb4c321000de8 \ + --hash=sha256:c0b4e55c4d0dc44728da90eb1451dfff0d05260b4a3496ff0014494e6c1865a6 \ + --hash=sha256:dcf602c233ee7600e810927adcb9e518d61bc796a6b2013c17feedd24c4e5413 \ + --hash=sha256:ebf6264b6feda01ba37d3b60a4bb87493bdb87be70f7b2a5384a7acd4902d88d +PyQt6==6.5.2 \ + --hash=sha256:1487ee7350f9ffb66d60ab4176519252c2b371762cbe8f8340fd951f63801280 \ + --hash=sha256:5bad1437eb0c1ae801103b32ef04ef62ef1cce505b448525f60089ce36329b89 \ + --hash=sha256:70468cca4537756c714a57fa1baa5beabb9b38775f52f9611f49870705672c55 \ + --hash=sha256:ff1d12767b578f0f0e87cdb12198e7dcad9a176c40d1d1d799984181b0af93cb +PyQt6-Qt6==6.5.2 \ + --hash=sha256:4b37f6f93c0980469ccc570998d3e3de243028bae7389fb6330443ab215ce2f6 \ + --hash=sha256:5a3c7bb899678bf801136b31cd589ed4d0d54ab32be5fb76c2bdeb161a9662ad \ + --hash=sha256:8dad61b4666d91882d7e1c4d619c71e7429c13e19182f8b3bebf3ecf95107d4c \ + --hash=sha256:953f3c0e99e486081a6d438b32fbc240da97457226562eb68cf1b11c516386fd +PyQt6-NetworkAuth==6.5.0 \ + --hash=sha256:6dc9e44a978698b673926e34da486f946ccbbeeac02078517c4d1ee23d0546a4 \ + --hash=sha256:7170db3f99e13aef855d9d52a00a8baa2dea92d12f9b441fed9c6dec57f83e09 \ + --hash=sha256:a8c8cb00a615dde1efaf1d7926e8532df77d6d08798d33b6325fb8f2ff0f220d \ + --hash=sha256:ac56d362c9efcfc194e358cc2bba362535b0775dc2bd8257f964e0bcfe7d421a +PyQt6-NetworkAuth-Qt6==6.5.2 \ + --hash=sha256:0588b93ec5a6f2c492a42dc56967f06d33306169e716c5636448816a65956278 \ + --hash=sha256:29396a63b68e8fa26587c35e8befad0a84e3a05e03551d1329ffd527684edc68 \ + --hash=sha256:2ec8ca45764d2f122912ad6c754b5ffe65f143b5a52f99649cc7931b475e064b \ + --hash=sha256:76e0877ed86247784740a0eb928f3c77da7466f08d96d17306efda6060df2c44 + certifi==2023.5.7; \ --hash=sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716 cryptography==41.0.1 \ From 6301926885f170f79189b0cf6fdc2d3594d1ba2e Mon Sep 17 00:00:00 2001 From: "saumya.jain" Date: Tue, 7 Nov 2023 18:08:08 +0530 Subject: [PATCH 006/182] Calculating time of travel for each line segment CURA-7647 --- cura/LayerPolygon.py | 6 ++++++ plugins/SimulationView/SimulationView.py | 5 +++++ plugins/SimulationView/SimulationViewMainComponent.qml | 6 +++++- 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/cura/LayerPolygon.py b/cura/LayerPolygon.py index 103703e594..4eb21dd45f 100644 --- a/cura/LayerPolygon.py +++ b/cura/LayerPolygon.py @@ -1,5 +1,6 @@ # Copyright (c) 2019 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. +import math import numpy from typing import Optional, cast @@ -186,6 +187,11 @@ class LayerPolygon: def types(self): return self._types + @property + def lineLengths(self): + return [math.sqrt(sum((b - a) ** 2 for a, b in zip(self._data[i], self._data[i + 1]))) + for i in range(len(self._data) - 1)] + @property def data(self): return self._data diff --git a/plugins/SimulationView/SimulationView.py b/plugins/SimulationView/SimulationView.py index 473948bc46..88fc44df98 100644 --- a/plugins/SimulationView/SimulationView.py +++ b/plugins/SimulationView/SimulationView.py @@ -400,6 +400,9 @@ class SimulationView(CuraView): def getMaxFeedrate(self) -> float: return self._max_feedrate + def getSimulationTime(self) -> list: + return [length / feedrate for length, feedrate in zip(self._visible_lengths, self._current_feedrates)] + def getMinThickness(self) -> float: if abs(self._min_thickness - sys.float_info.max) < 10: # Some lenience due to floating point rounding. return 0.0 # If it's still max-float, there are no measurements. Use 0 then. @@ -524,8 +527,10 @@ class SimulationView(CuraView): visible_indicies_with_extrusion = numpy.where(numpy.isin(polyline.types, visible_line_types_with_extrusion))[0] if visible_indices.size == 0: # No items to take maximum or minimum of. continue + self._visible_lengths = numpy.take(polyline.lineLengths, visible_indices) visible_feedrates = numpy.take(polyline.lineFeedrates, visible_indices) visible_feedrates_with_extrusion = numpy.take(polyline.lineFeedrates, visible_indicies_with_extrusion) + self._current_feedrates = visible_feedrates visible_linewidths = numpy.take(polyline.lineWidths, visible_indices) visible_linewidths_with_extrusion = numpy.take(polyline.lineWidths, visible_indicies_with_extrusion) visible_thicknesses = numpy.take(polyline.lineThicknesses, visible_indices) diff --git a/plugins/SimulationView/SimulationViewMainComponent.qml b/plugins/SimulationView/SimulationViewMainComponent.qml index a82d1e3db9..b2ef7b8356 100644 --- a/plugins/SimulationView/SimulationViewMainComponent.qml +++ b/plugins/SimulationView/SimulationViewMainComponent.qml @@ -136,9 +136,10 @@ Item Timer { id: simulationTimer - interval: 100 + interval: parseFloat(UM.SimulationView.getSimulationTime[pathNumber]).toFixed(2) //10 //dont change running: false repeat: true + property int pathNumber : 0 onTriggered: { var currentPath = UM.SimulationView.currentPath @@ -153,10 +154,12 @@ Item if (currentPath >= numPaths) { UM.SimulationView.setCurrentPath(0) + pathNumber =0 } else { UM.SimulationView.setCurrentPath(currentPath + 1) + pathNumber = 0 } } // If the simulation is already playing and we reach the end of a layer, then it automatically @@ -184,6 +187,7 @@ Item // The status must be set here instead of in the resumeSimulation function otherwise it won't work // correctly, because part of the logic is in this trigger function. isSimulationPlaying = true + pathNumber += 1 } } From efda0aaba4329948485021bbbc4d2e365a5b63c4 Mon Sep 17 00:00:00 2001 From: "saumya.jain" Date: Tue, 7 Nov 2023 18:42:41 +0530 Subject: [PATCH 007/182] updated for every layer CURA-7647 --- plugins/SimulationView/SimulationView.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/plugins/SimulationView/SimulationView.py b/plugins/SimulationView/SimulationView.py index 88fc44df98..2f09c8018b 100644 --- a/plugins/SimulationView/SimulationView.py +++ b/plugins/SimulationView/SimulationView.py @@ -78,6 +78,8 @@ class SimulationView(CuraView): self._minimum_path_num = 0 self.currentLayerNumChanged.connect(self._onCurrentLayerNumChanged) + self._current_feedrates = {} + self._visible_lengths ={} self._busy = False self._simulation_running = False @@ -401,7 +403,7 @@ class SimulationView(CuraView): return self._max_feedrate def getSimulationTime(self) -> list: - return [length / feedrate for length, feedrate in zip(self._visible_lengths, self._current_feedrates)] + return [length / feedrate for length, feedrate in zip(self._visible_lengths[self._current_layer_num], self._current_feedrates[self._current_layer_num])] def getMinThickness(self) -> float: if abs(self._min_thickness - sys.float_info.max) < 10: # Some lenience due to floating point rounding. @@ -527,10 +529,10 @@ class SimulationView(CuraView): visible_indicies_with_extrusion = numpy.where(numpy.isin(polyline.types, visible_line_types_with_extrusion))[0] if visible_indices.size == 0: # No items to take maximum or minimum of. continue - self._visible_lengths = numpy.take(polyline.lineLengths, visible_indices) + self._visible_lengths[layer_index] = numpy.take(polyline.lineLengths, visible_indices) visible_feedrates = numpy.take(polyline.lineFeedrates, visible_indices) visible_feedrates_with_extrusion = numpy.take(polyline.lineFeedrates, visible_indicies_with_extrusion) - self._current_feedrates = visible_feedrates + self._current_feedrates[layer_index] = visible_feedrates visible_linewidths = numpy.take(polyline.lineWidths, visible_indices) visible_linewidths_with_extrusion = numpy.take(polyline.lineWidths, visible_indicies_with_extrusion) visible_thicknesses = numpy.take(polyline.lineThicknesses, visible_indices) From 457cecba5943c09b1b3b5b2a573a18c0915e0bc0 Mon Sep 17 00:00:00 2001 From: "saumya.jain" Date: Wed, 8 Nov 2023 13:29:47 +0530 Subject: [PATCH 008/182] using numpy for array calculation CURA-7647 --- cura/LayerPolygon.py | 4 ++-- plugins/SimulationView/SimulationView.py | 2 +- plugins/SimulationView/SimulationViewMainComponent.qml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/cura/LayerPolygon.py b/cura/LayerPolygon.py index 4eb21dd45f..e5fd307dc9 100644 --- a/cura/LayerPolygon.py +++ b/cura/LayerPolygon.py @@ -189,8 +189,8 @@ class LayerPolygon: @property def lineLengths(self): - return [math.sqrt(sum((b - a) ** 2 for a, b in zip(self._data[i], self._data[i + 1]))) - for i in range(len(self._data) - 1)] + data_array = numpy.array(self._data) + return numpy.linalg.norm(data_array[1:] - data_array[:-1], axis=1) @property def data(self): diff --git a/plugins/SimulationView/SimulationView.py b/plugins/SimulationView/SimulationView.py index 2f09c8018b..18d1f981c7 100644 --- a/plugins/SimulationView/SimulationView.py +++ b/plugins/SimulationView/SimulationView.py @@ -403,7 +403,7 @@ class SimulationView(CuraView): return self._max_feedrate def getSimulationTime(self) -> list: - return [length / feedrate for length, feedrate in zip(self._visible_lengths[self._current_layer_num], self._current_feedrates[self._current_layer_num])] + return self._visible_lengths[self._current_layer_num] / self._current_feedrates[self._current_layer_num] def getMinThickness(self) -> float: if abs(self._min_thickness - sys.float_info.max) < 10: # Some lenience due to floating point rounding. diff --git a/plugins/SimulationView/SimulationViewMainComponent.qml b/plugins/SimulationView/SimulationViewMainComponent.qml index b2ef7b8356..66acff656a 100644 --- a/plugins/SimulationView/SimulationViewMainComponent.qml +++ b/plugins/SimulationView/SimulationViewMainComponent.qml @@ -136,7 +136,7 @@ Item Timer { id: simulationTimer - interval: parseFloat(UM.SimulationView.getSimulationTime[pathNumber]).toFixed(2) //10 //dont change + interval: parseFloat(UM.SimulationView.getSimulationTime[pathNumber]).toFixed(2) running: false repeat: true property int pathNumber : 0 From 1f9e0e2dee75bcbc12fbe1b54c61de10e5a5f65c Mon Sep 17 00:00:00 2001 From: "c.lamboo" Date: Tue, 28 Nov 2023 15:15:39 +0100 Subject: [PATCH 009/182] Add url protocol support for msi, nsis, dmg and pkg installers CURA-11288 --- UltiMaker-Cura.spec.jinja | 4 +++ packaging/NSIS/Ultimaker-Cura.nsi.jinja | 15 +++++++++++ packaging/msi/UltiMaker-Cura.wxs.jinja | 36 +++++++++++++++++++++++++ 3 files changed, 55 insertions(+) diff --git a/UltiMaker-Cura.spec.jinja b/UltiMaker-Cura.spec.jinja index 3d540d3b8f..cd939cf736 100644 --- a/UltiMaker-Cura.spec.jinja +++ b/UltiMaker-Cura.spec.jinja @@ -266,6 +266,10 @@ app = UMBUNDLE( 'CFBundlePackageType': 'APPL', 'CFBundleVersionString': {{ version }}, 'CFBundleShortVersionString': {{ short_version }}, + 'CFBundleURLTypes': [{ + 'CFBundleURLName': '{{ display_name }}', + 'CFBundleURLSchemes': ['cura', 'slicer'], + }], 'CFBundleDocumentTypes': [{ 'CFBundleTypeRole': 'Viewer', 'CFBundleTypeExtensions': ['*'], diff --git a/packaging/NSIS/Ultimaker-Cura.nsi.jinja b/packaging/NSIS/Ultimaker-Cura.nsi.jinja index 9996b24773..228dba4fe4 100644 --- a/packaging/NSIS/Ultimaker-Cura.nsi.jinja +++ b/packaging/NSIS/Ultimaker-Cura.nsi.jinja @@ -192,3 +192,18 @@ DeleteRegKey ${REG_ROOT} "${UNINSTALL_PATH}" SectionEnd ###################################################################### + +Section UrlProtocol + WriteRegStr HKCR "cura" "" "URL:cura" + WriteRegStr HKCR "cura" "URL Protocol" "" + WriteRegStr HKCR "cura\DefaultIcon" "" "$INSTDIR\${MAIN_APP_EXE},1" + WriteRegStr HKCR "cura\shell" "" "open" + WriteRegStr HKCR "cura\shell\open\command" "" '"$INSTDIR\${MAIN_APP_EXE}" "%1"' + + WriteRegStr HKCR "slicer" "" "URL:slicer" + WriteRegStr HKCR "slicer" "URL Protocol" "" + WriteRegStr HKCR "slicer\DefaultIcon" "" "$INSTDIR\${MAIN_APP_EXE},1" + WriteRegStr HKCR "slicer\shell" "" "open" + WriteRegStr HKCR "slicer\shell\open\command" "" '"$INSTDIR\${MAIN_APP_EXE}" "%1"' + +SectionEnd \ No newline at end of file diff --git a/packaging/msi/UltiMaker-Cura.wxs.jinja b/packaging/msi/UltiMaker-Cura.wxs.jinja index a183a97d5f..5ce8cd0a08 100644 --- a/packaging/msi/UltiMaker-Cura.wxs.jinja +++ b/packaging/msi/UltiMaker-Cura.wxs.jinja @@ -33,6 +33,21 @@ /> + + + + + {% if "Enterprise" in app_name %} @@ -144,11 +159,32 @@ + + + + + + + + + + + + + + + + + + + + + From d53b2d94abc0219995757c4c2e922226cefd0054 Mon Sep 17 00:00:00 2001 From: "c.lamboo" Date: Thu, 30 Nov 2023 11:51:35 +0100 Subject: [PATCH 010/182] Add directory for wix components CURA-11288 --- packaging/msi/UltiMaker-Cura.wxs.jinja | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packaging/msi/UltiMaker-Cura.wxs.jinja b/packaging/msi/UltiMaker-Cura.wxs.jinja index 5ce8cd0a08..de441443f4 100644 --- a/packaging/msi/UltiMaker-Cura.wxs.jinja +++ b/packaging/msi/UltiMaker-Cura.wxs.jinja @@ -160,7 +160,7 @@ - + @@ -169,7 +169,7 @@ - + From d1f4aa6cd3f9e97d9b5f5eaf220162d610923cfb Mon Sep 17 00:00:00 2001 From: Paul Kuiper <46715907+pkuiper-ultimaker@users.noreply.github.com> Date: Thu, 30 Nov 2023 13:03:22 +0100 Subject: [PATCH 011/182] PP-397 Adjust z shrinkage factor for the PET-CF annealing intent from 2.0 to 0.9% --- .../ultimaker_s3/um_s3_cc0.4_petcf_0.15mm_annealing.inst.cfg | 2 +- .../ultimaker_s3/um_s3_cc0.4_petcf_0.2mm_annealing.inst.cfg | 2 +- .../ultimaker_s3/um_s3_cc0.6_petcf_0.15mm_annealing.inst.cfg | 2 +- .../ultimaker_s3/um_s3_cc0.6_petcf_0.2mm_annealing.inst.cfg | 2 +- .../ultimaker_s5/um_s5_cc0.4_petcf_0.15mm_annealing.inst.cfg | 2 +- .../ultimaker_s5/um_s5_cc0.4_petcf_0.2mm_annealing.inst.cfg | 2 +- .../ultimaker_s5/um_s5_cc0.6_petcf_0.15mm_annealing.inst.cfg | 2 +- .../ultimaker_s5/um_s5_cc0.6_petcf_0.2mm_annealing.inst.cfg | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/resources/intent/ultimaker_s3/um_s3_cc0.4_petcf_0.15mm_annealing.inst.cfg b/resources/intent/ultimaker_s3/um_s3_cc0.4_petcf_0.15mm_annealing.inst.cfg index e042d43090..0c1e598e6c 100644 --- a/resources/intent/ultimaker_s3/um_s3_cc0.4_petcf_0.15mm_annealing.inst.cfg +++ b/resources/intent/ultimaker_s3/um_s3_cc0.4_petcf_0.15mm_annealing.inst.cfg @@ -15,7 +15,7 @@ variant = CC 0.4 infill_sparse_density = 100 jerk_print = 30 material_shrinkage_percentage_xy = 100.3 -material_shrinkage_percentage_z = 102.0 +material_shrinkage_percentage_z = 100.9 speed_infill = =speed_print speed_layer_0 = 20 speed_print = 25 diff --git a/resources/intent/ultimaker_s3/um_s3_cc0.4_petcf_0.2mm_annealing.inst.cfg b/resources/intent/ultimaker_s3/um_s3_cc0.4_petcf_0.2mm_annealing.inst.cfg index 8d8ec0f3fd..7961bb5ca0 100644 --- a/resources/intent/ultimaker_s3/um_s3_cc0.4_petcf_0.2mm_annealing.inst.cfg +++ b/resources/intent/ultimaker_s3/um_s3_cc0.4_petcf_0.2mm_annealing.inst.cfg @@ -15,7 +15,7 @@ variant = CC 0.4 infill_sparse_density = 100 jerk_print = 30 material_shrinkage_percentage_xy = 100.3 -material_shrinkage_percentage_z = 102.0 +material_shrinkage_percentage_z = 100.9 speed_infill = =speed_print speed_layer_0 = 20 speed_print = 20 diff --git a/resources/intent/ultimaker_s3/um_s3_cc0.6_petcf_0.15mm_annealing.inst.cfg b/resources/intent/ultimaker_s3/um_s3_cc0.6_petcf_0.15mm_annealing.inst.cfg index 90f8fb6c16..90401c220c 100644 --- a/resources/intent/ultimaker_s3/um_s3_cc0.6_petcf_0.15mm_annealing.inst.cfg +++ b/resources/intent/ultimaker_s3/um_s3_cc0.6_petcf_0.15mm_annealing.inst.cfg @@ -15,7 +15,7 @@ variant = CC 0.6 infill_sparse_density = 100 jerk_print = 30 material_shrinkage_percentage_xy = 100.3 -material_shrinkage_percentage_z = 102.0 +material_shrinkage_percentage_z = 100.9 speed_infill = =speed_print speed_layer_0 = 20 speed_print = 25 diff --git a/resources/intent/ultimaker_s3/um_s3_cc0.6_petcf_0.2mm_annealing.inst.cfg b/resources/intent/ultimaker_s3/um_s3_cc0.6_petcf_0.2mm_annealing.inst.cfg index 392f21098a..3b05f8fd30 100644 --- a/resources/intent/ultimaker_s3/um_s3_cc0.6_petcf_0.2mm_annealing.inst.cfg +++ b/resources/intent/ultimaker_s3/um_s3_cc0.6_petcf_0.2mm_annealing.inst.cfg @@ -15,7 +15,7 @@ variant = CC 0.6 infill_sparse_density = 100 jerk_print = 30 material_shrinkage_percentage_xy = 100.3 -material_shrinkage_percentage_z = 102.0 +material_shrinkage_percentage_z = 100.9 speed_infill = =speed_print speed_layer_0 = 20 speed_print = 25 diff --git a/resources/intent/ultimaker_s5/um_s5_cc0.4_petcf_0.15mm_annealing.inst.cfg b/resources/intent/ultimaker_s5/um_s5_cc0.4_petcf_0.15mm_annealing.inst.cfg index 923467092e..e3da6ecedb 100644 --- a/resources/intent/ultimaker_s5/um_s5_cc0.4_petcf_0.15mm_annealing.inst.cfg +++ b/resources/intent/ultimaker_s5/um_s5_cc0.4_petcf_0.15mm_annealing.inst.cfg @@ -15,7 +15,7 @@ variant = CC 0.4 infill_sparse_density = 100 jerk_print = 30 material_shrinkage_percentage_xy = 100.3 -material_shrinkage_percentage_z = 102.0 +material_shrinkage_percentage_z = 100.9 speed_infill = =speed_print speed_layer_0 = 20 speed_print = 25 diff --git a/resources/intent/ultimaker_s5/um_s5_cc0.4_petcf_0.2mm_annealing.inst.cfg b/resources/intent/ultimaker_s5/um_s5_cc0.4_petcf_0.2mm_annealing.inst.cfg index 8a09c840a1..5141dba947 100644 --- a/resources/intent/ultimaker_s5/um_s5_cc0.4_petcf_0.2mm_annealing.inst.cfg +++ b/resources/intent/ultimaker_s5/um_s5_cc0.4_petcf_0.2mm_annealing.inst.cfg @@ -15,7 +15,7 @@ variant = CC 0.4 infill_sparse_density = 100 jerk_print = 30 material_shrinkage_percentage_xy = 100.3 -material_shrinkage_percentage_z = 102.0 +material_shrinkage_percentage_z = 100.9 speed_infill = =speed_print speed_layer_0 = 20 speed_print = 20 diff --git a/resources/intent/ultimaker_s5/um_s5_cc0.6_petcf_0.15mm_annealing.inst.cfg b/resources/intent/ultimaker_s5/um_s5_cc0.6_petcf_0.15mm_annealing.inst.cfg index 069c039879..6ce13e175f 100644 --- a/resources/intent/ultimaker_s5/um_s5_cc0.6_petcf_0.15mm_annealing.inst.cfg +++ b/resources/intent/ultimaker_s5/um_s5_cc0.6_petcf_0.15mm_annealing.inst.cfg @@ -15,7 +15,7 @@ variant = CC 0.6 infill_sparse_density = 100 jerk_print = 30 material_shrinkage_percentage_xy = 100.3 -material_shrinkage_percentage_z = 102.0 +material_shrinkage_percentage_z = 100.9 speed_infill = =speed_print speed_layer_0 = 20 speed_print = 25 diff --git a/resources/intent/ultimaker_s5/um_s5_cc0.6_petcf_0.2mm_annealing.inst.cfg b/resources/intent/ultimaker_s5/um_s5_cc0.6_petcf_0.2mm_annealing.inst.cfg index 55faf12587..ceea80d7fd 100644 --- a/resources/intent/ultimaker_s5/um_s5_cc0.6_petcf_0.2mm_annealing.inst.cfg +++ b/resources/intent/ultimaker_s5/um_s5_cc0.6_petcf_0.2mm_annealing.inst.cfg @@ -15,7 +15,7 @@ variant = CC 0.6 infill_sparse_density = 100 jerk_print = 30 material_shrinkage_percentage_xy = 100.3 -material_shrinkage_percentage_z = 102.0 +material_shrinkage_percentage_z = 100.9 speed_infill = =speed_print speed_layer_0 = 20 speed_print = 25 From 2b5f8b3a7c4a77e7eb99fc974996efcd4b77ace0 Mon Sep 17 00:00:00 2001 From: "c.lamboo" Date: Thu, 30 Nov 2023 13:23:37 +0100 Subject: [PATCH 012/182] Remove deprecated `createAndRemoveOnUninstall` action from wix installer CURA-11288 --- packaging/msi/UltiMaker-Cura.wxs.jinja | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packaging/msi/UltiMaker-Cura.wxs.jinja b/packaging/msi/UltiMaker-Cura.wxs.jinja index de441443f4..07a2c7d8c9 100644 --- a/packaging/msi/UltiMaker-Cura.wxs.jinja +++ b/packaging/msi/UltiMaker-Cura.wxs.jinja @@ -161,7 +161,7 @@ - + @@ -170,7 +170,7 @@ - + From 87caa0307a80040a74d68a2060b9f34853e09115 Mon Sep 17 00:00:00 2001 From: "c.lamboo" Date: Thu, 30 Nov 2023 13:28:33 +0100 Subject: [PATCH 013/182] Display message on open file event CURA-11288 --- cura/CuraApplication.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index c6c44cf8f5..0ac7118776 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -1154,6 +1154,15 @@ class CuraApplication(QtApplication): """Handle Qt events""" if event.type() == QEvent.Type.FileOpen: + + result_message = Message( + f"file: {str(event.file())}, url: {str(event.url())}", + lifetime=0, + title="OPENING FILE", + message_type=Message.MessageType.NEUTRAL, + ) + result_message.show() + if self._plugins_loaded: self._openFile(event.file()) else: From ad871c627ed5a4de7e93613f83e7439d8030818c Mon Sep 17 00:00:00 2001 From: "c.lamboo" Date: Thu, 30 Nov 2023 13:42:48 +0100 Subject: [PATCH 014/182] Don't open file on open file event CURA-11288 --- cura/CuraApplication.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 0ac7118776..da1594c37b 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -1163,10 +1163,10 @@ class CuraApplication(QtApplication): ) result_message.show() - if self._plugins_loaded: - self._openFile(event.file()) - else: - self._open_file_queue.append(event.file()) + # if self._plugins_loaded: + # self._openFile(event.file()) + # else: + # self._open_file_queue.append(event.file()) if int(event.type()) == 20: # 'QEvent.Type.Quit' enum isn't there, even though it should be according to docs. # Once we're at this point, everything should have been flushed already (past OnExitCallbackManager). From 66ad006bc528392bd7246a29cfec4896fb31105d Mon Sep 17 00:00:00 2001 From: Paul Kuiper <46715907+pkuiper-ultimaker@users.noreply.github.com> Date: Thu, 30 Nov 2023 14:15:00 +0100 Subject: [PATCH 015/182] Reduced line width of the middle raft layer from 1.2 to 0.4 Increase speed from 27.5mm/s to 90mm/s. --- resources/definitions/ultimaker_method_base.def.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/resources/definitions/ultimaker_method_base.def.json b/resources/definitions/ultimaker_method_base.def.json index 8e9034c954..6ac68ef2de 100644 --- a/resources/definitions/ultimaker_method_base.def.json +++ b/resources/definitions/ultimaker_method_base.def.json @@ -357,7 +357,8 @@ "raft_base_thickness": { "value": 0.8 }, "raft_interface_extruder_nr": { "value": "raft_surface_extruder_nr" }, "raft_interface_layers": { "value": 2 }, - "raft_interface_line_width": { "value": 1.2 }, + "raft_interface_line_width": { "value": "line_width" }, + "raft_interface_speed": { "value": 90 }, "raft_interface_thickness": { "value": 0.3 }, "raft_margin": { "value": 3 }, "raft_surface_extruder_nr": { "value": "int(anyExtruderWithMaterial('material_is_support_material')) if support_enable and extruderValue(support_extruder_nr,'material_is_support_material') else raft_base_extruder_nr" }, From a442228f38d758870f7753870f03438e9fd6986b Mon Sep 17 00:00:00 2001 From: "c.lamboo" Date: Thu, 30 Nov 2023 22:45:18 +0100 Subject: [PATCH 016/182] Open file on url scheme CURA-11289 --- cura/CuraApplication.py | 73 ++++++++++++++++++++++++++++++++--------- 1 file changed, 57 insertions(+), 16 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index da1594c37b..e7289a225f 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -8,9 +8,11 @@ import time import platform from pathlib import Path from typing import cast, TYPE_CHECKING, Optional, Callable, List, Any, Dict +import re +import requests import numpy -from PyQt6.QtCore import QObject, QTimer, QUrl, pyqtSignal, pyqtProperty, QEvent, pyqtEnum, QCoreApplication +from PyQt6.QtCore import QObject, QTimer, QUrl, QUrlQuery, pyqtSignal, pyqtProperty, QEvent, pyqtEnum, QCoreApplication from PyQt6.QtGui import QColor, QIcon from PyQt6.QtQml import qmlRegisterUncreatableType, qmlRegisterUncreatableMetaObject, qmlRegisterSingletonType, qmlRegisterType from PyQt6.QtWidgets import QMessageBox @@ -249,7 +251,7 @@ class CuraApplication(QtApplication): self._additional_components = {} # Components to add to certain areas in the interface self._open_file_queue = [] # A list of files to open (after the application has started) - + self._open_url_queue = [] # A list of urls to open (after the application has started) self._update_platform_activity_timer = None self._sidebar_custom_menu_items = [] # type: list # Keeps list of custom menu items for the side bar @@ -946,6 +948,8 @@ class CuraApplication(QtApplication): self.callLater(self._openFile, file_name) for file_name in self._open_file_queue: # Open all the files that were queued up while plug-ins were loading. self.callLater(self._openFile, file_name) + for url in self._open_url_queue: + self.callLater(self._openUrl, url) initializationFinished = pyqtSignal() showAddPrintersUncancellableDialog = pyqtSignal() # Used to show the add printers dialog with a greyed background @@ -1154,19 +1158,16 @@ class CuraApplication(QtApplication): """Handle Qt events""" if event.type() == QEvent.Type.FileOpen: - - result_message = Message( - f"file: {str(event.file())}, url: {str(event.url())}", - lifetime=0, - title="OPENING FILE", - message_type=Message.MessageType.NEUTRAL, - ) - result_message.show() - - # if self._plugins_loaded: - # self._openFile(event.file()) - # else: - # self._open_file_queue.append(event.file()) + if self._plugins_loaded: + if event.file(): + self._openFile(event.file()) + if event.url(): + self._openUrl(event.url()) + else: + if event.file(): + self._open_file_queue.append(event.file()) + if event.url(): + self._open_url_queue.append(event.url()) if int(event.type()) == 20: # 'QEvent.Type.Quit' enum isn't there, even though it should be according to docs. # Once we're at this point, everything should have been flushed already (past OnExitCallbackManager). @@ -1550,7 +1551,7 @@ class CuraApplication(QtApplication): if not nodes: return - objects_in_filename = {} # type: Dict[str, List[CuraSceneNode]] + objects_in_filename: Dict[str, List[CuraSceneNode]] = {} for node in nodes: mesh_data = node.getMeshData() if mesh_data: @@ -1791,6 +1792,46 @@ class CuraApplication(QtApplication): def _openFile(self, filename): self.readLocalFile(QUrl.fromLocalFile(filename)) + def _openUrl(self, url: QUrl) -> None: + supported_schemes = ["cura", "slicer"] + if url.scheme() not in supported_schemes: + # only handle cura:// and slicer:// urls schemes + return + + match url.host() + url.path(): + case "open": + query = QUrlQuery(url.query()) + model_url = QUrl(query.queryItemValue("file", options=QUrl.ComponentFormattingOption.FullyDecoded)) + response = requests.get(model_url.url()) + if response.status_code is not 200: + Logger.log("e", "Could not download file from {0}".format(model_url.url())) + return + + content_disposition = response.headers.get('Content-Disposition') + if content_disposition is None: + Logger.log("w", + "Could not find Content-Disposition header in response from {0}".format(model_url.url())) + # Use the last part of the url as the filename, and assume it is an STL file + filename = model_url.path().split("/")[-1] + ".stl" + else: + # content_disposition is in the following format + # ``` + # content_disposition attachment; "filename=[FILENAME]" + # ``` + # Use a regex to extract the filename + # content_disposition = response.headers.get('Content-Disposition') + content_disposition_match = re.match(r'attachment; filename="(?P.*)"', + content_disposition) + assert content_disposition_match is not None + filename = content_disposition_match.group("filename") + + tmp = tempfile.NamedTemporaryFile(suffix=filename, delete=False) + with open(tmp.name, "wb") as f: + f.write(response.content) + self.readLocalFile(QUrl.fromLocalFile(tmp.name), add_to_recent_files=False) + case path: + Logger.log("w", "Unsupported url scheme path: {0}".format(path)) + def _addProfileReader(self, profile_reader): # TODO: Add the profile reader to the list of plug-ins that can be used when importing profiles. pass From 79c7db3e6f621ad444be94d98a2c27da6d2c9c04 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Fri, 1 Dec 2023 08:13:30 +0100 Subject: [PATCH 017/182] Use Uranium workign branch CURA-11137 Contributes to CURA-10831 and CURA-11137 --- conanfile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conanfile.py b/conanfile.py index d52d62e5cc..1244661849 100644 --- a/conanfile.py +++ b/conanfile.py @@ -328,7 +328,7 @@ class CuraConan(ConanFile): self.requires("pysavitar/5.3.0") self.requires("pynest2d/5.3.0") self.requires("curaengine_plugin_gradual_flow/0.1.0") - self.requires("uranium/(latest)@ultimaker/testing") + self.requires("uranium/(latest)@ultimaker/cura_11137") # FIXME: Use `testing` once the branch is merged self.requires("cura_binary_data/(latest)@ultimaker/testing") self.requires("cpython/3.10.4@ultimaker/stable") self.requires("openssl/3.2.0") From 31d48aabe7ca0b2eca3033b94f2eed7d9b3e20f5 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Fri, 1 Dec 2023 09:15:21 +0100 Subject: [PATCH 018/182] Use Qt6.6 and PyQt6.6 Contributes to CURA-11137 --- requirements.txt | 79 +++++++++++++++++++++++++----------------------- 1 file changed, 42 insertions(+), 37 deletions(-) diff --git a/requirements.txt b/requirements.txt index 48ee3abcdc..76339c884f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,41 +1,46 @@ ### Direct requirements for Uranium and libCharon ### -PyQt6-sip==13.5.2 \ - --hash=sha256:1bdb1f7b5b2f6ac31d517a6f3a13c38055640ac0014f67a2e5422d2083ce69ec \ - --hash=sha256:318d4d1c7ef60f69c68227cef78fc439accc9028ec6149200eea3d34c433d373 \ - --hash=sha256:4b5b0c4b557e0293eba008021342459a0f91c69a7a2eb5231276d495d1d2960a \ - --hash=sha256:5b499eff7150d9f31fe835a73cc41f076bba2fcde0f5b0325b1284797f17c0ac \ - --hash=sha256:5d0fd42da765198b51d7fe12c29721cbe3e14b77ca4f68aa43618149ee7dbeff \ - --hash=sha256:831f5d606fc5296a80303ab30892c3308954c5766039bf7a96267488bb2524a5 \ - --hash=sha256:87d758ba999baa16459f0a3c7f7ed47a5b45e8991ad691f17345bf3c493a4281 \ - --hash=sha256:91812f0094443b816a74a89954d60bb50060807f54d7c016a4de7bd29454091e \ - --hash=sha256:94afb031db89159aa330891eba2c937b0378b4b264570998848c7a78eddf7c94 \ - --hash=sha256:9ad5b8c4c92d62e00ebf254a4c9656668b130f2a1d2792034e0d82b2d6571509 \ - --hash=sha256:9c9dac067710015895f523f5a2a4d59cbef8624a152b6f9a426e5b848d8c6d29 \ - --hash=sha256:ace942b78378bff8ae2d6bafccc84465f1ff0cf30720b8321e0bd6c95c36ede6 \ - --hash=sha256:b54b0d8d21c5835af8f6d6d8a323a23106e67b7cd4c31e23c35bb4c321000de8 \ - --hash=sha256:c0b4e55c4d0dc44728da90eb1451dfff0d05260b4a3496ff0014494e6c1865a6 \ - --hash=sha256:dcf602c233ee7600e810927adcb9e518d61bc796a6b2013c17feedd24c4e5413 \ - --hash=sha256:ebf6264b6feda01ba37d3b60a4bb87493bdb87be70f7b2a5384a7acd4902d88d -PyQt6==6.5.2 \ - --hash=sha256:1487ee7350f9ffb66d60ab4176519252c2b371762cbe8f8340fd951f63801280 \ - --hash=sha256:5bad1437eb0c1ae801103b32ef04ef62ef1cce505b448525f60089ce36329b89 \ - --hash=sha256:70468cca4537756c714a57fa1baa5beabb9b38775f52f9611f49870705672c55 \ - --hash=sha256:ff1d12767b578f0f0e87cdb12198e7dcad9a176c40d1d1d799984181b0af93cb -PyQt6-Qt6==6.5.2 \ - --hash=sha256:4b37f6f93c0980469ccc570998d3e3de243028bae7389fb6330443ab215ce2f6 \ - --hash=sha256:5a3c7bb899678bf801136b31cd589ed4d0d54ab32be5fb76c2bdeb161a9662ad \ - --hash=sha256:8dad61b4666d91882d7e1c4d619c71e7429c13e19182f8b3bebf3ecf95107d4c \ - --hash=sha256:953f3c0e99e486081a6d438b32fbc240da97457226562eb68cf1b11c516386fd -PyQt6-NetworkAuth==6.5.0 \ - --hash=sha256:6dc9e44a978698b673926e34da486f946ccbbeeac02078517c4d1ee23d0546a4 \ - --hash=sha256:7170db3f99e13aef855d9d52a00a8baa2dea92d12f9b441fed9c6dec57f83e09 \ - --hash=sha256:a8c8cb00a615dde1efaf1d7926e8532df77d6d08798d33b6325fb8f2ff0f220d \ - --hash=sha256:ac56d362c9efcfc194e358cc2bba362535b0775dc2bd8257f964e0bcfe7d421a -PyQt6-NetworkAuth-Qt6==6.5.2 \ - --hash=sha256:0588b93ec5a6f2c492a42dc56967f06d33306169e716c5636448816a65956278 \ - --hash=sha256:29396a63b68e8fa26587c35e8befad0a84e3a05e03551d1329ffd527684edc68 \ - --hash=sha256:2ec8ca45764d2f122912ad6c754b5ffe65f143b5a52f99649cc7931b475e064b \ - --hash=sha256:76e0877ed86247784740a0eb928f3c77da7466f08d96d17306efda6060df2c44 +PyQt6-sip==13.6.0 \ + --hash=sha256:0dfd22cfedd87e96f9d51e0778ca2ba3dc0be83e424e9e0f98f6994d8d9c90f0 \ + --hash=sha256:13885361ca2cb2f5085d50359ba61b3fabd41b139fb58f37332acbe631ef2357 \ + --hash=sha256:24441032a29791e82beb7dfd76878339058def0e97fdb7c1cea517f3a0e6e96b \ + --hash=sha256:2486e1588071943d4f6657ba09096dc9fffd2322ad2c30041e78ea3f037b5778 \ + --hash=sha256:3075d8b325382750829e6cde6971c943352309d35768a4d4da0587459606d562 \ + --hash=sha256:33ea771fe777eb0d1a2c3ef35bcc3f7a286eb3ff09cd5b2fdd3d87d1f392d7e8 \ + --hash=sha256:39854dba35f8e5a4288da26ecb5f40b4c5ec1932efffb3f49d5ea435a7f37fb3 \ + --hash=sha256:3bf03e130fbfd75c9c06e687b86ba375410c7a9e835e4e03285889e61dd4b0c4 \ + --hash=sha256:43fb8551796030aae3d66d6e35e277494071ec6172cd182c9569ab7db268a2f5 \ + --hash=sha256:58f68a48400e0b3d1ccb18090090299bad26e3aed7ccb7057c65887b79b8aeea \ + --hash=sha256:5b9c6b6f9cfccb48cbb78a59603145a698fb4ffd176764d7083e5bf47631d8df \ + --hash=sha256:747f6ca44af81777a2c696bd501bc4815a53ec6fc94d4e25830e10bc1391f8ab \ + --hash=sha256:86a7b67c64436e32bffa9c28c9f21bf14a9faa54991520b12c3f6f435f24df7f \ + --hash=sha256:8c282062125eea5baf830c6998587d98c50be7c3a817a057fb95fef647184012 \ + --hash=sha256:8f9df9f7ccd8a9f0f1d36948c686f03ce1a1281543a3e636b7b7d5e086e1a436 \ + --hash=sha256:98bf954103b087162fa63b3a78f30b0b63da22fd6450b610ec1b851dbb798228 \ + --hash=sha256:9adf672f9114687533a74d5c2d4c03a9a929ad5ad9c3e88098a7da1a440ab916 \ + --hash=sha256:a6ce80bc24618d8a41be8ca51ad9f10e8bc4296dd90ab2809573df30a23ae0e5 \ + --hash=sha256:d6b5f699aaed0ac1fcd23e8fbca70d8a77965831b7c1ce474b81b1678817a49d \ + --hash=sha256:fa759b6339ff7e25f9afe2a6b651b775f0a36bcb3f5fa85e81a90d3b033c83f4 \ + --hash=sha256:fa7b10af7488efc5e53b41dd42c0f421bde6c2865a107af7ae259aff9d841da9 +PyQt6==6.6.0 \ + --hash=sha256:33655db05ac2de699320f035250c21434c77144a6a2943aca3f4c579dabc3f7b \ + --hash=sha256:3ef68830a9b32050c30f7962c56a5927802c9193b68eaf405faecb8ce9ae10a8 \ + --hash=sha256:d41512d66044c2df9c5f515a56a922170d68a37b3406ffddc8b4adc57181b576 \ + --hash=sha256:fc7185d65755f26d7a6842492ec5398c92544dc4eafbbcbef1b1922aca585c96 +PyQt6-Qt6==6.6.0 \ + --hash=sha256:1b079a33088d32ff47872cdb37fd15aa42101f0be46c3340244483849b781438 \ + --hash=sha256:8cb30d64a4d32465ea1686bc827cbe452225fb387c4873356b0fa7b9ae63534f \ + --hash=sha256:a151f34712cd645111e89cb30b02e5fb69c9dcc3603ab3c03a561e874bd7cbcf \ + --hash=sha256:e5483ae04bf107411c7469f1be9f9e2eb9840303e788b3ac524fe30af90d45f4 +PyQt6-NetworkAuth==6.6.0 \ + --hash=sha256:7b90b81792fe53105287c8cbb5e4b22bc44a482268ffb7d3e33f852807f86182 \ + --hash=sha256:c7e2335159aa795e2fe6fb069ccce6308672ab80f26c50fab57caf957371cbb5 \ + --hash=sha256:cdfc0bfaea16a9e09f075bdafefb996aa9fdec392052ba4fb3cbac233c1958fb \ + --hash=sha256:f60ff9a62f5129dc2a9d4c495fb47f9a03e4dfb666b50fb7d61f46e89bf7b6a2 +PyQt6-NetworkAuth-Qt6==6.6.0 \ + --hash=sha256:481d9093e1fb1ac6843d8beabcd359cc34b74b9a2cbb3e2b68d96bd3f178d4e0 \ + --hash=sha256:4cc48fd375730a0ba5fbed9d64abb2914f587377560a78a63aff893f9e276a45 \ + --hash=sha256:5006deabf55304d4a3e0b3c954f93e5835546b11e789d14653a2493d12d3a063 \ + --hash=sha256:bcd56bfc892fec961c51eba3c0bf32ba8317a762d9e254d3830569611ed569d6 certifi==2023.5.7; \ --hash=sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716 From cf6874c98481bd899a4a47c9af05af1570688a34 Mon Sep 17 00:00:00 2001 From: "c.lamboo" Date: Fri, 1 Dec 2023 10:53:30 +0100 Subject: [PATCH 019/182] Use the `HttpRequestManager` to avoid blocking the main thread CURA-11289 --- cura/CuraApplication.py | 65 ++++++++++++++++++++++++----------------- 1 file changed, 38 insertions(+), 27 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index e7289a225f..079a27b6ce 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -2,17 +2,18 @@ # Cura is released under the terms of the LGPLv3 or higher. import enum import os +import re import sys import tempfile import time import platform from pathlib import Path from typing import cast, TYPE_CHECKING, Optional, Callable, List, Any, Dict -import re import requests import numpy -from PyQt6.QtCore import QObject, QTimer, QUrl, QUrlQuery, pyqtSignal, pyqtProperty, QEvent, pyqtEnum, QCoreApplication +from PyQt6.QtCore import QObject, QTimer, QUrl, QUrlQuery, pyqtSignal, pyqtProperty, QEvent, pyqtEnum, QCoreApplication, \ + QByteArray from PyQt6.QtGui import QColor, QIcon from PyQt6.QtQml import qmlRegisterUncreatableType, qmlRegisterUncreatableMetaObject, qmlRegisterSingletonType, qmlRegisterType from PyQt6.QtWidgets import QMessageBox @@ -1802,33 +1803,43 @@ class CuraApplication(QtApplication): case "open": query = QUrlQuery(url.query()) model_url = QUrl(query.queryItemValue("file", options=QUrl.ComponentFormattingOption.FullyDecoded)) - response = requests.get(model_url.url()) - if response.status_code is not 200: - Logger.log("e", "Could not download file from {0}".format(model_url.url())) + + def on_finish(response): + content_disposition_header_key = QByteArray("content-disposition".encode()) + + if not response.hasRawHeader(content_disposition_header_key): + Logger.log("w", "Could not find Content-Disposition header in response from {0}".format( + model_url.url())) + # Use the last part of the url as the filename, and assume it is an STL file + filename = model_url.path().split("/")[-1] + ".stl" + else: + # content_disposition is in the format + # ``` + # content_disposition attachment; "filename=[FILENAME]" + # ``` + # Use a regex to extract the filename + content_disposition = str(response.rawHeader(content_disposition_header_key).data(), + encoding='utf-8') + content_disposition_match = re.match(r'attachment; filename="(?P.*)"', + content_disposition) + assert content_disposition_match is not None + filename = content_disposition_match.group("filename") + + tmp = tempfile.NamedTemporaryFile(suffix=filename, delete=False) + with open(tmp.name, "wb") as f: + f.write(response.readAll()) + + self.readLocalFile(QUrl.fromLocalFile(tmp.name), add_to_recent_files=False) + + def on_error(): + Logger.log("w", "Could not download file from {0}".format(model_url.url())) return - content_disposition = response.headers.get('Content-Disposition') - if content_disposition is None: - Logger.log("w", - "Could not find Content-Disposition header in response from {0}".format(model_url.url())) - # Use the last part of the url as the filename, and assume it is an STL file - filename = model_url.path().split("/")[-1] + ".stl" - else: - # content_disposition is in the following format - # ``` - # content_disposition attachment; "filename=[FILENAME]" - # ``` - # Use a regex to extract the filename - # content_disposition = response.headers.get('Content-Disposition') - content_disposition_match = re.match(r'attachment; filename="(?P.*)"', - content_disposition) - assert content_disposition_match is not None - filename = content_disposition_match.group("filename") - - tmp = tempfile.NamedTemporaryFile(suffix=filename, delete=False) - with open(tmp.name, "wb") as f: - f.write(response.content) - self.readLocalFile(QUrl.fromLocalFile(tmp.name), add_to_recent_files=False) + self.getHttpRequestManager().get( + model_url.url(), + callback=on_finish, + error_callback=on_error, + ) case path: Logger.log("w", "Unsupported url scheme path: {0}".format(path)) From 4b4b8b351462f7b788816c2ddbf2d75d38ee7de6 Mon Sep 17 00:00:00 2001 From: "c.lamboo" Date: Fri, 1 Dec 2023 13:03:40 +0100 Subject: [PATCH 020/182] Update nsi installer CURA-11288 --- packaging/NSIS/Ultimaker-Cura.nsi.jinja | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/packaging/NSIS/Ultimaker-Cura.nsi.jinja b/packaging/NSIS/Ultimaker-Cura.nsi.jinja index 228dba4fe4..c562e5f654 100644 --- a/packaging/NSIS/Ultimaker-Cura.nsi.jinja +++ b/packaging/NSIS/Ultimaker-Cura.nsi.jinja @@ -197,13 +197,11 @@ Section UrlProtocol WriteRegStr HKCR "cura" "" "URL:cura" WriteRegStr HKCR "cura" "URL Protocol" "" WriteRegStr HKCR "cura\DefaultIcon" "" "$INSTDIR\${MAIN_APP_EXE},1" - WriteRegStr HKCR "cura\shell" "" "open" - WriteRegStr HKCR "cura\shell\open\command" "" '"$INSTDIR\${MAIN_APP_EXE}" "%1"' + WriteRegStr HKCR "cura\shell\open\command" "" '"$INSTDIR\${MAIN_APP_EXE}"' WriteRegStr HKCR "slicer" "" "URL:slicer" WriteRegStr HKCR "slicer" "URL Protocol" "" WriteRegStr HKCR "slicer\DefaultIcon" "" "$INSTDIR\${MAIN_APP_EXE},1" - WriteRegStr HKCR "slicer\shell" "" "open" - WriteRegStr HKCR "slicer\shell\open\command" "" '"$INSTDIR\${MAIN_APP_EXE}" "%1"' + WriteRegStr HKCR "slicer\shell\open\command" "" '"$INSTDIR\${MAIN_APP_EXE}"' SectionEnd \ No newline at end of file From 34aecf20fe4f8f5e1ff4e52e80969d2f4279cb15 Mon Sep 17 00:00:00 2001 From: "c.lamboo" Date: Fri, 1 Dec 2023 13:04:49 +0100 Subject: [PATCH 021/182] pin uranium CURA-11288 --- conanfile.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/conanfile.py b/conanfile.py index 48cba847be..2c756f20c8 100644 --- a/conanfile.py +++ b/conanfile.py @@ -327,7 +327,7 @@ class CuraConan(ConanFile): self.requires("pysavitar/5.3.0") self.requires("pynest2d/5.3.0") self.requires("curaengine_plugin_gradual_flow/0.1.0") - self.requires("uranium/(latest)@ultimaker/testing") + self.requires("uranium/latest@ultimaker/cura_11288") self.requires("cura_binary_data/(latest)@ultimaker/testing") self.requires("cpython/3.10.4") if self.options.internal: @@ -358,7 +358,7 @@ class CuraConan(ConanFile): vr = VirtualRunEnv(self) vr.generate() - self._generate_cura_version(os.path.join(self.source_folder, "cura")) + # self._generate_cura_version(os.path.join(self.source_folder, "cura")) if not self.in_local_cache: # Copy CuraEngine.exe to bindirs of Virtual Python Environment @@ -466,7 +466,7 @@ echo "CURA_APP_NAME={{ cura_app_name }}" >> ${{ env_prefix }}GITHUB_ENV ext = ".sh" if self.settings.os != "Windows" else ".ps1" save(self, os.path.join(self._script_dir, f"activate_github_actions_version_env{ext}"), activate_github_actions_version_env) - self._generate_cura_version(os.path.join(self._site_packages, "cura")) + # self._generate_cura_version(os.path.join(self._site_packages, "cura")) entitlements_file = "'{}'".format(Path(self.cpp_info.res_paths[2], "MacOS", "cura.entitlements")) self._generate_pyinstaller_spec(location = self._base_dir, From 19b75b96fb007973bb2fe3f3c0ef0e1e95567903 Mon Sep 17 00:00:00 2001 From: "c.lamboo" Date: Fri, 1 Dec 2023 16:13:19 +0100 Subject: [PATCH 022/182] unpin dulcificum CURA-11288 --- conanfile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conanfile.py b/conanfile.py index 2c756f20c8..b58cbb4b7f 100644 --- a/conanfile.py +++ b/conanfile.py @@ -322,7 +322,7 @@ class CuraConan(ConanFile): self.requires("curaengine_grpc_definitions/0.1.0") self.requires("zlib/1.2.13") self.requires("pyarcus/5.3.0") - self.requires("dulcificum/0.1.0-beta.1") + self.requires("dulcificum/(latest)@ultimaker/testing") self.requires("curaengine/(latest)@ultimaker/testing") self.requires("pysavitar/5.3.0") self.requires("pynest2d/5.3.0") From e904123b8095376d31138b0c095909773a4e7d43 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Mon, 4 Dec 2023 14:41:46 +0100 Subject: [PATCH 023/182] Use Uranium CURA-11137 Contribute to CURA-11137 --- .github/workflows/conan-recipe-export.yml | 110 ---------------------- conandata.yml | 2 +- 2 files changed, 1 insertion(+), 111 deletions(-) delete mode 100644 .github/workflows/conan-recipe-export.yml diff --git a/.github/workflows/conan-recipe-export.yml b/.github/workflows/conan-recipe-export.yml deleted file mode 100644 index 69c4e4d34a..0000000000 --- a/.github/workflows/conan-recipe-export.yml +++ /dev/null @@ -1,110 +0,0 @@ -name: Export Conan Recipe to server - -on: - workflow_call: - inputs: - recipe_id_full: - required: true - type: string - - recipe_id_latest: - required: false - type: string - - runs_on: - required: true - type: string - - python_version: - required: true - type: string - - conan_config_branch: - required: false - type: string - - conan_logging_level: - required: false - type: string - - conan_export_binaries: - required: false - type: boolean - - conan_upload_community: - required: false - default: true - type: boolean - -env: - CONAN_LOGIN_USERNAME: ${{ secrets.CONAN_USER }} - CONAN_PASSWORD: ${{ secrets.CONAN_PASS }} - CONAN_LOG_RUN_TO_OUTPUT: 1 - CONAN_LOGGING_LEVEL: ${{ inputs.conan_logging_level }} - CONAN_NON_INTERACTIVE: 1 - -jobs: - package-export: - runs-on: ${{ inputs.runs_on }} - - steps: - - name: Checkout project - uses: actions/checkout@v3 - - - name: Setup Python and pip - uses: actions/setup-python@v4 - with: - python-version: ${{ inputs.python_version }} - cache: 'pip' - cache-dependency-path: .github/workflows/requirements-conan-package.txt - - - name: Install Python requirements and Create default Conan profile - run: | - pip install -r https://raw.githubusercontent.com/Ultimaker/Cura/main/.github/workflows/requirements-conan-package.txt - conan profile new default --detect - # Note the runner requirements are always installed from the main branch in the Ultimaker/Cura repo - - - name: Cache Conan local repository packages - uses: actions/cache@v3 - with: - path: $HOME/.conan/data - key: ${{ runner.os }}-conan-export-cache - - - name: Get Conan configuration from branch - if: ${{ inputs.conan_config_branch != '' }} - run: conan config install https://github.com/Ultimaker/conan-config.git -a "-b ${{ inputs.conan_config_branch }}" - - - name: Get Conan configuration - run: | - conan config install https://github.com/Ultimaker/conan-config.git - conan config install https://github.com/Ultimaker/conan-config.git -a "-b runner/${{ runner.os }}/${{ runner.arch }}" - - - name: Add Cura private Artifactory remote - run: conan remote add cura-private-conan-dev https://cura.jfrog.io/artifactory/api/conan/cura-private-conan-dev True - - - name: Set GH service account for remote cura-conan-dev - run: conan user -p ${{ secrets.CONAN_GH_RUNNER_PASS }} -r cura-private-conan-dev "${{ secrets.CONAN_GH_RUNNER_USER }}" - - - name: Export the Package (binaries) - if: ${{ inputs.conan_export_binaries }} - run: conan create . ${{ inputs.recipe_id_full }} --build=missing --update -c tools.build:skip_test=True - - - name: Export the Package - if: ${{ !inputs.conan_export_binaries }} - run: conan export . ${{ inputs.recipe_id_full }} - - - name: Create the latest alias - if: always() - run: conan alias ${{ inputs.recipe_id_latest }} ${{ inputs.recipe_id_full }} - - - name: Upload the Package(s) - if: ${{ always() && inputs.conan_upload_community }} - run: | - conan upload ${{ inputs.recipe_id_full }} -r cura --all -c - conan upload ${{ inputs.recipe_id_latest }} -r cura -c - - - name: Upload the Package(s) to the private Artifactory - if: ${{ always() && ! inputs.conan_upload_community }} - run: | - conan upload ${{ inputs.recipe_id_full }} -r cura-private-conan-dev --all -c - conan upload ${{ inputs.recipe_id_latest }} -r cura-private-conan-dev -c diff --git a/conandata.yml b/conandata.yml index 52f15cb3f3..347602a02e 100644 --- a/conandata.yml +++ b/conandata.yml @@ -1,6 +1,6 @@ version: "5.7.0-alpha.0" requirements: - - "uranium/(latest)@ultimaker/cura_10831" + - "uranium/(latest)@ultimaker/cura_11137" - "curaengine/(latest)@ultimaker/cura_10831" - "cura_binary_data/(latest)@ultimaker/cura_10831" - "fdm_materials/(latest)@ultimaker/cura_10831" From ce0cdd0b91f8df5a28e9bdf0bebd13c8f850bdb2 Mon Sep 17 00:00:00 2001 From: "saumya.jain" Date: Mon, 4 Dec 2023 17:07:43 +0100 Subject: [PATCH 024/182] =?UTF-8?q?Model=20translations=20while=20changing?= =?UTF-8?q?=20build=20plates=20while=20importing=20models,=20coordinate=20?= =?UTF-8?q?translations=20shouldn=E2=80=99t=20matter=20and=20the=20object?= =?UTF-8?q?=20should=20be=20organized=20on=20the=20plate=20where=20it=20fi?= =?UTF-8?q?nds=20space.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CURA-11166 --- cura/CuraApplication.py | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index c6c44cf8f5..7e2f0fb1ca 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -179,6 +179,7 @@ class CuraApplication(QtApplication): self._use_single_instance = False self._single_instance = None + self._project_mode = None self._cura_formula_functions = None # type: Optional[CuraFormulaFunctions] @@ -1845,7 +1846,7 @@ class CuraApplication(QtApplication): Logger.log("i", "Attempting to read file %s", file.toString()) if not file.isValid(): return - + self._project_mode = project_mode scene = self.getController().getScene() for node in DepthFirstIterator(scene.getRoot()): @@ -1855,16 +1856,16 @@ class CuraApplication(QtApplication): is_project_file = self.checkIsValidProjectFile(file) - if project_mode is None: - project_mode = self.getPreferences().getValue("cura/choice_on_open_project") + if self._project_mode is None: + self._project_mode = self.getPreferences().getValue("cura/choice_on_open_project") - if is_project_file and project_mode == "open_as_project": + if is_project_file and self._project_mode == "open_as_project": # open as project immediately without presenting a dialog workspace_handler = self.getWorkspaceFileHandler() workspace_handler.readLocalFile(file, add_to_recent_files_hint = add_to_recent_files) return - if is_project_file and project_mode == "always_ask": + if is_project_file and self._project_mode == "always_ask": # present a dialog asking to open as project or import models self.callLater(self.openProjectFile.emit, file, add_to_recent_files) return @@ -1999,8 +2000,11 @@ class CuraApplication(QtApplication): center_y = 0 node.translate(Vector(0, center_y, 0)) - nodes_to_arrange.append(node) + # If file extention is 3mf and models are to be loaded from a cura project, + # models are to be arranged in buildplate. + elif self._project_mode == "open_as_model": + nodes_to_arrange.append(node) # This node is deep copied from some other node which already has a BuildPlateDecorator, but the deepcopy # of BuildPlateDecorator produces one that's associated with build plate -1. So, here we need to check if From 3c86bf140ceba3e6830b0d483fdba5d17857e852 Mon Sep 17 00:00:00 2001 From: Erwan MATHIEU Date: Mon, 4 Dec 2023 19:47:07 +0100 Subject: [PATCH 025/182] Add support for OAuth2 client secret --- cura/OAuth2/AuthorizationHelpers.py | 2 ++ cura/OAuth2/Models.py | 1 + 2 files changed, 3 insertions(+) diff --git a/cura/OAuth2/AuthorizationHelpers.py b/cura/OAuth2/AuthorizationHelpers.py index a654ee4bdb..569ba80659 100644 --- a/cura/OAuth2/AuthorizationHelpers.py +++ b/cura/OAuth2/AuthorizationHelpers.py @@ -40,6 +40,7 @@ class AuthorizationHelpers: """ data = { "client_id": self._settings.CLIENT_ID if self._settings.CLIENT_ID is not None else "", + "client_secret": self._settings.CLIENT_SECRET if self._settings.CLIENT_SECRET is not None else "", "redirect_uri": self._settings.CALLBACK_URL if self._settings.CALLBACK_URL is not None else "", "grant_type": "authorization_code", "code": authorization_code, @@ -64,6 +65,7 @@ class AuthorizationHelpers: Logger.log("d", "Refreshing the access token for [%s]", self._settings.OAUTH_SERVER_URL) data = { "client_id": self._settings.CLIENT_ID if self._settings.CLIENT_ID is not None else "", + "client_secret": self._settings.CLIENT_SECRET if self._settings.CLIENT_SECRET is not None else "", "redirect_uri": self._settings.CALLBACK_URL if self._settings.CALLBACK_URL is not None else "", "grant_type": "refresh_token", "refresh_token": refresh_token, diff --git a/cura/OAuth2/Models.py b/cura/OAuth2/Models.py index 4c84872a09..3427f1cc3d 100644 --- a/cura/OAuth2/Models.py +++ b/cura/OAuth2/Models.py @@ -16,6 +16,7 @@ class OAuth2Settings(BaseModel): CALLBACK_PORT = None # type: Optional[int] OAUTH_SERVER_URL = None # type: Optional[str] CLIENT_ID = None # type: Optional[str] + CLIENT_SECRET = None # type: Optional[str] CLIENT_SCOPES = None # type: Optional[str] CALLBACK_URL = None # type: Optional[str] AUTH_DATA_PREFERENCE_KEY = "" # type: str From aac9af577bf6895665eb34dcae4e7fc5967caeff Mon Sep 17 00:00:00 2001 From: Erwan MATHIEU Date: Mon, 4 Dec 2023 20:09:36 +0100 Subject: [PATCH 026/182] Fix AuthorizationService signals --- cura/OAuth2/AuthorizationService.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/cura/OAuth2/AuthorizationService.py b/cura/OAuth2/AuthorizationService.py index 62bf31982a..cac9c0df38 100644 --- a/cura/OAuth2/AuthorizationService.py +++ b/cura/OAuth2/AuthorizationService.py @@ -31,15 +31,15 @@ class AuthorizationService: account information. """ - # Emit signal when authentication is completed. - onAuthStateChanged = Signal() - - # Emit signal when authentication failed. - onAuthenticationError = Signal() - - accessTokenChanged = Signal() - def __init__(self, settings: "OAuth2Settings", preferences: Optional["Preferences"] = None) -> None: + # Emit signal when authentication is completed. + self.onAuthStateChanged = Signal() + + # Emit signal when authentication failed. + self.onAuthenticationError = Signal() + + self.accessTokenChanged = Signal() + self._settings = settings self._auth_helpers = AuthorizationHelpers(settings) self._auth_url = "{}/authorize".format(self._settings.OAUTH_SERVER_URL) From b794989468653d04c3e0e24044cb8ea61ce29dff Mon Sep 17 00:00:00 2001 From: Erwan MATHIEU Date: Mon, 4 Dec 2023 20:58:11 +0100 Subject: [PATCH 027/182] Allow for OAuth service to stop after token has been retrieved --- cura/OAuth2/AuthorizationService.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/cura/OAuth2/AuthorizationService.py b/cura/OAuth2/AuthorizationService.py index cac9c0df38..06478e911b 100644 --- a/cura/OAuth2/AuthorizationService.py +++ b/cura/OAuth2/AuthorizationService.py @@ -31,7 +31,10 @@ class AuthorizationService: account information. """ - def __init__(self, settings: "OAuth2Settings", preferences: Optional["Preferences"] = None) -> None: + def __init__(self, + settings: "OAuth2Settings", + preferences: Optional["Preferences"] = None, + get_user_profile: bool = True) -> None: # Emit signal when authentication is completed. self.onAuthStateChanged = Signal() @@ -45,6 +48,7 @@ class AuthorizationService: self._auth_url = "{}/authorize".format(self._settings.OAUTH_SERVER_URL) self._auth_data: Optional[AuthenticationResponse] = None self._user_profile: Optional["UserProfile"] = None + self._get_user_profile: bool = get_user_profile self._preferences = preferences self._server = LocalAuthorizationServer(self._auth_helpers, self._onAuthStateChanged, daemon=True) self._currently_refreshing_token = False # Whether we are currently in the process of refreshing auth. Don't make new requests while busy. @@ -294,7 +298,8 @@ class AuthorizationService: self._auth_data = auth_data self._currently_refreshing_token = False if auth_data: - self.getUserProfile() + if self._get_user_profile: + self.getUserProfile() self._preferences.setValue(self._settings.AUTH_DATA_PREFERENCE_KEY, json.dumps(auth_data.dump())) else: Logger.log("d", "Clearing the user profile") From a9c3c2b4b432d7224d97fa356e8d042f4848aeba Mon Sep 17 00:00:00 2001 From: Paul Kuiper <46715907+pkuiper-ultimaker@users.noreply.github.com> Date: Tue, 5 Dec 2023 15:25:52 +0100 Subject: [PATCH 028/182] Increased raft base layer speed from 5mm/s to 10mm/s and increased raft middle layer linewidth from 0.4 to 0.7mm to increase productivity. PP-408 --- resources/definitions/ultimaker_method_base.def.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/definitions/ultimaker_method_base.def.json b/resources/definitions/ultimaker_method_base.def.json index 6ac68ef2de..ea00c726c2 100644 --- a/resources/definitions/ultimaker_method_base.def.json +++ b/resources/definitions/ultimaker_method_base.def.json @@ -353,11 +353,11 @@ "print_sequence": { "enabled": false }, "raft_base_line_spacing": { "value": "2*raft_base_line_width" }, "raft_base_line_width": { "value": 1.4 }, - "raft_base_speed": { "value": 5 }, + "raft_base_speed": { "value": 10 }, "raft_base_thickness": { "value": 0.8 }, "raft_interface_extruder_nr": { "value": "raft_surface_extruder_nr" }, "raft_interface_layers": { "value": 2 }, - "raft_interface_line_width": { "value": "line_width" }, + "raft_interface_line_width": { "value": 0.7 }, "raft_interface_speed": { "value": 90 }, "raft_interface_thickness": { "value": 0.3 }, "raft_margin": { "value": 3 }, From b46f6e8e09582f49216e4f0af295a413b78c9e7e Mon Sep 17 00:00:00 2001 From: "c.lamboo" Date: Tue, 5 Dec 2023 18:24:44 +0100 Subject: [PATCH 029/182] Add support for CLI file opening with 'cura' and 'slicer' schemes CURA-11288 --- cura/CuraApplication.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 079a27b6ce..a71b6d9915 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -276,6 +276,8 @@ class CuraApplication(QtApplication): self._conan_installs = ApplicationMetadata.CONAN_INSTALLS self._python_installs = ApplicationMetadata.PYTHON_INSTALLS + self._supported_url_schemes: List[str] = ["cura", "slicer"] + @pyqtProperty(str, constant=True) def ultimakerCloudApiRootUrl(self) -> str: return UltimakerCloudConstants.CuraCloudAPIRoot @@ -328,7 +330,11 @@ class CuraApplication(QtApplication): assert not "This crash is triggered by the trigger_early_crash command line argument." for filename in self._cli_args.file: - self._files_to_open.append(os.path.abspath(filename)) + url = QUrl(filename) + if url.scheme() in self._supported_url_schemes: + self._open_url_queue.append(url) + else: + self._files_to_open.append(os.path.abspath(filename)) def initialize(self) -> None: self.__addExpectedResourceDirsAndSearchPaths() # Must be added before init of super @@ -1794,8 +1800,7 @@ class CuraApplication(QtApplication): self.readLocalFile(QUrl.fromLocalFile(filename)) def _openUrl(self, url: QUrl) -> None: - supported_schemes = ["cura", "slicer"] - if url.scheme() not in supported_schemes: + if url.scheme() not in self._supported_url_schemes: # only handle cura:// and slicer:// urls schemes return From a7a4e4bd2911ae9a7a9095cb9d676b009233149a Mon Sep 17 00:00:00 2001 From: "c.lamboo" Date: Wed, 6 Dec 2023 06:06:08 +0100 Subject: [PATCH 030/182] Revert "Update nsi installer" This reverts commit 4b4b8b351462f7b788816c2ddbf2d75d38ee7de6. --- packaging/NSIS/Ultimaker-Cura.nsi.jinja | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packaging/NSIS/Ultimaker-Cura.nsi.jinja b/packaging/NSIS/Ultimaker-Cura.nsi.jinja index c562e5f654..228dba4fe4 100644 --- a/packaging/NSIS/Ultimaker-Cura.nsi.jinja +++ b/packaging/NSIS/Ultimaker-Cura.nsi.jinja @@ -197,11 +197,13 @@ Section UrlProtocol WriteRegStr HKCR "cura" "" "URL:cura" WriteRegStr HKCR "cura" "URL Protocol" "" WriteRegStr HKCR "cura\DefaultIcon" "" "$INSTDIR\${MAIN_APP_EXE},1" - WriteRegStr HKCR "cura\shell\open\command" "" '"$INSTDIR\${MAIN_APP_EXE}"' + WriteRegStr HKCR "cura\shell" "" "open" + WriteRegStr HKCR "cura\shell\open\command" "" '"$INSTDIR\${MAIN_APP_EXE}" "%1"' WriteRegStr HKCR "slicer" "" "URL:slicer" WriteRegStr HKCR "slicer" "URL Protocol" "" WriteRegStr HKCR "slicer\DefaultIcon" "" "$INSTDIR\${MAIN_APP_EXE},1" - WriteRegStr HKCR "slicer\shell\open\command" "" '"$INSTDIR\${MAIN_APP_EXE}"' + WriteRegStr HKCR "slicer\shell" "" "open" + WriteRegStr HKCR "slicer\shell\open\command" "" '"$INSTDIR\${MAIN_APP_EXE}" "%1"' SectionEnd \ No newline at end of file From 351183f407360b89565084b0bdef72ff7e852570 Mon Sep 17 00:00:00 2001 From: "c.lamboo" Date: Wed, 6 Dec 2023 06:13:39 +0100 Subject: [PATCH 031/182] Temporarily pin spdlog CURA-11288 --- conanfile.py | 1 + 1 file changed, 1 insertion(+) diff --git a/conanfile.py b/conanfile.py index b58cbb4b7f..081db4d933 100644 --- a/conanfile.py +++ b/conanfile.py @@ -335,6 +335,7 @@ class CuraConan(ConanFile): self.requires("fdm_materials/(latest)@internal/testing") else: self.requires("fdm_materials/(latest)@ultimaker/testing") + self.requires("spdlog/1.12.0@_/_") def build_requirements(self): if self.options.get_safe("enable_i18n", False): From c4939701e1f3ee37314f8e71a27eb4196ab3f3e1 Mon Sep 17 00:00:00 2001 From: "c.lamboo" Date: Wed, 6 Dec 2023 06:37:36 +0100 Subject: [PATCH 032/182] Re-enable genrate cura version CURA-11288 --- conanfile.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conanfile.py b/conanfile.py index 081db4d933..ec5be608d6 100644 --- a/conanfile.py +++ b/conanfile.py @@ -359,7 +359,7 @@ class CuraConan(ConanFile): vr = VirtualRunEnv(self) vr.generate() - # self._generate_cura_version(os.path.join(self.source_folder, "cura")) + self._generate_cura_version(os.path.join(self.source_folder, "cura")) if not self.in_local_cache: # Copy CuraEngine.exe to bindirs of Virtual Python Environment @@ -467,7 +467,7 @@ echo "CURA_APP_NAME={{ cura_app_name }}" >> ${{ env_prefix }}GITHUB_ENV ext = ".sh" if self.settings.os != "Windows" else ".ps1" save(self, os.path.join(self._script_dir, f"activate_github_actions_version_env{ext}"), activate_github_actions_version_env) - # self._generate_cura_version(os.path.join(self._site_packages, "cura")) + self._generate_cura_version(os.path.join(self._site_packages, "cura")) entitlements_file = "'{}'".format(Path(self.cpp_info.res_paths[2], "MacOS", "cura.entitlements")) self._generate_pyinstaller_spec(location = self._base_dir, From 153e2e7bd073f4d7e367560345993525f7a5aebc Mon Sep 17 00:00:00 2001 From: "c.lamboo" Date: Wed, 6 Dec 2023 07:14:36 +0100 Subject: [PATCH 033/182] Fix warning/Boyscouting CURA-11288 --- cura/PrinterOutput/Models/MaterialOutputModel.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/cura/PrinterOutput/Models/MaterialOutputModel.py b/cura/PrinterOutput/Models/MaterialOutputModel.py index 6920cead1b..d60c34ed10 100644 --- a/cura/PrinterOutput/Models/MaterialOutputModel.py +++ b/cura/PrinterOutput/Models/MaterialOutputModel.py @@ -42,8 +42,7 @@ class MaterialOutputModel(QObject): "tpu" :{"name" :"tpu_175" ,"guid": "19baa6a9-94ff-478b-b4a1-8157b74358d2"} } - - if guid is None and brand is not "empty" and type in _MATERIAL_MAP: + if guid is None and brand != "empty" and type in _MATERIAL_MAP: name = _MATERIAL_MAP[type]["name"] guid = _MATERIAL_MAP[type]["guid"] return name, guid From d6a73a5976067078c7e7e63e2d6a12b89573d566 Mon Sep 17 00:00:00 2001 From: "c.lamboo" Date: Wed, 6 Dec 2023 07:57:45 +0100 Subject: [PATCH 034/182] Fix opening files on windows `_open_url_queue` is expecting a list of strings, not a `QUrl` instance CURA-11288 --- cura/CuraApplication.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index a71b6d9915..82313eece8 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -332,7 +332,7 @@ class CuraApplication(QtApplication): for filename in self._cli_args.file: url = QUrl(filename) if url.scheme() in self._supported_url_schemes: - self._open_url_queue.append(url) + self._open_url_queue.append(filename) else: self._files_to_open.append(os.path.abspath(filename)) From 568fc4ca766afa3ee14f1620d925b90363196b09 Mon Sep 17 00:00:00 2001 From: "c.lamboo" Date: Wed, 6 Dec 2023 08:49:37 +0100 Subject: [PATCH 035/182] Revert "Fix opening files on windows" This reverts commit d6a73a5976067078c7e7e63e2d6a12b89573d566. --- cura/CuraApplication.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 82313eece8..a71b6d9915 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -332,7 +332,7 @@ class CuraApplication(QtApplication): for filename in self._cli_args.file: url = QUrl(filename) if url.scheme() in self._supported_url_schemes: - self._open_url_queue.append(filename) + self._open_url_queue.append(url) else: self._files_to_open.append(os.path.abspath(filename)) From 30e4c61620fc31703cf0b4227f419beea882db30 Mon Sep 17 00:00:00 2001 From: "saumya.jain" Date: Wed, 6 Dec 2023 12:39:10 +0100 Subject: [PATCH 036/182] review comments fix CURA-11166 --- cura/CuraApplication.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 7e2f0fb1ca..28dfd5e1c9 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -179,7 +179,7 @@ class CuraApplication(QtApplication): self._use_single_instance = False self._single_instance = None - self._project_mode = None + self._open_project_mode: Optional[str] = None self._cura_formula_functions = None # type: Optional[CuraFormulaFunctions] @@ -1846,7 +1846,7 @@ class CuraApplication(QtApplication): Logger.log("i", "Attempting to read file %s", file.toString()) if not file.isValid(): return - self._project_mode = project_mode + self._open_project_mode = project_mode scene = self.getController().getScene() for node in DepthFirstIterator(scene.getRoot()): @@ -1856,16 +1856,16 @@ class CuraApplication(QtApplication): is_project_file = self.checkIsValidProjectFile(file) - if self._project_mode is None: - self._project_mode = self.getPreferences().getValue("cura/choice_on_open_project") + if self._open_project_mode is None: + self._open_project_mode = self.getPreferences().getValue("cura/choice_on_open_project") - if is_project_file and self._project_mode == "open_as_project": + if is_project_file and self._open_project_mode == "open_as_project": # open as project immediately without presenting a dialog workspace_handler = self.getWorkspaceFileHandler() workspace_handler.readLocalFile(file, add_to_recent_files_hint = add_to_recent_files) return - if is_project_file and self._project_mode == "always_ask": + if is_project_file and self._open_project_mode == "always_ask": # present a dialog asking to open as project or import models self.callLater(self.openProjectFile.emit, file, add_to_recent_files) return @@ -2001,9 +2001,9 @@ class CuraApplication(QtApplication): node.translate(Vector(0, center_y, 0)) nodes_to_arrange.append(node) - # If file extention is 3mf and models are to be loaded from a cura project, - # models are to be arranged in buildplate. - elif self._project_mode == "open_as_model": + # If the file is a project,and models are to be loaded from a that project, + # models inside file should be arranged in buildplate. + elif self._open_project_mode == "open_as_model": nodes_to_arrange.append(node) # This node is deep copied from some other node which already has a BuildPlateDecorator, but the deepcopy From 84d56367f4f357caec408e14e4d396d96aa13aef Mon Sep 17 00:00:00 2001 From: "c.lamboo" Date: Wed, 6 Dec 2023 13:33:57 +0100 Subject: [PATCH 037/182] Also listen to the "/" appended string for url schemes Windows adds a slash for some reason CURA-11288 --- cura/CuraApplication.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index a71b6d9915..1f60130787 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -1805,7 +1805,7 @@ class CuraApplication(QtApplication): return match url.host() + url.path(): - case "open": + case "open" | "open/": query = QUrlQuery(url.query()) model_url = QUrl(query.queryItemValue("file", options=QUrl.ComponentFormattingOption.FullyDecoded)) From 7574b56ebad4371efcbeb5bd42d0bbe864e317ec Mon Sep 17 00:00:00 2001 From: Casper Lamboo Date: Thu, 7 Dec 2023 10:32:01 +0100 Subject: [PATCH 038/182] Update conanfile.py --- conanfile.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/conanfile.py b/conanfile.py index 1ee2094490..678943759c 100644 --- a/conanfile.py +++ b/conanfile.py @@ -326,13 +326,12 @@ class CuraConan(ConanFile): self.requires("curaengine_grpc_definitions/0.1.0") self.requires("zlib/1.2.13") self.requires("pyarcus/5.3.0") - self.requires("dulcificum/(latest)@ultimaker/testing") self.requires("dulcificum/(latest)@ultimaker/stable") self.requires("curaengine/(latest)@ultimaker/testing") self.requires("pysavitar/5.3.0") self.requires("pynest2d/5.3.0") self.requires("curaengine_plugin_gradual_flow/0.1.0") - self.requires("uranium/latest@ultimaker/testing") + self.requires("uranium/(latest)@ultimaker/testing") self.requires("cura_binary_data/(latest)@ultimaker/testing") self.requires("cpython/3.10.4@ultimaker/stable") self.requires("openssl/3.2.0") @@ -341,7 +340,6 @@ class CuraConan(ConanFile): self.requires("fdm_materials/(latest)@internal/testing") else: self.requires("fdm_materials/(latest)@ultimaker/testing") - self.requires("spdlog/1.12.0@_/_") def build_requirements(self): if self.options.get_safe("enable_i18n", False): From bf2c8b5a08e0fbf442edfa70ae4f11f04d3c32f2 Mon Sep 17 00:00:00 2001 From: "saumya.jain" Date: Fri, 8 Dec 2023 11:41:16 +0100 Subject: [PATCH 039/182] Simulation time fed to the timer controlling speed simulation time is made 10x faster than the actual time, for better visualisation CURA-7647 --- plugins/SimulationView/SimulationView.py | 10 ++++++---- .../SimulationViewMainComponent.qml | 6 +----- plugins/SimulationView/SimulationViewProxy.py | 15 +++++++++++++++ 3 files changed, 22 insertions(+), 9 deletions(-) diff --git a/plugins/SimulationView/SimulationView.py b/plugins/SimulationView/SimulationView.py index 18d1f981c7..6874b27625 100644 --- a/plugins/SimulationView/SimulationView.py +++ b/plugins/SimulationView/SimulationView.py @@ -79,7 +79,7 @@ class SimulationView(CuraView): self.currentLayerNumChanged.connect(self._onCurrentLayerNumChanged) self._current_feedrates = {} - self._visible_lengths ={} + self._lengths_of_polyline ={} self._busy = False self._simulation_running = False @@ -403,7 +403,9 @@ class SimulationView(CuraView): return self._max_feedrate def getSimulationTime(self) -> list: - return self._visible_lengths[self._current_layer_num] / self._current_feedrates[self._current_layer_num] + if len(self._lengths_of_polyline) > 0 and len(self._lengths_of_polyline) == len(self._current_feedrates): + return self._lengths_of_polyline[self._current_layer_num] / self._current_feedrates[self._current_layer_num] + return numpy.zeros(0) def getMinThickness(self) -> float: if abs(self._min_thickness - sys.float_info.max) < 10: # Some lenience due to floating point rounding. @@ -529,10 +531,10 @@ class SimulationView(CuraView): visible_indicies_with_extrusion = numpy.where(numpy.isin(polyline.types, visible_line_types_with_extrusion))[0] if visible_indices.size == 0: # No items to take maximum or minimum of. continue - self._visible_lengths[layer_index] = numpy.take(polyline.lineLengths, visible_indices) + self._lengths_of_polyline[layer_index] = polyline.lineLengths visible_feedrates = numpy.take(polyline.lineFeedrates, visible_indices) visible_feedrates_with_extrusion = numpy.take(polyline.lineFeedrates, visible_indicies_with_extrusion) - self._current_feedrates[layer_index] = visible_feedrates + self._current_feedrates[layer_index] = polyline.lineFeedrates visible_linewidths = numpy.take(polyline.lineWidths, visible_indices) visible_linewidths_with_extrusion = numpy.take(polyline.lineWidths, visible_indicies_with_extrusion) visible_thicknesses = numpy.take(polyline.lineThicknesses, visible_indices) diff --git a/plugins/SimulationView/SimulationViewMainComponent.qml b/plugins/SimulationView/SimulationViewMainComponent.qml index 66acff656a..216095c15c 100644 --- a/plugins/SimulationView/SimulationViewMainComponent.qml +++ b/plugins/SimulationView/SimulationViewMainComponent.qml @@ -136,10 +136,9 @@ Item Timer { id: simulationTimer - interval: parseFloat(UM.SimulationView.getSimulationTime[pathNumber]).toFixed(2) + interval: UM.SimulationView.simulationTime running: false repeat: true - property int pathNumber : 0 onTriggered: { var currentPath = UM.SimulationView.currentPath @@ -154,12 +153,10 @@ Item if (currentPath >= numPaths) { UM.SimulationView.setCurrentPath(0) - pathNumber =0 } else { UM.SimulationView.setCurrentPath(currentPath + 1) - pathNumber = 0 } } // If the simulation is already playing and we reach the end of a layer, then it automatically @@ -187,7 +184,6 @@ Item // The status must be set here instead of in the resumeSimulation function otherwise it won't work // correctly, because part of the logic is in this trigger function. isSimulationPlaying = true - pathNumber += 1 } } diff --git a/plugins/SimulationView/SimulationViewProxy.py b/plugins/SimulationView/SimulationViewProxy.py index 669f7fdbcc..e80005fc36 100644 --- a/plugins/SimulationView/SimulationViewProxy.py +++ b/plugins/SimulationView/SimulationViewProxy.py @@ -2,9 +2,11 @@ # Cura is released under the terms of the LGPLv3 or higher. from typing import TYPE_CHECKING +import numpy from PyQt6.QtCore import QObject, pyqtSignal, pyqtProperty from UM.FlameProfiler import pyqtSlot from UM.Application import Application +from UM.Logger import Logger if TYPE_CHECKING: from .SimulationView import SimulationView @@ -54,6 +56,19 @@ class SimulationViewProxy(QObject): def currentPath(self): return self._simulation_view.getCurrentPath() + @pyqtProperty(int, notify=currentPathChanged) + def simulationTime(self): + # This if is activated when there is a layer change + if numpy.all(self._simulation_view.getSimulationTime()==0) or len(self._simulation_view.getSimulationTime()) <= self._simulation_view.getCurrentPath(): + return 100 + # Extracts the currents paths simulation time (in seconds) from the dict of simulation time of the current layer. + # We multiply the time with 100 to make it to ms from s.(Should be 1000 in real time). This scaling makes the simulation time 10x faster than the real time. + simulationTimeOfpath =self._simulation_view.getSimulationTime()[0][self._simulation_view.getCurrentPath()] * 100 + # Since the timer cannot process time less than 1 ms, we put a lower limit here + if simulationTimeOfpath < 1: + return 1 + return int(simulationTimeOfpath) + @pyqtProperty(int, notify=currentPathChanged) def minimumPath(self): return self._simulation_view.getMinimumPath() From 7711c15ddedcce78e735d0a016f36e0134d3814d Mon Sep 17 00:00:00 2001 From: "saumya.jain" Date: Fri, 8 Dec 2023 11:43:38 +0100 Subject: [PATCH 040/182] removed unnecessary import CURA-7647 --- plugins/SimulationView/SimulationViewProxy.py | 1 - 1 file changed, 1 deletion(-) diff --git a/plugins/SimulationView/SimulationViewProxy.py b/plugins/SimulationView/SimulationViewProxy.py index e80005fc36..8f83e9b403 100644 --- a/plugins/SimulationView/SimulationViewProxy.py +++ b/plugins/SimulationView/SimulationViewProxy.py @@ -6,7 +6,6 @@ import numpy from PyQt6.QtCore import QObject, pyqtSignal, pyqtProperty from UM.FlameProfiler import pyqtSlot from UM.Application import Application -from UM.Logger import Logger if TYPE_CHECKING: from .SimulationView import SimulationView From 16715e6a3baac8d9e214096895648c935407b262 Mon Sep 17 00:00:00 2001 From: Christopher Peredy <16451370+mastercaution@users.noreply.github.com> Date: Sat, 9 Dec 2023 16:55:36 +0100 Subject: [PATCH 041/182] EN4 update Neptune 4 (Pro) definition Update same acceleration and start G-code settings according to Elegoo Cura v4.8.0_20231208. --- .../definitions/elegoo_neptune_4.def.json | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/resources/definitions/elegoo_neptune_4.def.json b/resources/definitions/elegoo_neptune_4.def.json index 21fd28f6f7..ed4856f540 100644 --- a/resources/definitions/elegoo_neptune_4.def.json +++ b/resources/definitions/elegoo_neptune_4.def.json @@ -9,16 +9,21 @@ }, "overrides": { - "acceleration_layer_0": { "value": 3000 }, - "acceleration_print": { "value": 3000 }, - "acceleration_travel": { "value": 5000 }, + "acceleration_print": + { + "default_value": 10000, + "maximum_value_warning": "20000", + "value": 10000 + }, + "acceleration_wall": { "value": "acceleration_print/2" }, "cool_fan_full_layer": { "value": 2 }, "infill_line_width": { "value": "line_width + 0.05" }, "infill_overlap": { "value": "0 if infill_sparse_density < 40.01 and infill_pattern != 'concentric' else -5" }, + "infill_pattern": { "value": "'lines' if infill_sparse_density > 35 else 'grid'" }, "initial_layer_line_width_factor": { "value": "100.0 if resolveOrValue('adhesion_type') == 'raft' else 125 if line_width < 0.5 else 110" }, - "machine_acceleration": { "value": 3000 }, + "machine_acceleration": { "value": 5000 }, "machine_depth": { "default_value": 230 }, - "machine_end_gcode": { "default_value": "G91 ;Relative positionning\nG1 E-2 F2700 ;Retract a bit\nG1 E-2 Z0.2 F2400 ;Retract and raise Z\nG1 X5 Y5 F3000 ;Wipe out\nG1 Z2 ;Raise Z more\nG90 ;Absolute positionning\nG1 X0 Y{machine_depth} ;Present print\nM106 S0 ;Turn-off fan\nM104 S0 ;Turn-off hotend\nM140 S0 ;Turn-off bed\nM84 X Y E ;Disable all steppers but Z" }, + "machine_end_gcode": { "default_value": "G91 ;Relative positionning\nG1 E-2 F2700 ;Retract a bit\nG1 E-2 Z0.2 F2400 ;Retract and raise Z\nG1 X5 Y5 F3000 ;Wipe out\nG1 Z2 ;Raise Z more\nG90 ;Absolute positionning\nG1 X0 Y{machine_depth - 5} ;Present print\nM106 S0 ;Turn-off fan\nM104 S0 ;Turn-off hotend\nM140 S0 ;Turn-off bed\nM84 X Y E ;Disable all steppers but Z" }, "machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" }, "machine_head_with_fans_polygon": { @@ -32,12 +37,12 @@ "machine_heated_bed": { "default_value": true }, "machine_height": { "default_value": 270 }, "machine_max_acceleration_e": { "value": 5000 }, - "machine_max_acceleration_x": { "value": 5000 }, - "machine_max_acceleration_y": { "value": 5000 }, + "machine_max_acceleration_x": { "value": 20000 }, + "machine_max_acceleration_y": { "value": 20000 }, "machine_name": { "default_value": "ELEGOO NEPTUNE 4" }, "machine_nozzle_cool_down_speed": { "value": 0.75 }, "machine_nozzle_heat_up_speed": { "value": 1.6 }, - "machine_start_gcode": { "default_value": "G28 ;home\nG92 E0 ;Reset Extruder\nG1 Z4.0 F3000 ;Move Z Axis up\nG92 E0 ;Reset Extruder\nG1 X1.1 Y20 Z0.28 F5000.0 ;Move to start position\nG1 X1.1 Y80.0 Z0.28 F1500.0 E10 ;Draw the first line\nG1 X1.4 Y80.0 Z0.28 F5000.0 ;Move to side a little\nG1 X1.4 Y20 Z0.28 F1500.0 E20 ;Draw the second line\nG92 E0 ;Reset Extruder\nG1 Z2.0 F3000 ;Move Z Axis up" }, + "machine_start_gcode": { "default_value": ";ELEGOO NEPTUNE 4 / 4 PRO\nM220 S100 ;Set the feed speed to 100%\nM221 S100 ;Set the flow rate to 100%\nM104 S140 ;Start heating extruder\nM190 S{material_bed_temperature_layer_0} ;Wait for the bed to reach print temp\nG90\nG28 ;home\nG1 Z10 F300\nG1 X67.5 Y0 F6000\nG1 Z0 F300\nM109 S{material_print_temperature_layer_0} ;Wait for extruder to reach print temp\nG92 E0 ;Reset Extruder\nG1 X67.5 Y0 Z0.4 F300 ;Move to start position\nG1 X167.5 E30 F400 ;Draw the first line\nG1 Z0.6 F120.0 ;Move to side a little\nG1 X162.5 F3000\nG92 E0 ;Reset Extruder" }, "machine_width": { "default_value": 235 }, "retraction_amount": { "default_value": 0.5 }, "retraction_count_max": { "value": 80 }, From 94f14b53f89f1e5c61a18aa22002af22d7a773b5 Mon Sep 17 00:00:00 2001 From: Christopher Peredy <16451370+mastercaution@users.noreply.github.com> Date: Sat, 9 Dec 2023 16:58:24 +0100 Subject: [PATCH 042/182] EN4 add Neptune 4 Plus and Max variants --- .../definitions/elegoo_neptune_4max.def.json | 57 +++++++++++++++++++ .../definitions/elegoo_neptune_4plus.def.json | 57 +++++++++++++++++++ .../elegoo_neptune_4max_0.20.inst.cfg | 13 +++++ .../elegoo_neptune_4max_0.40.inst.cfg | 13 +++++ .../elegoo_neptune_4max_0.60.inst.cfg | 13 +++++ .../elegoo_neptune_4max_0.80.inst.cfg | 13 +++++ .../elegoo_neptune_4plus_0.20.inst.cfg | 13 +++++ .../elegoo_neptune_4plus_0.40.inst.cfg | 13 +++++ .../elegoo_neptune_4plus_0.60.inst.cfg | 13 +++++ .../elegoo_neptune_4plus_0.80.inst.cfg | 13 +++++ 10 files changed, 218 insertions(+) create mode 100644 resources/definitions/elegoo_neptune_4max.def.json create mode 100644 resources/definitions/elegoo_neptune_4plus.def.json create mode 100644 resources/variants/elegoo/elegoo_neptune_4max/elegoo_neptune_4max_0.20.inst.cfg create mode 100644 resources/variants/elegoo/elegoo_neptune_4max/elegoo_neptune_4max_0.40.inst.cfg create mode 100644 resources/variants/elegoo/elegoo_neptune_4max/elegoo_neptune_4max_0.60.inst.cfg create mode 100644 resources/variants/elegoo/elegoo_neptune_4max/elegoo_neptune_4max_0.80.inst.cfg create mode 100644 resources/variants/elegoo/elegoo_neptune_4plus/elegoo_neptune_4plus_0.20.inst.cfg create mode 100644 resources/variants/elegoo/elegoo_neptune_4plus/elegoo_neptune_4plus_0.40.inst.cfg create mode 100644 resources/variants/elegoo/elegoo_neptune_4plus/elegoo_neptune_4plus_0.60.inst.cfg create mode 100644 resources/variants/elegoo/elegoo_neptune_4plus/elegoo_neptune_4plus_0.80.inst.cfg diff --git a/resources/definitions/elegoo_neptune_4max.def.json b/resources/definitions/elegoo_neptune_4max.def.json new file mode 100644 index 0000000000..c2240594b0 --- /dev/null +++ b/resources/definitions/elegoo_neptune_4max.def.json @@ -0,0 +1,57 @@ +{ + "version": 2, + "name": "ELEGOO NEPTUNE 4 Max", + "inherits": "elegoo_neptune_4", + "metadata": + { + "visible": true, + "author": "mastercaution", + "quality_definition": "elegoo_neptune_4" + }, + "overrides": + { + "acceleration_print": + { + "default_value": 2500, + "maximum_value_warning": "15000", + "value": 2500 + }, + "machine_depth": { "default_value": 430 }, + "machine_height": { "default_value": 482 }, + "machine_max_acceleration_e": { "value": 5000 }, + "machine_max_acceleration_x": { "value": 15000 }, + "machine_max_acceleration_y": { "value": 15000 }, + "machine_name": { "default_value": "ELEGOO NEPTUNE 4 Max" }, + "machine_start_gcode": { "default_value": ";ELEGOO NEPTUNE 4 MAX\nM220 S100 ;Set the feed speed to 100%\nM221 S100 ;Set the flow rate to 100%\nM104 S140 ;Start heating extruder\nM190 S{material_bed_temperature_layer_0} ;Wait for the bed to reach print temp\nG90\nG28 ;home\nG1 Z10 F300\nG1 X165 Y0 F6000\nG1 Z0 F300\nM109 S{material_print_temperature_layer_0} ;Wait for extruder to reach print temp\nG92 E0 ;Reset Extruder\nG1 X165 Y0 Z0.4 F300 ;Move to start position\nG1 X265 E30 F400 ;Draw the first line\nG1 Z0.6 F120.0 ;Move to side a little\nG1 X260 F3000\nG92 E0 ;Reset Extruder" }, + "machine_width": { "default_value": 430 }, + "nozzle_disallowed_areas": + { + "default_value": [ + [ + [-165, -165], + [-165, 165], + [-161, 165], + [-161, -165] + ], + [ + [165, 165], + [165, -165], + [161, -165], + [161, 165] + ], + [ + [-165, -165], + [165, -165], + [-165, -161], + [165, -161] + ], + [ + [-165, 165], + [165, 165], + [-165, 161], + [165, 161] + ] + ] + } + } +} \ No newline at end of file diff --git a/resources/definitions/elegoo_neptune_4plus.def.json b/resources/definitions/elegoo_neptune_4plus.def.json new file mode 100644 index 0000000000..703db64634 --- /dev/null +++ b/resources/definitions/elegoo_neptune_4plus.def.json @@ -0,0 +1,57 @@ +{ + "version": 2, + "name": "ELEGOO NEPTUNE 4 Plus", + "inherits": "elegoo_neptune_4", + "metadata": + { + "visible": true, + "author": "mastercaution", + "quality_definition": "elegoo_neptune_4" + }, + "overrides": + { + "acceleration_print": + { + "default_value": 4000, + "value": 4000 + }, + "machine_acceleration": { "value": 4000 }, + "machine_depth": { "default_value": 330 }, + "machine_height": { "default_value": 387 }, + "machine_max_acceleration_e": { "value": 5000 }, + "machine_max_acceleration_x": { "value": 20000 }, + "machine_max_acceleration_y": { "value": 20000 }, + "machine_name": { "default_value": "ELEGOO NEPTUNE 4 Plus" }, + "machine_start_gcode": { "default_value": ";ELEGOO NEPTUNE 4 PLUS\nM220 S100 ;Set the feed speed to 100%\nM221 S100 ;Set the flow rate to 100%\nM104 S140 ;Start heating extruder\nM190 S{material_bed_temperature_layer_0} ;Wait for the bed to reach print temp\nG90\nG28 ;home\nG1 Z10 F300\nG1 X115 Y0 F6000\nG1 Z0 F300\nM109 S{material_print_temperature_layer_0} ;Wait for extruder to reach print temp\nG92 E0 ;Reset Extruder\nG1 X115 Y0 Z0.4 F300 ;Move to start position\nG1 X215 E30 F400 ;Draw the first line\nG1 Z0.6 F120.0 ;Move to side a little\nG1 X210 F3000\nG92 E0 ;Reset Extruder" }, + "machine_width": { "default_value": 330 }, + "nozzle_disallowed_areas": + { + "default_value": [ + [ + [-165, -165], + [-165, 165], + [-161, 165], + [-161, -165] + ], + [ + [165, 165], + [165, -165], + [161, -165], + [161, 165] + ], + [ + [-165, -165], + [165, -165], + [-165, -161], + [165, -161] + ], + [ + [-165, 165], + [165, 165], + [-165, 161], + [165, 161] + ] + ] + } + } +} \ No newline at end of file diff --git a/resources/variants/elegoo/elegoo_neptune_4max/elegoo_neptune_4max_0.20.inst.cfg b/resources/variants/elegoo/elegoo_neptune_4max/elegoo_neptune_4max_0.20.inst.cfg new file mode 100644 index 0000000000..5dea2c50ce --- /dev/null +++ b/resources/variants/elegoo/elegoo_neptune_4max/elegoo_neptune_4max_0.20.inst.cfg @@ -0,0 +1,13 @@ +[general] +definition = elegoo_neptune_4max +name = 0.20mm_Elegoo_Nozzle +version = 4 + +[metadata] +hardware_type = nozzle +setting_version = 22 +type = variant + +[values] +machine_nozzle_size = 0.2 + diff --git a/resources/variants/elegoo/elegoo_neptune_4max/elegoo_neptune_4max_0.40.inst.cfg b/resources/variants/elegoo/elegoo_neptune_4max/elegoo_neptune_4max_0.40.inst.cfg new file mode 100644 index 0000000000..a7d62bdcff --- /dev/null +++ b/resources/variants/elegoo/elegoo_neptune_4max/elegoo_neptune_4max_0.40.inst.cfg @@ -0,0 +1,13 @@ +[general] +definition = elegoo_neptune_4max +name = 0.40mm_Elegoo_Nozzle +version = 4 + +[metadata] +hardware_type = nozzle +setting_version = 22 +type = variant + +[values] +machine_nozzle_size = 0.4 + diff --git a/resources/variants/elegoo/elegoo_neptune_4max/elegoo_neptune_4max_0.60.inst.cfg b/resources/variants/elegoo/elegoo_neptune_4max/elegoo_neptune_4max_0.60.inst.cfg new file mode 100644 index 0000000000..018d6d4881 --- /dev/null +++ b/resources/variants/elegoo/elegoo_neptune_4max/elegoo_neptune_4max_0.60.inst.cfg @@ -0,0 +1,13 @@ +[general] +definition = elegoo_neptune_4max +name = 0.60mm_Elegoo_Nozzle +version = 4 + +[metadata] +hardware_type = nozzle +setting_version = 22 +type = variant + +[values] +machine_nozzle_size = 0.6 + diff --git a/resources/variants/elegoo/elegoo_neptune_4max/elegoo_neptune_4max_0.80.inst.cfg b/resources/variants/elegoo/elegoo_neptune_4max/elegoo_neptune_4max_0.80.inst.cfg new file mode 100644 index 0000000000..fc7177d14c --- /dev/null +++ b/resources/variants/elegoo/elegoo_neptune_4max/elegoo_neptune_4max_0.80.inst.cfg @@ -0,0 +1,13 @@ +[general] +definition = elegoo_neptune_4max +name = 0.80mm_Elegoo_Nozzle +version = 4 + +[metadata] +hardware_type = nozzle +setting_version = 22 +type = variant + +[values] +machine_nozzle_size = 0.8 + diff --git a/resources/variants/elegoo/elegoo_neptune_4plus/elegoo_neptune_4plus_0.20.inst.cfg b/resources/variants/elegoo/elegoo_neptune_4plus/elegoo_neptune_4plus_0.20.inst.cfg new file mode 100644 index 0000000000..16ac330f8a --- /dev/null +++ b/resources/variants/elegoo/elegoo_neptune_4plus/elegoo_neptune_4plus_0.20.inst.cfg @@ -0,0 +1,13 @@ +[general] +definition = elegoo_neptune_4plus +name = 0.20mm_Elegoo_Nozzle +version = 4 + +[metadata] +hardware_type = nozzle +setting_version = 22 +type = variant + +[values] +machine_nozzle_size = 0.2 + diff --git a/resources/variants/elegoo/elegoo_neptune_4plus/elegoo_neptune_4plus_0.40.inst.cfg b/resources/variants/elegoo/elegoo_neptune_4plus/elegoo_neptune_4plus_0.40.inst.cfg new file mode 100644 index 0000000000..2d0237ff34 --- /dev/null +++ b/resources/variants/elegoo/elegoo_neptune_4plus/elegoo_neptune_4plus_0.40.inst.cfg @@ -0,0 +1,13 @@ +[general] +definition = elegoo_neptune_4plus +name = 0.40mm_Elegoo_Nozzle +version = 4 + +[metadata] +hardware_type = nozzle +setting_version = 22 +type = variant + +[values] +machine_nozzle_size = 0.4 + diff --git a/resources/variants/elegoo/elegoo_neptune_4plus/elegoo_neptune_4plus_0.60.inst.cfg b/resources/variants/elegoo/elegoo_neptune_4plus/elegoo_neptune_4plus_0.60.inst.cfg new file mode 100644 index 0000000000..bd960d80e1 --- /dev/null +++ b/resources/variants/elegoo/elegoo_neptune_4plus/elegoo_neptune_4plus_0.60.inst.cfg @@ -0,0 +1,13 @@ +[general] +definition = elegoo_neptune_4plus +name = 0.60mm_Elegoo_Nozzle +version = 4 + +[metadata] +hardware_type = nozzle +setting_version = 22 +type = variant + +[values] +machine_nozzle_size = 0.6 + diff --git a/resources/variants/elegoo/elegoo_neptune_4plus/elegoo_neptune_4plus_0.80.inst.cfg b/resources/variants/elegoo/elegoo_neptune_4plus/elegoo_neptune_4plus_0.80.inst.cfg new file mode 100644 index 0000000000..32d3860498 --- /dev/null +++ b/resources/variants/elegoo/elegoo_neptune_4plus/elegoo_neptune_4plus_0.80.inst.cfg @@ -0,0 +1,13 @@ +[general] +definition = elegoo_neptune_4plus +name = 0.80mm_Elegoo_Nozzle +version = 4 + +[metadata] +hardware_type = nozzle +setting_version = 22 +type = variant + +[values] +machine_nozzle_size = 0.8 + From 3da4fb2d263012612becba3b32289ef12141abb6 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Mon, 11 Dec 2023 09:13:36 +0100 Subject: [PATCH 043/182] Install pdb files Contribute to CURA-11443 --- conanfile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conanfile.py b/conanfile.py index e9d06452f3..a3ca8f1c89 100644 --- a/conanfile.py +++ b/conanfile.py @@ -242,7 +242,7 @@ class CuraConan(ConanFile): self.output.warning(f"Source path for binary {binary['binary']} does not exist") continue - for bin in Path(src_path).glob(binary["binary"] + "*[.exe|.dll|.so|.dylib|.so.]*"): + for bin in Path(src_path).glob(binary["binary"] + "*[.exe|.dll|.so|.dylib|.so.|.pdb]*"): binaries.append((str(bin), binary["dst"])) for bin in Path(src_path).glob(binary["binary"]): binaries.append((str(bin), binary["dst"])) From ab480a29ce42d1d8481a5108f169a191b0707d52 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Mon, 11 Dec 2023 09:16:59 +0100 Subject: [PATCH 044/182] Use CuraEngine CURA-11443 Contribute to CURA-11443 --- conandata.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conandata.yml b/conandata.yml index c4dd1ce6de..7f542add2a 100644 --- a/conandata.yml +++ b/conandata.yml @@ -1,7 +1,7 @@ version: "5.7.0-alpha.0" requirements: - "uranium/(latest)@ultimaker/testing" - - "curaengine/(latest)@ultimaker/testing" + - "curaengine/(latest)@ultimaker/cura_11443" - "cura_binary_data/(latest)@ultimaker/testing" - "fdm_materials/(latest)@ultimaker/testing" - "curaengine_plugin_gradual_flow/(latest)@ultimaker/stable" From a19c667106fce8ab4e6f7c7f50bd16c709d2aa51 Mon Sep 17 00:00:00 2001 From: Saumya Jain <70144862+saumyaj3@users.noreply.github.com> Date: Mon, 11 Dec 2023 14:29:33 +0100 Subject: [PATCH 045/182] Update plugins/SimulationView/SimulationViewProxy.py simplified code Co-authored-by: Casper Lamboo --- plugins/SimulationView/SimulationViewProxy.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/plugins/SimulationView/SimulationViewProxy.py b/plugins/SimulationView/SimulationViewProxy.py index 8f83e9b403..e3d5ca13a7 100644 --- a/plugins/SimulationView/SimulationViewProxy.py +++ b/plugins/SimulationView/SimulationViewProxy.py @@ -64,9 +64,7 @@ class SimulationViewProxy(QObject): # We multiply the time with 100 to make it to ms from s.(Should be 1000 in real time). This scaling makes the simulation time 10x faster than the real time. simulationTimeOfpath =self._simulation_view.getSimulationTime()[0][self._simulation_view.getCurrentPath()] * 100 # Since the timer cannot process time less than 1 ms, we put a lower limit here - if simulationTimeOfpath < 1: - return 1 - return int(simulationTimeOfpath) + return int(max(1, simulationTimeOfpath)) @pyqtProperty(int, notify=currentPathChanged) def minimumPath(self): From ba0fb97d6373bd51c143a4ad7169885bf354c236 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Tue, 12 Dec 2023 10:01:59 +0100 Subject: [PATCH 046/182] Include threshold settings Contributes to CURA-11391 --- resources/definitions/fdmprinter.def.json | 82 +++++++++++++++++++++++ 1 file changed, 82 insertions(+) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index b640fb5746..85785981d6 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -8305,6 +8305,88 @@ } } }, + "ppr": + { + "label": "Print Process Reporting", + "type": "category", + "icon": "DocumentFilled", + "description": "Reporting events that go out of set thresholds", + "enabled": false, + "children": + { + "ppr_enable": + { + "label": "Enable Print Process Reporting", + "description": "Enable print process reporting for setting threshold values for possible fault detection.", + "type": "bool", + "enabled": false, + "default_value": false, + "value": false, + "settable_per_mesh": false, + "settable_per_extruder": false + }, + "flow_warn_limit": + { + "label": "Flow Warning Detection Limit", + "description": "Limit on the flow warning for detection.", + "default_value": "15.0", + "enabled": "ppr_enable", + "unit": "%", + "type": "float", + "settable_per_extruder": true + }, + "flow_anomaly_limit": + { + "label": "Flow Anomaly Detection Limit", + "description": "Limit on flow anomaly for detection.", + "default_value": "25.0", + "enabled": "ppr_enable", + "unit": "%", + "type": "float", + "settable_per_extruder": true + }, + "print_temp_warn_limit": + { + "label": "Print temperature Warning Detection Limit", + "description": "Limit on Print temperature warning for detection.", + "unit": "\u00b0C", + "type": "float", + "default_value": "3.0", + "enabled": "ppr_enable", + "settable_per_extruder": true + }, + "print_temp_anomaly_limit": + { + "label": "Print temperature Anomaly Detection Limit", + "description": "Limit on Print Temperature anomaly for detection.", + "unit": "\u00b0C", + "type": "float", + "default_value": "7.0", + "enabled": "ppr_enable", + "settable_per_extruder": true + }, + "bv_temp_warn_limit": + { + "label": "Build Volume temperature Warning Detection Limit", + "description": "Limit on Build Volume Temperature warning for detection.", + "unit": "\u00b0C", + "type": "float", + "default_value": "7.5", + "enabled": "ppr_enable", + "settable_per_extruder": false + }, + "bv_temp_anomaly_limit": + { + "label": "Build Volume temperature Anomaly Detection Limit", + "description": "Limit on Build Volume temperature Anomaly for detection.", + "unit": "\u00b0C", + "type": "float", + "default_value": "10.0", + "enabled": "ppr_enable", + "settable_per_extruder": false + } + } + }, "command_line_settings": { "label": "Command Line Settings", From cc4627886b85f2e1ef94f3190350e812d591a303 Mon Sep 17 00:00:00 2001 From: "saumya.jain" Date: Tue, 12 Dec 2023 13:01:37 +0100 Subject: [PATCH 047/182] Name shortned for Cura settings CURA-11392 --- resources/definitions/fdmprinter.def.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 85785981d6..62143cf8f8 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -8327,7 +8327,7 @@ }, "flow_warn_limit": { - "label": "Flow Warning Detection Limit", + "label": "Flow Warning", "description": "Limit on the flow warning for detection.", "default_value": "15.0", "enabled": "ppr_enable", @@ -8337,7 +8337,7 @@ }, "flow_anomaly_limit": { - "label": "Flow Anomaly Detection Limit", + "label": "Flow Limit", "description": "Limit on flow anomaly for detection.", "default_value": "25.0", "enabled": "ppr_enable", @@ -8347,7 +8347,7 @@ }, "print_temp_warn_limit": { - "label": "Print temperature Warning Detection Limit", + "label": "Print temperature Warning", "description": "Limit on Print temperature warning for detection.", "unit": "\u00b0C", "type": "float", @@ -8357,7 +8357,7 @@ }, "print_temp_anomaly_limit": { - "label": "Print temperature Anomaly Detection Limit", + "label": "Print temperature Limit", "description": "Limit on Print Temperature anomaly for detection.", "unit": "\u00b0C", "type": "float", @@ -8367,7 +8367,7 @@ }, "bv_temp_warn_limit": { - "label": "Build Volume temperature Warning Detection Limit", + "label": "Build Volume temperature Warning", "description": "Limit on Build Volume Temperature warning for detection.", "unit": "\u00b0C", "type": "float", @@ -8377,7 +8377,7 @@ }, "bv_temp_anomaly_limit": { - "label": "Build Volume temperature Anomaly Detection Limit", + "label": "Build Volume temperature Limit", "description": "Limit on Build Volume temperature Anomaly for detection.", "unit": "\u00b0C", "type": "float", From 189a22aa4fc9a5414424760ccab87a0418cf99d7 Mon Sep 17 00:00:00 2001 From: "saumya.jain" Date: Tue, 12 Dec 2023 14:56:06 +0100 Subject: [PATCH 048/182] refactoring of code for easier access and avoid hanging issues CURA-7647 --- plugins/SimulationView/SimulationView.py | 13 +++++++++---- plugins/SimulationView/SimulationViewProxy.py | 7 ++----- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/plugins/SimulationView/SimulationView.py b/plugins/SimulationView/SimulationView.py index 6874b27625..186036a581 100644 --- a/plugins/SimulationView/SimulationView.py +++ b/plugins/SimulationView/SimulationView.py @@ -402,10 +402,13 @@ class SimulationView(CuraView): def getMaxFeedrate(self) -> float: return self._max_feedrate - def getSimulationTime(self) -> list: - if len(self._lengths_of_polyline) > 0 and len(self._lengths_of_polyline) == len(self._current_feedrates): - return self._lengths_of_polyline[self._current_layer_num] / self._current_feedrates[self._current_layer_num] - return numpy.zeros(0) + def getSimulationTime(self, currentIndex) -> list: + try: + return self._lengths_of_polyline[self._current_layer_num][currentIndex] / self._current_feedrates[self._current_layer_num][currentIndex] + except: + # In case of change in layers, currentIndex comes one more than the items in the lengths_of_polyline + # We give 1 second time for layer change + return 1 def getMinThickness(self) -> float: if abs(self._min_thickness - sys.float_info.max) < 10: # Some lenience due to floating point rounding. @@ -535,6 +538,8 @@ class SimulationView(CuraView): visible_feedrates = numpy.take(polyline.lineFeedrates, visible_indices) visible_feedrates_with_extrusion = numpy.take(polyline.lineFeedrates, visible_indicies_with_extrusion) self._current_feedrates[layer_index] = polyline.lineFeedrates + # if len(polyline.lineLengths) > 0 and len(polyline.lineLengths) == len(polyline.lineFeedrates): + # self._simulation_time[layer_index] = polyline.lineLengths / polyline.lineFeedrates visible_linewidths = numpy.take(polyline.lineWidths, visible_indices) visible_linewidths_with_extrusion = numpy.take(polyline.lineWidths, visible_indicies_with_extrusion) visible_thicknesses = numpy.take(polyline.lineThicknesses, visible_indices) diff --git a/plugins/SimulationView/SimulationViewProxy.py b/plugins/SimulationView/SimulationViewProxy.py index e3d5ca13a7..61366fccbb 100644 --- a/plugins/SimulationView/SimulationViewProxy.py +++ b/plugins/SimulationView/SimulationViewProxy.py @@ -57,12 +57,9 @@ class SimulationViewProxy(QObject): @pyqtProperty(int, notify=currentPathChanged) def simulationTime(self): - # This if is activated when there is a layer change - if numpy.all(self._simulation_view.getSimulationTime()==0) or len(self._simulation_view.getSimulationTime()) <= self._simulation_view.getCurrentPath(): - return 100 - # Extracts the currents paths simulation time (in seconds) from the dict of simulation time of the current layer. + # Extracts the currents paths simulation time (in seconds) for the current path from the dict of simulation time of the current layer. # We multiply the time with 100 to make it to ms from s.(Should be 1000 in real time). This scaling makes the simulation time 10x faster than the real time. - simulationTimeOfpath =self._simulation_view.getSimulationTime()[0][self._simulation_view.getCurrentPath()] * 100 + simulationTimeOfpath = self._simulation_view.getSimulationTime(self._simulation_view.getCurrentPath()) * 100 # Since the timer cannot process time less than 1 ms, we put a lower limit here return int(max(1, simulationTimeOfpath)) From 3c0b9a65db5e204cecc0dcdb43d8dd59d3b1d4f0 Mon Sep 17 00:00:00 2001 From: "saumya.jain" Date: Tue, 12 Dec 2023 14:59:41 +0100 Subject: [PATCH 049/182] removing commented code CURA-7647 --- plugins/SimulationView/SimulationView.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/plugins/SimulationView/SimulationView.py b/plugins/SimulationView/SimulationView.py index 186036a581..cbf5e571fc 100644 --- a/plugins/SimulationView/SimulationView.py +++ b/plugins/SimulationView/SimulationView.py @@ -538,8 +538,6 @@ class SimulationView(CuraView): visible_feedrates = numpy.take(polyline.lineFeedrates, visible_indices) visible_feedrates_with_extrusion = numpy.take(polyline.lineFeedrates, visible_indicies_with_extrusion) self._current_feedrates[layer_index] = polyline.lineFeedrates - # if len(polyline.lineLengths) > 0 and len(polyline.lineLengths) == len(polyline.lineFeedrates): - # self._simulation_time[layer_index] = polyline.lineLengths / polyline.lineFeedrates visible_linewidths = numpy.take(polyline.lineWidths, visible_indices) visible_linewidths_with_extrusion = numpy.take(polyline.lineWidths, visible_indicies_with_extrusion) visible_thicknesses = numpy.take(polyline.lineThicknesses, visible_indices) From a9aba2df748977554a454ce3e7d7b1667d152e8d Mon Sep 17 00:00:00 2001 From: "saumya.jain" Date: Tue, 12 Dec 2023 16:06:22 +0100 Subject: [PATCH 050/182] maintenence. CURA-7647 --- plugins/SimulationView/SimulationView.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/plugins/SimulationView/SimulationView.py b/plugins/SimulationView/SimulationView.py index cbf5e571fc..a659a6de97 100644 --- a/plugins/SimulationView/SimulationView.py +++ b/plugins/SimulationView/SimulationView.py @@ -402,13 +402,14 @@ class SimulationView(CuraView): def getMaxFeedrate(self) -> float: return self._max_feedrate - def getSimulationTime(self, currentIndex) -> list: + def getSimulationTime(self, currentIndex) -> float: try: - return self._lengths_of_polyline[self._current_layer_num][currentIndex] / self._current_feedrates[self._current_layer_num][currentIndex] + return (self._lengths_of_polyline[self._current_layer_num][currentIndex] / self._current_feedrates[self._current_layer_num][currentIndex])[0] + except: # In case of change in layers, currentIndex comes one more than the items in the lengths_of_polyline # We give 1 second time for layer change - return 1 + return 1.0 def getMinThickness(self) -> float: if abs(self._min_thickness - sys.float_info.max) < 10: # Some lenience due to floating point rounding. From 84565b7daa03613087b2544b78fc944e249eae3d Mon Sep 17 00:00:00 2001 From: "saumya.jain" Date: Tue, 12 Dec 2023 16:53:34 +0100 Subject: [PATCH 051/182] removal of magic number CURA-7647 --- plugins/SimulationView/SimulationViewProxy.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/plugins/SimulationView/SimulationViewProxy.py b/plugins/SimulationView/SimulationViewProxy.py index 61366fccbb..576281874c 100644 --- a/plugins/SimulationView/SimulationViewProxy.py +++ b/plugins/SimulationView/SimulationViewProxy.py @@ -12,6 +12,11 @@ if TYPE_CHECKING: class SimulationViewProxy(QObject): + + S_TO_MS = 1000 + SPEED_OF_SIMULATION = 10 + FACTOR = S_TO_MS/SPEED_OF_SIMULATION + def __init__(self, simulation_view: "SimulationView", parent=None) -> None: super().__init__(parent) self._simulation_view = simulation_view @@ -59,7 +64,7 @@ class SimulationViewProxy(QObject): def simulationTime(self): # Extracts the currents paths simulation time (in seconds) for the current path from the dict of simulation time of the current layer. # We multiply the time with 100 to make it to ms from s.(Should be 1000 in real time). This scaling makes the simulation time 10x faster than the real time. - simulationTimeOfpath = self._simulation_view.getSimulationTime(self._simulation_view.getCurrentPath()) * 100 + simulationTimeOfpath = self._simulation_view.getSimulationTime(self._simulation_view.getCurrentPath()) * SimulationViewProxy.FACTOR # Since the timer cannot process time less than 1 ms, we put a lower limit here return int(max(1, simulationTimeOfpath)) From 3472ec26a10c330cd6aea040ef70e0d6db94434d Mon Sep 17 00:00:00 2001 From: "c.lamboo" Date: Tue, 12 Dec 2023 17:19:28 +0100 Subject: [PATCH 052/182] Fix snapshot for makerbot CURA-11442 --- cura/Snapshot.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/Snapshot.py b/cura/Snapshot.py index 40c74c9693..f94b3ff42e 100644 --- a/cura/Snapshot.py +++ b/cura/Snapshot.py @@ -49,7 +49,7 @@ class Snapshot: """ if node is None: - root = Application.getInstance().getController().getScene().getRoot() + node = Application.getInstance().getController().getScene().getRoot() # the direction the camera is looking at to create the isometric view iso_view_dir = Vector(-1, -1, -1).normalized() From 5125c7d33a6dd1f36374d084d8100e22c9c3f99c Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Wed, 13 Dec 2023 17:00:02 +0100 Subject: [PATCH 053/182] Don't package system managed openssl This should fall back on the Conan package ssl version which is in the root of the AppDir Contributes to CURA-11080 --- packaging/AppImage-builder/AppImageBuilder.yml.jinja | 1 + 1 file changed, 1 insertion(+) diff --git a/packaging/AppImage-builder/AppImageBuilder.yml.jinja b/packaging/AppImage-builder/AppImageBuilder.yml.jinja index 446c0dacc0..9090a5f209 100644 --- a/packaging/AppImage-builder/AppImageBuilder.yml.jinja +++ b/packaging/AppImage-builder/AppImageBuilder.yml.jinja @@ -38,6 +38,7 @@ AppDir: - usr/share/doc/*/changelog.* - usr/share/doc/*/NEWS.* - usr/share/doc/*/TODO.* + - usr/lib/x86_64-linux-gnu/libssl.so* runtime: env: APPDIR_LIBRARY_PATH: "$APPDIR:$APPDIR/runtime/compat/:$APPDIR/usr/lib/x86_64-linux-gnu:$APPDIR/lib/x86_64-linux-gnu:$APPDIR/usr/lib:$APPDIR/usr/lib/x86_64-linux-gnu/gdk-pixbuf-2.0/2.10.0/loaders" From 8116df6c2162a1877a169d3949e15e377faac30a Mon Sep 17 00:00:00 2001 From: Dmitry Gribenchuk Date: Wed, 13 Dec 2023 20:10:28 +0200 Subject: [PATCH 054/182] cleanup unused import and fix comment space --- plugins/3MFWriter/ThreeMFWriter.py | 3 --- plugins/DigitalLibrary/__init__.py | 1 - .../DigitalLibrary/src/DigitalFactoryApiClient.py | 1 - .../src/DigitalFactoryProjectModel.py | 1 - plugins/GCodeGzWriter/__init__.py | 1 - plugins/GCodeWriter/GCodeWriter.py | 1 - plugins/Marketplace/MissingPackageList.py | 2 -- plugins/Marketplace/PackageModel.py | 2 -- .../PerObjectSettingVisibilityHandler.py | 2 +- plugins/PostProcessingPlugin/scripts/ColorMix.py | 2 +- .../scripts/DisplayFilenameAndLayerOnLCD.py | 1 - .../scripts/DisplayInfoOnLCD.py | 3 --- .../scripts/DisplayProgressOnLCD.py | 2 -- .../PostProcessingPlugin/scripts/FilamentChange.py | 2 +- .../PostProcessingPlugin/scripts/PauseAtHeight.py | 2 +- .../scripts/SearchAndReplace.py | 2 +- .../RemovableDriveOutputDevice.py | 2 +- plugins/SimulationView/SimulationViewProxy.py | 1 - plugins/SliceInfoPlugin/SliceInfo.py | 2 +- plugins/SolidView/SolidView.py | 2 -- plugins/UFPWriter/UFPWriter.py | 1 - plugins/UFPWriter/__init__.py | 4 ++-- plugins/USBPrinting/AutoDetectBaudJob.py | 3 --- plugins/USBPrinting/USBPrinterOutputDevice.py | 8 ++++---- .../VersionUpgrade21to22/MachineInstance.py | 14 +++++++------- .../VersionUpgrade21to22/Preferences.py | 6 +++--- .../VersionUpgrade/VersionUpgrade21to22/Profile.py | 4 ++-- plugins/XRayView/XRayView.py | 1 - plugins/XmlMaterialProfile/XmlMaterialProfile.py | 6 +++--- scripts/fix_translation_memory.py | 3 +-- scripts/lionbridge_import.py | 6 +++--- 31 files changed, 32 insertions(+), 59 deletions(-) diff --git a/plugins/3MFWriter/ThreeMFWriter.py b/plugins/3MFWriter/ThreeMFWriter.py index ad4b0d8dad..0a939e5b8a 100644 --- a/plugins/3MFWriter/ThreeMFWriter.py +++ b/plugins/3MFWriter/ThreeMFWriter.py @@ -10,11 +10,8 @@ from UM.Math.Vector import Vector from UM.Logger import Logger from UM.Math.Matrix import Matrix from UM.Application import Application -from UM.Message import Message -from UM.Resources import Resources from UM.Scene.SceneNode import SceneNode from UM.Settings.ContainerRegistry import ContainerRegistry -from UM.Settings.EmptyInstanceContainer import EmptyInstanceContainer from cura.CuraApplication import CuraApplication from cura.CuraPackageManager import CuraPackageManager diff --git a/plugins/DigitalLibrary/__init__.py b/plugins/DigitalLibrary/__init__.py index 968aef66ee..fc27f873c8 100644 --- a/plugins/DigitalLibrary/__init__.py +++ b/plugins/DigitalLibrary/__init__.py @@ -1,7 +1,6 @@ # Copyright (c) 2021 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. -from UM.MimeTypeDatabase import MimeType, MimeTypeDatabase from .src import DigitalFactoryFileProvider, DigitalFactoryOutputDevicePlugin, DigitalFactoryController diff --git a/plugins/DigitalLibrary/src/DigitalFactoryApiClient.py b/plugins/DigitalLibrary/src/DigitalFactoryApiClient.py index 1168928588..c0ce594ecf 100644 --- a/plugins/DigitalLibrary/src/DigitalFactoryApiClient.py +++ b/plugins/DigitalLibrary/src/DigitalFactoryApiClient.py @@ -3,7 +3,6 @@ import json from json import JSONDecodeError -import re from time import time from typing import List, Any, Optional, Union, Type, Tuple, Dict, cast, TypeVar, Callable diff --git a/plugins/DigitalLibrary/src/DigitalFactoryProjectModel.py b/plugins/DigitalLibrary/src/DigitalFactoryProjectModel.py index 92aa92ef4c..bd12a4ca12 100644 --- a/plugins/DigitalLibrary/src/DigitalFactoryProjectModel.py +++ b/plugins/DigitalLibrary/src/DigitalFactoryProjectModel.py @@ -4,7 +4,6 @@ from typing import List, Optional from PyQt6.QtCore import Qt, pyqtSignal -from UM.Logger import Logger from UM.Qt.ListModel import ListModel from .DigitalFactoryProjectResponse import DigitalFactoryProjectResponse diff --git a/plugins/GCodeGzWriter/__init__.py b/plugins/GCodeGzWriter/__init__.py index 95949eee74..1f350d686c 100644 --- a/plugins/GCodeGzWriter/__init__.py +++ b/plugins/GCodeGzWriter/__init__.py @@ -2,7 +2,6 @@ # Cura is released under the terms of the LGPLv3 or higher. from UM.i18n import i18nCatalog -from UM.Platform import Platform from . import GCodeGzWriter diff --git a/plugins/GCodeWriter/GCodeWriter.py b/plugins/GCodeWriter/GCodeWriter.py index 667e064d90..9fa4f88614 100644 --- a/plugins/GCodeWriter/GCodeWriter.py +++ b/plugins/GCodeWriter/GCodeWriter.py @@ -11,7 +11,6 @@ from UM.Settings.InstanceContainer import InstanceContainer from cura.Machines.ContainerTree import ContainerTree from UM.i18n import i18nCatalog -from cura.Settings.CuraStackBuilder import CuraStackBuilder catalog = i18nCatalog("cura") diff --git a/plugins/Marketplace/MissingPackageList.py b/plugins/Marketplace/MissingPackageList.py index 018e977823..38d7718dc0 100644 --- a/plugins/Marketplace/MissingPackageList.py +++ b/plugins/Marketplace/MissingPackageList.py @@ -3,12 +3,10 @@ from typing import Optional, TYPE_CHECKING, Dict, List -from .Constants import PACKAGES_URL from .PackageModel import PackageModel from .RemotePackageList import RemotePackageList from PyQt6.QtCore import pyqtSignal, QObject, pyqtProperty, QCoreApplication -from UM.TaskManagement.HttpRequestManager import HttpRequestManager # To request the package list from the API. from UM.i18n import i18nCatalog if TYPE_CHECKING: diff --git a/plugins/Marketplace/PackageModel.py b/plugins/Marketplace/PackageModel.py index afc6e0ce73..ddd8f9b531 100644 --- a/plugins/Marketplace/PackageModel.py +++ b/plugins/Marketplace/PackageModel.py @@ -2,7 +2,6 @@ # Cura is released under the terms of the LGPLv3 or higher. import re -from enum import Enum from typing import Any, cast, Dict, List, Optional from PyQt6.QtCore import pyqtProperty, QObject, pyqtSignal, pyqtSlot @@ -12,7 +11,6 @@ from cura.CuraApplication import CuraApplication from cura.CuraPackageManager import CuraPackageManager from cura.Settings.CuraContainerRegistry import CuraContainerRegistry # To get names of materials we're compatible with. from UM.i18n import i18nCatalog # To translate placeholder names if data is not present. -from UM.Logger import Logger from UM.PluginRegistry import PluginRegistry catalog = i18nCatalog("cura") diff --git a/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py b/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py index 15f37e499d..d6b433a0c2 100644 --- a/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py +++ b/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py @@ -11,7 +11,7 @@ from UM.Settings.SettingInstance import SettingInstance from UM.Logger import Logger import UM.Settings.Models.SettingVisibilityHandler -from cura.Settings.ExtruderManager import ExtruderManager #To get global-inherits-stack setting values from different extruders. +from cura.Settings.ExtruderManager import ExtruderManager # To get global-inherits-stack setting values from different extruders. from cura.Settings.SettingOverrideDecorator import SettingOverrideDecorator diff --git a/plugins/PostProcessingPlugin/scripts/ColorMix.py b/plugins/PostProcessingPlugin/scripts/ColorMix.py index 534c0208cf..000661b46b 100644 --- a/plugins/PostProcessingPlugin/scripts/ColorMix.py +++ b/plugins/PostProcessingPlugin/scripts/ColorMix.py @@ -21,7 +21,7 @@ # M163 - Set Mix Factor # M164 - Save Mix - saves to T2 as a unique mix -import re #To perform the search and replace. +import re # To perform the search and replace. from ..Script import Script class ColorMix(Script): diff --git a/plugins/PostProcessingPlugin/scripts/DisplayFilenameAndLayerOnLCD.py b/plugins/PostProcessingPlugin/scripts/DisplayFilenameAndLayerOnLCD.py index bfe04b2bea..a5edb78d35 100644 --- a/plugins/PostProcessingPlugin/scripts/DisplayFilenameAndLayerOnLCD.py +++ b/plugins/PostProcessingPlugin/scripts/DisplayFilenameAndLayerOnLCD.py @@ -6,7 +6,6 @@ # Description: This plugin is now an option in 'Display Info on LCD' from ..Script import Script -from UM.Application import Application from UM.Message import Message class DisplayFilenameAndLayerOnLCD(Script): diff --git a/plugins/PostProcessingPlugin/scripts/DisplayInfoOnLCD.py b/plugins/PostProcessingPlugin/scripts/DisplayInfoOnLCD.py index 784a18b2e5..63c1c8c788 100644 --- a/plugins/PostProcessingPlugin/scripts/DisplayInfoOnLCD.py +++ b/plugins/PostProcessingPlugin/scripts/DisplayInfoOnLCD.py @@ -30,9 +30,6 @@ from ..Script import Script from UM.Application import Application from UM.Qt.Duration import DurationFormat -import UM.Util -import configparser -from UM.Preferences import Preferences import time import datetime import math diff --git a/plugins/PostProcessingPlugin/scripts/DisplayProgressOnLCD.py b/plugins/PostProcessingPlugin/scripts/DisplayProgressOnLCD.py index 4d24aedac0..03cb375514 100644 --- a/plugins/PostProcessingPlugin/scripts/DisplayProgressOnLCD.py +++ b/plugins/PostProcessingPlugin/scripts/DisplayProgressOnLCD.py @@ -7,8 +7,6 @@ from ..Script import Script -import re -import datetime from UM.Message import Message class DisplayProgressOnLCD(Script): diff --git a/plugins/PostProcessingPlugin/scripts/FilamentChange.py b/plugins/PostProcessingPlugin/scripts/FilamentChange.py index 93941c0992..6fe28ef2f2 100644 --- a/plugins/PostProcessingPlugin/scripts/FilamentChange.py +++ b/plugins/PostProcessingPlugin/scripts/FilamentChange.py @@ -7,7 +7,7 @@ from typing import List from ..Script import Script -from UM.Application import Application #To get the current printer's settings. +from UM.Application import Application # To get the current printer's settings. class FilamentChange(Script): diff --git a/plugins/PostProcessingPlugin/scripts/PauseAtHeight.py b/plugins/PostProcessingPlugin/scripts/PauseAtHeight.py index 3d85740bd4..f502678317 100644 --- a/plugins/PostProcessingPlugin/scripts/PauseAtHeight.py +++ b/plugins/PostProcessingPlugin/scripts/PauseAtHeight.py @@ -7,7 +7,7 @@ from ..Script import Script import re -from UM.Application import Application #To get the current printer's settings. +from UM.Application import Application # To get the current printer's settings. from UM.Logger import Logger from typing import List, Tuple diff --git a/plugins/PostProcessingPlugin/scripts/SearchAndReplace.py b/plugins/PostProcessingPlugin/scripts/SearchAndReplace.py index 7a12c229cc..dabc6b725a 100644 --- a/plugins/PostProcessingPlugin/scripts/SearchAndReplace.py +++ b/plugins/PostProcessingPlugin/scripts/SearchAndReplace.py @@ -1,7 +1,7 @@ # Copyright (c) 2017 Ghostkeeper # The PostProcessingPlugin is released under the terms of the LGPLv3 or higher. -import re #To perform the search and replace. +import re # To perform the search and replace. from ..Script import Script diff --git a/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py b/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py index 8c0c50d0b4..a9a0666d9c 100644 --- a/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py +++ b/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py @@ -8,7 +8,7 @@ from UM.Application import Application from UM.Logger import Logger from UM.Message import Message from UM.FileHandler.WriteFileJob import WriteFileJob -from UM.FileHandler.FileWriter import FileWriter #To check against the write modes (text vs. binary). +from UM.FileHandler.FileWriter import FileWriter # To check against the write modes (text vs. binary). from UM.Scene.Iterator.BreadthFirstIterator import BreadthFirstIterator from UM.OutputDevice.OutputDevice import OutputDevice from UM.OutputDevice import OutputDeviceError diff --git a/plugins/SimulationView/SimulationViewProxy.py b/plugins/SimulationView/SimulationViewProxy.py index 576281874c..3bf2ed6f49 100644 --- a/plugins/SimulationView/SimulationViewProxy.py +++ b/plugins/SimulationView/SimulationViewProxy.py @@ -2,7 +2,6 @@ # Cura is released under the terms of the LGPLv3 or higher. from typing import TYPE_CHECKING -import numpy from PyQt6.QtCore import QObject, pyqtSignal, pyqtProperty from UM.FlameProfiler import pyqtSlot from UM.Application import Application diff --git a/plugins/SliceInfoPlugin/SliceInfo.py b/plugins/SliceInfoPlugin/SliceInfo.py index 7e7a132c98..be021251da 100755 --- a/plugins/SliceInfoPlugin/SliceInfo.py +++ b/plugins/SliceInfoPlugin/SliceInfo.py @@ -5,7 +5,7 @@ import json import os import platform import time -from typing import cast, Optional, Set, TYPE_CHECKING +from typing import Optional, Set, TYPE_CHECKING from PyQt6.QtCore import pyqtSlot, QObject from PyQt6.QtNetwork import QNetworkRequest diff --git a/plugins/SolidView/SolidView.py b/plugins/SolidView/SolidView.py index b7aeb90da4..7f32b0df7f 100644 --- a/plugins/SolidView/SolidView.py +++ b/plugins/SolidView/SolidView.py @@ -16,8 +16,6 @@ from UM.Application import Application from UM.Logger import Logger from UM.Message import Message from UM.Math.Color import Color -from UM.PluginRegistry import PluginRegistry -from UM.Platform import Platform from UM.Event import Event from UM.View.RenderBatch import RenderBatch diff --git a/plugins/UFPWriter/UFPWriter.py b/plugins/UFPWriter/UFPWriter.py index c8064ac37f..475e5fc01a 100644 --- a/plugins/UFPWriter/UFPWriter.py +++ b/plugins/UFPWriter/UFPWriter.py @@ -22,7 +22,6 @@ from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator from UM.Scene.SceneNode import SceneNode from UM.Settings.InstanceContainer import InstanceContainer from cura.CuraApplication import CuraApplication -from cura.Settings.CuraStackBuilder import CuraStackBuilder from cura.Settings.GlobalStack import GlobalStack from cura.Utils.Threading import call_on_qt_thread diff --git a/plugins/UFPWriter/__init__.py b/plugins/UFPWriter/__init__.py index ae51f78e95..8561454856 100644 --- a/plugins/UFPWriter/__init__.py +++ b/plugins/UFPWriter/__init__.py @@ -9,8 +9,8 @@ try: except ImportError: Logger.log("w", "Could not import UFPWriter; libCharon may be missing") -from UM.i18n import i18nCatalog #To translate the file format description. -from UM.Mesh.MeshWriter import MeshWriter #For the binary mode flag. +from UM.i18n import i18nCatalog # To translate the file format description. +from UM.Mesh.MeshWriter import MeshWriter # For the binary mode flag. i18n_catalog = i18nCatalog("cura") diff --git a/plugins/USBPrinting/AutoDetectBaudJob.py b/plugins/USBPrinting/AutoDetectBaudJob.py index 5a8e455720..c26e5e8824 100644 --- a/plugins/USBPrinting/AutoDetectBaudJob.py +++ b/plugins/USBPrinting/AutoDetectBaudJob.py @@ -4,9 +4,6 @@ from UM.Job import Job from UM.Logger import Logger -from .avr_isp import ispBase -from .avr_isp.stk500v2 import Stk500v2 - from time import time, sleep from serial import Serial, SerialException diff --git a/plugins/USBPrinting/USBPrinterOutputDevice.py b/plugins/USBPrinting/USBPrinterOutputDevice.py index 1155420b60..85b98e532b 100644 --- a/plugins/USBPrinting/USBPrinterOutputDevice.py +++ b/plugins/USBPrinting/USBPrinterOutputDevice.py @@ -5,9 +5,9 @@ import os from UM.i18n import i18nCatalog from UM.Logger import Logger -from UM.Mesh.MeshWriter import MeshWriter #To get the g-code output. -from UM.Message import Message #Show an error when already printing. -from UM.PluginRegistry import PluginRegistry #To get the g-code output. +from UM.Mesh.MeshWriter import MeshWriter # To get the g-code output. +from UM.Message import Message # Show an error when already printing. +from UM.PluginRegistry import PluginRegistry # To get the g-code output. from UM.Qt.Duration import DurationFormat from cura.CuraApplication import CuraApplication @@ -19,7 +19,7 @@ from cura.PrinterOutput.GenericOutputController import GenericOutputController from .AutoDetectBaudJob import AutoDetectBaudJob from .AvrFirmwareUpdater import AvrFirmwareUpdater -from io import StringIO #To write the g-code output. +from io import StringIO # To write the g-code output. from queue import Queue from serial import Serial, SerialException, SerialTimeoutException from threading import Thread, Event diff --git a/plugins/VersionUpgrade/VersionUpgrade21to22/MachineInstance.py b/plugins/VersionUpgrade/VersionUpgrade21to22/MachineInstance.py index ff5c33517d..be6002e269 100644 --- a/plugins/VersionUpgrade/VersionUpgrade21to22/MachineInstance.py +++ b/plugins/VersionUpgrade/VersionUpgrade21to22/MachineInstance.py @@ -1,16 +1,16 @@ # Copyright (c) 2018 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. -import configparser #To read config files. -import io #To write config files to strings as if they were files. -import os.path #To get the path to write new user profiles to. +import configparser # To read config files. +import io # To write config files to strings as if they were files. +import os.path # To get the path to write new user profiles to. from typing import Dict, List, Optional, Set, Tuple -import urllib #To serialise the user container file name properly. +import urllib # To serialise the user container file name properly. import urllib.parse -import UM.VersionUpgrade #To indicate that a file is of incorrect format. -import UM.VersionUpgradeManager #To schedule more files to be upgraded. -from UM.Resources import Resources #To get the config storage path. +import UM.VersionUpgrade # To indicate that a file is of incorrect format. +import UM.VersionUpgradeManager # To schedule more files to be upgraded. +from UM.Resources import Resources # To get the config storage path. ## Creates a new machine instance instance by parsing a serialised machine # instance in version 1 of the file format. diff --git a/plugins/VersionUpgrade/VersionUpgrade21to22/Preferences.py b/plugins/VersionUpgrade/VersionUpgrade21to22/Preferences.py index 953837b863..906f868af9 100644 --- a/plugins/VersionUpgrade/VersionUpgrade21to22/Preferences.py +++ b/plugins/VersionUpgrade/VersionUpgrade21to22/Preferences.py @@ -1,11 +1,11 @@ # Copyright (c) 2018 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. -import configparser #To read config files. -import io #To output config files to string. +import configparser # To read config files. +import io # To output config files to string. from typing import List, Optional, Tuple -import UM.VersionUpgrade #To indicate that a file is of the wrong format. +import UM.VersionUpgrade # To indicate that a file is of the wrong format. ## Creates a new preferences instance by parsing a serialised preferences file # in version 1 of the file format. diff --git a/plugins/VersionUpgrade/VersionUpgrade21to22/Profile.py b/plugins/VersionUpgrade/VersionUpgrade21to22/Profile.py index 8419b3beeb..7e5f330a36 100644 --- a/plugins/VersionUpgrade/VersionUpgrade21to22/Profile.py +++ b/plugins/VersionUpgrade/VersionUpgrade21to22/Profile.py @@ -1,8 +1,8 @@ # Copyright (c) 2018 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. -import configparser #To read config files. -import io #To write config files to strings as if they were files. +import configparser # To read config files. +import io # To write config files to strings as if they were files. from typing import Dict, List, Optional, Tuple import UM.VersionUpgrade diff --git a/plugins/XRayView/XRayView.py b/plugins/XRayView/XRayView.py index 5af7b17652..b27e615e56 100644 --- a/plugins/XRayView/XRayView.py +++ b/plugins/XRayView/XRayView.py @@ -7,7 +7,6 @@ from PyQt6.QtGui import QOpenGLContext, QImage from UM.Application import Application from UM.Logger import Logger from UM.Math.Color import Color -from UM.PluginRegistry import PluginRegistry from UM.Resources import Resources from UM.Platform import Platform from UM.Event import Event diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py index 490d704d19..5d4efd7cab 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -3,9 +3,9 @@ import copy import io -import json #To parse the product-to-id mapping file. -import os.path #To find the product-to-id mapping. -from typing import Any, Dict, List, Optional, Tuple, cast, Set, Union +import json # To parse the product-to-id mapping file. +import os.path #T o find the product-to-id mapping. +from typing import Any, Dict, List, Optional, Tuple, cast, Set import xml.etree.ElementTree as ET from UM.PluginRegistry import PluginRegistry diff --git a/scripts/fix_translation_memory.py b/scripts/fix_translation_memory.py index 610fb93ac6..979cc92eb7 100644 --- a/scripts/fix_translation_memory.py +++ b/scripts/fix_translation_memory.py @@ -5,9 +5,8 @@ import re import argparse from pathlib import Path from fuzzywuzzy import fuzz -from fuzzywuzzy import process import xml.etree.ElementTree as ET -from xml.sax.saxutils import unescape, escape, quoteattr +from xml.sax.saxutils import unescape def load_existing_xmtm(path: Path) -> ET.Element: diff --git a/scripts/lionbridge_import.py b/scripts/lionbridge_import.py index 65b07183a3..c73361a912 100644 --- a/scripts/lionbridge_import.py +++ b/scripts/lionbridge_import.py @@ -1,10 +1,10 @@ # Copyright (c) 2021 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. -import argparse #To get the source directory from command line arguments. +import argparse # To get the source directory from command line arguments. import io # To fix encoding issues in Windows -import os #To find files from the source. -import os.path #To find files from the source and the destination path. +import os # To find files from the source. +import os.path # To find files from the source and the destination path. cura_files = {"cura", "fdmprinter.def.json", "fdmextruder.def.json"} uranium_files = {"uranium"} From aff37dae3fc4057f356d6d420ecbc1337ffdee88 Mon Sep 17 00:00:00 2001 From: Dmitry Gribenchuk Date: Thu, 14 Dec 2023 11:00:06 +0200 Subject: [PATCH 055/182] fix comment space --- plugins/XmlMaterialProfile/XmlMaterialProfile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py index 5d4efd7cab..41beb88419 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -4,7 +4,7 @@ import copy import io import json # To parse the product-to-id mapping file. -import os.path #T o find the product-to-id mapping. +import os.path # To find the product-to-id mapping. from typing import Any, Dict, List, Optional, Tuple, cast, Set import xml.etree.ElementTree as ET From 1941fbe90be65ea6fab393bdfeed6a8bf30dbab8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miro=20Hron=C4=8Dok?= Date: Thu, 14 Dec 2023 12:52:26 +0100 Subject: [PATCH 056/182] Avoid "KeyError: material_name" crash in Fedora Traceback (most recent call last): File "/usr/lib/python3.11/site-packages/UM/Qt/ListModel.py", line 54, in data return self._items[index.row()][self._role_names[role].decode("utf-8")] ~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ KeyError: 'material_name' Downstream report: https://bugzilla.redhat.com/show_bug.cgi?id=2252195 Community: https://community.ultimaker.com/topic/44538-cura-53-crashs-at-startup/ For reasons unknown, this crash does not happen with the AppImage. Nevertheless, in 2baada8a70b15dd87948a25855e17d15b0ece58c material_name was added as a role, not material_label. Reaming the field in the sentinel extruder makes the crash go away. --- cura/Machines/Models/ExtrudersModel.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/Machines/Models/ExtrudersModel.py b/cura/Machines/Models/ExtrudersModel.py index 2677894bff..f31f7c8717 100644 --- a/cura/Machines/Models/ExtrudersModel.py +++ b/cura/Machines/Models/ExtrudersModel.py @@ -227,7 +227,7 @@ class ExtrudersModel(ListModel): "material_brand": "", "color_name": "", "material_type": "", - "material_label": "" + "material_name": "" } items.append(item) if self._items != items: From aebd5f32c5bb82a39d9d2f7a6ab070761e8e7e28 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Fri, 15 Dec 2023 10:08:16 +0100 Subject: [PATCH 057/182] Update Sentry to `1.39.1` Contributes to CURA-11464 --- requirements.txt | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/requirements.txt b/requirements.txt index 76339c884f..916886e369 100644 --- a/requirements.txt +++ b/requirements.txt @@ -171,9 +171,9 @@ scipy==1.9.1 \ trimesh==3.9.36 \ --hash=sha256:f01e8edab14d1999700c980c21a1546f37417216ad915a53be649d263130181e \ --hash=sha256:8ac8bea693b3ee119f11b022fc9b9481c9f1af06cb38bc859bf5d16bbbe49b23 -sentry-sdk==0.13.5 \ - --hash=sha256:05285942901d38c7ce2498aba50d8e87b361fc603281a5902dda98f3f8c5e145 \ - --hash=sha256:c6b919623e488134a728f16326c6f0bcdab7e3f59e7f4c472a90eea4d6d8fe82 +sentry-sdk==1.39.1 \ + --hash=sha256:320a55cdf9da9097a0bead239c35b7e61f53660ef9878861824fd6d9b2eaf3b5 \ + --hash=sha256:81b5b9ffdd1a374e9eb0c053b5d2012155db9cbe76393a8585677b753bd5fdc1 mypy==0.931 \ --hash=sha256:0038b21890867793581e4cb0d810829f5fd4441aa75796b53033af3aa30430ce \ --hash=sha256:1171f2e0859cfff2d366da2c7092b06130f232c636a3f7301e3feb8b41f6377d \ @@ -209,9 +209,9 @@ idna==2.8 \ attrs==21.2.0 \ --hash=sha256:149e90d6d8ac20db7a955ad60cf0e6881a3f20d37096140088356da6c716b0b1 \ --hash=sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb -requests==2.22.0 \ - --hash=sha256:11e007a8a2aa0323f5a921e9e6a2d7e4e67d9877e85773fba9ba6419025cbeb4 \ - --hash=sha256:9cf5292fcd0f598c671cfc1e0d7d1a7f13bb8085e9a590f48c010551dc6c4b31 +requests==2.31.0 \ + --hash=sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1 \ + --hash=sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f # twisted Twisted==21.2.0 \ --hash=sha256:77544a8945cf69b98d2946689bbe0c75de7d145cdf11f391dd487eae8fc95a12 \ @@ -372,9 +372,9 @@ cffi==1.15.0 \ --hash=sha256:f6f824dc3bce0edab5f427efcfb1d63ee75b6fcb7282900ccaf925be84efb0fc \ --hash=sha256:fd8a250edc26254fe5b33be00402e6d287f562b6a5b2152dec302fa15bb3e997 \ --hash=sha256:ffaa5c925128e29efbde7301d8ecaf35c8c60ffbcd6a1ffd3a552177c8e5e796 -urllib3==1.25.9 \ - --hash=sha256:3018294ebefce6572a474f0604c2021e33b3fd8006ecd11d62107a5d2a963527 \ - --hash=sha256:88206b0eb87e6d677d424843ac5209e3fb9d0190d0ee169599165ec25e9d9115 +urllib3==2.1.0 \ + --hash=sha256:df7aa8afb0148fa78488e7899b2c59b5f4ffcfa82e6c54ccb9dd37c1d7b52d54 \ + --hash=sha256:55901e917a5896a349ff771be919f8bd99aff50b79fe58fec595eb37bbc56bb3 mypy-extensions==0.4.3 \ --hash=sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d \ --hash=sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8 From 139c46fc9dbbb19f7128783369abd0f68e0b36ef Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Fri, 15 Dec 2023 10:23:42 +0100 Subject: [PATCH 058/182] Use generic job name --- .github/workflows/linux.yml | 2 +- .github/workflows/macos.yml | 2 +- .github/workflows/windows.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/linux.yml b/.github/workflows/linux.yml index 2ad8f90bfe..f88b77a022 100644 --- a/.github/workflows/linux.yml +++ b/.github/workflows/linux.yml @@ -45,7 +45,7 @@ env: STAGING: ${{ inputs.staging || false }} jobs: - windows-installer: + installer: uses: ultimaker/cura-workflows/.github/workflows/cura-installer-linux.yml@main with: cura_conan_version: ${{ inputs.cura_conan_version }} diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml index d080fcc710..e909b9f839 100644 --- a/.github/workflows/macos.yml +++ b/.github/workflows/macos.yml @@ -49,7 +49,7 @@ env: STAGING: ${{ inputs.staging || false }} jobs: - windows-installer: + installer: uses: ultimaker/cura-workflows/.github/workflows/cura-installer-macos.yml@main with: cura_conan_version: ${{ inputs.cura_conan_version }} diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index 0007936969..151935c3f3 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -45,7 +45,7 @@ env: STAGING: ${{ inputs.staging || false }} jobs: - windows-installer: + installer: uses: ultimaker/cura-workflows/.github/workflows/cura-installer-windows.yml@main with: cura_conan_version: ${{ inputs.cura_conan_version }} From 64cb060bd1c2ec23d498c81ea50a55957dfad3e6 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Fri, 15 Dec 2023 10:38:33 +0100 Subject: [PATCH 059/182] Revert "Update Sentry to `1.39.1`" This reverts commit aebd5f32c5bb82a39d9d2f7a6ab070761e8e7e28. --- requirements.txt | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/requirements.txt b/requirements.txt index 916886e369..76339c884f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -171,9 +171,9 @@ scipy==1.9.1 \ trimesh==3.9.36 \ --hash=sha256:f01e8edab14d1999700c980c21a1546f37417216ad915a53be649d263130181e \ --hash=sha256:8ac8bea693b3ee119f11b022fc9b9481c9f1af06cb38bc859bf5d16bbbe49b23 -sentry-sdk==1.39.1 \ - --hash=sha256:320a55cdf9da9097a0bead239c35b7e61f53660ef9878861824fd6d9b2eaf3b5 \ - --hash=sha256:81b5b9ffdd1a374e9eb0c053b5d2012155db9cbe76393a8585677b753bd5fdc1 +sentry-sdk==0.13.5 \ + --hash=sha256:05285942901d38c7ce2498aba50d8e87b361fc603281a5902dda98f3f8c5e145 \ + --hash=sha256:c6b919623e488134a728f16326c6f0bcdab7e3f59e7f4c472a90eea4d6d8fe82 mypy==0.931 \ --hash=sha256:0038b21890867793581e4cb0d810829f5fd4441aa75796b53033af3aa30430ce \ --hash=sha256:1171f2e0859cfff2d366da2c7092b06130f232c636a3f7301e3feb8b41f6377d \ @@ -209,9 +209,9 @@ idna==2.8 \ attrs==21.2.0 \ --hash=sha256:149e90d6d8ac20db7a955ad60cf0e6881a3f20d37096140088356da6c716b0b1 \ --hash=sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb -requests==2.31.0 \ - --hash=sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1 \ - --hash=sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f +requests==2.22.0 \ + --hash=sha256:11e007a8a2aa0323f5a921e9e6a2d7e4e67d9877e85773fba9ba6419025cbeb4 \ + --hash=sha256:9cf5292fcd0f598c671cfc1e0d7d1a7f13bb8085e9a590f48c010551dc6c4b31 # twisted Twisted==21.2.0 \ --hash=sha256:77544a8945cf69b98d2946689bbe0c75de7d145cdf11f391dd487eae8fc95a12 \ @@ -372,9 +372,9 @@ cffi==1.15.0 \ --hash=sha256:f6f824dc3bce0edab5f427efcfb1d63ee75b6fcb7282900ccaf925be84efb0fc \ --hash=sha256:fd8a250edc26254fe5b33be00402e6d287f562b6a5b2152dec302fa15bb3e997 \ --hash=sha256:ffaa5c925128e29efbde7301d8ecaf35c8c60ffbcd6a1ffd3a552177c8e5e796 -urllib3==2.1.0 \ - --hash=sha256:df7aa8afb0148fa78488e7899b2c59b5f4ffcfa82e6c54ccb9dd37c1d7b52d54 \ - --hash=sha256:55901e917a5896a349ff771be919f8bd99aff50b79fe58fec595eb37bbc56bb3 +urllib3==1.25.9 \ + --hash=sha256:3018294ebefce6572a474f0604c2021e33b3fd8006ecd11d62107a5d2a963527 \ + --hash=sha256:88206b0eb87e6d677d424843ac5209e3fb9d0190d0ee169599165ec25e9d9115 mypy-extensions==0.4.3 \ --hash=sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d \ --hash=sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8 From a071795f9e5415f575cd7e8e86e3347faf8e6a1a Mon Sep 17 00:00:00 2001 From: "c.lamboo" Date: Fri, 15 Dec 2023 12:43:54 +0100 Subject: [PATCH 060/182] Fix monitor page CURA-11426 --- plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py index aed38a3949..9a11bb886c 100644 --- a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py +++ b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py @@ -331,7 +331,7 @@ class CloudOutputDevice(UltimakerNetworkedPrinterOutputDevice): return False [printer, *_] = self._printers - return printer.pinterType in ("ultimaker_methodx", "ultimaker_methodxl") + return printer.name in ("ultimaker_methodx", "ultimaker_methodxl") @pyqtProperty(bool, notify=_cloudClusterPrintersChanged) def supportsPrintJobActions(self) -> bool: From a6218c3f5432a6d08d0ff852f67892119b317a7d Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Fri, 15 Dec 2023 18:08:46 +0100 Subject: [PATCH 061/182] Use cura sentry id and version Contribute to CURA-11482 --- conandata.yml | 2 +- plugins/CuraEngineBackend/Cura.proto | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/conandata.yml b/conandata.yml index a0a5a204ca..dcf883c630 100644 --- a/conandata.yml +++ b/conandata.yml @@ -1,7 +1,7 @@ version: "5.7.0-alpha.0" requirements: - "uranium/(latest)@ultimaker/testing" - - "curaengine/(latest)@ultimaker/testing" + - "curaengine/(latest)@ultimaker/cura_11482" - "cura_binary_data/(latest)@ultimaker/testing" - "fdm_materials/(latest)@ultimaker/testing" - "curaengine_plugin_gradual_flow/(latest)@ultimaker/stable" diff --git a/plugins/CuraEngineBackend/Cura.proto b/plugins/CuraEngineBackend/Cura.proto index 54c322fa0a..9593b83528 100644 --- a/plugins/CuraEngineBackend/Cura.proto +++ b/plugins/CuraEngineBackend/Cura.proto @@ -33,6 +33,8 @@ message Slice repeated Extruder extruders = 3; // The settings sent to each extruder object repeated SettingExtruder limit_to_extruder = 4; // From which stack the setting would inherit if not defined per object repeated EnginePlugin engine_plugins = 5; + string sentry_id = 6; // The anonymized Sentry user id that requested the slice + string cura_version = 7; // The version of Cura that requested the slice } message Extruder From 5744371f380e8c7baa47c2ab05bea9157c5d7e58 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Sun, 17 Dec 2023 17:44:30 +0100 Subject: [PATCH 062/182] Add anonymous user tracking to slice message User tracking has been added to the 'slice_message' method in the 'StartSliceJob.py' file. A unique, anonymous UUID is generated for each user, stripping away identifiable data with a bitmask operation. The user's Cura version is also included in the message. This facilitates more robust analysis of crash reports and user behaviors. Contributes to CURA-11482 --- plugins/CuraEngineBackend/StartSliceJob.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index a12e9e655d..fe7137150b 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -1,5 +1,7 @@ # Copyright (c) 2023 UltiMaker # Cura is released under the terms of the LGPLv3 or higher. +import uuid + import os import numpy @@ -30,6 +32,7 @@ from cura.CuraApplication import CuraApplication from cura.Scene.CuraSceneNode import CuraSceneNode from cura.OneAtATimeIterator import OneAtATimeIterator from cura.Settings.ExtruderManager import ExtruderManager +from cura.CuraVersion import CuraVersion NON_PRINTING_MESH_SETTINGS = ["anti_overhang_mesh", "infill_mesh", "cutting_mesh"] @@ -332,6 +335,11 @@ class StartSliceJob(Job): self._buildGlobalSettingsMessage(stack) self._buildGlobalInheritsStackMessage(stack) + user_id = uuid.getnode() # On all of Cura's supported platforms, this returns the MAC address which is pseudonymical information (!= anonymous). + user_id %= 2 ** 16 # So to make it anonymous, apply a bitmask selecting only the last 16 bits. This prevents it from being traceable to a specific user but still gives somewhat of an idea of whether it's just the same user hitting the same crash over and over again, or if it's widespread. + self._slice_message.sentry_id = "{user_id}" + self._slice_message.cura_version = CuraVersion + # Build messages for extruder stacks for extruder_stack in global_stack.extruderList: self._buildExtruderMessage(extruder_stack) From 82a3308d26a94ed834b5247dc2bfe945f68dee06 Mon Sep 17 00:00:00 2001 From: "saumya.jain" Date: Mon, 18 Dec 2023 17:03:52 +0100 Subject: [PATCH 063/182] for merging to main CURA-11482 --- conandata.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conandata.yml b/conandata.yml index dcf883c630..a0a5a204ca 100644 --- a/conandata.yml +++ b/conandata.yml @@ -1,7 +1,7 @@ version: "5.7.0-alpha.0" requirements: - "uranium/(latest)@ultimaker/testing" - - "curaengine/(latest)@ultimaker/cura_11482" + - "curaengine/(latest)@ultimaker/testing" - "cura_binary_data/(latest)@ultimaker/testing" - "fdm_materials/(latest)@ultimaker/testing" - "curaengine_plugin_gradual_flow/(latest)@ultimaker/stable" From cfec5e0cc112181d4db4af13ed6a0f8ec3047669 Mon Sep 17 00:00:00 2001 From: "saumya.jain" Date: Tue, 19 Dec 2023 10:12:56 +0100 Subject: [PATCH 064/182] Proof of concept for simulation Co-authored-by: Casper Lamboo CURA-7647 --- cura/LayerPolygon.py | 6 +- plugins/SimulationView/SimulationPass.py | 32 +++-- plugins/SimulationView/SimulationView.py | 124 +++++++++++++----- .../SimulationViewMainComponent.qml | 47 +------ plugins/SimulationView/SimulationViewProxy.py | 23 +--- 5 files changed, 128 insertions(+), 104 deletions(-) diff --git a/cura/LayerPolygon.py b/cura/LayerPolygon.py index e5fd307dc9..e772a8b78e 100644 --- a/cura/LayerPolygon.py +++ b/cura/LayerPolygon.py @@ -67,7 +67,7 @@ class LayerPolygon: # Buffering the colors shouldn't be necessary as it is not # re-used and can save a lot of memory usage. self._color_map = LayerPolygon.getColorMap() - self._colors = self._color_map[self._types] # type: numpy.ndarray + self._colors: numpy.ndarray = self._color_map[self._types] # When type is used as index returns true if type == LayerPolygon.InfillType # or type == LayerPolygon.SkinType @@ -75,8 +75,8 @@ class LayerPolygon: # Should be generated in better way, not hardcoded. self._is_infill_or_skin_type_map = numpy.array([0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0], dtype=bool) - self._build_cache_line_mesh_mask = None # type: Optional[numpy.ndarray] - self._build_cache_needed_points = None # type: Optional[numpy.ndarray] + self._build_cache_line_mesh_mask: Optional[numpy.ndarray] = None + self._build_cache_needed_points: Optional[numpy.ndarray] = None def buildCache(self) -> None: # For the line mesh we do not draw Infill or Jumps. Therefore those lines are filtered out. diff --git a/plugins/SimulationView/SimulationPass.py b/plugins/SimulationView/SimulationPass.py index 1294b37db4..3294f4b1e6 100644 --- a/plugins/SimulationView/SimulationPass.py +++ b/plugins/SimulationView/SimulationPass.py @@ -35,7 +35,7 @@ class SimulationPass(RenderPass): self._nozzle_shader = None self._disabled_shader = None self._old_current_layer = 0 - self._old_current_path = 0 + self._old_current_path: float = 0.0 self._switching_layers = True # Tracking whether the user is moving across layers (True) or across paths (False). If false, lower layers render as shadowy. self._gl = OpenGL.getInstance().getBindingsObject() self._scene = Application.getInstance().getController().getScene() @@ -139,7 +139,7 @@ class SimulationPass(RenderPass): continue # Render all layers below a certain number as line mesh instead of vertices. - if self._layer_view._current_layer_num > -1 and ((not self._layer_view._only_show_top_layers) or (not self._layer_view.getCompatibilityMode())): + if self._layer_view.getCurrentLayer() > -1 and ((not self._layer_view._only_show_top_layers) or (not self._layer_view.getCompatibilityMode())): start = 0 end = 0 element_counts = layer_data.getElementCounts() @@ -147,7 +147,7 @@ class SimulationPass(RenderPass): # In the current layer, we show just the indicated paths if layer == self._layer_view._current_layer_num: # We look for the position of the head, searching the point of the current path - index = self._layer_view._current_path_num + index = int(self._layer_view.getCurrentPath()) offset = 0 for polygon in layer_data.getLayer(layer).polygons: # The size indicates all values in the two-dimension array, and the second dimension is @@ -157,23 +157,33 @@ class SimulationPass(RenderPass): offset = 1 # This is to avoid the first point when there is more than one polygon, since has the same value as the last point in the previous polygon continue # The head position is calculated and translated - head_position = Vector(polygon.data[index+offset][0], polygon.data[index+offset][1], polygon.data[index+offset][2]) + node.getWorldPosition() + ratio = self._layer_view.getCurrentPath() - index + pos_a = Vector(polygon.data[index + offset][0], polygon.data[index + offset][1], + polygon.data[index + offset][2]) + if ratio > 0.0001: + pos_b = Vector(polygon.data[index + offset + 1][0], + polygon.data[index + offset + 1][1], + polygon.data[index + offset + 1][2]) + vec = pos_a * (1.0 - ratio) + pos_b * ratio + head_position = vec + node.getWorldPosition() + else: + head_position = pos_a + node.getWorldPosition() break break - if self._layer_view._minimum_layer_num > layer: + if self._layer_view.getMinimumLayer() > layer: start += element_counts[layer] end += element_counts[layer] # Calculate the range of paths in the last layer current_layer_start = end - current_layer_end = end + self._layer_view._current_path_num * 2 # Because each point is used twice + current_layer_end = end + int( self._layer_view.getCurrentPath()) * 2 # Because each point is used twice # This uses glDrawRangeElements internally to only draw a certain range of lines. # All the layers but the current selected layer are rendered first - if self._old_current_path != self._layer_view._current_path_num: + if self._old_current_path != self._layer_view.getCurrentPath(): self._current_shader = self._layer_shadow_shader self._switching_layers = False - if not self._layer_view.isSimulationRunning() and self._old_current_layer != self._layer_view._current_layer_num: + if not self._layer_view.isSimulationRunning() and self._old_current_layer != self._layer_view.getCurrentLayer(): self._current_shader = self._layer_shader self._switching_layers = True @@ -193,8 +203,8 @@ class SimulationPass(RenderPass): current_layer_batch.addItem(node.getWorldTransformation(), layer_data) current_layer_batch.render(self._scene.getActiveCamera()) - self._old_current_layer = self._layer_view._current_layer_num - self._old_current_path = self._layer_view._current_path_num + self._old_current_layer = self._layer_view.getCurrentLayer() + self._old_current_path = self._layer_view.getCurrentPath() # Create a new batch that is not range-limited batch = RenderBatch(self._layer_shader, type = RenderBatch.RenderType.Solid) @@ -230,4 +240,4 @@ class SimulationPass(RenderPass): if changed_object.callDecoration("getLayerData"): # Any layer data has changed. self._switching_layers = True self._old_current_layer = 0 - self._old_current_path = 0 + self._old_current_path = 0.0 diff --git a/plugins/SimulationView/SimulationView.py b/plugins/SimulationView/SimulationView.py index a659a6de97..64ec0dfc1b 100644 --- a/plugins/SimulationView/SimulationView.py +++ b/plugins/SimulationView/SimulationView.py @@ -40,7 +40,7 @@ from .SimulationViewProxy import SimulationViewProxy import numpy import os.path -from typing import Optional, TYPE_CHECKING, List, cast +from typing import Optional, TYPE_CHECKING, List, Tuple, cast if TYPE_CHECKING: from UM.Scene.SceneNode import SceneNode @@ -74,21 +74,20 @@ class SimulationView(CuraView): self._old_max_layers = 0 self._max_paths = 0 - self._current_path_num = 0 + self._current_path_num: float = 0.0 + self._current_time = 0.0 self._minimum_path_num = 0 self.currentLayerNumChanged.connect(self._onCurrentLayerNumChanged) - self._current_feedrates = {} - self._lengths_of_polyline ={} self._busy = False self._simulation_running = False - self._ghost_shader = None # type: Optional["ShaderProgram"] - self._layer_pass = None # type: Optional[SimulationPass] - self._composite_pass = None # type: Optional[CompositePass] - self._old_layer_bindings = None # type: Optional[List[str]] - self._simulationview_composite_shader = None # type: Optional["ShaderProgram"] - self._old_composite_shader = None # type: Optional["ShaderProgram"] + self._ghost_shader: Optional["ShaderProgram"] = None + self._layer_pass: Optional[SimulationPass] = None + self._composite_pass: Optional[CompositePass] = None + self._old_layer_bindings: Optional[List[str]] = None + self._simulationview_composite_shader: Optional["ShaderProgram"] = None + self._old_composite_shader: Optional["ShaderProgram"] = None self._max_feedrate = sys.float_info.min self._min_feedrate = sys.float_info.max @@ -99,13 +98,13 @@ class SimulationView(CuraView): self._min_flow_rate = sys.float_info.max self._max_flow_rate = sys.float_info.min - self._global_container_stack = None # type: Optional[ContainerStack] + self._global_container_stack: Optional[ContainerStack] = None self._proxy = None self._resetSettings() self._legend_items = None self._show_travel_moves = False - self._nozzle_node = None # type: Optional[NozzleNode] + self._nozzle_node: Optional[NozzleNode] = None Application.getInstance().getPreferences().addPreference("view/top_layer_count", 5) Application.getInstance().getPreferences().addPreference("view/only_show_top_layers", False) @@ -127,13 +126,12 @@ class SimulationView(CuraView): self._only_show_top_layers = bool(Application.getInstance().getPreferences().getValue("view/only_show_top_layers")) self._compatibility_mode = self._evaluateCompatibilityMode() - self._slice_first_warning_message = Message(catalog.i18nc("@info:status", - "Nothing is shown because you need to slice first."), - title = catalog.i18nc("@info:title", "No layers to show"), - option_text = catalog.i18nc("@info:option_text", - "Do not show this message again"), - option_state = False, - message_type = Message.MessageType.WARNING) + self._slice_first_warning_message = Message(catalog.i18nc("@info:status", "Nothing is shown because you need to slice first."), + title=catalog.i18nc("@info:title", "No layers to show"), + option_text=catalog.i18nc("@info:option_text", + "Do not show this message again"), + option_state=False, + message_type=Message.MessageType.WARNING) self._slice_first_warning_message.optionToggled.connect(self._onDontAskMeAgain) CuraApplication.getInstance().getPreferences().addPreference(self._no_layers_warning_preference, True) @@ -189,9 +187,82 @@ class SimulationView(CuraView): def getMaxLayers(self) -> int: return self._max_layers - def getCurrentPath(self) -> int: + def getCurrentPath(self) -> float: return self._current_path_num + def setTime(self, time: float) -> None: + self._current_time = time + + left_i = 0 + right_i = self._max_paths - 1 + + total_duration, cumulative_line_duration = self.cumulativeLineDuration() + + # make an educated guess about where to start + i = int(right_i * max(0.0, min(1.0, self._current_time / total_duration))) + + # binary search for the correct path + while left_i < right_i: + if cumulative_line_duration[i] <= self._current_time: + left_i = i + 1 + else: + right_i = i + i = int((left_i + right_i) / 2) + + left_value = cumulative_line_duration[i - 1] if i > 0 else 0.0 + right_value = cumulative_line_duration[i] + + assert (left_value <= self._current_time <= right_value) + + fractional_value = (self._current_time - left_value) / (right_value - left_value) + + self.setPath(i + fractional_value) + + def advanceTime(self, time_increase: float) -> bool: + """ + Advance the time by the given amount. + + :param time_increase: The amount of time to advance (in seconds). + :return: True if the time was advanced, False if the end of the simulation was reached. + """ + total_duration, cumulative_line_duration = self.cumulativeLineDuration() + + # time ratio + time_increase = time_increase + + if self._current_time + time_increase > total_duration: + # If we have reached the end of the simulation, go to the next layer. + if self.getCurrentLayer() == self.getMaxLayers(): + # If we are already at the last layer, go to the first layer. + self.setTime(total_duration) + return False + + # advance to the next layer, and reset the time + self.setLayer(self.getCurrentLayer() + 1) + self.setTime(0.0) + else: + self.setTime(self._current_time + time_increase) + return True + + def cumulativeLineDuration(self) -> Tuple[float, List[float]]: + # TODO: cache the total duration and cumulative line duration at each layer change event + cumulative_line_duration = [] + total_duration = 0.0 + for polyline in self.getLayerData().polygons: + for line_duration in list((polyline.lineLengths / polyline.lineFeedrates)[0]): + total_duration += line_duration + cumulative_line_duration.append(total_duration) + return total_duration, cumulative_line_duration + + def getLayerData(self) -> Optional["LayerData"]: + scene = self.getController().getScene() + for node in DepthFirstIterator(scene.getRoot()): # type: ignore + layer_data = node.callDecoration("getLayerData") + if not layer_data: + continue + return layer_data.getLayer(self.getCurrentLayer()) + return None + def getMinimumPath(self) -> int: return self._minimum_path_num @@ -279,7 +350,7 @@ class SimulationView(CuraView): self._startUpdateTopLayers() self.currentLayerNumChanged.emit() - def setPath(self, value: int) -> None: + def setPath(self, value: float) -> None: """ Set the upper end of the range of visible paths on the current layer. @@ -402,15 +473,6 @@ class SimulationView(CuraView): def getMaxFeedrate(self) -> float: return self._max_feedrate - def getSimulationTime(self, currentIndex) -> float: - try: - return (self._lengths_of_polyline[self._current_layer_num][currentIndex] / self._current_feedrates[self._current_layer_num][currentIndex])[0] - - except: - # In case of change in layers, currentIndex comes one more than the items in the lengths_of_polyline - # We give 1 second time for layer change - return 1.0 - def getMinThickness(self) -> float: if abs(self._min_thickness - sys.float_info.max) < 10: # Some lenience due to floating point rounding. return 0.0 # If it's still max-float, there are no measurements. Use 0 then. @@ -535,10 +597,8 @@ class SimulationView(CuraView): visible_indicies_with_extrusion = numpy.where(numpy.isin(polyline.types, visible_line_types_with_extrusion))[0] if visible_indices.size == 0: # No items to take maximum or minimum of. continue - self._lengths_of_polyline[layer_index] = polyline.lineLengths visible_feedrates = numpy.take(polyline.lineFeedrates, visible_indices) visible_feedrates_with_extrusion = numpy.take(polyline.lineFeedrates, visible_indicies_with_extrusion) - self._current_feedrates[layer_index] = polyline.lineFeedrates visible_linewidths = numpy.take(polyline.lineWidths, visible_indices) visible_linewidths_with_extrusion = numpy.take(polyline.lineWidths, visible_indicies_with_extrusion) visible_thicknesses = numpy.take(polyline.lineThicknesses, visible_indices) diff --git a/plugins/SimulationView/SimulationViewMainComponent.qml b/plugins/SimulationView/SimulationViewMainComponent.qml index 216095c15c..23cbf8c611 100644 --- a/plugins/SimulationView/SimulationViewMainComponent.qml +++ b/plugins/SimulationView/SimulationViewMainComponent.qml @@ -136,54 +136,19 @@ Item Timer { id: simulationTimer - interval: UM.SimulationView.simulationTime + interval: 1000 / 60 running: false repeat: true onTriggered: { - var currentPath = UM.SimulationView.currentPath - var numPaths = UM.SimulationView.numPaths - var currentLayer = UM.SimulationView.currentLayer - var numLayers = UM.SimulationView.numLayers - - // When the user plays the simulation, if the path slider is at the end of this layer, we start - // the simulation at the beginning of the current layer. - if (!isSimulationPlaying) - { - if (currentPath >= numPaths) - { - UM.SimulationView.setCurrentPath(0) - } - else - { - UM.SimulationView.setCurrentPath(currentPath + 1) - } - } - // If the simulation is already playing and we reach the end of a layer, then it automatically - // starts at the beginning of the next layer. - else - { - if (currentPath >= numPaths) - { - // At the end of the model, the simulation stops - if (currentLayer >= numLayers) - { - playButton.pauseSimulation() - } - else - { - UM.SimulationView.setCurrentLayer(currentLayer + 1) - UM.SimulationView.setCurrentPath(0) - } - } - else - { - UM.SimulationView.setCurrentPath(currentPath + 1) - } + // divide by 1000 to accont for ms to s conversion + const advance_time = simulationTimer.interval / 1000.0; + if (!UM.SimulationView.advanceTime(advance_time)) { + playButton.pauseSimulation(); } // The status must be set here instead of in the resumeSimulation function otherwise it won't work // correctly, because part of the logic is in this trigger function. - isSimulationPlaying = true + isSimulationPlaying = true; } } diff --git a/plugins/SimulationView/SimulationViewProxy.py b/plugins/SimulationView/SimulationViewProxy.py index 576281874c..bf449a99d1 100644 --- a/plugins/SimulationView/SimulationViewProxy.py +++ b/plugins/SimulationView/SimulationViewProxy.py @@ -2,7 +2,6 @@ # Cura is released under the terms of the LGPLv3 or higher. from typing import TYPE_CHECKING -import numpy from PyQt6.QtCore import QObject, pyqtSignal, pyqtProperty from UM.FlameProfiler import pyqtSlot from UM.Application import Application @@ -12,11 +11,6 @@ if TYPE_CHECKING: class SimulationViewProxy(QObject): - - S_TO_MS = 1000 - SPEED_OF_SIMULATION = 10 - FACTOR = S_TO_MS/SPEED_OF_SIMULATION - def __init__(self, simulation_view: "SimulationView", parent=None) -> None: super().__init__(parent) self._simulation_view = simulation_view @@ -56,17 +50,13 @@ class SimulationViewProxy(QObject): def numPaths(self): return self._simulation_view.getMaxPaths() - @pyqtProperty(int, notify=currentPathChanged) + @pyqtProperty(float, notify=currentPathChanged) def currentPath(self): return self._simulation_view.getCurrentPath() - @pyqtProperty(int, notify=currentPathChanged) - def simulationTime(self): - # Extracts the currents paths simulation time (in seconds) for the current path from the dict of simulation time of the current layer. - # We multiply the time with 100 to make it to ms from s.(Should be 1000 in real time). This scaling makes the simulation time 10x faster than the real time. - simulationTimeOfpath = self._simulation_view.getSimulationTime(self._simulation_view.getCurrentPath()) * SimulationViewProxy.FACTOR - # Since the timer cannot process time less than 1 ms, we put a lower limit here - return int(max(1, simulationTimeOfpath)) + @pyqtSlot(float, result=bool) + def advanceTime(self, duration: float) -> bool: + return self._simulation_view.advanceTime(duration) @pyqtProperty(int, notify=currentPathChanged) def minimumPath(self): @@ -92,8 +82,8 @@ class SimulationViewProxy(QObject): def setMinimumLayer(self, layer_num): self._simulation_view.setMinimumLayer(layer_num) - @pyqtSlot(int) - def setCurrentPath(self, path_num): + @pyqtSlot(float) + def setCurrentPath(self, path_num: float): self._simulation_view.setPath(path_num) @pyqtSlot(int) @@ -229,4 +219,3 @@ class SimulationViewProxy(QObject): self._simulation_view.activityChanged.disconnect(self._onActivityChanged) self._simulation_view.globalStackChanged.disconnect(self._onGlobalStackChanged) self._simulation_view.preferencesChanged.disconnect(self._onPreferencesChanged) - From ddfd7d6a06842b2350b259ad9c22d8fd8fadcf06 Mon Sep 17 00:00:00 2001 From: "saumya.jain" Date: Tue, 19 Dec 2023 10:50:56 +0100 Subject: [PATCH 065/182] Use of APP_ASSOCIATE in url_scheme CURA-11288 --- packaging/NSIS/Ultimaker-Cura.nsi.jinja | 67 +++++++++++++++++++------ 1 file changed, 51 insertions(+), 16 deletions(-) diff --git a/packaging/NSIS/Ultimaker-Cura.nsi.jinja b/packaging/NSIS/Ultimaker-Cura.nsi.jinja index 228dba4fe4..3bef698805 100644 --- a/packaging/NSIS/Ultimaker-Cura.nsi.jinja +++ b/packaging/NSIS/Ultimaker-Cura.nsi.jinja @@ -144,6 +144,49 @@ SectionEnd ###################################################################### +Section UrlProtocol + +!macro APP_ASSOCIATE extension progid description commandname command + WriteRegStr HKCR "${extension}" "" "${description}" + WriteRegStr HKCR "${extension}" "URL Protocol" "" + WriteRegStr HKCR "${extension}\DefaultIcon" "" "${commandname},1" + WriteRegStr HKCR "${extension}\shell" "" "open" + WriteRegStr HKCR "${extension}\shell\open\command" "" '"${command}" "%1"' + !insertmacro APP_ASSOCIATE_SHORTCUT "${extension}" "${progid}" "${description}" "${command}" +!macroend + +WriteRegStr HKCR "cura" "" "URL:cura" +WriteRegStr HKCR "cura" "URL Protocol" "" +WriteRegStr HKCR "cura\DefaultIcon" "" "$INSTDIR\${MAIN_APP_EXE},1" +WriteRegStr HKCR "cura\shell" "" "open" +WriteRegStr HKCR "cura\shell\open\command" "" '"$INSTDIR\${MAIN_APP_EXE}" "%1"' + +WriteRegStr HKCR "slicer" "" "URL:slicer" +WriteRegStr HKCR "slicer" "URL Protocol" "" +WriteRegStr HKCR "slicer\DefaultIcon" "" "$INSTDIR\${MAIN_APP_EXE},1" +WriteRegStr HKCR "slicer\shell" "" "open" +WriteRegStr HKCR "slicer\shell\open\command" "" '"$INSTDIR\${MAIN_APP_EXE}" "%1"' + +; Set the uninstall section flag for this section +SetSectionFlags ${SECTION_UNINSTALL} + +; Define file associations for 'cura' protocol +StrCpy $0 "cura" +StrCpy $1 "URL:cura" +StrCpy $2 "CURA Protocol" +StrCpy $3 "$INSTDIR\${MAIN_APP_EXE},1" +Call APP_ASSOCIATE + +; Define file associations for 'slicer' protocol +StrCpy $0 "slicer" +StrCpy $1 "URL:slicer" +StrCpy $2 "SLICER Protocol" +StrCpy $3 "$INSTDIR\${MAIN_APP_EXE},1" +Call APP_ASSOCIATE + +SectionEnd +###################################################################### + Section Uninstall ${INSTALL_TYPE}{% for files in mapped_out_paths.values() %}{% for file in files %} Delete "{{ file[1] }}"{% endfor %}{% endfor %}{% for rem_dir in rmdir_paths %} @@ -187,23 +230,15 @@ RmDir "$SMPROGRAMS\{{ app_name }}" !insertmacro APP_UNASSOCIATE "stl" "Cura.model" !insertmacro APP_UNASSOCIATE "3mf" "Cura.project" +; Unassociate file associations for 'cura' protocol +StrCpy $0 "cura" +Call APP_UNASSOCIATE + +; Unassociate file associations for 'slicer' protocol +StrCpy $0 "slicer" +Call APP_UNASSOCIATE + DeleteRegKey ${REG_ROOT} "${REG_APP_PATH}" DeleteRegKey ${REG_ROOT} "${UNINSTALL_PATH}" SectionEnd -###################################################################### - -Section UrlProtocol - WriteRegStr HKCR "cura" "" "URL:cura" - WriteRegStr HKCR "cura" "URL Protocol" "" - WriteRegStr HKCR "cura\DefaultIcon" "" "$INSTDIR\${MAIN_APP_EXE},1" - WriteRegStr HKCR "cura\shell" "" "open" - WriteRegStr HKCR "cura\shell\open\command" "" '"$INSTDIR\${MAIN_APP_EXE}" "%1"' - - WriteRegStr HKCR "slicer" "" "URL:slicer" - WriteRegStr HKCR "slicer" "URL Protocol" "" - WriteRegStr HKCR "slicer\DefaultIcon" "" "$INSTDIR\${MAIN_APP_EXE},1" - WriteRegStr HKCR "slicer\shell" "" "open" - WriteRegStr HKCR "slicer\shell\open\command" "" '"$INSTDIR\${MAIN_APP_EXE}" "%1"' - -SectionEnd \ No newline at end of file From 5769fcba50134c7975437452a4a17f68927a6446 Mon Sep 17 00:00:00 2001 From: "saumya.jain" Date: Tue, 19 Dec 2023 13:26:19 +0100 Subject: [PATCH 066/182] Deleting the register key for url scheme CURA-11288 --- packaging/NSIS/Ultimaker-Cura.nsi.jinja | 32 ++----------------------- 1 file changed, 2 insertions(+), 30 deletions(-) diff --git a/packaging/NSIS/Ultimaker-Cura.nsi.jinja b/packaging/NSIS/Ultimaker-Cura.nsi.jinja index 3bef698805..0a2ce0f517 100644 --- a/packaging/NSIS/Ultimaker-Cura.nsi.jinja +++ b/packaging/NSIS/Ultimaker-Cura.nsi.jinja @@ -146,15 +146,6 @@ SectionEnd Section UrlProtocol -!macro APP_ASSOCIATE extension progid description commandname command - WriteRegStr HKCR "${extension}" "" "${description}" - WriteRegStr HKCR "${extension}" "URL Protocol" "" - WriteRegStr HKCR "${extension}\DefaultIcon" "" "${commandname},1" - WriteRegStr HKCR "${extension}\shell" "" "open" - WriteRegStr HKCR "${extension}\shell\open\command" "" '"${command}" "%1"' - !insertmacro APP_ASSOCIATE_SHORTCUT "${extension}" "${progid}" "${description}" "${command}" -!macroend - WriteRegStr HKCR "cura" "" "URL:cura" WriteRegStr HKCR "cura" "URL Protocol" "" WriteRegStr HKCR "cura\DefaultIcon" "" "$INSTDIR\${MAIN_APP_EXE},1" @@ -167,23 +158,6 @@ WriteRegStr HKCR "slicer\DefaultIcon" "" "$INSTDIR\${MAIN_APP_EXE},1" WriteRegStr HKCR "slicer\shell" "" "open" WriteRegStr HKCR "slicer\shell\open\command" "" '"$INSTDIR\${MAIN_APP_EXE}" "%1"' -; Set the uninstall section flag for this section -SetSectionFlags ${SECTION_UNINSTALL} - -; Define file associations for 'cura' protocol -StrCpy $0 "cura" -StrCpy $1 "URL:cura" -StrCpy $2 "CURA Protocol" -StrCpy $3 "$INSTDIR\${MAIN_APP_EXE},1" -Call APP_ASSOCIATE - -; Define file associations for 'slicer' protocol -StrCpy $0 "slicer" -StrCpy $1 "URL:slicer" -StrCpy $2 "SLICER Protocol" -StrCpy $3 "$INSTDIR\${MAIN_APP_EXE},1" -Call APP_ASSOCIATE - SectionEnd ###################################################################### @@ -231,12 +205,10 @@ RmDir "$SMPROGRAMS\{{ app_name }}" !insertmacro APP_UNASSOCIATE "3mf" "Cura.project" ; Unassociate file associations for 'cura' protocol -StrCpy $0 "cura" -Call APP_UNASSOCIATE +DeleteRegKey HKCR "cura" ; Unassociate file associations for 'slicer' protocol -StrCpy $0 "slicer" -Call APP_UNASSOCIATE +DeleteRegKey HKCR "slicer" DeleteRegKey ${REG_ROOT} "${REG_APP_PATH}" DeleteRegKey ${REG_ROOT} "${UNINSTALL_PATH}" From 69f8227b412e2eefa8e53b4c2e28fca6f803490c Mon Sep 17 00:00:00 2001 From: "saumya.jain" Date: Tue, 19 Dec 2023 14:33:21 +0100 Subject: [PATCH 067/182] Path correction for cura application for msi CURA-11288 --- packaging/msi/UltiMaker-Cura.wxs.jinja | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packaging/msi/UltiMaker-Cura.wxs.jinja b/packaging/msi/UltiMaker-Cura.wxs.jinja index 07a2c7d8c9..e9cb01a041 100644 --- a/packaging/msi/UltiMaker-Cura.wxs.jinja +++ b/packaging/msi/UltiMaker-Cura.wxs.jinja @@ -164,8 +164,8 @@ - - + + @@ -173,8 +173,8 @@ - - + + From cb01026aad29777fdd2aa3eb05a6fbd9fe1f43ac Mon Sep 17 00:00:00 2001 From: "saumya.jain" Date: Tue, 19 Dec 2023 15:27:53 +0100 Subject: [PATCH 068/182] Path correction for cura application for msi CURA-11288 --- packaging/msi/UltiMaker-Cura.wxs.jinja | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packaging/msi/UltiMaker-Cura.wxs.jinja b/packaging/msi/UltiMaker-Cura.wxs.jinja index e9cb01a041..c6ec5dbd63 100644 --- a/packaging/msi/UltiMaker-Cura.wxs.jinja +++ b/packaging/msi/UltiMaker-Cura.wxs.jinja @@ -164,8 +164,8 @@ - - + + @@ -173,8 +173,8 @@ - - + + From 380f0ed27032c8e4e860f343590bf7d36ea85f9b Mon Sep 17 00:00:00 2001 From: Christopher Peredy <16451370+mastercaution@users.noreply.github.com> Date: Tue, 19 Dec 2023 19:48:16 +0100 Subject: [PATCH 069/182] EN4 fix `nozzle_disallowed_areas` for N4 Max --- .../definitions/elegoo_neptune_4max.def.json | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/resources/definitions/elegoo_neptune_4max.def.json b/resources/definitions/elegoo_neptune_4max.def.json index c2240594b0..9ea53650cb 100644 --- a/resources/definitions/elegoo_neptune_4max.def.json +++ b/resources/definitions/elegoo_neptune_4max.def.json @@ -28,28 +28,28 @@ { "default_value": [ [ - [-165, -165], - [-165, 165], - [-161, 165], - [-161, -165] + [-215, -215], + [-215, 215], + [-211, 215], + [-211, -215] ], [ - [165, 165], - [165, -165], - [161, -165], - [161, 165] + [215, 215], + [215, -215], + [211, -215], + [211, 215] ], [ - [-165, -165], - [165, -165], - [-165, -161], - [165, -161] + [-215, -215], + [215, -215], + [-215, -211], + [215, -211] ], [ - [-165, 165], - [165, 165], - [-165, 161], - [165, 161] + [-215, 215], + [215, 215], + [-215, 211], + [215, 211] ] ] } From 8e0831a1e7910a66e46c9191bb816bdcb9ee48ae Mon Sep 17 00:00:00 2001 From: Christopher Peredy <16451370+mastercaution@users.noreply.github.com> Date: Tue, 19 Dec 2023 20:06:36 +0100 Subject: [PATCH 070/182] EN4 Plus/Max fix platform mesh --- resources/definitions/elegoo_neptune_4max.def.json | 6 ++++++ resources/definitions/elegoo_neptune_4plus.def.json | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/resources/definitions/elegoo_neptune_4max.def.json b/resources/definitions/elegoo_neptune_4max.def.json index 9ea53650cb..c2f6aa708c 100644 --- a/resources/definitions/elegoo_neptune_4max.def.json +++ b/resources/definitions/elegoo_neptune_4max.def.json @@ -6,6 +6,12 @@ { "visible": true, "author": "mastercaution", + "platform": "elegoo_platform_max.3mf", + "platform_offset": [ + -2.1, + -0.2, + 0 + ], "quality_definition": "elegoo_neptune_4" }, "overrides": diff --git a/resources/definitions/elegoo_neptune_4plus.def.json b/resources/definitions/elegoo_neptune_4plus.def.json index 703db64634..0038e49641 100644 --- a/resources/definitions/elegoo_neptune_4plus.def.json +++ b/resources/definitions/elegoo_neptune_4plus.def.json @@ -6,6 +6,12 @@ { "visible": true, "author": "mastercaution", + "platform": "elegoo_platform_max.3mf", + "platform_offset": [ + -2.1, + -0.2, + 0 + ], "quality_definition": "elegoo_neptune_4" }, "overrides": From f663c57a927ca7a637bd382cd7b0ab9bc19c76aa Mon Sep 17 00:00:00 2001 From: "c.lamboo" Date: Wed, 20 Dec 2023 08:50:37 +0100 Subject: [PATCH 071/182] Remove msi installer code Should be done for CURA-11435 CURA-11288 --- packaging/msi/UltiMaker-Cura.wxs.jinja | 36 -------------------------- 1 file changed, 36 deletions(-) diff --git a/packaging/msi/UltiMaker-Cura.wxs.jinja b/packaging/msi/UltiMaker-Cura.wxs.jinja index c6ec5dbd63..a183a97d5f 100644 --- a/packaging/msi/UltiMaker-Cura.wxs.jinja +++ b/packaging/msi/UltiMaker-Cura.wxs.jinja @@ -33,21 +33,6 @@ /> - - - - - {% if "Enterprise" in app_name %} @@ -159,32 +144,11 @@ - - - - - - - - - - - - - - - - - - - - - From f8f497b5781da97567077bff81bd75123b5bc3f4 Mon Sep 17 00:00:00 2001 From: "saumya.jain" Date: Wed, 20 Dec 2023 10:05:01 +0100 Subject: [PATCH 072/182] url registry entry for msi CURA-11435 --- packaging/msi/UltiMaker-Cura.wxs.jinja | 36 ++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/packaging/msi/UltiMaker-Cura.wxs.jinja b/packaging/msi/UltiMaker-Cura.wxs.jinja index a183a97d5f..c6ec5dbd63 100644 --- a/packaging/msi/UltiMaker-Cura.wxs.jinja +++ b/packaging/msi/UltiMaker-Cura.wxs.jinja @@ -33,6 +33,21 @@ /> + + + + + {% if "Enterprise" in app_name %} @@ -144,11 +159,32 @@ + + + + + + + + + + + + + + + + + + + + + From 76f86081c63c48652949d11d5c6aea62c5a4fd8b Mon Sep 17 00:00:00 2001 From: "saumya.jain" Date: Wed, 20 Dec 2023 10:50:57 +0100 Subject: [PATCH 073/182] fixing the register entry CURA-11435 --- packaging/msi/UltiMaker-Cura.wxs.jinja | 41 ++++++++++++++++++++------ 1 file changed, 32 insertions(+), 9 deletions(-) diff --git a/packaging/msi/UltiMaker-Cura.wxs.jinja b/packaging/msi/UltiMaker-Cura.wxs.jinja index c6ec5dbd63..3dcb9ef2ee 100644 --- a/packaging/msi/UltiMaker-Cura.wxs.jinja +++ b/packaging/msi/UltiMaker-Cura.wxs.jinja @@ -160,24 +160,47 @@ - + + + + + + + + + + + + + + + + + + + + + 127.0.0.1 + + + + - - + + - + - - - - + + + + - From e08d183b6c424d9ecc5c5e4668e7e379edf0cabf Mon Sep 17 00:00:00 2001 From: "saumya.jain" Date: Wed, 20 Dec 2023 10:56:25 +0100 Subject: [PATCH 074/182] undo commit 76f8608 CURA-11435 --- packaging/msi/UltiMaker-Cura.wxs.jinja | 37 +++++--------------------- 1 file changed, 7 insertions(+), 30 deletions(-) diff --git a/packaging/msi/UltiMaker-Cura.wxs.jinja b/packaging/msi/UltiMaker-Cura.wxs.jinja index 3dcb9ef2ee..21f017c813 100644 --- a/packaging/msi/UltiMaker-Cura.wxs.jinja +++ b/packaging/msi/UltiMaker-Cura.wxs.jinja @@ -160,31 +160,7 @@ - - - - - - - - - - - - - - - - - - - - - 127.0.0.1 - - - - + @@ -193,14 +169,15 @@ - + - - - - + + + + + From 41efdbabe0faf7bd70fe2d759db19be3e6033414 Mon Sep 17 00:00:00 2001 From: "saumya.jain" Date: Wed, 20 Dec 2023 18:16:04 +0100 Subject: [PATCH 075/182] Path change possible by user - simulation speed increased - no buffering in between layers - fps made 30 CURA-7647 --- plugins/SimulationView/SimulationView.py | 43 +++++++++++-------- .../SimulationViewMainComponent.qml | 3 +- 2 files changed, 27 insertions(+), 19 deletions(-) diff --git a/plugins/SimulationView/SimulationView.py b/plugins/SimulationView/SimulationView.py index 64ec0dfc1b..2663993f55 100644 --- a/plugins/SimulationView/SimulationView.py +++ b/plugins/SimulationView/SimulationView.py @@ -1,6 +1,6 @@ # Copyright (c) 2021 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. - +import math import sys from PyQt6.QtCore import Qt @@ -58,6 +58,7 @@ class SimulationView(CuraView): LAYER_VIEW_TYPE_LINE_TYPE = 1 LAYER_VIEW_TYPE_FEEDRATE = 2 LAYER_VIEW_TYPE_THICKNESS = 3 + SIMULATION_FACTOR = 5 _no_layers_warning_preference = "view/no_layers_warning" @@ -97,6 +98,7 @@ class SimulationView(CuraView): self._min_line_width = sys.float_info.max self._min_flow_rate = sys.float_info.max self._max_flow_rate = sys.float_info.min + self._cumulative_line_duration ={} self._global_container_stack: Optional[ContainerStack] = None self._proxy = None @@ -196,21 +198,21 @@ class SimulationView(CuraView): left_i = 0 right_i = self._max_paths - 1 - total_duration, cumulative_line_duration = self.cumulativeLineDuration() + total_duration = self.cumulativeLineDuration() # make an educated guess about where to start i = int(right_i * max(0.0, min(1.0, self._current_time / total_duration))) # binary search for the correct path while left_i < right_i: - if cumulative_line_duration[i] <= self._current_time: + if self._cumulative_line_duration[self.getCurrentLayer()][i] <= self._current_time: left_i = i + 1 else: right_i = i i = int((left_i + right_i) / 2) - left_value = cumulative_line_duration[i - 1] if i > 0 else 0.0 - right_value = cumulative_line_duration[i] + left_value = self._cumulative_line_duration[self.getCurrentLayer()][i - 1] if i > 0 else 0.0 + right_value = self._cumulative_line_duration[self.getCurrentLayer()][i] assert (left_value <= self._current_time <= right_value) @@ -225,10 +227,7 @@ class SimulationView(CuraView): :param time_increase: The amount of time to advance (in seconds). :return: True if the time was advanced, False if the end of the simulation was reached. """ - total_duration, cumulative_line_duration = self.cumulativeLineDuration() - - # time ratio - time_increase = time_increase + total_duration = self.cumulativeLineDuration() if self._current_time + time_increase > total_duration: # If we have reached the end of the simulation, go to the next layer. @@ -244,15 +243,20 @@ class SimulationView(CuraView): self.setTime(self._current_time + time_increase) return True - def cumulativeLineDuration(self) -> Tuple[float, List[float]]: - # TODO: cache the total duration and cumulative line duration at each layer change event - cumulative_line_duration = [] - total_duration = 0.0 - for polyline in self.getLayerData().polygons: - for line_duration in list((polyline.lineLengths / polyline.lineFeedrates)[0]): - total_duration += line_duration - cumulative_line_duration.append(total_duration) - return total_duration, cumulative_line_duration + def cumulativeLineDuration(self) -> float: + # Make sure _cumulative_line_duration is initialized properly + if self.getCurrentLayer() not in self._cumulative_line_duration: + self._cumulative_line_duration[self.getCurrentLayer()] = [] + total_duration = 0.0 + for polyline in self.getLayerData().polygons: + for line_duration in list((polyline.lineLengths / polyline.lineFeedrates)[0]): + total_duration += line_duration / SimulationView.SIMULATION_FACTOR + self._cumulative_line_duration[self.getCurrentLayer()].append(total_duration) + + # Calculate the total duration using numpy.sum + total_duration = (self._cumulative_line_duration[self.getCurrentLayer()][-1]) + + return total_duration def getLayerData(self) -> Optional["LayerData"]: scene = self.getController().getScene() @@ -360,6 +364,9 @@ class SimulationView(CuraView): if self._current_path_num != value: self._current_path_num = min(max(value, 0), self._max_paths) self._minimum_path_num = min(self._minimum_path_num, self._current_path_num) + # update _current time when the path is changed by user + if self.getCurrentLayer() in self._cumulative_line_duration and self._current_path_num < self._max_paths and round(self._current_path_num)== self._current_path_num: + self._current_time = self._cumulative_line_duration[self.getCurrentLayer()][int(self._current_path_num)] self._startUpdateTopLayers() self.currentPathNumChanged.emit() diff --git a/plugins/SimulationView/SimulationViewMainComponent.qml b/plugins/SimulationView/SimulationViewMainComponent.qml index 23cbf8c611..0432cfc08d 100644 --- a/plugins/SimulationView/SimulationViewMainComponent.qml +++ b/plugins/SimulationView/SimulationViewMainComponent.qml @@ -127,6 +127,7 @@ Item function resumeSimulation() { UM.SimulationView.setSimulationRunning(true) + UM.SimulationView.setCurrentPath(UM.SimulationView.currentPath) simulationTimer.start() layerSlider.manuallyChanged = false pathSlider.manuallyChanged = false @@ -136,7 +137,7 @@ Item Timer { id: simulationTimer - interval: 1000 / 60 + interval: 1000 / 30 running: false repeat: true onTriggered: From e2e94b7f6b9252ad64641793ef9a4d283cff5bcb Mon Sep 17 00:00:00 2001 From: "saumya.jain" Date: Thu, 21 Dec 2023 10:32:49 +0100 Subject: [PATCH 076/182] fps made 15 for lower GPU load - reinitialisation of cummulative_time for new model CURA-7647 --- plugins/SimulationView/SimulationView.py | 5 +++-- plugins/SimulationView/SimulationViewMainComponent.qml | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/plugins/SimulationView/SimulationView.py b/plugins/SimulationView/SimulationView.py index 2663993f55..bce7062a36 100644 --- a/plugins/SimulationView/SimulationView.py +++ b/plugins/SimulationView/SimulationView.py @@ -98,7 +98,7 @@ class SimulationView(CuraView): self._min_line_width = sys.float_info.max self._min_flow_rate = sys.float_info.max self._max_flow_rate = sys.float_info.min - self._cumulative_line_duration ={} + self._cumulative_line_duration = {} self._global_container_stack: Optional[ContainerStack] = None self._proxy = None @@ -253,7 +253,7 @@ class SimulationView(CuraView): total_duration += line_duration / SimulationView.SIMULATION_FACTOR self._cumulative_line_duration[self.getCurrentLayer()].append(total_duration) - # Calculate the total duration using numpy.sum + # total duration for a layer to simulate is the last element of the list total_duration = (self._cumulative_line_duration[self.getCurrentLayer()][-1]) return total_duration @@ -572,6 +572,7 @@ class SimulationView(CuraView): self._max_thickness = sys.float_info.min self._min_flow_rate = sys.float_info.max self._max_flow_rate = sys.float_info.min + self._cumulative_line_duration = {} # The colour scheme is only influenced by the visible lines, so filter the lines by if they should be visible. visible_line_types = [] diff --git a/plugins/SimulationView/SimulationViewMainComponent.qml b/plugins/SimulationView/SimulationViewMainComponent.qml index 0432cfc08d..d9e7a95bc1 100644 --- a/plugins/SimulationView/SimulationViewMainComponent.qml +++ b/plugins/SimulationView/SimulationViewMainComponent.qml @@ -137,12 +137,12 @@ Item Timer { id: simulationTimer - interval: 1000 / 30 + interval: 1000 / 15 running: false repeat: true onTriggered: { - // divide by 1000 to accont for ms to s conversion + // divide by 1000 to account for ms to s conversion const advance_time = simulationTimer.interval / 1000.0; if (!UM.SimulationView.advanceTime(advance_time)) { playButton.pauseSimulation(); From 3f8908f53a8207d2d75cab89618d22436df31ccd Mon Sep 17 00:00:00 2001 From: "saumya.jain" Date: Thu, 21 Dec 2023 10:42:52 +0100 Subject: [PATCH 077/182] cleanup CURA-7647 --- plugins/SimulationView/SimulationView.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/plugins/SimulationView/SimulationView.py b/plugins/SimulationView/SimulationView.py index bce7062a36..070a5c0345 100644 --- a/plugins/SimulationView/SimulationView.py +++ b/plugins/SimulationView/SimulationView.py @@ -1,6 +1,5 @@ # Copyright (c) 2021 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. -import math import sys from PyQt6.QtCore import Qt @@ -40,7 +39,7 @@ from .SimulationViewProxy import SimulationViewProxy import numpy import os.path -from typing import Optional, TYPE_CHECKING, List, Tuple, cast +from typing import Optional, TYPE_CHECKING, List, cast if TYPE_CHECKING: from UM.Scene.SceneNode import SceneNode From 0de4f612b399cfe8b7a6c8059e9579489bcd739c Mon Sep 17 00:00:00 2001 From: "saumya.jain" Date: Thu, 21 Dec 2023 14:13:16 +0100 Subject: [PATCH 078/182] fixing review comments. Cache only for the current layer CURA-7647 --- plugins/SimulationView/SimulationView.py | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/plugins/SimulationView/SimulationView.py b/plugins/SimulationView/SimulationView.py index 070a5c0345..1043c7659a 100644 --- a/plugins/SimulationView/SimulationView.py +++ b/plugins/SimulationView/SimulationView.py @@ -197,21 +197,22 @@ class SimulationView(CuraView): left_i = 0 right_i = self._max_paths - 1 - total_duration = self.cumulativeLineDuration() + cumulative_line_duration = self.cumulativeLineDuration() + total_duration = cumulative_line_duration[-1] # make an educated guess about where to start i = int(right_i * max(0.0, min(1.0, self._current_time / total_duration))) # binary search for the correct path while left_i < right_i: - if self._cumulative_line_duration[self.getCurrentLayer()][i] <= self._current_time: + if cumulative_line_duration[i] <= self._current_time: left_i = i + 1 else: right_i = i i = int((left_i + right_i) / 2) - left_value = self._cumulative_line_duration[self.getCurrentLayer()][i - 1] if i > 0 else 0.0 - right_value = self._cumulative_line_duration[self.getCurrentLayer()][i] + left_value = cumulative_line_duration[i - 1] if i > 0 else 0.0 + right_value = cumulative_line_duration[i] assert (left_value <= self._current_time <= right_value) @@ -226,7 +227,7 @@ class SimulationView(CuraView): :param time_increase: The amount of time to advance (in seconds). :return: True if the time was advanced, False if the end of the simulation was reached. """ - total_duration = self.cumulativeLineDuration() + total_duration = self.cumulativeLineDuration()[-1] if self._current_time + time_increase > total_duration: # If we have reached the end of the simulation, go to the next layer. @@ -242,9 +243,11 @@ class SimulationView(CuraView): self.setTime(self._current_time + time_increase) return True - def cumulativeLineDuration(self) -> float: + def cumulativeLineDuration(self) -> list: # Make sure _cumulative_line_duration is initialized properly if self.getCurrentLayer() not in self._cumulative_line_duration: + #clear cache + self._cumulative_line_duration = {} self._cumulative_line_duration[self.getCurrentLayer()] = [] total_duration = 0.0 for polyline in self.getLayerData().polygons: @@ -252,10 +255,7 @@ class SimulationView(CuraView): total_duration += line_duration / SimulationView.SIMULATION_FACTOR self._cumulative_line_duration[self.getCurrentLayer()].append(total_duration) - # total duration for a layer to simulate is the last element of the list - total_duration = (self._cumulative_line_duration[self.getCurrentLayer()][-1]) - - return total_duration + return self._cumulative_line_duration[self.getCurrentLayer()] def getLayerData(self) -> Optional["LayerData"]: scene = self.getController().getScene() @@ -364,8 +364,8 @@ class SimulationView(CuraView): self._current_path_num = min(max(value, 0), self._max_paths) self._minimum_path_num = min(self._minimum_path_num, self._current_path_num) # update _current time when the path is changed by user - if self.getCurrentLayer() in self._cumulative_line_duration and self._current_path_num < self._max_paths and round(self._current_path_num)== self._current_path_num: - self._current_time = self._cumulative_line_duration[self.getCurrentLayer()][int(self._current_path_num)] + if self._current_path_num < self._max_paths and round(self._current_path_num)== self._current_path_num: + self._current_time = self.cumulativeLineDuration()[int(self._current_path_num)] self._startUpdateTopLayers() self.currentPathNumChanged.emit() From 152cb27232310a35b3e71a70b438253a95c760f5 Mon Sep 17 00:00:00 2001 From: Saumya Jain <70144862+saumyaj3@users.noreply.github.com> Date: Thu, 21 Dec 2023 14:30:43 +0100 Subject: [PATCH 079/182] Update plugins/SimulationView/SimulationView.py review fix Co-authored-by: Casper Lamboo --- plugins/SimulationView/SimulationView.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/SimulationView/SimulationView.py b/plugins/SimulationView/SimulationView.py index 1043c7659a..04fc383fbb 100644 --- a/plugins/SimulationView/SimulationView.py +++ b/plugins/SimulationView/SimulationView.py @@ -243,7 +243,7 @@ class SimulationView(CuraView): self.setTime(self._current_time + time_increase) return True - def cumulativeLineDuration(self) -> list: + def cumulativeLineDuration(self) -> List[float]: # Make sure _cumulative_line_duration is initialized properly if self.getCurrentLayer() not in self._cumulative_line_duration: #clear cache From 608c2344c5d8b44e318d14a1284eb6204b194154 Mon Sep 17 00:00:00 2001 From: "saumya.jain" Date: Thu, 21 Dec 2023 16:25:12 +0100 Subject: [PATCH 080/182] on_error takes multiple args CURA-11289 --- cura/CuraApplication.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 52f38d4685..fd4b0c858c 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -1837,7 +1837,7 @@ class CuraApplication(QtApplication): self.readLocalFile(QUrl.fromLocalFile(tmp.name), add_to_recent_files=False) - def on_error(): + def on_error(*args, **kwargs): Logger.log("w", "Could not download file from {0}".format(model_url.url())) return From a309c9efdb5e3520de880fec40a89835d87f14dd Mon Sep 17 00:00:00 2001 From: "saumya.jain" Date: Thu, 21 Dec 2023 17:26:11 +0100 Subject: [PATCH 081/182] Error is displayed on Cura screen CURA-11289 --- cura/CuraApplication.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index fd4b0c858c..1ef2f63a9e 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -1839,6 +1839,9 @@ class CuraApplication(QtApplication): def on_error(*args, **kwargs): Logger.log("w", "Could not download file from {0}".format(model_url.url())) + Message("Could not download file: " + str(model_url.url()), + title= "Loading Model failed", + message_type=Message.MessageType.ERROR).show() return self.getHttpRequestManager().get( From 411b40d78c39923723ad31709d04f5558c7d1728 Mon Sep 17 00:00:00 2001 From: "saumya.jain" Date: Fri, 22 Dec 2023 10:37:51 +0100 Subject: [PATCH 082/182] Simulation speed made 3X case where no polygon in layer is also addressed CURA-11289 --- plugins/SimulationView/SimulationView.py | 57 ++++++++++++------------ 1 file changed, 29 insertions(+), 28 deletions(-) diff --git a/plugins/SimulationView/SimulationView.py b/plugins/SimulationView/SimulationView.py index 04fc383fbb..337879475b 100644 --- a/plugins/SimulationView/SimulationView.py +++ b/plugins/SimulationView/SimulationView.py @@ -57,7 +57,7 @@ class SimulationView(CuraView): LAYER_VIEW_TYPE_LINE_TYPE = 1 LAYER_VIEW_TYPE_FEEDRATE = 2 LAYER_VIEW_TYPE_THICKNESS = 3 - SIMULATION_FACTOR = 5 + SIMULATION_FACTOR = 3 _no_layers_warning_preference = "view/no_layers_warning" @@ -192,33 +192,30 @@ class SimulationView(CuraView): return self._current_path_num def setTime(self, time: float) -> None: - self._current_time = time - - left_i = 0 - right_i = self._max_paths - 1 - cumulative_line_duration = self.cumulativeLineDuration() - total_duration = cumulative_line_duration[-1] + if len(cumulative_line_duration) > 0: + self._current_time = time + left_i = 0 + right_i = self._max_paths - 1 + total_duration = cumulative_line_duration[-1] + # make an educated guess about where to start + i = int(right_i * max(0.0, min(1.0, self._current_time / total_duration))) + # binary search for the correct path + while left_i < right_i: + if cumulative_line_duration[i] <= self._current_time: + left_i = i + 1 + else: + right_i = i + i = int((left_i + right_i) / 2) - # make an educated guess about where to start - i = int(right_i * max(0.0, min(1.0, self._current_time / total_duration))) + left_value = cumulative_line_duration[i - 1] if i > 0 else 0.0 + right_value = cumulative_line_duration[i] - # binary search for the correct path - while left_i < right_i: - if cumulative_line_duration[i] <= self._current_time: - left_i = i + 1 - else: - right_i = i - i = int((left_i + right_i) / 2) + assert (left_value <= self._current_time <= right_value) - left_value = cumulative_line_duration[i - 1] if i > 0 else 0.0 - right_value = cumulative_line_duration[i] + fractional_value = (self._current_time - left_value) / (right_value - left_value) - assert (left_value <= self._current_time <= right_value) - - fractional_value = (self._current_time - left_value) / (right_value - left_value) - - self.setPath(i + fractional_value) + self.setPath(i + fractional_value) def advanceTime(self, time_increase: float) -> bool: """ @@ -227,7 +224,9 @@ class SimulationView(CuraView): :param time_increase: The amount of time to advance (in seconds). :return: True if the time was advanced, False if the end of the simulation was reached. """ - total_duration = self.cumulativeLineDuration()[-1] + total_duration = 0.0 + if len(self.cumulativeLineDuration()) > 0: + total_duration = self.cumulativeLineDuration()[-1] if self._current_time + time_increase > total_duration: # If we have reached the end of the simulation, go to the next layer. @@ -250,10 +249,12 @@ class SimulationView(CuraView): self._cumulative_line_duration = {} self._cumulative_line_duration[self.getCurrentLayer()] = [] total_duration = 0.0 - for polyline in self.getLayerData().polygons: - for line_duration in list((polyline.lineLengths / polyline.lineFeedrates)[0]): - total_duration += line_duration / SimulationView.SIMULATION_FACTOR - self._cumulative_line_duration[self.getCurrentLayer()].append(total_duration) + polylines = self.getLayerData() + if polylines is not None: + for polyline in polylines.polygons: + for line_duration in list((polyline.lineLengths / polyline.lineFeedrates)[0]): + total_duration += line_duration / SimulationView.SIMULATION_FACTOR + self._cumulative_line_duration[self.getCurrentLayer()].append(total_duration) return self._cumulative_line_duration[self.getCurrentLayer()] From 224f6132286e0e2aec6386545cfb6921f58afcab Mon Sep 17 00:00:00 2001 From: "saumya.jain" Date: Fri, 22 Dec 2023 11:36:51 +0100 Subject: [PATCH 083/182] Property of machinemanager redefined CURA-11459 --- resources/qml/PrinterSelector/MachineSelector.qml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/resources/qml/PrinterSelector/MachineSelector.qml b/resources/qml/PrinterSelector/MachineSelector.qml index b8b27049f6..1bad1d70bc 100644 --- a/resources/qml/PrinterSelector/MachineSelector.qml +++ b/resources/qml/PrinterSelector/MachineSelector.qml @@ -11,7 +11,7 @@ Cura.ExpandablePopup { id: machineSelector - property Cura.MachineManager machineManager + property var machineManager: Cura.MachineManager property bool isNetworkPrinter: machineManager.activeMachineHasNetworkConnection property bool isConnectedCloudPrinter: machineManager.activeMachineHasCloudConnection property bool isCloudRegistered: machineManager.activeMachineHasCloudRegistration @@ -107,6 +107,7 @@ Cura.ExpandablePopup { return UM.Theme.getIcon("Printer", "medium") } + else { return "" From 7fab301866b63d90ffb72603fdd3aa30a505cdec Mon Sep 17 00:00:00 2001 From: "c.lamboo" Date: Fri, 22 Dec 2023 18:02:23 +0100 Subject: [PATCH 084/182] Guard against index out of bound CURA-7647 --- plugins/SimulationView/SimulationPass.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/SimulationView/SimulationPass.py b/plugins/SimulationView/SimulationPass.py index 3294f4b1e6..e97a0cd32c 100644 --- a/plugins/SimulationView/SimulationPass.py +++ b/plugins/SimulationView/SimulationPass.py @@ -160,14 +160,14 @@ class SimulationPass(RenderPass): ratio = self._layer_view.getCurrentPath() - index pos_a = Vector(polygon.data[index + offset][0], polygon.data[index + offset][1], polygon.data[index + offset][2]) - if ratio > 0.0001: + if ratio <= 0.0001 or index + offset == len(polygon.data): + head_position = pos_a + node.getWorldPosition() + else: pos_b = Vector(polygon.data[index + offset + 1][0], polygon.data[index + offset + 1][1], polygon.data[index + offset + 1][2]) vec = pos_a * (1.0 - ratio) + pos_b * ratio head_position = vec + node.getWorldPosition() - else: - head_position = pos_a + node.getWorldPosition() break break if self._layer_view.getMinimumLayer() > layer: From 632c10db51908445c41a3cd12bd2532c0df0211e Mon Sep 17 00:00:00 2001 From: "saumya.jain" Date: Wed, 27 Dec 2023 10:12:40 +0100 Subject: [PATCH 085/182] Guard against index for edge case CURA-7647 --- plugins/SimulationView/SimulationPass.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/SimulationView/SimulationPass.py b/plugins/SimulationView/SimulationPass.py index e97a0cd32c..dd94d678ae 100644 --- a/plugins/SimulationView/SimulationPass.py +++ b/plugins/SimulationView/SimulationPass.py @@ -160,7 +160,7 @@ class SimulationPass(RenderPass): ratio = self._layer_view.getCurrentPath() - index pos_a = Vector(polygon.data[index + offset][0], polygon.data[index + offset][1], polygon.data[index + offset][2]) - if ratio <= 0.0001 or index + offset == len(polygon.data): + if ratio <= 0.0001 or index + offset < len(polygon.data): head_position = pos_a + node.getWorldPosition() else: pos_b = Vector(polygon.data[index + offset + 1][0], From 96aba0a8df8ad20441c0c23c5b56cf0d98398181 Mon Sep 17 00:00:00 2001 From: Christopher Peredy <16451370+mastercaution@users.noreply.github.com> Date: Thu, 28 Dec 2023 23:12:35 +0100 Subject: [PATCH 086/182] EN4 add 0.2mm engineering profile --- ...oo_n4_aa0.4_pla_0.2mm_engineering.inst.cfg | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 resources/intent/elegoo_neptune_4/PLA/elegoo_n4_aa0.4_pla_0.2mm_engineering.inst.cfg diff --git a/resources/intent/elegoo_neptune_4/PLA/elegoo_n4_aa0.4_pla_0.2mm_engineering.inst.cfg b/resources/intent/elegoo_neptune_4/PLA/elegoo_n4_aa0.4_pla_0.2mm_engineering.inst.cfg new file mode 100644 index 0000000000..1e9703215d --- /dev/null +++ b/resources/intent/elegoo_neptune_4/PLA/elegoo_n4_aa0.4_pla_0.2mm_engineering.inst.cfg @@ -0,0 +1,25 @@ +[general] +definition = elegoo_neptune_4 +name = Accurate +version = 4 + +[metadata] +intent_category = engineering +is_experimental = True +material = generic_pla +quality_type = Elegoo_layer_020 +setting_version = 22 +type = intent +variant = 0.40mm_Elegoo_Nozzle + +[values] +speed_infill = =speed_print +speed_print = 150 +speed_topbottom = =speed_print * 2 / 3 +speed_travel = =min(speed_print * 4 / 3, 250) if speed_print <= 250 else speed_print +speed_wall = =speed_print * 2 / 3 +speed_wall_0 = =speed_wall +speed_wall_x = =speed_wall +top_bottom_thickness = =wall_thickness +wall_thickness = =line_width * 3 + From ff65f79a728e033bd7258b57c697b867ba187c2d Mon Sep 17 00:00:00 2001 From: Christian Kunis Date: Sat, 30 Dec 2023 09:58:58 -0500 Subject: [PATCH 087/182] Fixed default gcode flavor for Voron --- resources/definitions/voron2_base.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/voron2_base.def.json b/resources/definitions/voron2_base.def.json index 1e76380b69..8fc882d59e 100644 --- a/resources/definitions/voron2_base.def.json +++ b/resources/definitions/voron2_base.def.json @@ -55,7 +55,7 @@ "machine_endstop_positive_direction_y": { "default_value": true }, "machine_endstop_positive_direction_z": { "default_value": false }, "machine_feeder_wheel_diameter": { "default_value": 7.5 }, - "machine_gcode_flavor": { "default_value": "RepRap (RepRap)" }, + "machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" }, "machine_head_with_fans_polygon": { "default_value": [ From b51ea6970b507344963abcfddb69bd3f33e37a83 Mon Sep 17 00:00:00 2001 From: Christian Kunis Date: Sat, 30 Dec 2023 09:59:25 -0500 Subject: [PATCH 088/182] Updated print_start gcode for Voron printers --- resources/definitions/voron2_base.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/voron2_base.def.json b/resources/definitions/voron2_base.def.json index 8fc882d59e..a3eb099d49 100644 --- a/resources/definitions/voron2_base.def.json +++ b/resources/definitions/voron2_base.def.json @@ -76,7 +76,7 @@ "machine_max_jerk_xy": { "default_value": 20 }, "machine_max_jerk_z": { "default_value": 1 }, "machine_name": { "default_value": "VORON2" }, - "machine_start_gcode": { "default_value": "print_start" }, + "machine_start_gcode": { "default_value": "print_start EXTRUDER={material_print_temperature_layer_0} BED={material_bed_temperature_layer_0} CHAMBER={build_volume_temperature}" }, "machine_steps_per_mm_x": { "default_value": 80 }, "machine_steps_per_mm_y": { "default_value": 80 }, "machine_steps_per_mm_z": { "default_value": 400 }, From 6bb1dba3e092fa55169b7767dd05cb03787e2db8 Mon Sep 17 00:00:00 2001 From: Christian Kunis Date: Sat, 30 Dec 2023 10:10:46 -0500 Subject: [PATCH 089/182] Add metadata to Voron start gcode Adding extra metadata for Moonraker as described in the Klipper Preprocessor docs --- resources/definitions/voron2_base.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/voron2_base.def.json b/resources/definitions/voron2_base.def.json index a3eb099d49..dc6cd255bb 100644 --- a/resources/definitions/voron2_base.def.json +++ b/resources/definitions/voron2_base.def.json @@ -76,7 +76,7 @@ "machine_max_jerk_xy": { "default_value": 20 }, "machine_max_jerk_z": { "default_value": 1 }, "machine_name": { "default_value": "VORON2" }, - "machine_start_gcode": { "default_value": "print_start EXTRUDER={material_print_temperature_layer_0} BED={material_bed_temperature_layer_0} CHAMBER={build_volume_temperature}" }, + "machine_start_gcode": { "default_value": ";Nozzle diameter = {machine_nozzle_size}\n;Filament type = {material_type}\n;Filament name = {material_name}\n;Filament weight = {filament_weight}\n; M190 S{material_bed_temperature_layer_0}\n; M109 S{material_print_temperature_layer_0}\nprint_start EXTRUDER={material_print_temperature_layer_0} BED={material_bed_temperature_layer_0} CHAMBER={build_volume_temperature}" }, "machine_steps_per_mm_x": { "default_value": 80 }, "machine_steps_per_mm_y": { "default_value": 80 }, "machine_steps_per_mm_z": { "default_value": 400 }, From e66314b2dd35bb6f87f1f3804a38311e5fc535f4 Mon Sep 17 00:00:00 2001 From: "saumya.jain" Date: Tue, 2 Jan 2024 10:48:40 +0100 Subject: [PATCH 090/182] ppr setting was added when it should be excluded CURA-11480 --- resources/qml/Preferences/SettingVisibilityPage.qml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/resources/qml/Preferences/SettingVisibilityPage.qml b/resources/qml/Preferences/SettingVisibilityPage.qml index 476ba999cf..8743999fe2 100644 --- a/resources/qml/Preferences/SettingVisibilityPage.qml +++ b/resources/qml/Preferences/SettingVisibilityPage.qml @@ -123,7 +123,7 @@ UM.PreferencesPage var idx = -1; for(var i = 0; i < settingVisibilityPresetsModel.items.length; ++i) { - if(settingVisibilityPresetsModel.items[i].presetId == settingVisibilityPresetsModel.activePreset) + if(settingVisibilityPresetsModel.items[i].presetId === settingVisibilityPresetsModel.activePreset) { idx = i; break; @@ -159,7 +159,7 @@ UM.PreferencesPage id: definitionsModel containerId: Cura.MachineManager.activeMachine != null ? Cura.MachineManager.activeMachine.definition.id: "" showAll: true - exclude: ["machine_settings", "command_line_settings"] + exclude: ["machine_settings", "command_line_settings", "ppr"] showAncestors: true expanded: ["*"] visibilityHandler: UM.SettingPreferenceVisibilityHandler {} @@ -173,13 +173,13 @@ UM.PreferencesPage id: loader width: settingsListView.width - scrollBar.width - height: model.type != undefined ? UM.Theme.getSize("section").height : 0 + height: model.type !== undefined ? UM.Theme.getSize("section").height : 0 property var definition: model property var settingDefinitionsModel: definitionsModel asynchronous: true - active: model.type != undefined + active: model.type !== undefined sourceComponent: { switch (model.type) From 0bb1f0b7c3ff87edbecca432e017c6423ad03eed Mon Sep 17 00:00:00 2001 From: "saumya.jain" Date: Tue, 2 Jan 2024 12:05:55 +0100 Subject: [PATCH 091/182] Case of simulation with multiple extruders CURA-7647 --- plugins/SimulationView/SimulationPass.py | 22 +++++++++++----------- plugins/SimulationView/SimulationView.py | 7 +++++-- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/plugins/SimulationView/SimulationPass.py b/plugins/SimulationView/SimulationPass.py index dd94d678ae..cdeb9da29f 100644 --- a/plugins/SimulationView/SimulationPass.py +++ b/plugins/SimulationView/SimulationPass.py @@ -1,5 +1,6 @@ # Copyright (c) 2021 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. +import math from UM.Math.Color import Color from UM.Math.Vector import Vector @@ -148,24 +149,23 @@ class SimulationPass(RenderPass): if layer == self._layer_view._current_layer_num: # We look for the position of the head, searching the point of the current path index = int(self._layer_view.getCurrentPath()) - offset = 0 for polygon in layer_data.getLayer(layer).polygons: # The size indicates all values in the two-dimension array, and the second dimension is # always size 3 because we have 3D points. - if index >= polygon.data.size // 3 - offset: - index -= polygon.data.size // 3 - offset - offset = 1 # This is to avoid the first point when there is more than one polygon, since has the same value as the last point in the previous polygon + if index >= polygon.data.size // 3 : + index -= polygon.data.size // 3 continue # The head position is calculated and translated - ratio = self._layer_view.getCurrentPath() - index - pos_a = Vector(polygon.data[index + offset][0], polygon.data[index + offset][1], - polygon.data[index + offset][2]) - if ratio <= 0.0001 or index + offset < len(polygon.data): + ratio = self._layer_view.getCurrentPath() - math.floor(self._layer_view.getCurrentPath()) + pos_a = Vector(polygon.data[index][0], polygon.data[index + offset][1], + polygon.data[index][2]) + if ratio <= 0.0001 or index + 1 == len(polygon.data): + # in case there multiple polygons and polygon changes, the first point has the same value as the last point in the previous polygon head_position = pos_a + node.getWorldPosition() else: - pos_b = Vector(polygon.data[index + offset + 1][0], - polygon.data[index + offset + 1][1], - polygon.data[index + offset + 1][2]) + pos_b = Vector(polygon.data[index + 1][0], + polygon.data[index + 1][1], + polygon.data[index + 1][2]) vec = pos_a * (1.0 - ratio) + pos_b * ratio head_position = vec + node.getWorldPosition() break diff --git a/plugins/SimulationView/SimulationView.py b/plugins/SimulationView/SimulationView.py index 337879475b..92a6a9e853 100644 --- a/plugins/SimulationView/SimulationView.py +++ b/plugins/SimulationView/SimulationView.py @@ -57,7 +57,7 @@ class SimulationView(CuraView): LAYER_VIEW_TYPE_LINE_TYPE = 1 LAYER_VIEW_TYPE_FEEDRATE = 2 LAYER_VIEW_TYPE_THICKNESS = 3 - SIMULATION_FACTOR = 3 + SIMULATION_FACTOR = 2 _no_layers_warning_preference = "view/no_layers_warning" @@ -211,7 +211,8 @@ class SimulationView(CuraView): left_value = cumulative_line_duration[i - 1] if i > 0 else 0.0 right_value = cumulative_line_duration[i] - assert (left_value <= self._current_time <= right_value) + if not (left_value <= self._current_time <= right_value): + Logger.debug(f"At index {i}: left value {left_value} right value {right_value} and current time is {self._current_time}") fractional_value = (self._current_time - left_value) / (right_value - left_value) @@ -255,6 +256,8 @@ class SimulationView(CuraView): for line_duration in list((polyline.lineLengths / polyline.lineFeedrates)[0]): total_duration += line_duration / SimulationView.SIMULATION_FACTOR self._cumulative_line_duration[self.getCurrentLayer()].append(total_duration) + # for tool change we add an extra tool path + self._cumulative_line_duration[self.getCurrentLayer()].append(total_duration) return self._cumulative_line_duration[self.getCurrentLayer()] From ee7ecc1acc76f8d5504251dba9b4627bbb3b5ca5 Mon Sep 17 00:00:00 2001 From: "saumya.jain" Date: Wed, 3 Jan 2024 09:16:04 +0100 Subject: [PATCH 092/182] offset removed CURA-7647 --- plugins/SimulationView/SimulationPass.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/SimulationView/SimulationPass.py b/plugins/SimulationView/SimulationPass.py index cdeb9da29f..2099f6c21d 100644 --- a/plugins/SimulationView/SimulationPass.py +++ b/plugins/SimulationView/SimulationPass.py @@ -157,7 +157,7 @@ class SimulationPass(RenderPass): continue # The head position is calculated and translated ratio = self._layer_view.getCurrentPath() - math.floor(self._layer_view.getCurrentPath()) - pos_a = Vector(polygon.data[index][0], polygon.data[index + offset][1], + pos_a = Vector(polygon.data[index][0], polygon.data[index][1], polygon.data[index][2]) if ratio <= 0.0001 or index + 1 == len(polygon.data): # in case there multiple polygons and polygon changes, the first point has the same value as the last point in the previous polygon From 2fbdb633e16857a58e883f0ecf2bfdcc308d36bb Mon Sep 17 00:00:00 2001 From: "saumya.jain" Date: Wed, 3 Jan 2024 12:23:40 +0100 Subject: [PATCH 093/182] qt6.6 scroll issues CURA-11468 --- conanfile.py | 1 + cura_app.py | 1 + packaging/AppImage-builder/AppImageBuilder.yml.jinja | 1 + packaging/AppImage/AppRun | 1 + 4 files changed, 4 insertions(+) diff --git a/conanfile.py b/conanfile.py index a3ca8f1c89..5ebcf5a4c4 100644 --- a/conanfile.py +++ b/conanfile.py @@ -71,6 +71,7 @@ class CuraConan(ConanFile): self._cura_env = Environment() self._cura_env.define("QML2_IMPORT_PATH", str(self._site_packages.joinpath("PyQt6", "Qt6", "qml"))) self._cura_env.define("QT_PLUGIN_PATH", str(self._site_packages.joinpath("PyQt6", "Qt6", "plugins"))) + self._cura_env.define("QT_QUICK_FLICKABLE_WHEEL_DECELERATION", "5000") if not self.in_local_cache: self._cura_env.define("CURA_DATA_ROOT", str(self._share_dir.joinpath("cura"))) diff --git a/cura_app.py b/cura_app.py index 905d8f4ee0..17321b8042 100755 --- a/cura_app.py +++ b/cura_app.py @@ -17,6 +17,7 @@ import faulthandler import os if sys.platform != "linux": # Turns out the Linux build _does_ use this, but we're not making an Enterprise release for that system anyway. os.environ["QT_PLUGIN_PATH"] = "" # Security workaround: Don't need it, and introduces an attack vector, so set to nul. + os.environ["QT_QUICK_FLICKABLE_WHEEL_DECELERATION"] = "" # Security workaround: Don't need it, and introduces an attack vector, so set to nul. os.environ["QML2_IMPORT_PATH"] = "" # Security workaround: Don't need it, and introduces an attack vector, so set to nul. os.environ["QT_OPENGL_DLL"] = "" # Security workaround: Don't need it, and introduces an attack vector, so set to nul. diff --git a/packaging/AppImage-builder/AppImageBuilder.yml.jinja b/packaging/AppImage-builder/AppImageBuilder.yml.jinja index 9090a5f209..ae6cabcaa1 100644 --- a/packaging/AppImage-builder/AppImageBuilder.yml.jinja +++ b/packaging/AppImage-builder/AppImageBuilder.yml.jinja @@ -45,6 +45,7 @@ AppDir: LD_LIBRARY_PATH: "$APPDIR:$APPDIR/runtime/compat/:$APPDIR/usr/lib/x86_64-linux-gnu:$APPDIR/lib/x86_64-linux-gnu:$APPDIR/usr/lib:$APPDIR/usr/lib/x86_64-linux-gnu/gdk-pixbuf-2.0/2.10.0/loaders" PYTHONPATH: "$APPDIR" QT_PLUGIN_PATH: "$APPDIR/qt/plugins" + QT_QUICK_FLICKABLE_WHEEL_DECELERATION: "5000" QML2_IMPORT_PATH: "$APPDIR/qt/qml" QT_QPA_PLATFORMTHEME: xdgdesktopportal GDK_PIXBUF_MODULEDIR: $APPDIR/usr/lib/x86_64-linux-gnu/gdk-pixbuf-2.0/2.10.0/loaders diff --git a/packaging/AppImage/AppRun b/packaging/AppImage/AppRun index 369ce54c6c..9926df1878 100644 --- a/packaging/AppImage/AppRun +++ b/packaging/AppImage/AppRun @@ -5,6 +5,7 @@ scriptdir=$(dirname $0) export PYTHONPATH="$scriptdir/lib/python3.10" export LD_LIBRARY_PATH=$scriptdir export QT_PLUGIN_PATH="$scriptdir/qt/plugins" +export QT_QUICK_FLICKABLE_WHEEL_DECELERATION="5000" export QML2_IMPORT_PATH="$scriptdir/qt/qml" export QT_QPA_FONTDIR=/usr/share/fonts export QT_QPA_PLATFORMTHEME=xdgdesktopportal From 1e230ffef1962faeae7068caf4ad3f91f6a35b06 Mon Sep 17 00:00:00 2001 From: "saumya.jain" Date: Wed, 3 Jan 2024 14:19:22 +0100 Subject: [PATCH 094/182] Printer name changed to printer type printer names can be different for same type of printer. Also, printer type is coming from cloud here so the type search is changed accordingly CURA-11432 --- plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py index 9a11bb886c..b2541f6f82 100644 --- a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py +++ b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py @@ -331,7 +331,7 @@ class CloudOutputDevice(UltimakerNetworkedPrinterOutputDevice): return False [printer, *_] = self._printers - return printer.name in ("ultimaker_methodx", "ultimaker_methodxl") + return printer.type in ("MakerBot Method X", "MakerBot Method XL") @pyqtProperty(bool, notify=_cloudClusterPrintersChanged) def supportsPrintJobActions(self) -> bool: From df589cfe95a3da7b407ee0b4b2f268ba0544a492 Mon Sep 17 00:00:00 2001 From: Paul Kuiper <46715907+pkuiper-ultimaker@users.noreply.github.com> Date: Wed, 3 Jan 2024 15:38:53 +0100 Subject: [PATCH 095/182] Fan speeds are in 0..1 range and not in 0..255 range for the Method machines. This needs to be corrected in the switch over routine formula's. PP-417 --- resources/extruders/ultimaker_methodx_extruder_left.def.json | 4 ++-- resources/extruders/ultimaker_methodx_extruder_right.def.json | 4 ++-- resources/extruders/ultimaker_methodxl_extruder_left.def.json | 4 ++-- .../extruders/ultimaker_methodxl_extruder_right.def.json | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/resources/extruders/ultimaker_methodx_extruder_left.def.json b/resources/extruders/ultimaker_methodx_extruder_left.def.json index 97e8a1f2c3..273a2c922e 100644 --- a/resources/extruders/ultimaker_methodx_extruder_left.def.json +++ b/resources/extruders/ultimaker_methodx_extruder_left.def.json @@ -14,8 +14,8 @@ "default_value": 0, "maximum_value": "1" }, - "machine_extruder_end_code": { "default_value": "M106 P{extruder_nr} S255\nG91\nG0 Z0.4 F600\nG90\nG0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000" }, - "machine_extruder_start_code": { "default_value": "G0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000\nM109 S{material_final_print_temperature}\nG4 S5\nG91\nG0 Z-0.4 F600\nG90\nM107 P{(extruder_nr+1)%2}\nM106 P{extruder_nr} S{cool_fan_speed*255/100}" }, + "machine_extruder_end_code": { "default_value": "M106 P{extruder_nr} S1.0\nG91\nG0 Z0.4 F600\nG90\nG0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000" }, + "machine_extruder_start_code": { "default_value": "G0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000\nM109 S{material_initial_print_temperature}\nG4 S5\nG91\nG0 Z-0.4 F600\nG90\nM107 P{(extruder_nr+1)%2}\nM106 P{extruder_nr} S{cool_fan_speed/100}" }, "machine_nozzle_offset_x": { "default_value": 0 }, "machine_nozzle_offset_y": { "default_value": 0 }, "machine_nozzle_size": { "default_value": 0.4 }, diff --git a/resources/extruders/ultimaker_methodx_extruder_right.def.json b/resources/extruders/ultimaker_methodx_extruder_right.def.json index 8a4ef33404..bb8f1d89c2 100644 --- a/resources/extruders/ultimaker_methodx_extruder_right.def.json +++ b/resources/extruders/ultimaker_methodx_extruder_right.def.json @@ -14,8 +14,8 @@ "default_value": 1, "maximum_value": "1" }, - "machine_extruder_end_code": { "default_value": "M106 P{extruder_nr} S255\nG91\nG0 Z0.4 F600\nG90\nG0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000" }, - "machine_extruder_start_code": { "default_value": "G0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000\nM109 S{material_final_print_temperature}\nG4 S5\nG91\nG0 Z-0.4 F600\nG90\nM107 P{(extruder_nr+1)%2}\nM106 P{extruder_nr} S{cool_fan_speed*255/100}" }, + "machine_extruder_end_code": { "default_value": "M106 P{extruder_nr} S1.0\nG91\nG0 Z0.4 F600\nG90\nG0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000" }, + "machine_extruder_start_code": { "default_value": "G0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000\nM109 S{material_initial_print_temperature}\nG4 S5\nG91\nG0 Z-0.4 F600\nG90\nM107 P{(extruder_nr+1)%2}\nM106 P{extruder_nr} S{cool_fan_speed/100}" }, "machine_nozzle_offset_x": { "default_value": 0 }, "machine_nozzle_offset_y": { "default_value": 0 }, "machine_nozzle_size": { "default_value": 0.4 }, diff --git a/resources/extruders/ultimaker_methodxl_extruder_left.def.json b/resources/extruders/ultimaker_methodxl_extruder_left.def.json index 2bedf9a62c..ba4a3f0157 100644 --- a/resources/extruders/ultimaker_methodxl_extruder_left.def.json +++ b/resources/extruders/ultimaker_methodxl_extruder_left.def.json @@ -14,8 +14,8 @@ "default_value": 0, "maximum_value": "1" }, - "machine_extruder_end_code": { "default_value": "M106 P{extruder_nr} S255\nG91\nG0 Z0.4 F600\nG90\nG0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000" }, - "machine_extruder_start_code": { "default_value": "G0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000\nM109 S{material_final_print_temperature}\nG4 S5\nG91\nG0 Z-0.4 F600\nG90\nM107 P{(extruder_nr+1)%2}\nM106 P{extruder_nr} S{cool_fan_speed*255/100}" }, + "machine_extruder_end_code": { "default_value": "M106 P{extruder_nr} S1.0\nG91\nG0 Z0.4 F600\nG90\nG0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000" }, + "machine_extruder_start_code": { "default_value": "G0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000\nM109 S{material_initial_print_temperature}\nG4 S5\nG91\nG0 Z-0.4 F600\nG90\nM107 P{(extruder_nr+1)%2}\nM106 P{extruder_nr} S{cool_fan_speed/100}" }, "machine_nozzle_offset_x": { "default_value": 0 }, "machine_nozzle_offset_y": { "default_value": 0 }, "machine_nozzle_size": { "default_value": 0.4 }, diff --git a/resources/extruders/ultimaker_methodxl_extruder_right.def.json b/resources/extruders/ultimaker_methodxl_extruder_right.def.json index 2fd5b37663..32fbf1dd08 100644 --- a/resources/extruders/ultimaker_methodxl_extruder_right.def.json +++ b/resources/extruders/ultimaker_methodxl_extruder_right.def.json @@ -14,8 +14,8 @@ "default_value": 1, "maximum_value": "1" }, - "machine_extruder_end_code": { "default_value": "M106 P{extruder_nr} S255\nG91\nG0 Z0.4 F600\nG90\nG0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000" }, - "machine_extruder_start_code": { "default_value": "G0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000\nM109 S{material_final_print_temperature}\nG4 S5\nG91\nG0 Z-0.4 F600\nG90\nM107 P{(extruder_nr+1)%2}\nM106 P{extruder_nr} S{cool_fan_speed*255/100}" }, + "machine_extruder_end_code": { "default_value": "M106 P{extruder_nr} S1.0\nG91\nG0 Z0.4 F600\nG90\nG0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000" }, + "machine_extruder_start_code": { "default_value": "G0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000\nM109 S{material_initial_print_temperature}\nG4 S5\nG91\nG0 Z-0.4 F600\nG90\nM107 P{(extruder_nr+1)%2}\nM106 P{extruder_nr} S{cool_fan_speed/100}" }, "machine_nozzle_offset_x": { "default_value": 0 }, "machine_nozzle_offset_y": { "default_value": 0 }, "machine_nozzle_size": { "default_value": 0.4 }, From 44441dfe5b119e66d7e671f780f3dffe3a66f7aa Mon Sep 17 00:00:00 2001 From: Paul Kuiper <46715907+pkuiper-ultimaker@users.noreply.github.com> Date: Wed, 3 Jan 2024 15:54:24 +0100 Subject: [PATCH 096/182] Improve the time estimates for the Method machines be increasing the acceleration and reducing the jerk. For dual extrusion a rough switch over time estimate is taken into account. PP-377 --- resources/definitions/ultimaker_method_base.def.json | 6 +++--- .../extruders/ultimaker_methodx_extruder_left.def.json | 1 + .../extruders/ultimaker_methodx_extruder_right.def.json | 1 + .../extruders/ultimaker_methodxl_extruder_left.def.json | 1 + .../extruders/ultimaker_methodxl_extruder_right.def.json | 1 + 5 files changed, 7 insertions(+), 3 deletions(-) diff --git a/resources/definitions/ultimaker_method_base.def.json b/resources/definitions/ultimaker_method_base.def.json index 4f03a8dbe1..972d69e0d3 100644 --- a/resources/definitions/ultimaker_method_base.def.json +++ b/resources/definitions/ultimaker_method_base.def.json @@ -99,7 +99,7 @@ "acceleration_print": { "enabled": false, - "value": 300 + "value": 800 }, "acceleration_print_layer_0": { @@ -234,7 +234,7 @@ "jerk_print": { "enabled": false, - "value": 12.5 + "value": 6.25 }, "jerk_print_layer_0": { @@ -279,7 +279,7 @@ "jerk_travel": { "enabled": false, - "value": 12.5 + "value": "jerk_print" }, "jerk_travel_enabled": { diff --git a/resources/extruders/ultimaker_methodx_extruder_left.def.json b/resources/extruders/ultimaker_methodx_extruder_left.def.json index 97e8a1f2c3..7051f056f3 100644 --- a/resources/extruders/ultimaker_methodx_extruder_left.def.json +++ b/resources/extruders/ultimaker_methodx_extruder_left.def.json @@ -16,6 +16,7 @@ }, "machine_extruder_end_code": { "default_value": "M106 P{extruder_nr} S255\nG91\nG0 Z0.4 F600\nG90\nG0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000" }, "machine_extruder_start_code": { "default_value": "G0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000\nM109 S{material_final_print_temperature}\nG4 S5\nG91\nG0 Z-0.4 F600\nG90\nM107 P{(extruder_nr+1)%2}\nM106 P{extruder_nr} S{cool_fan_speed*255/100}" }, + "machine_extruder_start_code_duration": { "default_value": 8 }, "machine_nozzle_offset_x": { "default_value": 0 }, "machine_nozzle_offset_y": { "default_value": 0 }, "machine_nozzle_size": { "default_value": 0.4 }, diff --git a/resources/extruders/ultimaker_methodx_extruder_right.def.json b/resources/extruders/ultimaker_methodx_extruder_right.def.json index 8a4ef33404..1fea854877 100644 --- a/resources/extruders/ultimaker_methodx_extruder_right.def.json +++ b/resources/extruders/ultimaker_methodx_extruder_right.def.json @@ -16,6 +16,7 @@ }, "machine_extruder_end_code": { "default_value": "M106 P{extruder_nr} S255\nG91\nG0 Z0.4 F600\nG90\nG0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000" }, "machine_extruder_start_code": { "default_value": "G0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000\nM109 S{material_final_print_temperature}\nG4 S5\nG91\nG0 Z-0.4 F600\nG90\nM107 P{(extruder_nr+1)%2}\nM106 P{extruder_nr} S{cool_fan_speed*255/100}" }, + "machine_extruder_start_code_duration": { "default_value": 8 }, "machine_nozzle_offset_x": { "default_value": 0 }, "machine_nozzle_offset_y": { "default_value": 0 }, "machine_nozzle_size": { "default_value": 0.4 }, diff --git a/resources/extruders/ultimaker_methodxl_extruder_left.def.json b/resources/extruders/ultimaker_methodxl_extruder_left.def.json index 2bedf9a62c..66670fe994 100644 --- a/resources/extruders/ultimaker_methodxl_extruder_left.def.json +++ b/resources/extruders/ultimaker_methodxl_extruder_left.def.json @@ -16,6 +16,7 @@ }, "machine_extruder_end_code": { "default_value": "M106 P{extruder_nr} S255\nG91\nG0 Z0.4 F600\nG90\nG0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000" }, "machine_extruder_start_code": { "default_value": "G0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000\nM109 S{material_final_print_temperature}\nG4 S5\nG91\nG0 Z-0.4 F600\nG90\nM107 P{(extruder_nr+1)%2}\nM106 P{extruder_nr} S{cool_fan_speed*255/100}" }, + "machine_extruder_start_code_duration": { "default_value": 10 }, "machine_nozzle_offset_x": { "default_value": 0 }, "machine_nozzle_offset_y": { "default_value": 0 }, "machine_nozzle_size": { "default_value": 0.4 }, diff --git a/resources/extruders/ultimaker_methodxl_extruder_right.def.json b/resources/extruders/ultimaker_methodxl_extruder_right.def.json index 2fd5b37663..9f483e39bc 100644 --- a/resources/extruders/ultimaker_methodxl_extruder_right.def.json +++ b/resources/extruders/ultimaker_methodxl_extruder_right.def.json @@ -16,6 +16,7 @@ }, "machine_extruder_end_code": { "default_value": "M106 P{extruder_nr} S255\nG91\nG0 Z0.4 F600\nG90\nG0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000" }, "machine_extruder_start_code": { "default_value": "G0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000\nM109 S{material_final_print_temperature}\nG4 S5\nG91\nG0 Z-0.4 F600\nG90\nM107 P{(extruder_nr+1)%2}\nM106 P{extruder_nr} S{cool_fan_speed*255/100}" }, + "machine_extruder_start_code_duration": { "default_value": 10 }, "machine_nozzle_offset_x": { "default_value": 0 }, "machine_nozzle_offset_y": { "default_value": 0 }, "machine_nozzle_size": { "default_value": 0.4 }, From 2e197f72ee3b5abfd18941fa1969d31e5ae3dcc0 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Wed, 3 Jan 2024 17:37:54 +0100 Subject: [PATCH 097/182] Add missing `default_value` for `roofing_monotonic --- resources/definitions/fdmprinter.def.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 62143cf8f8..2a35a5faab 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1478,6 +1478,7 @@ "description": "Print top surface lines in an ordering that causes them to always overlap with adjacent lines in a single direction. This takes slightly more time to print, but makes flat surfaces look more consistent.", "type": "bool", "value": true, + "default_value": true, "enabled": "roofing_layer_count > 0 and top_layers > 0 and roofing_pattern != 'concentric'", "limit_to_extruder": "roofing_extruder_nr", "settable_per_mesh": true @@ -8438,4 +8439,4 @@ } } } -} \ No newline at end of file +} From 4a8e00fcc6b43f04ca87a08abe8ce2a6e7739ed8 Mon Sep 17 00:00:00 2001 From: jellespijker Date: Wed, 3 Jan 2024 16:38:51 +0000 Subject: [PATCH 098/182] Applied printer-linter format --- 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 2a35a5faab..7796b04751 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -8439,4 +8439,4 @@ } } } -} +} \ No newline at end of file From 7d040a0b026c2d77ea7e9733fef334c6eccef062 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Wed, 3 Jan 2024 18:03:37 +0100 Subject: [PATCH 099/182] Fixed multiple `default_value` definitions default_value should be an actual value --- resources/definitions/fdmprinter.def.json | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 7796b04751..cf2b7a57af 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -4579,6 +4579,7 @@ "unit": "\u00b0C", "type": "float", "value": "material_print_temperature", + "default_value": 0, "enabled": "cool_min_layer_time > 0", "minimum_value_warning": "max(material_final_print_temperature, material_initial_print_temperature)", "maximum_value_warning": "material_print_temperature", @@ -6690,7 +6691,7 @@ "type": "float", "unit": "mm", "enabled": "resolveOrValue('prime_tower_enable') and (resolveOrValue('prime_tower_brim_enable') or resolveOrValue('adhesion_type') == 'raft')", - "default_value": "resolveOrValue('brim_width')", + "default_value": 1.2, "minimum_value": "0", "maximum_value": "min(0.5 * machine_width, 0.5 * machine_depth)", "settable_per_mesh": false, @@ -8330,7 +8331,7 @@ { "label": "Flow Warning", "description": "Limit on the flow warning for detection.", - "default_value": "15.0", + "default_value": 15.0, "enabled": "ppr_enable", "unit": "%", "type": "float", @@ -8340,7 +8341,7 @@ { "label": "Flow Limit", "description": "Limit on flow anomaly for detection.", - "default_value": "25.0", + "default_value": 25.0, "enabled": "ppr_enable", "unit": "%", "type": "float", @@ -8352,7 +8353,7 @@ "description": "Limit on Print temperature warning for detection.", "unit": "\u00b0C", "type": "float", - "default_value": "3.0", + "default_value": 3.0, "enabled": "ppr_enable", "settable_per_extruder": true }, @@ -8362,7 +8363,7 @@ "description": "Limit on Print Temperature anomaly for detection.", "unit": "\u00b0C", "type": "float", - "default_value": "7.0", + "default_value": 7.0, "enabled": "ppr_enable", "settable_per_extruder": true }, @@ -8372,7 +8373,7 @@ "description": "Limit on Build Volume Temperature warning for detection.", "unit": "\u00b0C", "type": "float", - "default_value": "7.5", + "default_value": 7.5, "enabled": "ppr_enable", "settable_per_extruder": false }, @@ -8382,7 +8383,7 @@ "description": "Limit on Build Volume temperature Anomaly for detection.", "unit": "\u00b0C", "type": "float", - "default_value": "10.0", + "default_value": 10.0, "enabled": "ppr_enable", "settable_per_extruder": false } From 1747bbb0cbc28e7eef2736af9cb75a58af67a776 Mon Sep 17 00:00:00 2001 From: Saumya Jain <70144862+saumyaj3@users.noreply.github.com> Date: Thu, 4 Jan 2024 14:18:57 +0100 Subject: [PATCH 100/182] Update cura_app.py sanitization of environment variable Co-authored-by: Casper Lamboo --- cura_app.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/cura_app.py b/cura_app.py index 17321b8042..7e80bbac79 100755 --- a/cura_app.py +++ b/cura_app.py @@ -17,7 +17,11 @@ import faulthandler import os if sys.platform != "linux": # Turns out the Linux build _does_ use this, but we're not making an Enterprise release for that system anyway. os.environ["QT_PLUGIN_PATH"] = "" # Security workaround: Don't need it, and introduces an attack vector, so set to nul. - os.environ["QT_QUICK_FLICKABLE_WHEEL_DECELERATION"] = "" # Security workaround: Don't need it, and introduces an attack vector, so set to nul. + try: + # try converting to integer + os.environ["QT_QUICK_FLICKABLE_WHEEL_DECELERATION"] = str(int(os.environ["QT_QUICK_FLICKABLE_WHEEL_DECELERATION"])) + except ValueError: + os.environ["QT_QUICK_FLICKABLE_WHEEL_DECELERATION"] = "5000" os.environ["QML2_IMPORT_PATH"] = "" # Security workaround: Don't need it, and introduces an attack vector, so set to nul. os.environ["QT_OPENGL_DLL"] = "" # Security workaround: Don't need it, and introduces an attack vector, so set to nul. From f6cc7993e1a1e1b79ed7c6df57295ecc75e8b54a Mon Sep 17 00:00:00 2001 From: Nikita Chernukhin Date: Sat, 23 Dec 2023 18:11:27 +0100 Subject: [PATCH 101/182] Add RatRig printers configurations Added configurations for the following RatRig printers: * RatRig V-Core 3 (200mm, 300mm, 400mm and 500mm versions) * RatRig V-Minion V-Core 3.1 modification is also supported. Bed meshes are taken from https://github.com/slic3r/slic3r-profiles with kind permission of the author @HelgeKeck --- resources/definitions/ratrig_base.def.json | 19 +++ .../definitions/ratrig_vcore3_200.def.json | 23 ++++ .../definitions/ratrig_vcore3_300.def.json | 23 ++++ .../definitions/ratrig_vcore3_400.def.json | 23 ++++ .../definitions/ratrig_vcore3_500.def.json | 23 ++++ .../definitions/ratrig_vcore3_base.def.json | 117 ++++++++++++++++ resources/definitions/ratrig_vminion.def.json | 128 ++++++++++++++++++ .../extruders/ratrig_base_extruder_0.def.json | 15 ++ resources/meshes/ratrig_vcore3_200.stl | Bin 0 -> 290784 bytes resources/meshes/ratrig_vcore3_300.stl | Bin 0 -> 250084 bytes resources/meshes/ratrig_vcore3_400.stl | Bin 0 -> 250084 bytes resources/meshes/ratrig_vcore3_500.stl | Bin 0 -> 250084 bytes resources/meshes/ratrig_vminion.stl | Bin 0 -> 45784 bytes .../ratrig_base_0.2_Nylon_super.inst.cfg | 15 ++ .../ratrig_base_0.2_Nylon_ultra.inst.cfg | 15 ++ .../ratrig_base_0.3_Nylon_adaptive.inst.cfg | 15 ++ .../nylon/ratrig_base_0.3_Nylon_low.inst.cfg | 15 ++ .../ratrig_base_0.3_Nylon_standard.inst.cfg | 15 ++ .../ratrig_base_0.3_Nylon_super.inst.cfg | 15 ++ .../ratrig_base_0.4_Nylon_adaptive.inst.cfg | 18 +++ .../nylon/ratrig_base_0.4_Nylon_low.inst.cfg | 18 +++ .../ratrig_base_0.4_Nylon_standard.inst.cfg | 18 +++ .../ratrig_base_0.4_Nylon_super.inst.cfg | 18 +++ .../ratrig_base_0.5_Nylon_adaptive.inst.cfg | 15 ++ .../nylon/ratrig_base_0.5_Nylon_low.inst.cfg | 15 ++ .../ratrig_base_0.5_Nylon_standard.inst.cfg | 15 ++ .../ratrig_base_0.5_Nylon_super.inst.cfg | 15 ++ .../ratrig_base_0.6_Nylon_standard.inst.cfg | 15 ++ .../ratrig_base_0.8_Nylon_draft.inst.cfg | 16 +++ .../ratrig_base_1.0_Nylon_draft.inst.cfg | 15 ++ .../petg/ratrig_base_0.2_PETG_super.inst.cfg | 15 ++ .../petg/ratrig_base_0.2_PETG_ultra.inst.cfg | 15 ++ .../ratrig_base_0.3_PETG_adaptive.inst.cfg | 15 ++ .../petg/ratrig_base_0.3_PETG_low.inst.cfg | 15 ++ .../ratrig_base_0.3_PETG_standard.inst.cfg | 15 ++ .../petg/ratrig_base_0.3_PETG_super.inst.cfg | 15 ++ .../ratrig_base_0.4_PETG_adaptive.inst.cfg | 18 +++ .../petg/ratrig_base_0.4_PETG_low.inst.cfg | 18 +++ .../ratrig_base_0.4_PETG_standard.inst.cfg | 18 +++ .../petg/ratrig_base_0.4_PETG_super.inst.cfg | 18 +++ .../ratrig_base_0.5_PETG_adaptive.inst.cfg | 15 ++ .../petg/ratrig_base_0.5_PETG_low.inst.cfg | 15 ++ .../ratrig_base_0.5_PETG_standard.inst.cfg | 15 ++ .../petg/ratrig_base_0.5_PETG_super.inst.cfg | 15 ++ .../ratrig_base_0.6_PETG_standard.inst.cfg | 15 ++ .../petg/ratrig_base_0.8_PETG_draft.inst.cfg | 16 +++ .../petg/ratrig_base_1.0_PETG_draft.inst.cfg | 15 ++ .../pla/ratrig_base_0.2_PLA_super.inst.cfg | 13 ++ .../pla/ratrig_base_0.2_PLA_ultra.inst.cfg | 13 ++ .../pla/ratrig_base_0.3_PLA_adaptive.inst.cfg | 13 ++ .../pla/ratrig_base_0.3_PLA_low.inst.cfg | 13 ++ .../pla/ratrig_base_0.3_PLA_standard.inst.cfg | 13 ++ .../pla/ratrig_base_0.3_PLA_super.inst.cfg | 13 ++ .../pla/ratrig_base_0.4_PLA_adaptive.inst.cfg | 13 ++ .../pla/ratrig_base_0.4_PLA_low.inst.cfg | 13 ++ .../pla/ratrig_base_0.4_PLA_standard.inst.cfg | 13 ++ .../pla/ratrig_base_0.4_PLA_super.inst.cfg | 13 ++ .../pla/ratrig_base_0.5_PLA_adaptive.inst.cfg | 13 ++ .../pla/ratrig_base_0.5_PLA_low.inst.cfg | 13 ++ .../pla/ratrig_base_0.5_PLA_standard.inst.cfg | 13 ++ .../pla/ratrig_base_0.5_PLA_super.inst.cfg | 13 ++ .../pla/ratrig_base_0.6_PLA_draft.inst.cfg | 13 ++ .../pla/ratrig_base_0.6_PLA_low.inst.cfg | 13 ++ .../pla/ratrig_base_0.6_PLA_standard.inst.cfg | 13 ++ .../pla/ratrig_base_0.8_PLA_draft.inst.cfg | 13 ++ .../pla/ratrig_base_1.0_PLA_draft.inst.cfg | 13 ++ .../ratrig_base_global_adaptive.inst.cfg | 19 +++ .../ratrig_base_global_draft.inst.cfg | 18 +++ .../ratrig_base_global_low.inst.cfg | 18 +++ .../ratrig_base_global_standard.inst.cfg | 18 +++ .../ratrig_base_global_super.inst.cfg | 18 +++ .../ratrig_base_global_ultra.inst.cfg | 18 +++ .../tpu/ratrig_base_0.3_TPU_adaptive.inst.cfg | 13 ++ .../tpu/ratrig_base_0.3_TPU_standard.inst.cfg | 13 ++ .../tpu/ratrig_base_0.3_TPU_super.inst.cfg | 13 ++ .../tpu/ratrig_base_0.4_TPU_adaptive.inst.cfg | 13 ++ .../tpu/ratrig_base_0.4_TPU_standard.inst.cfg | 13 ++ .../tpu/ratrig_base_0.4_TPU_super.inst.cfg | 13 ++ .../tpu/ratrig_base_0.5_TPU_adaptive.inst.cfg | 13 ++ .../tpu/ratrig_base_0.5_TPU_standard.inst.cfg | 13 ++ .../tpu/ratrig_base_0.5_TPU_super.inst.cfg | 13 ++ .../tpu/ratrig_base_0.6_TPU_standard.inst.cfg | 13 ++ .../tpu/ratrig_base_0.8_TPU_draft.inst.cfg | 13 ++ .../tpu/ratrig_base_1.0_TPU_draft.inst.cfg | 13 ++ .../variants/ratrig/ratrig_base_0.2.inst.cfg | 12 ++ .../variants/ratrig/ratrig_base_0.3.inst.cfg | 12 ++ .../variants/ratrig/ratrig_base_0.4.inst.cfg | 12 ++ .../variants/ratrig/ratrig_base_0.6.inst.cfg | 12 ++ .../variants/ratrig/ratrig_base_0.8.inst.cfg | 12 ++ .../variants/ratrig/ratrig_base_1.0.inst.cfg | 12 ++ .../ratrig/ratrig_vcore3_200_0.2.inst.cfg | 12 ++ .../ratrig/ratrig_vcore3_200_0.3.inst.cfg | 12 ++ .../ratrig/ratrig_vcore3_200_0.4.inst.cfg | 12 ++ .../ratrig/ratrig_vcore3_200_0.6.inst.cfg | 12 ++ .../ratrig/ratrig_vcore3_200_0.8.inst.cfg | 12 ++ .../ratrig/ratrig_vcore3_200_1.0.inst.cfg | 12 ++ .../ratrig/ratrig_vcore3_300_0.2.inst.cfg | 12 ++ .../ratrig/ratrig_vcore3_300_0.3.inst.cfg | 12 ++ .../ratrig/ratrig_vcore3_300_0.4.inst.cfg | 12 ++ .../ratrig/ratrig_vcore3_300_0.6.inst.cfg | 12 ++ .../ratrig/ratrig_vcore3_300_0.8.inst.cfg | 12 ++ .../ratrig/ratrig_vcore3_300_1.0.inst.cfg | 12 ++ .../ratrig/ratrig_vcore3_400_0.2.inst.cfg | 12 ++ .../ratrig/ratrig_vcore3_400_0.3.inst.cfg | 12 ++ .../ratrig/ratrig_vcore3_400_0.4.inst.cfg | 12 ++ .../ratrig/ratrig_vcore3_400_0.6.inst.cfg | 12 ++ .../ratrig/ratrig_vcore3_400_0.8.inst.cfg | 12 ++ .../ratrig/ratrig_vcore3_400_1.0.inst.cfg | 12 ++ .../ratrig/ratrig_vcore3_500_0.2.inst.cfg | 12 ++ .../ratrig/ratrig_vcore3_500_0.3.inst.cfg | 12 ++ .../ratrig/ratrig_vcore3_500_0.4.inst.cfg | 12 ++ .../ratrig/ratrig_vcore3_500_0.6.inst.cfg | 12 ++ .../ratrig/ratrig_vcore3_500_0.8.inst.cfg | 12 ++ .../ratrig/ratrig_vcore3_500_1.0.inst.cfg | 12 ++ .../ratrig/ratrig_vminion_0.2.inst.cfg | 12 ++ .../ratrig/ratrig_vminion_0.3.inst.cfg | 12 ++ .../ratrig/ratrig_vminion_0.4.inst.cfg | 12 ++ .../ratrig/ratrig_vminion_0.6.inst.cfg | 12 ++ .../ratrig/ratrig_vminion_0.8.inst.cfg | 12 ++ .../ratrig/ratrig_vminion_1.0.inst.cfg | 12 ++ 120 files changed, 1851 insertions(+) create mode 100644 resources/definitions/ratrig_base.def.json create mode 100644 resources/definitions/ratrig_vcore3_200.def.json create mode 100644 resources/definitions/ratrig_vcore3_300.def.json create mode 100644 resources/definitions/ratrig_vcore3_400.def.json create mode 100644 resources/definitions/ratrig_vcore3_500.def.json create mode 100644 resources/definitions/ratrig_vcore3_base.def.json create mode 100644 resources/definitions/ratrig_vminion.def.json create mode 100644 resources/extruders/ratrig_base_extruder_0.def.json create mode 100644 resources/meshes/ratrig_vcore3_200.stl create mode 100644 resources/meshes/ratrig_vcore3_300.stl create mode 100644 resources/meshes/ratrig_vcore3_400.stl create mode 100644 resources/meshes/ratrig_vcore3_500.stl create mode 100644 resources/meshes/ratrig_vminion.stl create mode 100644 resources/quality/ratrig_base/nylon/ratrig_base_0.2_Nylon_super.inst.cfg create mode 100644 resources/quality/ratrig_base/nylon/ratrig_base_0.2_Nylon_ultra.inst.cfg create mode 100644 resources/quality/ratrig_base/nylon/ratrig_base_0.3_Nylon_adaptive.inst.cfg create mode 100644 resources/quality/ratrig_base/nylon/ratrig_base_0.3_Nylon_low.inst.cfg create mode 100644 resources/quality/ratrig_base/nylon/ratrig_base_0.3_Nylon_standard.inst.cfg create mode 100644 resources/quality/ratrig_base/nylon/ratrig_base_0.3_Nylon_super.inst.cfg create mode 100644 resources/quality/ratrig_base/nylon/ratrig_base_0.4_Nylon_adaptive.inst.cfg create mode 100644 resources/quality/ratrig_base/nylon/ratrig_base_0.4_Nylon_low.inst.cfg create mode 100644 resources/quality/ratrig_base/nylon/ratrig_base_0.4_Nylon_standard.inst.cfg create mode 100644 resources/quality/ratrig_base/nylon/ratrig_base_0.4_Nylon_super.inst.cfg create mode 100644 resources/quality/ratrig_base/nylon/ratrig_base_0.5_Nylon_adaptive.inst.cfg create mode 100644 resources/quality/ratrig_base/nylon/ratrig_base_0.5_Nylon_low.inst.cfg create mode 100644 resources/quality/ratrig_base/nylon/ratrig_base_0.5_Nylon_standard.inst.cfg create mode 100644 resources/quality/ratrig_base/nylon/ratrig_base_0.5_Nylon_super.inst.cfg create mode 100644 resources/quality/ratrig_base/nylon/ratrig_base_0.6_Nylon_standard.inst.cfg create mode 100644 resources/quality/ratrig_base/nylon/ratrig_base_0.8_Nylon_draft.inst.cfg create mode 100644 resources/quality/ratrig_base/nylon/ratrig_base_1.0_Nylon_draft.inst.cfg create mode 100644 resources/quality/ratrig_base/petg/ratrig_base_0.2_PETG_super.inst.cfg create mode 100644 resources/quality/ratrig_base/petg/ratrig_base_0.2_PETG_ultra.inst.cfg create mode 100644 resources/quality/ratrig_base/petg/ratrig_base_0.3_PETG_adaptive.inst.cfg create mode 100644 resources/quality/ratrig_base/petg/ratrig_base_0.3_PETG_low.inst.cfg create mode 100644 resources/quality/ratrig_base/petg/ratrig_base_0.3_PETG_standard.inst.cfg create mode 100644 resources/quality/ratrig_base/petg/ratrig_base_0.3_PETG_super.inst.cfg create mode 100644 resources/quality/ratrig_base/petg/ratrig_base_0.4_PETG_adaptive.inst.cfg create mode 100644 resources/quality/ratrig_base/petg/ratrig_base_0.4_PETG_low.inst.cfg create mode 100644 resources/quality/ratrig_base/petg/ratrig_base_0.4_PETG_standard.inst.cfg create mode 100644 resources/quality/ratrig_base/petg/ratrig_base_0.4_PETG_super.inst.cfg create mode 100644 resources/quality/ratrig_base/petg/ratrig_base_0.5_PETG_adaptive.inst.cfg create mode 100644 resources/quality/ratrig_base/petg/ratrig_base_0.5_PETG_low.inst.cfg create mode 100644 resources/quality/ratrig_base/petg/ratrig_base_0.5_PETG_standard.inst.cfg create mode 100644 resources/quality/ratrig_base/petg/ratrig_base_0.5_PETG_super.inst.cfg create mode 100644 resources/quality/ratrig_base/petg/ratrig_base_0.6_PETG_standard.inst.cfg create mode 100644 resources/quality/ratrig_base/petg/ratrig_base_0.8_PETG_draft.inst.cfg create mode 100644 resources/quality/ratrig_base/petg/ratrig_base_1.0_PETG_draft.inst.cfg create mode 100644 resources/quality/ratrig_base/pla/ratrig_base_0.2_PLA_super.inst.cfg create mode 100644 resources/quality/ratrig_base/pla/ratrig_base_0.2_PLA_ultra.inst.cfg create mode 100644 resources/quality/ratrig_base/pla/ratrig_base_0.3_PLA_adaptive.inst.cfg create mode 100644 resources/quality/ratrig_base/pla/ratrig_base_0.3_PLA_low.inst.cfg create mode 100644 resources/quality/ratrig_base/pla/ratrig_base_0.3_PLA_standard.inst.cfg create mode 100644 resources/quality/ratrig_base/pla/ratrig_base_0.3_PLA_super.inst.cfg create mode 100644 resources/quality/ratrig_base/pla/ratrig_base_0.4_PLA_adaptive.inst.cfg create mode 100644 resources/quality/ratrig_base/pla/ratrig_base_0.4_PLA_low.inst.cfg create mode 100644 resources/quality/ratrig_base/pla/ratrig_base_0.4_PLA_standard.inst.cfg create mode 100644 resources/quality/ratrig_base/pla/ratrig_base_0.4_PLA_super.inst.cfg create mode 100644 resources/quality/ratrig_base/pla/ratrig_base_0.5_PLA_adaptive.inst.cfg create mode 100644 resources/quality/ratrig_base/pla/ratrig_base_0.5_PLA_low.inst.cfg create mode 100644 resources/quality/ratrig_base/pla/ratrig_base_0.5_PLA_standard.inst.cfg create mode 100644 resources/quality/ratrig_base/pla/ratrig_base_0.5_PLA_super.inst.cfg create mode 100644 resources/quality/ratrig_base/pla/ratrig_base_0.6_PLA_draft.inst.cfg create mode 100644 resources/quality/ratrig_base/pla/ratrig_base_0.6_PLA_low.inst.cfg create mode 100644 resources/quality/ratrig_base/pla/ratrig_base_0.6_PLA_standard.inst.cfg create mode 100644 resources/quality/ratrig_base/pla/ratrig_base_0.8_PLA_draft.inst.cfg create mode 100644 resources/quality/ratrig_base/pla/ratrig_base_1.0_PLA_draft.inst.cfg create mode 100644 resources/quality/ratrig_base/ratrig_base_global_adaptive.inst.cfg create mode 100644 resources/quality/ratrig_base/ratrig_base_global_draft.inst.cfg create mode 100644 resources/quality/ratrig_base/ratrig_base_global_low.inst.cfg create mode 100644 resources/quality/ratrig_base/ratrig_base_global_standard.inst.cfg create mode 100644 resources/quality/ratrig_base/ratrig_base_global_super.inst.cfg create mode 100644 resources/quality/ratrig_base/ratrig_base_global_ultra.inst.cfg create mode 100644 resources/quality/ratrig_base/tpu/ratrig_base_0.3_TPU_adaptive.inst.cfg create mode 100644 resources/quality/ratrig_base/tpu/ratrig_base_0.3_TPU_standard.inst.cfg create mode 100644 resources/quality/ratrig_base/tpu/ratrig_base_0.3_TPU_super.inst.cfg create mode 100644 resources/quality/ratrig_base/tpu/ratrig_base_0.4_TPU_adaptive.inst.cfg create mode 100644 resources/quality/ratrig_base/tpu/ratrig_base_0.4_TPU_standard.inst.cfg create mode 100644 resources/quality/ratrig_base/tpu/ratrig_base_0.4_TPU_super.inst.cfg create mode 100644 resources/quality/ratrig_base/tpu/ratrig_base_0.5_TPU_adaptive.inst.cfg create mode 100644 resources/quality/ratrig_base/tpu/ratrig_base_0.5_TPU_standard.inst.cfg create mode 100644 resources/quality/ratrig_base/tpu/ratrig_base_0.5_TPU_super.inst.cfg create mode 100644 resources/quality/ratrig_base/tpu/ratrig_base_0.6_TPU_standard.inst.cfg create mode 100644 resources/quality/ratrig_base/tpu/ratrig_base_0.8_TPU_draft.inst.cfg create mode 100644 resources/quality/ratrig_base/tpu/ratrig_base_1.0_TPU_draft.inst.cfg create mode 100644 resources/variants/ratrig/ratrig_base_0.2.inst.cfg create mode 100644 resources/variants/ratrig/ratrig_base_0.3.inst.cfg create mode 100644 resources/variants/ratrig/ratrig_base_0.4.inst.cfg create mode 100644 resources/variants/ratrig/ratrig_base_0.6.inst.cfg create mode 100644 resources/variants/ratrig/ratrig_base_0.8.inst.cfg create mode 100644 resources/variants/ratrig/ratrig_base_1.0.inst.cfg create mode 100644 resources/variants/ratrig/ratrig_vcore3_200_0.2.inst.cfg create mode 100644 resources/variants/ratrig/ratrig_vcore3_200_0.3.inst.cfg create mode 100644 resources/variants/ratrig/ratrig_vcore3_200_0.4.inst.cfg create mode 100644 resources/variants/ratrig/ratrig_vcore3_200_0.6.inst.cfg create mode 100644 resources/variants/ratrig/ratrig_vcore3_200_0.8.inst.cfg create mode 100644 resources/variants/ratrig/ratrig_vcore3_200_1.0.inst.cfg create mode 100644 resources/variants/ratrig/ratrig_vcore3_300_0.2.inst.cfg create mode 100644 resources/variants/ratrig/ratrig_vcore3_300_0.3.inst.cfg create mode 100644 resources/variants/ratrig/ratrig_vcore3_300_0.4.inst.cfg create mode 100644 resources/variants/ratrig/ratrig_vcore3_300_0.6.inst.cfg create mode 100644 resources/variants/ratrig/ratrig_vcore3_300_0.8.inst.cfg create mode 100644 resources/variants/ratrig/ratrig_vcore3_300_1.0.inst.cfg create mode 100644 resources/variants/ratrig/ratrig_vcore3_400_0.2.inst.cfg create mode 100644 resources/variants/ratrig/ratrig_vcore3_400_0.3.inst.cfg create mode 100644 resources/variants/ratrig/ratrig_vcore3_400_0.4.inst.cfg create mode 100644 resources/variants/ratrig/ratrig_vcore3_400_0.6.inst.cfg create mode 100644 resources/variants/ratrig/ratrig_vcore3_400_0.8.inst.cfg create mode 100644 resources/variants/ratrig/ratrig_vcore3_400_1.0.inst.cfg create mode 100644 resources/variants/ratrig/ratrig_vcore3_500_0.2.inst.cfg create mode 100644 resources/variants/ratrig/ratrig_vcore3_500_0.3.inst.cfg create mode 100644 resources/variants/ratrig/ratrig_vcore3_500_0.4.inst.cfg create mode 100644 resources/variants/ratrig/ratrig_vcore3_500_0.6.inst.cfg create mode 100644 resources/variants/ratrig/ratrig_vcore3_500_0.8.inst.cfg create mode 100644 resources/variants/ratrig/ratrig_vcore3_500_1.0.inst.cfg create mode 100644 resources/variants/ratrig/ratrig_vminion_0.2.inst.cfg create mode 100644 resources/variants/ratrig/ratrig_vminion_0.3.inst.cfg create mode 100644 resources/variants/ratrig/ratrig_vminion_0.4.inst.cfg create mode 100644 resources/variants/ratrig/ratrig_vminion_0.6.inst.cfg create mode 100644 resources/variants/ratrig/ratrig_vminion_0.8.inst.cfg create mode 100644 resources/variants/ratrig/ratrig_vminion_1.0.inst.cfg diff --git a/resources/definitions/ratrig_base.def.json b/resources/definitions/ratrig_base.def.json new file mode 100644 index 0000000000..22c01c8bc3 --- /dev/null +++ b/resources/definitions/ratrig_base.def.json @@ -0,0 +1,19 @@ +{ + "version": 2, + "name": "RatRig Printer", + "inherits": "fdmprinter", + "metadata": + { + "visible": false, + "author": "nu-hin", + "manufacturer": "RatRig", + "file_formats": "text/x-gcode", + "exclude_materials": [], + "first_start_actions": [ "MachineSettingsAction" ], + "has_materials": true, + "preferred_material": "generic_pla", + "preferred_quality_type": "standard", + "quality_definition": "ratrig_base", + "supported_actions": [ "MachineSettingsAction" ] + } +} diff --git a/resources/definitions/ratrig_vcore3_200.def.json b/resources/definitions/ratrig_vcore3_200.def.json new file mode 100644 index 0000000000..22738f6ce1 --- /dev/null +++ b/resources/definitions/ratrig_vcore3_200.def.json @@ -0,0 +1,23 @@ +{ + "version": 2, + "name": "RatRig V-Core 3 200mm", + "inherits": "ratrig_vcore3_base", + "metadata": + { + "visible": true, + "platform": "ratrig_vcore3_200.stl", + "platform_offset": [ + 0, + 5, + 0 + ], + "weight": 16 + }, + "overrides": + { + "machine_depth": { "default_value": 200 }, + "machine_height": { "default_value": 200 }, + "machine_name": { "default_value": "RatRig V-Core 3 200mm" }, + "machine_width": { "default_value": 200 } + } +} diff --git a/resources/definitions/ratrig_vcore3_300.def.json b/resources/definitions/ratrig_vcore3_300.def.json new file mode 100644 index 0000000000..b139f3b105 --- /dev/null +++ b/resources/definitions/ratrig_vcore3_300.def.json @@ -0,0 +1,23 @@ +{ + "version": 2, + "name": "RatRig V-Core 3 300mm", + "inherits": "ratrig_vcore3_base", + "metadata": + { + "visible": true, + "platform": "ratrig_vcore3_300.stl", + "platform_offset": [ + 0, + 5, + 0 + ], + "weight": 16 + }, + "overrides": + { + "machine_depth": { "default_value": 300 }, + "machine_height": { "default_value": 300 }, + "machine_name": { "default_value": "RatRig V-Core 3 300mm" }, + "machine_width": { "default_value": 300 } + } +} diff --git a/resources/definitions/ratrig_vcore3_400.def.json b/resources/definitions/ratrig_vcore3_400.def.json new file mode 100644 index 0000000000..a61e4570bc --- /dev/null +++ b/resources/definitions/ratrig_vcore3_400.def.json @@ -0,0 +1,23 @@ +{ + "version": 2, + "name": "RatRig V-Core 3 400mm", + "inherits": "ratrig_vcore3_base", + "metadata": + { + "visible": true, + "platform": "ratrig_vcore3_400.stl", + "platform_offset": [ + 0, + 3, + 0 + ], + "weight": 16 + }, + "overrides": + { + "machine_depth": { "default_value": 400 }, + "machine_height": { "default_value": 400 }, + "machine_name": { "default_value": "RatRig V-Core 3 400mm" }, + "machine_width": { "default_value": 400 } + } +} diff --git a/resources/definitions/ratrig_vcore3_500.def.json b/resources/definitions/ratrig_vcore3_500.def.json new file mode 100644 index 0000000000..93483af33a --- /dev/null +++ b/resources/definitions/ratrig_vcore3_500.def.json @@ -0,0 +1,23 @@ +{ + "version": 2, + "name": "RatRig V-Core 3 500mm", + "inherits": "ratrig_vcore3_base", + "metadata": + { + "visible": true, + "platform": "ratrig_vcore3_500.stl", + "platform_offset": [ + 0, + 0, + 0 + ], + "weight": 16 + }, + "overrides": + { + "machine_depth": { "default_value": 500 }, + "machine_height": { "default_value": 500 }, + "machine_name": { "default_value": "RatRig V-Core 3 500mm" }, + "machine_width": { "default_value": 500 } + } +} diff --git a/resources/definitions/ratrig_vcore3_base.def.json b/resources/definitions/ratrig_vcore3_base.def.json new file mode 100644 index 0000000000..a736da4506 --- /dev/null +++ b/resources/definitions/ratrig_vcore3_base.def.json @@ -0,0 +1,117 @@ +{ + "version": 2, + "name": "RatRig V-Core 3", + "inherits": "ratrig_base", + "metadata": + { + "visible": false, + "has_machine_quality": true, + "has_variants": true, + "machine_extruder_trains": { "0": "ratrig_base_extruder_0" }, + "preferred_variant_name": "0.4mm Nozzle", + "variants_name": "Nozzle Size" + }, + "overrides": + { + "acceleration_enabled": { "value": true }, + "acceleration_layer_0": { "value": "acceleration_topbottom" }, + "acceleration_roofing": { "enabled": "acceleration_enabled and roofing_layer_count > 0 and top_layers > 0" }, + "acceleration_topbottom": { "value": "acceleration_print / 3" }, + "acceleration_travel": { "value": 3000 }, + "acceleration_travel_layer_0": { "value": "acceleration_travel / 3" }, + "adaptive_layer_height_variation": { "value": 0.04 }, + "adaptive_layer_height_variation_step": { "value": 0.04 }, + "adhesion_type": { "value": "'skirt'" }, + "brim_replaces_support": { "value": false }, + "brim_width": { "value": "3" }, + "cool_fan_full_at_height": { "value": "layer_height_0 + 2 * layer_height" }, + "cool_min_layer_time": { "value": 2 }, + "fill_outline_gaps": { "value": false }, + "filter_out_tiny_gaps": { "value": false }, + "gantry_height": { "value": 30 }, + "infill_before_walls": { "value": false }, + "infill_overlap": { "value": 30 }, + "infill_pattern": { "value": "'lines' if infill_sparse_density > 50 else 'cubic'" }, + "infill_wipe_dist": { "value": 0 }, + "layer_height": { "default_value": 0.2 }, + "layer_height_0": { "default_value": 0.2 }, + "machine_acceleration": { "value": 3000 }, + "machine_end_gcode": { "default_value": "END_PRINT" }, + "machine_extruder_count": { "default_value": 1 }, + "machine_head_with_fans_polygon": + { + "default_value": [ + [-40, 90], + [-40, -30], + [40, -30], + [40, 90] + ] + }, + "machine_heated_bed": { "default_value": true }, + "machine_max_acceleration_e": { "value": 5000 }, + "machine_max_acceleration_x": { "value": 9000 }, + "machine_max_acceleration_y": { "value": 9000 }, + "machine_max_acceleration_z": { "value": 100 }, + "machine_max_feedrate_e": { "value": 60 }, + "machine_max_feedrate_x": { "value": 500 }, + "machine_max_feedrate_y": { "value": 500 }, + "machine_max_feedrate_z": { "value": 10 }, + "machine_max_jerk_e": { "value": 5 }, + "machine_max_jerk_xy": { "value": 5 }, + "machine_max_jerk_z": { "value": 0.4 }, + "machine_name": { "default_value": "RatRig V-Core 3" }, + "machine_shape": { "default_value": "rectangular" }, + "machine_show_variants": { "default_value": true }, + "machine_start_gcode": { "default_value": "START_PRINT EXTRUDER_TEMP={material_print_temperature_layer_0} BED_TEMP={material_bed_temperature_layer_0}" }, + "material_diameter": { "default_value": 1.75 }, + "material_final_print_temperature": { "value": "material_print_temperature" }, + "material_initial_print_temperature": { "value": "material_print_temperature" }, + "meshfix_maximum_resolution": { "value": "0.25" }, + "meshfix_maximum_travel_resolution": { "value": "meshfix_maximum_resolution" }, + "minimum_interface_area": { "value": 10 }, + "minimum_support_area": { "value": 2 }, + "optimize_wall_printing_order": { "value": true }, + "retraction_amount": { "value": "machine_nozzle_size * 2" }, + "retraction_combing": { "value": "'off' if retraction_hop_enabled else 'noskin'" }, + "retraction_combing_max_distance": { "value": 30 }, + "retraction_count_max": { "value": 100 }, + "retraction_extrusion_window": { "value": 10 }, + "retraction_speed": { "value": 40 }, + "roofing_layer_count": { "value": 1 }, + "skin_overlap": { "value": 18 }, + "skirt_brim_minimal_length": { "default_value": 30 }, + "skirt_gap": { "value": 10 }, + "skirt_line_count": { "value": 3 }, + "speed_layer_0": { "value": "math.floor(speed_print * 3 / 10)" }, + "speed_print": { "value": 100 }, + "speed_roofing": { "value": "math.floor(speed_print * 3 / 10)" }, + "speed_support": { "value": "math.floor(speed_print * 3 / 10)" }, + "speed_support_interface": { "value": "speed_topbottom" }, + "speed_topbottom": { "value": "math.floor(speed_print / 2)" }, + "speed_travel": { "value": 250 }, + "speed_travel_layer_0": { "value": "100 if speed_layer_0 < 20 else 150 if speed_layer_0 > 30 else speed_layer_0 * 5" }, + "speed_wall_x": { "value": "speed_wall" }, + "speed_z_hop": { "value": 5 }, + "support_angle": { "value": "math.floor(math.degrees(math.atan(line_width/2.0/layer_height)))" }, + "support_brim_width": { "value": 4 }, + "support_infill_rate": { "value": "0 if support_enable and support_structure == 'tree' else 20" }, + "support_interface_density": { "value": 33.333 }, + "support_interface_enable": { "value": true }, + "support_interface_height": { "value": "layer_height * 4" }, + "support_interface_pattern": { "value": "'grid'" }, + "support_pattern": { "value": "'zigzag'" }, + "support_use_towers": { "value": false }, + "support_xy_distance": { "value": "wall_line_width_0 * 2" }, + "support_xy_distance_overhang": { "value": "wall_line_width_0" }, + "support_xy_overrides_z": { "value": "'xy_overrides_z'" }, + "support_z_distance": { "value": "layer_height if layer_height >= 0.16 else layer_height * 2" }, + "top_bottom_pattern": { "value": "'lines'" }, + "top_bottom_thickness": { "value": "layer_height_0 + layer_height * 3" }, + "travel_avoid_supports": { "value": true }, + "travel_retract_before_outer_wall": { "value": true }, + "wall_0_wipe_dist": { "value": 0 }, + "wall_thickness": { "value": "line_width * 2" }, + "z_seam_corner": { "value": "'z_seam_corner_weighted'" }, + "z_seam_type": { "value": "'back'" } + } +} diff --git a/resources/definitions/ratrig_vminion.def.json b/resources/definitions/ratrig_vminion.def.json new file mode 100644 index 0000000000..3cfb3baad6 --- /dev/null +++ b/resources/definitions/ratrig_vminion.def.json @@ -0,0 +1,128 @@ +{ + "version": 2, + "name": "RatRig V-Minion", + "inherits": "ratrig_base", + "metadata": + { + "visible": true, + "platform": "ratrig_vminion.stl", + "has_machine_quality": true, + "has_variants": true, + "machine_extruder_trains": { "0": "ratrig_base_extruder_0" }, + "platform_offset": [ + 0, + 5, + 0 + ], + "preferred_variant_name": "0.4mm Nozzle", + "variants_name": "Nozzle Size", + "weight": 8 + }, + "overrides": + { + "acceleration_enabled": { "value": true }, + "acceleration_layer_0": { "value": "acceleration_topbottom" }, + "acceleration_roofing": { "enabled": "acceleration_enabled and roofing_layer_count > 0 and top_layers > 0" }, + "acceleration_topbottom": { "value": "acceleration_print / 3" }, + "acceleration_travel": { "value": 3000 }, + "acceleration_travel_layer_0": { "value": "acceleration_travel / 3" }, + "adaptive_layer_height_variation": { "value": 0.04 }, + "adaptive_layer_height_variation_step": { "value": 0.04 }, + "adhesion_type": { "value": "'skirt'" }, + "brim_replaces_support": { "value": false }, + "brim_width": { "value": "3" }, + "cool_fan_full_at_height": { "value": "layer_height_0 + 2 * layer_height" }, + "cool_min_layer_time": { "value": 2 }, + "fill_outline_gaps": { "value": false }, + "filter_out_tiny_gaps": { "value": false }, + "gantry_height": { "value": 30 }, + "infill_before_walls": { "value": false }, + "infill_overlap": { "value": 30 }, + "infill_pattern": { "value": "'lines' if infill_sparse_density > 50 else 'cubic'" }, + "infill_wipe_dist": { "value": 0 }, + "layer_height": { "default_value": 0.2 }, + "layer_height_0": { "default_value": 0.2 }, + "machine_acceleration": { "value": 3000 }, + "machine_depth": { "default_value": 180 }, + "machine_end_gcode": { "default_value": "END_PRINT" }, + "machine_extruder_count": { "default_value": 1 }, + "machine_head_with_fans_polygon": + { + "default_value": [ + [-40, 90], + [-40, -30], + [40, -30], + [40, 90] + ] + }, + "machine_heated_bed": { "default_value": true }, + "machine_height": { "default_value": 180 }, + "machine_max_acceleration_e": { "value": 5000 }, + "machine_max_acceleration_x": { "value": 9000 }, + "machine_max_acceleration_y": { "value": 9000 }, + "machine_max_acceleration_z": { "value": 100 }, + "machine_max_feedrate_e": { "value": 60 }, + "machine_max_feedrate_x": { "value": 500 }, + "machine_max_feedrate_y": { "value": 500 }, + "machine_max_feedrate_z": { "value": 10 }, + "machine_max_jerk_e": { "value": 5 }, + "machine_max_jerk_xy": { "value": 5 }, + "machine_max_jerk_z": { "value": 0.4 }, + "machine_name": { "default_value": "RatRig V-Minion" }, + "machine_shape": { "default_value": "rectangular" }, + "machine_show_variants": { "default_value": true }, + "machine_start_gcode": { "default_value": "START_PRINT EXTRUDER_TEMP={material_print_temperature_layer_0} BED_TEMP={material_bed_temperature_layer_0}" }, + "machine_width": { "default_value": 180 }, + "material_diameter": { "default_value": 1.75 }, + "material_final_print_temperature": { "value": "material_print_temperature" }, + "material_initial_print_temperature": { "value": "material_print_temperature" }, + "meshfix_maximum_resolution": { "value": "0.25" }, + "meshfix_maximum_travel_resolution": { "value": "meshfix_maximum_resolution" }, + "minimum_interface_area": { "value": 10 }, + "minimum_support_area": { "value": 2 }, + "optimize_wall_printing_order": { "value": true }, + "retraction_amount": { "value": "machine_nozzle_size * 2" }, + "retraction_combing": { "value": "'off' if retraction_hop_enabled else 'noskin'" }, + "retraction_combing_max_distance": { "value": 30 }, + "retraction_count_max": { "value": 100 }, + "retraction_extrusion_window": { "value": 10 }, + "retraction_speed": { "value": 40 }, + "roofing_layer_count": { "value": 1 }, + "skin_overlap": { "value": 18 }, + "skirt_brim_minimal_length": { "default_value": 30 }, + "skirt_gap": { "value": 10 }, + "skirt_line_count": { "value": 3 }, + "speed_layer_0": { "value": "math.floor(speed_print * 3 / 10)" }, + "speed_print": { "value": 100 }, + "speed_roofing": { "value": "math.floor(speed_print * 3 / 10)" }, + "speed_support": { "value": "math.floor(speed_print * 3 / 10)" }, + "speed_support_interface": { "value": "speed_topbottom" }, + "speed_topbottom": { "value": "math.floor(speed_print / 2)" }, + "speed_travel": { "value": 250 }, + "speed_travel_layer_0": { "value": "100 if speed_layer_0 < 20 else 150 if speed_layer_0 > 30 else speed_layer_0 * 5" }, + "speed_wall": { "value": "math.floor(speed_print / 2)" }, + "speed_wall_x": { "value": "speed_wall" }, + "speed_z_hop": { "value": 5 }, + "support_angle": { "value": "math.floor(math.degrees(math.atan(line_width/2.0/layer_height)))" }, + "support_brim_width": { "value": 4 }, + "support_infill_rate": { "value": "0 if support_enable and support_structure == 'tree' else 20" }, + "support_interface_density": { "value": 33.333 }, + "support_interface_enable": { "value": true }, + "support_interface_height": { "value": "layer_height * 4" }, + "support_interface_pattern": { "value": "'grid'" }, + "support_pattern": { "value": "'zigzag'" }, + "support_use_towers": { "value": false }, + "support_xy_distance": { "value": "wall_line_width_0 * 2" }, + "support_xy_distance_overhang": { "value": "wall_line_width_0" }, + "support_xy_overrides_z": { "value": "'xy_overrides_z'" }, + "support_z_distance": { "value": "layer_height if layer_height >= 0.16 else layer_height * 2" }, + "top_bottom_pattern": { "value": "'lines'" }, + "top_bottom_thickness": { "value": "layer_height_0 + layer_height * 3" }, + "travel_avoid_supports": { "value": true }, + "travel_retract_before_outer_wall": { "value": true }, + "wall_0_wipe_dist": { "value": 0 }, + "wall_thickness": { "value": "line_width * 2" }, + "z_seam_corner": { "value": "'z_seam_corner_weighted'" }, + "z_seam_type": { "value": "'back'" } + } +} diff --git a/resources/extruders/ratrig_base_extruder_0.def.json b/resources/extruders/ratrig_base_extruder_0.def.json new file mode 100644 index 0000000000..0c621c9a06 --- /dev/null +++ b/resources/extruders/ratrig_base_extruder_0.def.json @@ -0,0 +1,15 @@ +{ + "version": 2, + "name": "Extruder 1", + "inherits": "fdmextruder", + "metadata": { + "machine": "ratrig_base", + "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/meshes/ratrig_vcore3_200.stl b/resources/meshes/ratrig_vcore3_200.stl new file mode 100644 index 0000000000000000000000000000000000000000..b44e099eb3f38dfaa1fdb42a928319b4aed7889e GIT binary patch literal 290784 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

n01}ErvB84aDDne(RczZ${cIt(v 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 O@#}~Aoj+w|ApRfb5FPLU literal 0 HcmV?d00001 diff --git a/resources/meshes/ratrig_vcore3_300.stl b/resources/meshes/ratrig_vcore3_300.stl new file mode 100644 index 0000000000000000000000000000000000000000..454efe90123ade9d965f4b4cf597e8cbb3891e12 GIT binary patch literal 250084 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 z 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 literal 0 HcmV?d00001 diff --git a/resources/meshes/ratrig_vcore3_400.stl b/resources/meshes/ratrig_vcore3_400.stl new file mode 100644 index 0000000000000000000000000000000000000000..dd1b801714a887243aa04bd1d5bcd5a82fa35094 GIT binary patch literal 250084 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

SjVOgc75e84hWM~o#=S}7P0xrx3le$0ahjxa z6#`Z0XQb}m35m?T;6BswuG1BNA`)F`?W2!8zYk>jqt?9FqeG@r6;+=ls?c9b(Y}j) z_|B)-O&d$wD*j#c++Isdv>YS<`S^5lBv0$r+>}%&OYtG2O7~gozbe1$>1MlWyv_$} z@o(Kkg+LYhuc^ad!%*J5?|#$wZ(|hCHWF-HlJ=60G3d9x!>Ut>XnuP9A(L~=Ud7*z zD)ihN3{SsD@@BmqgwL`uiccSj2jtV&$B{q7jis8=yCa&Ls!+`+{w-Af_Y3pq-EOx= z@)mu5ncgnGs1T^ar~~!uiwWZPX*s6Lc{dnZkofOR=XcW`(z`FOGL~X2yR119sKQ7J zb$jbkhi|scHO(^_ImT5`h0z*{{OoYxQ`~Y*TPeE@2~^>GmpUkyb(EW595Z&J-MJzu zdas{FJu>D}CsI4%9ck8geE#MRr-7! z7#L~J-(#eH(dx2$>|!=Pv?)gm60W1dw3-Vd%)_XcqQP+GKy&#e{IqdLe|LpI6~5ak zpTS`)_lPu$PRni@(c`7xCI3Z~Fw#U<@JK(t`S>T{A2(3(s-X%!Y}9SRrZ=Bh?u=+# z`vgM^5_rE+l+33Szn^?n1bIJI2vngD&|vsEuN*&U%oLut8!Br!RN?(b=W119zGS=* z2dA`F2vn(e;-F3Acw_3NH~-L9CEur4JKFo2uECw$7wLPw^8bAzNcWx}X)=_rxp0jo zjT$E~-v?Eg&qUuJrH68-ca&+kI7rDtLZZOIMC~QTQtd4L6F(ndoUh7aRt{DY{}!q+ z%ZfVVon*ZAw<|2Vsg07cg~WmyiJB{o$vIcg@d~b3o7>aKo1Jo12vlvNxT;PRJfwGA zycSxT7p!=WjV;z#Aruwlm(ep=>Mxc{og)kF@1x|ZVHR4?9dVW@@_I}E#DBLuFrM#x zi|uj=QV3LGE*{+_V{RE6*S^U-Qi7D6yZ=k*vF-d-#*;^zO}PhevY#DCDun)b|5IU3 zA>|IbTsJulInO?QAEo3DB2i^hv}GJECh8p*pSZ_~$IoA}2EP3i0#%qBN%L;XX|ajA z2+l9lPsxEq;#^3C_K5D19+s%3L(o^MF?q-O*|$^(RAJ5~`P&y&mxpq0vYjb4BwCPA zb2;b7Rg|@wK4!P7xk|Jkacx_e<-9r8(eJCE;Fj{_t|!dAwV*2YsaIRi$qOXIm*6w32tX{iFDOP=!7q zx=T{)NYCC)WbVIX8CsA)pA*%FpZ1Ur!dsrKo?==H9xqg(UtG_1t}Cana+A~g?^Jwb zs6uZ&c?ZXqmj~RvWY0@xg+LX0*vPY8y0o0r#Y=ALcvYYU35+37pNYfoL}^1SIr&wN zLZC|Z^+i_RC#uo8>h`jNL<M@ryNYHAj;z$EGX(T~wiOnQ8$>H|5i)1LlJ>V-z1U5*UvpKU{cY-u`w& z*|Y3d6aFn!p~ss#G>vuV$rl?+`+}j0za3S$wxh428g+P&HEz=H!G4866~=BU7w5wj z*70FWdF)YPB?^Elj3-bx-F{cuofgeygRaGt*aQ+7gQgzwE=}3z2X6AcT{DG16-LI% zU-Hj<!nF6?nb*iv6hw4gT<<5W~}_}NvS6lcVYlQonG z78000LDl57j56}YD^cXZSB8HJRTyuh74nN-a?hGn;l2No5?4b4J(JY6ZeoCRUvgPw zRhgv_sKO{9Wha=1$s-L5-9ub&bB7OF5dX)v7gpCBEn z2i=n~o0K>w5|{x)Pwkk2@<6*c!akvkz`unmjLK3Ex+eZ|=CDJePMK#)^c4x5wW&g( ziocw=;kH<=WeBt&f!RW|zgmjBJTd91C^xLML;_V9U8dFR$oJww*<0e$A8nOLHL5VP zin1)e&JecLwNA?zq!6f5WAx=%h*}`ys4u1!d#wnQtNMNR$!BAaxV^az~6|;Q;6arP489{M_fs@$ql$+v4>mf=8 z1QM9BM^99VODx#yrl_9WO(9T)86Gr?QWwE()V1z3brD1h5+)_1@$0;@{7UXE;nu6Z zLZAxsPG~m|pElf=I$+-Z@m|ScK^10c(oAjFkN2Yvn3sZ56#`Y5J4(@vk$riSTkpjA zl`#r|Dtup29H+ua?&*{zq8KhfdRyge#BfVXclvN)R7@?z% zawngP9mj{sGtD!MXu+r)uAHe`PuCM7o0?39xUW>!)JUi+{fc9w`P5Ds#(lYCjp%Ph zpA33c4Tj7;kvwzYFJrMGmyBpZVp+o^EtfLl2U|M)jUjJs*2w0@O609Y0#)c$H5l5K z3F7bP7h)$@-e71!0==qK`I0q)o8DQo^6hUjv><``^wjz5epkNvQYqv41ZR!}s?ZNh z-jAv+xM}VxFk%7wwWkcjUxMcfYs{#+KWh}}20T_vDm0DmFH&&Njc%{v|0j4gXj_)GBmqrZ$+`T^7Vvh90~ z-VTWZEl8|}Kd_ffgkGyR!MQi5!Y%Jf*uNoT3>>pz6Qt zlpp_S+0~z)>i^3a6jEFwfhzQ{Q4BKJmru;xXN;)nBGG~b##;=A)R~QVQs@0fC$~ll zfhxr(X9(!hh%9N=lWiWnAR6?gxy2PR`G7*CPsg<~yqX z7YngOc)!LrljVGqjfHGHED_%S2vi-SJnIj14(A`!_uD?5=p`pCF2r8b|Iva3MwBVr zFw#%jP`|!9`y3SlRT$@{9V!kCk(qUG8NK-%fyY1osWrMObcSia{?OXk3T1gbELfO=q4oc3C$H%3p2^x`p4b**NI<(h~2 z={vHOrXBuP(f)w_E+re$f&}I^kcXwmRGHZ+*=XB-2}1%^dPc!J8sAb&Pe4X7?coax zF+IxyElAiXnH)ZwhRc&Nzgr$Y|4boJrN)XJO#U*WXnD4}RxyspKoxol>AN<23|~b% zH63l!xh2lj7z@ESgTdg?egLme-rDvfmot1%ph~R_8@YQ7x4NCkF0WWCFoJ>eJkGA< zdzJotIdvCnU$B5g0#!J>8VoV)H(R)B0ZVoDSE}N1e#Ci<_E=waf))1M!Uot5RtQvK z)WKlbWS+}r&+ui3xbK6=b;@v7>~yFl zn(pCiE2&rUqZ3mkT9Ck*k5J3WH&w z_fYwk?h@y|_XJvyz}b#6Qp^)%oJ#_G>=>^QsKUsG-dlZw{P$x#^E?@+bP7QNXFgiD zx0);~d2L~-(-V|#B&fp326b;O9xlD;F3D**!iW|maOR`$b3RViU9*baydK7oKov$d zC{N#NyzJkU*6eNOGqfOq^B6@&sqbJjni<|w-$5i$rOt4halL70i zv5x}PB2TW!tCnfbM~z;`(1HYZMKBoJAFIyoo;Bj@t=2NMAfeW6&q*xE`Ae$*Y`D+9jA_CvelEuG7^qVFGkmNS#u`-Y#+Q95%+Z1b_G+MR zp>4Xe_i`|Iy!DKs1qrpL`pu`g#=N{yJlF5CLZAw(%ngQGR@+S0^9J*jzrHF2s<68Q z<(`*F6d8Rc@>L083@u1tWQ)2EE!!#<*^lL|A5T;WRAG0A|3}$*fLBqpZ-0@h2q>Zm zC|#u21W7v^S)_xYR0|*o(m|<#lub_PARtAGihw8xh=iJioQ*C>FDl)JB7&lbR7HjF zd1lU>y*Fp`fBkY9+$;C}+h=BXc4l^Fcb2Z&TBibSx4oiQ`umqyRFJ@x7wGBFwmE?V zqlW5}zdMwJ3KICXJdJoIv_ar)p%_gJ`=1+Kk==ZRY9N89+?z3_xyX;>W#6(n#S4f=l6pboy5TSV*a zFF)>DVFL+Vfr!rF!N+nwr#kWF*JE4+x^P`28q2uwP@o_k-4E;3auMjl^+2dKSkNvo z`^yOZuV3o9RtiA^*LR}l87>|R)ao0dYhRXj5$M8|Q0R^I!KVTh|7omGjeo#G1qpmI zf>yvRS;X4Zu8w}=-y$voUHD`Kz1w&8Ve7>^b@VSgoN=wHf-YRqh1RpYuP%LgF;-t0 z`(_R*xGEQ}8bjx!YP9vxv0Z}*GDzT43$(sy`8ex`ZMF4sf9`RuS%WTIn@rPY z41UN;K5FQXm6_th=;*=~cIdhAyQ)~vWz^D(-9GGENe2mBV~tA5xC4Pr)nfDlt4ip& zFLdEbLG<)zwF803K$QN*!cwj^gpk0s;^^&x@=pX-o~f<(qxnJH7rJl-JNk}$NM_;fsALQopNtBOMhautlYMx4<91UuKur|H!EBYHM*l5nNS? z)?99Uul`QgK>G;%Tan(`Ja7v zzAWe>(B-~YJ2<_GZ^?#=dY?mvD<7D1TswtI`=cv;k9}84uRh4oG3|JK+{FA}3+c69 z-|I_i)ZDdx3DUTB3XPsmsvO8!T;579)mq2-Q=G5G_p50xwdeg-ZqCNIi}a21(1-^; zdy3Dbs$Rc*mQ$Nw%KGc(4Bx#J0~I9jIZ~RNm>p$(&}w5`&71W82fV?7@o-PHhG}$? z^;+!49OKI?Iono_H+s)av6rr_ZS5UJZ^%EAY@eJ}JJ8WD-%#Mc)3fIv_p{Evofv3Q zbe9iZNGInc7zg^K+82qYH^W-?wyv}r5xBeL*FIE`xLz>9Xq{+^*!2G3mVQ=|-bVu+ zJGKZQfv$?n6O8@UQ-j2cnNL}rp1H?*Z_ip6fv$mLCm7{(6fwO}q!m**((1kPbQZ=y z*Yimejd}5D!5A0&ma`h)iLhF9&voSkT{&fvjE4Ku?24~*&cAt&-bo$W+1l{rGjXUO z@#p$PBWkURaX~u~xJ=KI<*xcE2MKiDzMW(o{7VtFCJYW7Iyb^9`Qv0C66pGTscFn^ z@3(J@^KoC&=zv}EWvkKRT|QKhXgGl0X{hB7=KQx7ALY!xHr~4QP_FD$$B4 zH)wU-lW&f+5)Q9%5$KxnSSrLgIy~L?Xw`96&p(UDVGMLtKa~nO?>=&=@8p3#*2B-_ zxblInzt*N1Hx{JXHO2XOvCB!{#p|zFO=@n8MFoiuXdM>keC*Up>$_7sS(77A=OBTu z>*f4VO5!Ir(3c15Sl7Oq<3j>nv*|0!B}%2*^+l@8M{Dc!YZWWB!G{VG!{7Ep*)8~1 zJN?4kl2)~Q#{`f-SD9kzaDBAy`Mln4?t#EBr{8xG=vv(^9j?KYm1Fgu^v*n)Xc2AboE?JrYj%l>bNA`c;* zp?v>C);^ydNYWRr-WZoMYflam=wdoyU1G58?z=EVPw1cM`())}9}?(Fy*J$`v^Bx* zD^j)UzM=Y}0!cn|*diY)NQk5G)Wl$n)era4ciukYyJuN?010&Qk#2r1AxJDa)Kd3H z7S}g@zrsbJi_hjNdwh^M_fr$SDg8d){cIe@Ko^&oj2+{GgzwAB`mUah^x+-1xblIn zGb7WC@%zWx!$i)j>@KYrf2Xrv_>BuYP(gxA{wwFl24j3b=Y+3w^;h)2Q#R%xfiAwf z^tOta`?%lt{-r^>)pxlM33MIpWg6{QjIpPSR8_2N`t-UZ^cDqZ{X|fZ;95faWlS(t zWoNF9yHRe89{K95021ipn&{2Fiikh3CTIVm*YxdY-*yq`;@ZxM@&4awfnNrX*5g}N zaHR@eT%$TUpY`Lcz|?p9>&?1<>>|*Wxg^mT|MOUTvdDRzN+$zncf6wadZcv@DoAk4 z;GB;dua&l5e5|wn%wr2&1iHBOaY{+AS0A&c^=hU+(kRu3G0|gDiqT(AL!y+Ge2dkB8p&A%QOJ zMNyxjdXlxM-p07P-Tur$1qpYL%-EZ39d5ikr_zDcs1xfFjUfk;?4`4p)q01@u_oJ3ljM+3#JNx4YtT*p!9*fH4F-b`qx#cWiNc(q!J@yAUS<5KFLK=T>S z=rubqAa{&4Htk|IDoAW8Wf~hFNev#|N$F>DHjPfU==JXyB+$h*5%+gxKCB5DIjf7L zP?^+BRJ;gz1|ME{Gp>83WF|Bu)Hb`S|6>}h9!Rx65c#n^y7AYtNQGMu}Gln{u*gU z6`yIZ6UXYsK^^ti2bZ;)zjQGh6(pKO6H#8pC|GWgzGL;5f%0SDjX?rkmtRXWme)$L z10u%f_Yc*#l=>_%a>|S>RFLR8D$V$=T1v27Egzk%*IRZbXZCAnn<0TNZmIeGNLj89 zj8E2!j{Gi%O9?7ogghU)6_fSjJ8s71B^1rBO4Q3}d?(SKD)MpgT9RI@N&#QW;u%?} zAW>vQn(^gdiNSo7IX^&8dFUHo>x9H8B+zxVQkt=I!^B`+a%KBSJ$lP}U()&Gv8W(X zqD`97?Qs>O%kgLR=p0&ir(D};B+zxESeh|>@Wf!Mn%*0wUp>=MZ?UefD+ao_^c?D|rspVmGiN}^Jb7_unU$Xq=k7~|FD#q~q4chmP!?SuP5*T-#Ajlk0r zf+ca+v>$wrzR_Rbns_lA6(q8%rWy+)RE&9lC;NWAG)}KO{M{HN&^3?NdZ~Oh!ColN zV3o)E`VOy8(C3byk%bBp>)tSpoyJmJL?MB$o7+>2_GKpoYoCp^ zzsR|SK3;z4n?MCBDVwe*L?MB$v4fJ0i`ypH+eJS1Z(JXk zo;gxaynQ?t6(sKaKG_)6U&Z+O%X_TH9_p^wE8Z~%33Sykl8rw56>;MGhSnJ>DL=Hm z&lLk*lRro@+Ppe3SV{_HL|U!8Md%v`EQmn`3IFgU|mnXbgF5J?p^!v4P%a8d<0yfxRet4{~@J>z}U<2fjQW;Udt*eP3t9 zt7G^3t+i#32Ubprv`|3;dr>s!wNbNP&Csm5lyfA|#l3!Kj4Y?`;lLjcmaz&_&QU=E z$Fk^Y!*5Om%G^`hIyW-HLInxzchQ&r+AR*0>0RA=cb%I+7mj7olYj{`121;1VJ(;# zX`zAy_PgjgYd4c$@r2-d}Zd8 zu~tydkw6!Ym(j@fy+?et=a#XC6M+g6*terqBYc`pzg9vX0$n)5Mk8LW3+b|Vu?d>kr_4}JG z2;7_%+hC{;+H3&-T>J6L5S^kJ0~a~`Kup@IaC$!S_(WQ2Zo z!^)iZskEblgz5pxbN>3e2)*ndiE(4;d?0}?9FwD2{n}0RPY-6qt)cUQ3KH0Vq`6ee zdEFtgzLk`7B+!MUc(eu`osTwD;)_$xQ9%Mn@#q=)-BtBYUoZ7NMlB91NMMgs(-NqZ z+}V4?H;Yn*1iHBNI3p}4*WB@axB8B+Dy0e)BybduzE-fhpgy$5Eng0u4^)uA9w&WY zt;7*upE+gp>A~wmjUl0nkF+xyHN5;z-+;Hu>Wk@opn?SUIB6w>V~c&0u2!cNV&rwM z_JuAS_oI~~YsUCCyi;FqOgTpd2^{yM_lk0x_#WC_RASv$crz7>Z zC{;+Hi)&P8Jh6Sb#GE9$MxrQHs33tOg>-!kn3?nHJ5BV`lqyt^z+NrYB|~EauTc3l zDOE_I3r7m+X%VVN)>HX?lv0HX5;#&wYrTBEG;oK?ZzQD(6(q19OyA(4+HC`s-!~{# zNT3Tx3h6!iHFpB^>nlg8LInvN#iMlxAHNld`=Fry9hF^FkidR0^)jgK$fXuxK9yZ0 z(1qiERN9x8wcdVYr*9~gT~v_3elWGQm#bSH_tm$S<}~p&q4R+X64;Zabq(hA-Q4ZST@f@;I?hojdeIfM(*c!aS+JH@%&b>moE% zkWkw}g7!`Si4kF?LMg4}%ho%&cfmg8ld;SC~NT_WW z;iIH!N>TYx*PZ%%{sb$W5=E$ONpQC5Kb>PJg=6qh$d_QqMex3mP}{*6@|=r&D1~FF zvx)KYCs;v3Z3hX?fcSB)4_5FTgt;;3bUj@hRJCsPaziuPP z@%R0aWKV6SX5yq<5@)L<+oyx0f0n5mhB}W~*&}`z+ifROst@78@Q9pz+`%6=fv$gxnRabI5T-;- z9Tg;27c}jUM*_hBQEmcV`irLRjD<_LfOJ%lSlrXJr&sohfdslb{ASwEg~q}$1}aFb z{K~Yiol&FboF4iyIUh)%tI})q1&rVG5De*9mavSCS(t1OtFPvx%AWP6 z)R92f#}THzwSbyYRCdk>Do7OHX4=kNs)~@8Kv$zJrrnsn)FkI7kU#~A)if(wxi%1{ zq)ffYU1|2zTQY}{lTz)piqh5MQmXxXXcjpbgD5wFuCA}9!OLz}hdyu@ZO_lxjw^e2B^LtId-I@O0 zdo$0UKfEr{iutOVZ$Qi#7lE!G73ezs3L( z86?y;yWTiE(QbM|wFXF_;zh_9pA{UaC%tr1#6UuAv#b3}iT0a&)fq$r6)!@@sIs}U z{{FGjq7R3J+Gf|K;z{;T$5btf1S(#Hj4`QDq~5o1q=uMGPd=HoN}*JlVd`V|=h?KmrvnLdMAMbJBN(&Iw;rNT_XgEvE0cHTY^= zFa{E+co8y2he_$a9aOeB1`=wUT@zAFyTR)!1`?=v5i-U{6EfoHIT;ZH3AN2GuG^cB zRxyx3#fu2V;Ae3}3?$SxyN-X53i+TIAp#XILdM9Rlpa_gJXT1kZFc#eNW=311S(#H zj4`P9$-t9^OFG9wk8qQL6A`)twT~i{{ zq25IT6)!@@sL*PhH7QNj?MSF?b`^Oc9oi2hQ1K#U3~F&KY6nG&gM`{<*S`bP-R)qA zK*fu2#o)HqL_%$=e5f{9w45A65WHWdco8zj6LhRrr>66rp^1drW)~lYXPT%U84{>? z5i-UyI_Hn|Jt<-!p|;t@XR}I{ih%?wUWANsYEx&cBwdG`4s0u?Vp#^5|~$~XoRYMWhLON_swVjzKv7a?PO+2>^7 zS2`yg0|~XwF0SpmHcAV&gGiv_MaUSzx?RLTLT$5)Ywcs*RSYCh@gii5)1xwSa)Qr` zBB8d~#jVf&msJcTQ1K!{G2((TG$hnEySNo~@B5^9@W+{<*Xb0kplB4iA@{`6p7q9LKS*~PtOr@lf06)!@@pmU)I>qHF+waqT> z^*i-05~z3)GDd+`<8;F>>UIqYwaqTRdr_@~rXhif7a?QZTG}tVWK#X;8+THyth)4l z%n1qhPaipbLw4O*Xxa;ECfHxn7fR@h2$_|ey|MaS=4~QS;cJk4#Z2(E!o61+H}g&&0$p746;0nbY?+l=aNqjq%S7OQF@;>Oa8F;xsQYT=to`?_i~gMmRFL4> zj_*Gtk=WwVtVdR^7X&Iu+)rZ;U5ih&4}Z)#zaEjE6?JGw^m&Sb1iHA^=KClam2$X_Nq#mOrU~9%o}n%NXC#1|LZ2ug}oY0yHucRv&>~L zY*(q`D~I=m#L^LdyZiSkb~BOl#42Vp?U`wzd?*54*sGyc(#E~o?Cr+i3j!4+u#ZA3 zW<9(ydsNP=F^g`?GsyK4rwWOlkNfS?bEton$>*cV;z`*x9*)Uw7(C~SKo|B=Xr1kr zFJ|-alfiPu^()6f0(%^qR{r+~qqmG2mOYyYRFHVLqIGGv6r34iuu%)J_+fF`{wYTl4tZS4HRFHW7R*L=6OR2WKfsfUr zE5C^H4Ou@EfeI4Xiqc9U zFRY2Kc>naMD@34z#P*#@cH>t}`)kn}{99vvCjE+|iv+r`6{S_6Voztjb9j*;P(cFQ zL`_?E;J3^^yI&LpDo9`pM>Vx}HuJA`SDSH3LTSwobR3U+`u^W=?V)XT)A@6f3xpH4x*4#2%x8KY| zpo>%M)Von_7G(7(@NVXHB2YnskBHM6)b6t+tJYtovi=AjE2SX8N8M?0_I8_*HK2+i z2vm^ZGwZZ!AAZ_1YqQ-mi&KRP5?p$mmUC%~E}1hfbjadkg$feb`_Qz)>j!0)`}+M% zKIcfFi?0Hw2T*)Q>&*6dpAZBpNbr^B^fF35T{yFm^{42`pn`yX@*R{GbZ|6ByR3fNua->5D3B#7WYZUS9{r?!ai zI1~ulKmX87+`IzurSDD`DXDjFo%j~n()FuWI6m%v`FH7MdtL%v<9?m2-|hhfx%tP` zQ9)wx#wGf~=YbIRyac*>JU+rVJ0%YxVwioRtsVZr8EWwc>j{ciK-b}4 z-pcjUdx|cCAsrPY9*bY%Cdkb{ZUSAU*DcJwc?DufAP<2qU!6s{e-`$tOHe`L+rm?F z6K5;pZJL+JNtSbv`|9Szcl}x(6Sd8)Wzyi>cqivbpyEZywl+wJ@m(a;HoKVKSSU}b z1c8bdA!B??a~~~(bC5`=ZFZfXxhcNad=&!;RJ;foqZrM7^rLw%J}F43ZFX%uwlcnc z1yv^^fr=L)V{D=Ek|$~Yj$6)!@@=u2~unZbEAB-A#$h7~TL|FB)fKmrvnLdG~DM>)l@LPBk` zi|hH5yHpG$Q1K!{F?f7e#6UuAv#aB&^OlnjiV-4E@gii5el(-FJ$S5;P}}T!&W_1- z&Ib~xco8xNoxy-Q=SZk+c3rQXlIxT!BvA1pWDF{amMXhQsBLyFDE>~abA2FziWebc zl%|!%js~wmB-A#$?(M!k*SXG-K*fuYF{oy+R9%9E+GbbxwFh&Z`U(kDya*YCYB)>P ziAbnzcFpShO|Db#B7uq*A!ATYZK=8)3AN3xk$0WXb=nUkQ1K#U3~Hk+Y6nG&gM`{< zSGD+Gpgl(d6)(aSL(C{5p|({%R2xiV88TIZ;QcDai;yvbIT!PTNT_Xg@ljaaUiE#D zK*fuYF@k4M#6UuAvy0E>$z7_Shy*HLgp3g^i54{FI1r-AcRJ;foBUrvmx(@k#AfdL|#kF>uPAUcxsCW@F##&gj1_`yzE^d8ZXsTi$ zfr=LqiowtOa6U97)Hb`g6?O7KF+v0?UWAPCnLphZJXRVKYMWi$8*t7C5~z3)G6tPN z?)!**AfdL|#l0G*Tp@vq7a?O%N#s79h=GLKW*7I)oa+M#RJ;foBiOSPF_2K(?BZUg zbDblBiWebcP|d)7Y7qkowaqT>Ej#rU5~z3)G6vOfd~d*YqUg7)eJPq<-0OGhT_jNP zB4iAzsrep9#6UuAvy1OuR4burNTA|H$QY}}Jlm{Zxw2XR(#T!blKocSi|K}+Mwj`D z;=Uofxa4zRR1!ayiQhgh{_ZRu>q7!vT#gm3X)ViCj9NGG0TBcDi!|2~+)tD-Hdh-K z^~zJX#poa^NO0Z7y*^2F{C8SZ_0qcpfeI2_qjDck5-qAtjM{K*MAn~_4^)sSmAx{z zKaI)lTg4;7seO~8Yxhmc;+at-(8VnS_u*uWB0nyVUcRkw)^9|hf&{l$+#{338#gne zyPU5f2vm^ZR+Rf!lGwOzUG&Y;nVFm_RFL4doqJ1?_^$rK=#Qem*v>O1s33to4ld&~ z`?I&d7(GV?i4C(ii{6rqAsPPHw2(j-_BiP4D#z}Pp1W7i`YV_!F4ep*BnJMwGIv+a zRHKL(q3>Ppy=d)+4N+I~5a_}l2Yn%L;hN~vk5?4)&Zr=P{Rd4eb$wCv*@$j}Km`fx z4Nxod^YG}W=$BK43KH11)2b?as%&fC{zY+gQ9+{Wza?|`7dMSdVz#fqrRB}eH9s%r zgpoiOw(ayKvmWWqCSE8Z=G9O^0$XaDAKX>FS+O1E1c3??*zRgt|9bC4{ay3Z&nfWgQy^ZBZZ>wF|VxrTFe!pg2dff)5R#KQ(wh?(n?%| zNT6%Nv!ml%Zuc7_MD5c$J2mUz;w@r+5D9c~YMpww@u~S)0Fpb^EZR zi?gncDV4=@!l)p@N8M>ZP6noD9qiCt%nzc11fN-_jas#(M^-ob<@rHWkl+&Pw456{ zz0$1X7p=1XCIS^Cj2!xg=dpCdM>RNo)8gAdw$0jFS3LWH1iJXTaoY1!f9%?}-q%GC zs35`DrqgG5@#nGIM!YaU5U3#G?w7oHW=rN9rSBHA$fzKJy#c39qgGAF6%b3(mnlzw zCEt}&Ys-Ys8=!(j=b3WF#SkHyO^$&Cx^UG(cdAf9VtZ1WaiEOX8=y#_3)eYx$H0{X zaizlBds7Y9`wpIRGCMjF z=$cAvm?qKN+2JJ-6(n#yQ+Es`(8cH9d1n;!feI38g)UdB2sCvh(AB|~7>fkD?%!`3_t86}^|$eSt*=CZz&#g|^nQ(2#iD|QT4PP- zV|C%pIcIJq>qY!yT?D$O(HcSn8>HHAWpIo+aYuIaIh&$iy?2arA5Is33tW9fx8t%#a<7>wj}w!ojs&`J#Z7k%T(=ZgJ>@eSR*Q-ls34Jl z4TlO6SXYMLWaY7N?c>dULp^D&wz=Q-!6$x0y`$_VQ1K#UuMgjSMM7<}i)rt-Wl`}W zWDI^wkKWJlseGt?DVkjkU-ui%+pk zHoNY+m1cOqEsKg5A!FdXuSlqEb{(CQW_Z6Xi;5Q^W6=A9x_aXf3AN3xe;!IRoVR6> zK*fuYG4S12B-A#$>di?tyx*2Z#fy+JzNM!h_628Okx<+0O3^4r=xtdfQ1K#U41D($ z3AN2GZcDu1mPN&jkTF_M%*gp5I8%*;+Gba)k5eEYNTA|H$Qbm_Pe8p{jD*@|*ROMu z;d~&0iWebcJV2wt6@qWeBB8d~)xngxY4;lQ|RNI!6K(FG9w^cVCfE+w59adLqA4s6$MaUTVwk#5An_Yj_o8WE-LvPEX;zhV(hcrMLT$5)TOa3bStL;LB4iAF_Z11X%`R?5oqQmHiWebc1bYBtW)umv z%`WZ@IOhWiRJ;fo1K)i`LT$5)do@nELIM>pLdKwysPk3DeQG4sHoLfY=3F00pyEZy z7<5I2-j+o|ZL^Dena*{N1S(#HjDhdIBB8d~#l2;xzCr>OFG9w^cVCfE+w9_Azf z+pApiop)c)m5<+^q|2FVB+$j>Skam`h-RwK2WP5rzesZ};k=ddd(~l4HCoA;YE+Qm zy32X|Tp1dbGnn#5eTyT5qq1r;RD{UYZFo!aNOTsc#X1iIYcCNDxW)ve!>Gu23- zi&N{=qE%?7y44IhQ;iA|d_&PeRTm{xMDM>Ud%;_`w!f&$_M8OX+ba~2vm?z+cH&(AxiHtEx|7OQL0!~ z`a+j7pQ!CluTUSD-cbw@rld?A6(k0XdFT@t!2nTi0$m*YPGhPaf@@&2n}1}gl!64u zQ-7CUw&x|#^~$9Ld*1I}F;GF`?}8;iaS?(QCk7MrW9q0N@x{44xfAz6sw9wy zK-b}4-pw5wJ=r4$mL)8eTy|Bx65PG`pQ)pQ1fQo-^ww{vT(RHed?0}?an$4U5De+4 z@NujEWQy1??umD=e%vvT7(XS^eyCouJ5_|a33PSZon%+(kmNz2(y&&F{pjk%|BqB5 zQMa>cmoy};^1%OhrwUzM7K&8yB2cM*JT+pwc7C8MQ4ol$OkHUiLi4nVj#iW%Jt0c zsbV#f@MDEaULvffrrel16G}m1{#k!MWfuu_y*n&Dbgjq(CI2;bRF-~|Zu^7R9q!3Z zpn}9B4JUT&;z);DwdYbQH|@IfOc;SKKC@1XbACZo(<1l!#kZX>Rp_eo@npMjiK)hWOF18r zi=rdxSHwUC2`*z!i?gY?e@m5xQQ}x3fv#6Zq}%_jnHD@&ukJh(IUuF7AW%VqOTN=a zeR6AAx>E#TqpXEs2F@<$f9WKNT7?i|91}n32qsjd<2U+hjR59(8aBfbFA1Ze@z_~ zZsF89_;0B~f?H9il+gZzKkiha3;RUM&Htxwr7W*+s9y2f=<%WLr|tTNsw)Lyihqef z1&Ngpk9QLc5alM&#j%~5LAnJbQl%6mIG*}DJH?Nw@}U%TMa9-PoSK3BPKU2H-QQgoeI`4y!+Hhpo`y7@+MG0qQQz6b(KPqDpRJ-)KNjAdvf(q zp4|CB0$trR9*lP#t56J7kZ4%AT0Tb?33NSMdw9I-42EK$f<&j4Rq{FKNT93keaqri z8521V#Xtp#@%<`?N~Iuz|Cl-w=xR3alXzEY55+(QiQZ3F%IEq(0$r!)eiN_y*CIio z7^omIctl0RMTGK!1iCsmz7p@MOF}VFLE@EtkLFYRAc3wrM{mcgHrSmHRFLS=|ItuO z9n69RbtKR=Z+d|zz1wqCkmzJQnooO<1iCo3YJZl;WHnMGc5z57Ptp5xi=cGymU;-7~FW(i1jX;VRs35_2;bG&VfD+9OUYP0^?wlPS~@7f@b&T{P(gx^Rh3(lJz^k%F0L`W3EVH2%D&&plpq~C zwBlHyf&`bh;e*mVQiTM%xV#NIUXsqAKo`dtOWy`? zopX~*2}Va3kDZz4yv_$INbs1Pld6V$=Qkbn-c9jMZzRz55{+42X+7DN70)Y8W){UW4w6@bnzIebI#|S^ly24WmFh} zuG%!d`{&wpdzBd9{pDa(B>!>@RFL4YUR5eJZCcN$rq}xT#fUHx=&D9z;Z265**}S~ z@ES(trX@$75iw9fg2$|#tM;`vb(-GZu`G;07mtfOb;)A~VwF! zqs7h5L+8vF#|l%0E*|SY+rX>#K?Mn(Lr^VhsI-f+iv+rO&LWH;RL=Y;1qqI)TGUXC zFalkC6vEnCkt$U9=&DxqzoiNZKAWz#HkdSbKG4Nw%)8}8g-g3?E%Q&6*Hac;e@vS) z-Z(kHtCxWaw}Yzpg1s8|(Zz8e9MQp6)J>p*#EA!r=eovyLdOaTbgg`GP_AnfCq!_n z)EC7E-aFBVnJfDum|AzLP(k8{rxJ~rHC{8LNTBP~iX`LFzw^x3np}2K+5T{fQG2Fz z;hyqO6%r41G>t&-JTVA0b=()avhJfb2gU(GDU$s}RQerCH4c8BPpX)pA9oBS4%JW1 zXB-Ywg)Z&^xJCy}5rSf%3uC-QE1P?tb5xM%l$vH79SUbK6axu#b$%-?pK&-;ka)1V z-W5Z33UC_ZEEoOi zB{?_Uc)g$OdE=h)PZbi+H=k;Fw`!;$@nfN>#>lo_J!Djnm^m-qm^4DQod4Ea8rh-2 zTcWK+0$nRAOff3=_uJb=pP^{9zSaNbd!ju@1&Q7*(~U({RjS@wT662PY2Snq=<4{D z-)#&%FS6hbw#R>K-ZqvX~nwX zia4F<-`ea{B{6@F1iC!$icCJbs36g3QHt?LKNZ6%?`{HJ(;i7So_oTJK&AZFL?itd zc@8kP6CrP^kjNb|(fBk)ok53jrwUy!JxlMt-cltI2~_ZIGXGR{$W9N9t7DDY`2el% zITD^14Thmqfr12I|6$L`m?Gyupo?QWW8rmL-HfO`S3W0$3K9obO)=u=IT?9xaPC0t z)>}Q~b23Pv>$9opFcu!&rq0%_0r{K^DoC_wN;waWY%ek@Z~bt%d`<=xB-(yPE4_uD zE$or@!2cx#kI20vn1|-lG7wd=7!3L-Nk&nD5pOZla ziIRK##_iB^GIaXrT<{NlO9;+69|bkrgJ)BE<-hK>771}gJm-XQU+CiedC!ue!g*5j zb-1VeQ-uWfCENsG2dW?S;j<~BUKsYf+yp8}_)k;sHTaZf{sg-CIRMu@XAm=WRQSmO zm2-@pe+(q}Nd?!@Wz6Jrj{8EFcz(k345EV19pIkaslq26IOl4_oR9kde#!y~KGOet zgdSZS!+YKUqoXS@Gu7~Z{t6W&xUcP`s^OmbTOWB>KI4T1y4=^`cdOcN`S1bx92qJ| za9>*;H%(i4YuT33!DrQwKo^&GHS3^hPth}dPY0ieLjqk`W8^u5aHq&mcB}G=cb0Af z6(sl>aaE47M>>B(UC-+68ubni|6RQWLOaxo4ra`L5_d=LO<@7x@+vBZ^=pFTu1T*efZ{`N>_=#eO;G zYFqt1jL=X)LTxL;d3WjGfzxc2cHZW+b3WAHU4+SLLnSYPIcKko!_oJ@JVor6Q>eDp z-&Krof)ymxHWHHBS!l4`>g}Q8n-5$v)OQoUS~bv6e`lxqF)dV(Q0pXzts>|m(ABr) zW5(_t>f0PD0_PqTB-F~vp%|v5+yuHB&#rDf^Qu=2RFF_>F^9)M0$rWXRx{L>^PF68 zK2SkIt==3S0||6pZ&l53eN!(O$h1&FLaoId9s>zzhKsypi7)tQ+sE)yKmuJ{LK`0Pih&9eYNhM&7)YRt zue7jlvQl2;RjU*v)JoUkF>qh#;u>RlEAiNT7@Be4Xw=!wFQ7Q0s61-vqkEvp;jZVxWQqx18LE3y*;Wx_r4c^2rA(NDLqM zcs@rL6(l-UtC`<92L*`_12yw0iKrm4vqi0Zt`Ag@n7Of*;rG01Q9&Z3Ky7zj61vV& zL4sGnb=5we1iG-l;#?hkeV~Fw?KO$+S~L^`33RPol<2OhO^KKm_piE_7+`bxQS*+x zjr}g+brGuPg#>SNk2Aa^;=a(e?O>|y-S_)O8f26*q+OSOJ@)jBq~Mt?E!7Pjuk3MsQ2;0k1i7EdYPVOaoXCKPA=IL zm06lc?krT0IF>xsPJMEc@dKTIOGsJUr349d_1&Cid$)tAAn|mmDR#!PDIPJ9Kv&mS(`?n+1y7zV^cE^e zoM=ATu03>WFvh{r^|wS_dsrM@B+%9ALc0BKziGx)7b9D{!y%Rq{rLIBs zcj;9GUbRTHe<{&+)>U&D_jQi0H_lG9omJA1z`BG-Hu)ZqQ^kMxP8BLhs1-!Q%dU%n z^@-IABH_fmg%fSH;@YajiQ>NYzaJ|kcu#8GYA4@ZcJb(fpT`ObuC>** z;?4)U>NN9*&RYHiDoFHP?$4)`Ac3wAZ}>x{(w!<)rbMQPN;vMxO`w8Akr&eQxuTFj z*S`blS*&2al79?zspreWYX(%1;CQOW(6kb7m)KmY$~@6VA%U(hsT~}9Ce{8?)YO@A zCnNr{&Ntzbhzb&X6r5VLafy8q6Gz7KoUn^P7aw(}rf%7)apdF-Q?wr#16|z0)uNf| z@SLN91fPFrB~M>Mqb)y8_)z2=33TzB>^JGD$#Wv-xfORt@Gs{B6&KOWZ#yfJev$BD zWTo+qL_Uz)jvy_Nob!gJ-be zh}ejy>6~yrP(gyPe`kf*v7eo9vO4x;7=bRXSDbZgzo<4Za?7$3oAbs%mwM(l{0yRk z1lM-X`n%2*Vp>R`i?>z(!SQpdP(gz0V<#UD<0jC>^}KVef`rL2P~rANoi&W@M97;e zB)IKTB_@9YUEC%*r5#g+3if^SPZjoxu*ZSziaS+!PtK#x>O1#%Zzu>;a;6ynR(I}5 zaH`bb-7!!>LVbTUyj&rHF7^G<5D`ihD(ah~?7}_epDHBO*F-}xf|x8(y;AW`YHRCkOJfeI2hVnKTk{g@V(KJ_hI zF1tvF?6e_!`l^f~p}uPyx;}!Kn?RTPO0A19IR+}~o3;NvRY<6B&bnfF=0klqT77fY zMTk_PqP{cx-&2Kz`hu)0Mp&xQrM@8RB1EcCQD2Sy@2NsUeL>b0BP>L_QtQAJPz=vhp-Zh#A0jwa z^lOS0_|2;}wRa?dQbVS!JKm7ZSXwOkWLTfb17_f)lMxtv)(-Q8xJM#SxW5gI466pH# zmC1(p3>FgTy0=6c%!YqKb5YNZsV~OJP(fl??t*H=iO>;122rQ6vmAL>Z)(M1J`{6}k%K-c1)rtSR%9V$qyE@;}` z&-I~##L%)S_G`bY_5<^Q3KC@!l5OuNwopL=$7DqWQ^qkZ>`n0XsM3zT4<}8kW>7sA zBtAWpWQ_U~@)3%GintzwPn-R>7)aprUhY)wX9VB&wDSWB(ti0)n4H z3~M>VQiU#l3Nfs876dBd$-`i)|KC!D1fLIA-5$)0`&gk1OOK|lrSE?(Nyrf2$W?O_ zyVfkpRoh%gsTm0VyPH78i;y*3p$C(#SqP>R)M zd`8^UpIysF1qqzx(6kSq8fRVgr~CFa-yMSlx^R|5)9$J_*vdJ5$hU8JgewNRL>)ut zM&`WJ;(pdWeSYy>*}g6Y6(n$8MAO<1Xm8c2SYH2UPthGnpzE%BDR#uqrm;)pyxp~C z*4lp>>VLg>IR+IZa3)35+C5y>8u&p+y{8$GjRd;5KIW1y^YL5yJyy@w-Sv(e*2SQL z1kSx^TCHDp2YRd>qMzMebO#dXik)TJ_x3i8Ln0rod(RFSxnuN~#$Ap<1qqz3p`!8F z*EvPfll8Y-Mr0#_F0SXfrzZ39OnOGn>%niVqvA!#lE|fyN~8E16cTEiU4PN6{;s~J zu~X!ugg+xLr%;Oi>GEsYs33teLi80rDuo|BHBPV7b9W39=yJ~$aVezIs5fpA;fjGS z^>nMudEY)KeZ_)bWk1?6tu+{^YKN}Xnn2yW}v~x>tawr0-w^Q?|*c8Nq^+(mB8(U z$95oruK9=4?B_mEF6BRE)p7RCt?d62vx0jJn+w9_!&wWN2gKANoYEetnqM#sw_Y9hraelY& z+qFZi4-Zi-3Iw`JFG;m;(TJC92ix?X?RzSBjP(Mw2B;u`_YCws$eLfr{p(M*R&|NU zMgm=;?xHa{nU9=`PsP>Tlw$2(N38+ZuR#R~yl0@cw#luWFH0v|6RA~00$ttdnWFe) zx?>S#_xakR0`u37w^DmvjzI+pyvxwE*(VMKwonUwB_$#o33REu44DtA6#{gv^Eo$B z@ghR!+zOs^7oli&ahu4`h07R~ek*Ua-QUjY^xnD{RFJ?s8BHtjRE*VqYJDr?c+nk5 zpsVS-$@Z@+{l>52SaloR(W*G8tkt;PLipyEZy7_-+!Sm%C8%t=}oA-)Z$ z)>}auzW_+zeI+8{`@|d~UEcR(- zN;>U(nsSZ`64>L^v`MQq>z~z{Uh2UJ7lAHbm(^Kq;muKp16I{CdKTpz6(o3#R<*hV z^>^o-2+XclS|3C?M+FJK9-aQ~*XWZ9X z%C(<eGvSS?8+h^C{=3Ai=9)I_JDFmGln>*3c6<=b*R<=+)9U@2R9O zm{Ufab0k#nm9KMNebXt4hZ0Zw;sT{a&QU=Ed$pQ&ib^{FUZR{Mfi7ML)VZS8Q%N5( z`mm4BIVwo-TBFW&-oAQi{lKgfzS)#>RFF_TSy{u4ppxFP?P4F-iAbP}S3^~GjHY!X z;wK^|6M+g6swXRBly1;K&)pg0!=`s{b2eQHaYiF z`JJ1GKo@?=PSeJBjnGq{D<0Q@$}TEMU_V&Xx;Ky1=k7?#xu5DQB+$jFRV|UG&01ey z|1~Nm!1Wa>NbnJHzG*SoY^cv$Upp|6&LApCV9#08#?blb(sprxuUaI~CC+SU<*#CI zSJb-|S{r!sM5H|DK?MoyIcwVUbZrzac|^p(eW8m>sIyjB>ovE1^cyI8LzZ2oAi-CG z^Id>pmx}6HfBg|yTT)&hNeiw>1op_eR#I!^Xxhu$XZX%esA2V^a)k;K*w?0&R9=Yny-B@* zyQy3ufiA8qot1PRZkQNX@$m@j4JuctAR+4D&^PsdueKtN>O(6v*czx6rNW3%PoG+Y z9Pa<9)<6+rzd;wbL{6&K{k$b7p87v+DCejkfxUB0yYWJ7U^eCaKFT=~=;HR#Il9wM zFA6N8{?B&GIVwnStL>cg1KsBa&Qkwp3gsLXBvg-FmaAJOjs%{iQo?l!66oUIhbp0( z){?G`Mnt?x1S&{ie_qq7`7~<@{m#!rpo@D^>blXihh`MACe*(kc#@7TDo9{|Uek^g zf6)3n^GKiw9bF{QCHi)unqeOu*?p%L1vb&qMFk1&i#qkywiQ*aMpKsu2Gh|+1qs!M zmq$0E0hM$+Ccyo6B+$iuYNr;hOT-l-#u0%E64-~=v`chPJE88^IfY+|$d0Q~+xY!P znz5VimvC-E&1}e2(a501BZPd9gNhd+?>~Zs9H$P>tMI-Q%`P>1?usD@RJ;foqvgKQ zR_3V%Vr&Tswau=MU)3^d_*0Fe;(qWx8rgoA#uO8FT+2oU2^`<2V|CX+>$%=1eSKT+ zjzI!lIESEVO;&fYmQE_EuYW1R6$4#r&O+v#@0)qdgpRI;iWebs{=t;`*7nvhVT7XD z^~m6w#Nb-_sMgMyLzniJQuQ9%OdTQu#5W2LRcjLv$M`nzM0Ko`yeY1+BZ zzYpBW?XS0<6yb`2E;WZFa~>RL5cxpGi;y|z`(_?fJ$I4ei}D;f*$UN}W>^z!Z) zB+!MkfSUHj?$N$I^TzA7X=ED-bg4C~LOJ)TV}*(rA#;vn;Yg@$cJZn)&ix<~sCW@F zMr#^9w}YeSNT_Xgt-n^);L-E1#L+!>w6s2qO5zp!S~e<3;3`*|_ArfE^6#0r-7!d@ z3)ifo(oW;;E6SGDOTHZ8ih(Y*0#)d$)zwvtiWebsj-%&DsBLzsHLGL{BvA1pWDGvv zYP=l@wau;*!PTr}3?xwTB4msxWON6ar)dfP(R-5WFT?0I}I z^7QT)B+!K`P|;-HN6qx&ts7ZQ2Sm7Hpi8YMCC@pI>7(LB$edq2R$9Lp9MeZaZL^E7 zM`uhQ2~@lY86#MiSbRQ^P}}U{dWD~?k@-LZ6)!@@C|qoSuke@z5d#Ue&90Fdj~OlJ zrU&PWmQjD9B=s9=AG(%}3KCqSI?pXlpt`+h;S{TFv)wUBpi9*Abe|wowcehZGj>>t zbvQA?6$4$|mT(N2^Wc0f=fgzBi;yusI=vuJnR-ll2}QH3*td@xX)mN32gOxOIS+7; z>9sxAvQa^TTT$mpr{{a03~-NWbHwf#B+$ieyLwtk)3Vb`T6?I+bc6Z~NT7>*9L~G} z)w!XW22{KVnRA}K3eI4eNT_XgaX*OH#R**>Ap#XILdFR8;l$BJLT$54^ylb0mobn) z#fy+JrhGKS+VazGF>io`+GZE_=QZsmIu~5~{2I9C>gglFJz3|C+%8=PBBvh|o9;>(MPJ8;< z#JB{y$3X&J_+4!38xnEvABk~1LXQd(s@E@LJWlsfw?2*W&B#Nb3%`r4X?KsTYgvDG z^~KXYCn`wbJ%grAIbYp+X#Zm0Wg6u~0$uneZB4sawTyLq)L~yb9bHtAz^`g++H=jz zT0i{0$2X6TE-FZH8RMs^WX@lrJ8k;a`Hmh5bm6zRHSMjs*8^Y8D5O72IY$Kvyl2p~ z>vX4mp!kD2kK!PKF8o@zrY)nfjE`w#`yI+TDoEg$yEX0VLzQp%A)hIa< zs@E@be(lqkKouHI<(%Wb(1qXk)-)P-4em|sKo{5A z&fLWLA;oj1cBQ!wI=ZMJfp-8jUa})8&ZO~Io+U#9UHG+bx|?VgqJji} z16CbFng!TY+xKHiLwznCT~v_ZHj$qllsW&BMh8pN`0E_XITGl?Z*ObbO&U4xPJ~GW zDlWox|ABK8NN^88-KF5Sw`q=r<|bljZlW0-T~v_3dj^_=qP@8g&3KDqFKm^sf4`&?-T%@v#1iJ9M*z`12;EwOObtkYiSa#JID-!sXYfbBy zUQk~<=vIJd6j4D!_4;Mb@1mK8o-`snjdG3zy6`L4nl_MTGt!BeM+7P^!gc?Fa}!9Y zdjn1h*GkUl`5vl$n$m2>hZF-9Bvh|o=HuN@Vtloz->@PNfiC>YHLY(yr;_h#nT8g( zoTwmy_YBl>W+%nXAl)6@GIB!7q@2G&IY$Cr_>F8$8+WT~VCRUsRv*eaDoEfRfTmsBw>Z$3 zdQ1;f&XGVDeo0%?nvXslm_t3L4V-iMDmN1NC2g7?ytF6q1NE4=&wvUNs@E@b9_%fN z`41$}<^Do95~v`ddi^rS3@Yi*(L9Ulk*RACU7|M_nww}z#6X&7Nu=|E3KFW&0~>3SBDbG_SbDvYTm5sI* zNDUsV=I3_@ZqPII#rDZ(=oNu3ev;?c%Cz#3I3K5a%?@CT>P!FbSpIE_9*F%@JpHMZyhP>ND#p7n zl<}=>o1_olaot7mewFLuvQ+!m@+!uwBag(bTAQr@Q23oJRFH_Alxn9{R52PHoaKAw z?=kwoYujRwKv$8w((I|XR4Lih@^fF$rGxY`&yU%G1iDT=lVZ8B! zqOb39IR+IZ_$dM|SF)5`Y~4ujw7!{sh@MGB0$u!su~XU$UhwG)XV%ttmH0CT6(rh! zoCc-+>c-BxpT;fc$K7-h=;G&c##T}#anYC0>V}mBipVFHG-c)I549Q0|={Vvs-=AH!d7 zPYmW`-_b$(^gc%d2an$nM^`CG)ch&UZeB>m2%d9migD9Lpo>e-8~s#_cq%1nG^W_6 zhb$#ZL4wc!@WB&<`FNM+QR&xu;5j#eE-sbhznKus$BW$>>%CV!VfFvILM$ps4D6L= z_uW4s7^5o92OrDmY)wykHwFoG@iQ|Yk5nkX=dsE`(6$s6wR(1t5fWDt0&mlU8a>Z|1iHB0<+3Y@ime)1_iSipHGVC^6$4$|`%u>nJ#BbB z#)>>p&$_jFo#>Y+1&IO6lI=}d>WcazyPI|K`QldVy+wE6zR*?ENVePbN(}a|cHG_H z>iGZaIuGzDsx6KW9qAwtn$iPO5<)hVY<6y75D^4aqzcjl(nRTy-UvlNkSZN4NRc7} zft|Y$DN2!!qJXG~QWOM~BJj?c*_-(sytb98v!3g_YJ-O@t_CotT z&PemFd!DK7w>77BcF8pzi+VYxMg<9sI5lk~tp$rwzV9CA`rxzBiuVCsT4lfMnf6n! z50e)t-#ie#HsY0u+p|k^Z%o7A!@jkgXzf(Ro7CmZ~datZl zN(3rM1V+e|%P?u5rQm&*NT3z(_q$3@(%Jp$lWo(?$F%EyIQ1)3kO+*Bf2Q4r3AFdT z2CdbQKr7yb_|6;3#|6qW+zEAw9n`N-LBfiV-%`ZC4Oe>kS%VSu50(EAxiR&VyY9#O zKg**1R=mg4`Bsh39ravl+gP-v{ky0jfl)0z6GvH`P|91bqqBi zP2r*ayQm<+J7}G2ej@RGU5>3Ko|;elsX;*k<6uo&ntfDXMA^H1bUlzjE8f@Z^xdKI zvCjW^-zzFe@IGW`ME&&UeLaG*ckj~mKm`emwdr?x>gl|*n0FN;fmXZ++8O7xqge3H zV%}AZ3KAGOYub~$?$u|Z74PL%vl6YmsHgu+JByo8Z$||QjGQ&CAN6#tZ;Z~fC=zJJ zd(xd*v-)lUz92F$^%3d=k_=yC1z9g>udnW%@gbEUYkv{Dx7QC~VGhRrb75BHYN#p%K zXh*T&oyEMX7!@P}BYpmjlXG$G0|~U^ar5txaeg02pn?QO=k)6x_ASt;MIWBfkOP-eR|5qz#tK|;mX z_FavB8P(~RQL7zDpcT)Rx096*ej6cMy{W1!lg;so@cY4Wn`qk&>$<-wP@`DNz z7|&~3Df-ptJneD6Ni9bLtvJGQdi!znu_@`7pHHdfs35^nlrsijAAH};n~~3IIVwnC zJg;e(*+v4bI2v^3lGVpTNqdGI(w{*Sx z(RH6nEk^|jj+~u&cW0w8*)6QSIh?LJDo9`qPft7bPn5BPE_r9XS2p`Ve5%ow-mnn4 zghpxtz16sEg0ig`{Jr|yJAS-r~zD;JJRFv4Dc9Hf2vzl_*y?aV|%9kUhJ@jLsy z$`m1iN-)Cqag|o{muOEMueOm;$8420G}S0NC&|B}M*@{#gzaNT{{d2OciHlRggR!c z)z76Gi`ymV{6ObW(`HjWne2X7^o@nLN27v7R%oh`&{1XX9;Y^!OWtfG5?fWtMgpz4 zj-QhYuYaeRZ2zc{;FhBjjIi7B%D+Wr*)CoFLnxZ99(7DHE<8@o8MKt!(U9uNoT6N~ zmb4=p6(nA2mtt(q&4rgcILnmN$B3=5)w7X6tI`LPjZ&1^4%@~)`rQA^lhi0tTzPZm z&eUy5MrFzs=UKMMH-&174yKrT@#aOov&EAQCl~$^WpS2K9hR-f_PCKitBe6j#>XX8 z)_HlxA^r4cL&Pt2`vmwvE3N{jGWYb9P_HX`p+)^E>$T2}3KH|XB^n#PQdh7=LPas~ z!b_s$g?zh^K&xHfBp97%Cg)6|_R&6>YK_FMea%I?o*dlS5t~(m`bYVAo+mB^Y7%l8wEF3ccS~R&Pf_9kbQH+v1H$kx4n< zS?!oayNV;Ja?4v)zT1fk5?u3)$Dr-w`00t_pY|{5;_JFGNTAh-b@4`idP{{(oO&Zs z%=+|KPehwiZY0o(D-}BPRmp)#;-jagd(80{-KZe3c2T@>VS_!}XV^0maI_us{&P{#r&LbIpE)o zZY0pE%`=IHlM$}Hk$we#%_Vb&)QUj`iBKca=#!ffe&KRa(WHMDIr46@8ws?kTPDd^ z>zSCd@B?ng`V&RO{&HRApRT2DRFEijG0_+`Q04j#Y`Lzxvir$OUzCbL0W42oT3DsO)JuzpE)sAOrKlOUb@5VMiw-Xg4xTdU= z-@QWl-Aw-7z{qhUfmVDkaq_#hL=*Yq{z&dT z6-H5-HYo29S$^?1X6%dmqftQuBPXhOvLRH2h0QProOFpPlgAt1#@Q=goF%fVO)#oz z6aDKbxuK@$yl=kQY-yB01qmGgnl^l8W$}zR+iX6KDo4O)q19Ku3C7R;Cgi+ZqXgyt z3tTHB9;`fNzSN(d*#`xQtB)rb<<_Z{@Uge^iJDXInO%>#1S&`jE;h+pJv9&)M!S*(@cHK&$c{k`1%B@{w;^MbD_lv@4!kjtUYu z$IxA^NVs>vk|>!!#1%lGRdy+gMaL;0ySmpkUyNuZ-~ZVqP(h;qkrd z66Kb9A25$!2$5r{tSMJMH_v=wUz9)v37p5M0%oT$S-scG<_GkxkU*=}ThonmJ?vkdH0|lX zBIWX^ttRc3kFEHfxgn#pc#c|*1X{hcBh?5wpnP1v`=uEc z86s*@%TYlB*P^sD^RrcEXkrafomw71!0NYl(NyC|RrOm@vtuutBa#}5KHs|pD)_m> zUQRI{(py~ZzWc$E4(84G8j9I}xCAOl1g?aC{N+>cx(+V!U|b-9RtIJz8-I*YKK6}_ z_rBKNCBms+p@Iaiqc!b|Ej2xZTGNin39bMFts)jA88`bYAERF0;5k?=Qmmv|6cr?J z6;5~OA)$K6vk@YN&Mp#YHKj_T(W9yIQRd(bebwYp@!EG3`+$N(r7z-*blQ(&pWWH9 zv-H284i)q7xdbXm;3{0xUO2Q*pL;z-^qdq(pq1~fNyeTe<)h)&Z}r%=rNnybSEwL? zt8l8HnCG58;M4qK2eljtwCdYwqVei|HKN`rTw44Z{hfaNj7y+`#0PIqF!VPR@oju* zadFBS{mcXUZ2}Y|)XLi)QPUq+7gKJn(x*)fB+x2j$9SU!?T53^?#_F)#q;yu)qkdz zqk;sk!ZodF)i4qE_*MNTwHyhw8r5dJ@%&Xa?}lHF6xlDV_mn#A5~v_?s^WN~>|nJ! zq1=T?u_k-9=jlf-feI41Zl}7OZKK5F=x4oOQ*TECt)31aZ>;@E-J?dBb zq68{PV0=x_e?&xxoHDh|+7(>^1X^J{uW9})r&puBID7}-rx*E3sbgMw@!f~ttzch4 zBv1)P*sD9tq#~h?*@|iB$(N+t3G!x%Ji3Q!N27uSzTbrEAs-kmi=LRPe??VKkwB|X z-BOMERPp47wbSYRYeQt0XOHN!C*E+Qf&{)1g?<^OeaNS2AM%!7uANArRWbj&QtWd@ zyL~0?`n9s0s01VIb9F5cx4gQC7*Lm%N=I9`0J_Mg<9cvx}yMo|&t^d|ze=sB0$@ zXvOPK?j?5Lr7E<7s?dr7lyyc034D8uro}$*7G<)+M4qFCb|HaQX|K>K)stfEvf6R+ z%?`r*W{CLu^&4(fkl=aVc@s@<>V>_IUevEsg(f7>O1*E!ZU)oSKK?2{QqG|i7qI{2!JIG!$K4^{vT5->J zs(8FW73Ke=D$0DWPzgrZXLlM^=I&0F3Z5hs%~ppFCK+6r`zxy*A;tIUeaj4!JBIg& zMg<9c-;Acc-S7v`bLok)(Zwarkw7bJCZY-(_V~CQcfoUge4_QOPzgrZ?Z65fNT_4B z;u+Pc$uYii9Sb)X-$*XI+luynv5NMu zXjkLCgK5`G`<>~As>_F;`^uqoYlgEUecCxE-N)m-i-$>sy^dXy3M5O7x!;>)=SgA z3{;T7_>rnc(7ud%RQ=*x+LwU@TD59I=PI`{clnxSWi8qxJeT%mpn^o(eQAbM75F0U z5vFH4b$*@`6(qRFIMpxy^l0)N?F{36OGu!VCnn8ssvG<2-7(is&o6pV%TYlBBTjlY zoT^_Op}m}iX)h-dX!XkCRKuy#yost`BG+Y`)@T6J*nlWAb}Al{fbPx;fG(YCHT2*B+zQr_;|SHd#I3}=3KAHjQuIna{Y!c_gDck~ zfmW+3jEB2H1?uUgsCvD1%|SteKS|wJG;KTe^ivO`yd$aQs34)@QoH5R)YD7SSm)|V zNT3y;5$8$od(_iQ(ewITxgHfHFsjwGZPe2{)1JHQ)N&-y%DS?-PptnzJ^d`bu^?4l zbH9QF_a61^JMFCZ-XbZ^ZvR_$n10*HW^8Y@#Eq2gV>YCK~&l_`eqn5OTdr|&!a zXCI{?fpIYP#9lG_TzdLGuYdMY1X}UT=hUZun&#a~R5fA_wHy^BtVlMu&P3B%D?K#x z$Rz5CsQib>jl!q=9`8-3*o5nTAYmQ*t@tkCe5*n?5Zm+(-L& zb-IG6Ac3(qy#b8&@6M(DyBsqhfmR$#IDOYe`*%zD9-I5<3ZjApM>uK}Pz8aw`{v)Y zf0yf1qk@ErukE>HAMI546+3G36IDo{l@+Pwj`O(VA@cLVIc8sKIVwnCbgpSbC{BDp zb4dwmITC2a@uM?e{YCqCS2uB+GpOaLAc4`jrg>@q?mOY_&Cb+vRFJ@koSw&_y|v2| z?Hbr)3ipdu83=XE>w!-7;$oc~a`DSaGV;WkU8}kkj6ns7Pp9>djqI7~&tG*bn<(9_ z?t3a0OmHKCR!yJk6&p!!ceJ0v{@X~9&plO6|7df87*vpO=j{_VrnDvgz3K z`k7`wxRF4s-p3+iUyV>cN(>z=GgqC~MOIliDo7;viH@E6it^F)rw+2Mue=z&wq*VHPsp&2x&}!7q3xX?J+f{*=4GEFalvx`ecf*Ye66;^v zC7kTwPe(7B9?GowhP!qmfmSp3za*UeZmAOc%%-J>iSO2~bEASp=)Ar9GxV-Tdp-En z;eO_iE9eb&g^KM$0OIwJUMBulFtWtvXR{hH8|d zfBLK2J5fQR>AG${C#S!Up1dDSb)A<-?{_1CR;L2~9TIw%m_s_<- zQ9+hR;|mQm7IJ1+&a6HUeDCskH*T#Pcvdr zL85_siCmJYe9UY7gXcSXgGBw4k!~c=YJQhGQoZ|7(+ZVt=Q+JDNxsy$bPOs;R2=-! zY&}i+xJ>o*_fZ99@95=jB+#mU_BxM~dwr_SV{h9>336~m=@?Xy=vL<~eP)vKahIyx zR-%2#PbDvRBY{>tgFCs`e-FQFuDd@*em&}gghKhxV=;6(ojawTkU9O!*i>`_7Fm*Uc?|mxw_Et@7k_j&*)x*-H7{ z6ANaTy+*orB7s&a*0SgJOLV;}`ro{WN-)AcyOeX4n`za;`I7o4AH}M5IMQ>b=4rw6 zuAM0&OPS>-P(cD?JE{sy#Kzy_J@o$q3AAG0DvL|CSm`}NmFVqq{Jb+NNMLM7kv^>j zC(_&H{-O0b5@_{G39l%8|vx|~R$RkJy}W1akNPkKIaD?Q_$NZ$$-BpQ@j7VBhdH=TT7X1$O{ zw4`r^3KAF%YFZImdHqZ|EPe|g5@^+_-iTNyTf3FAwYw>YHHE$vDoAwQTrSqhCmyG4 zZ5_&C&7k!MDo9}bNbgspRcaN=NWAublt2Xuj50Ot z+@=I?33rqjU4?eI!Dpcr&&N)-_UX3qp2E>CvAAlKKn002PZ#w$->T6t-4kCgN<2lo z!caj1qgt!w`ZLsWep(g@v|82cO`mgiE8Op_|4ccowlqFaK>}k`O)E{mON^%+7C$G9 z1X_J_Wx3C}=Gm03{h4xDoG(EIiQ|_J_?({D?bqY_Jj!A9pq_{d5*XEL+9t|hou_|= zXeEpUTAd$!)#r?llk|;p=$mo&92F#dTk`F8Mr|>wJiMDK4^N<;hzb%I)lyXzszkDc zo%`&M@edfy$@ zXV~z|RxekZMg<9sgEfuce40QtGjCJNkw7axBTn{XFU>rIXa-t9Ek^|j>pJD;WSUQ{ zA-pFRo6V^wqJjiQ&UPK)Iy5i-M&AkvwBr8e}lK%5v^@n@uQN%k^ZCKr6o6sdGr!hHr7$Lmfv5C1X^({;q>^{rGn8RO8SqbEP_-_BdqsGxbt)7HqNq9!Q`Pj9{9o8}EC;+*)>$;0y~A>X@yL zxYKg#Bq$$9pc0I*eKdG~wfX0p?^r&NP{(XltW|o>=$gt05~u_tY#&!g{bcrEIMDKe zggR!cSM`jX!k(1PD}u5w?%&%}dA)-@j)0Ktdg}Rrk=$9Id$WfdneS2)~bm zb>-{hV=W&@sAIMYy_=bnw{w=i9o2zAB^Y7**fTy>Zuq*cX@w>w#&*1`ykWr0|``u5w?%_77mn+M*U>%{zO6@v(>_V zSvi-NXZU>}fl4sK_CfttQg5_;Afb-g>ZNK^a@H(J_xnHsm0*PJgT|kvQDyl+LLIY} zx672AyP33WlE%NLA%RLT!uCP)h@|<%%A_Kpj@jzr;3+vAS=v63KqVNF>q96XAMMVv zb_noisbjW^`z*_F+QGA%B2WoN*gkl!Qs)W@b<9?G#%CGM^*{oZV1(_X>5z9s=4|_# zBcYDj%BY%UIQgdavhBIFwfl4sK_Q9Xe6yKweP{(YQHz~t# z=3OLE2}amH_&jmz*#{Epn63Vumu@)s4(+uZ6hy*IZ z2-^qGRq9@gggR!caqp)Z&ixz-RDuz<4<3I!s`y+Xp^n*VUuufs#3e|e5{$5Y@T{O> zA0*TSl50q)W47YE&smY`_kjc|!3f)j|ITUoKtdg}72ib{H%;;TKmwIugzdv00a!ke zP{(Y=(ZJQ($$lS5pc0I*efT38emYY_LLIXeM>Sk&DmT93*vBGJ2}b1l;24gHWRA$x zXQ^Yh;^@q2hd+k12vmX*whwAK$D(|$l95oyY{gNgb3KqiB^Y7*@JGm&4*O$85#f78QNuW^pV6m0*PJgXa;R9oPpF>X@xKYouZ#EB47HPzgrZK0cv0 zHPPp5o&r?6)<0jd!pFSM{Yy0xs60t9Z4>v7yJYXB9?y&uF3X4dT%LV+ zovC~{#PEKRa{CMIJ#BE$HJb|ldbxt}E4$G&bTQ9*)dB3^UaKAOE% zL+)}d*I&Bs3Lwym=M`Q-+JyJJ%CgFw6}r(mI)Ff{g}Wx_G})f%Kf7;DsVEPI9oBnv zh>)lt!Sf2QAZ;HwM=NQnv(Jg@Ky()Lk%{fFk;_v?t_ z8DRkgTJbEw>p`2CJ}bqXJE)pS{X8asK&zD<(sIf@HPzqpKBtD71wU&jHq2`*Q9*)d z30@D{KK9-UG2KhU#GDRI0|>M#=St0ax3%)|>Ki4@E`Kx@FU*gWs35_!1g{5e9~;`V z_qOUEDF%c$2_Vpl=a{h9l@DW?$9w#QOKhd_j>?k+uLo@({+Yq6W(JOySiyM(V-%`$ zM>9kA3+=r;GoXS5kN=;;lXL9ZCzWP~PkWUxd1gQYtuRK>w8}Iy=!HYgD>O5pg2V}$ z8OHvYlJkqzuiOtKh*1t?GM*^)de$ce#bY?4`tt?B?*+m73<-ermd^j=F zf6eF7)f+}vu^3%JB+v@u2Tkk!+1sX|d&oh$f1rW{Mg#PY+(Myd{{nU8p%pO_6(o2x zCtu3+x4e@*&Lxj?B+v?@0Zm(Dk8{c692F#ZG*`c`e6+O3x%`60ITC2a#~hc~(8EQChE6p zC{aOzb3o4BVDQv9y~bD1iN)KS1Q2M&86D>yRlC-k`kgOBMZea~0|>N={vypNyn2dZ z&n0~>uhhrauPwS9kC3P!!5JOr&RJ#sdcEhKa^mRxm;fTcDk8&(JCNnSJGTn`MsJX> zvN$#}Txy^o!5JMV0w{UvFTLidBBJW)hyVhuI6vdWB{yo^(BIqeK>z);JAgo|yMrM)fveDrAOn=Ki{v$+W6+WnM zZ5Js~L4xx$PMkRHULA2`-G}-=6qg`@R-A2dV$pBns)>g0rRYVs#sm;(^-KONBVn!D z@%t^sBtM)Os^_D)1QjGW+v3F3MV3*$n!iHyOYNHm5NP#!%Phl*+c_qo*hJ^~3Kb+c z+oIM9n#M5+#U>t}uaH2if4kVfY}tL6M=ZrA9*#>;K>~lx${pvD37i3NX24vpHH&)a zn_06cDoB{qQ;dL_TBp`qGc^)ug}GkZ<5ehBUqyF=MRYen1&MZ^G{d<^RoM8pzMt+m zVRXkq0(eR9I7d+i5@>~)TTT0* zPf;w!4#WtPecU?9-B@S&f}b86CUSCpcQ6S?Qzbr36FDBkl@kGYX)bWb8NzK2@+_f zvbc6!!Z8WQ4IDGz41iWRW7tuQB2amfaK07fON3gb@D6^J*WhE7d9kz3NTBj0!C4WT zfDDUJc^FoZP?->$@UNpd!y-^YLgi8H=MDVpD9*415NM?`A-0eDo*MGwlM#CM-B^JN z5;fXq<+M1IVO(0sZvd-yCtU8oIzr!GzEJ>yRw{R5`*>$vxEyD!*DIc?B~U>^WkPJC zVG~PUDIov--PD&YXeCfVg4ZGiif0+CKj3!M?psu*j=ilH zn%*dYKr5BkuzlPZd)wSWGf-0^P(eavDQu$D@1}Y0V@PxWfmSN7Vf)x;tT#)p3m3!b?4p8%%2L=w*{dVW#ka%7OCgN}DoCiD zgH3Ed9bp=t8e$6d5>${-84J57`qwy|%LpLQO644EAO1BC=Q0E;NT~IP?Zdyu5j2+s z5NO56&Tre0%dp0v`sGLE9Qd2?=;FWIKKxlu&SeD53`nS)gH8CeoSe%Ls34&-7Iw== z(ip6EGQylnXBP>ys!3xoa%gJKuhtk`MPqQnwGn0=8iS}Hp)wY>k8fxU9;cqN=wz(` z0g`pHEKC3NT_Ur?c*?=*$_Iz{b>v$fmSM;U=tPS>h+|nIF_y;5@@Az12&O;D#HAd zdP)Q8B}kx^$_Lmz(VtJ`=vAPCgvt%rKK%Jaj*tTgwBixPYjxX)KcC1^xIpDe!ukD! z?##*lJcC8>YMVccqi}T`IBK6H)ObdMkJaD#-k+OiuzV=*Y^9Fz+y0kOEkuHk)!%d1 zADl@Q=$(&MJ5)ZvKD#u-@%qD>;ZQ+>*9n{vw$CojqP+gFW>F;2N@WmiAD^6x&=1i} z9ZJ0f6(mX=NHZSg-f<>g8=LD4_Qz}v~K?Mo5 zZnt})e{H}yfB*um)LPy4!9AUOJkKSlAfcjj+Xv?WID5zUb0pA8tpIEv{#>6m`|v1I zV_U7&*^2+}jM`T9)_7XX2$i3-Xkm?7r65tsn`)fjkeSnX5yy$*#WMP-vrT2qZeaoy zB-Fay{#MIsPSV%kZYJBr*A5`iO0C;%qTGW8`kBg=JhS7acM$Sjpz4lD)Z}cDXR+dfP4i~5(p;qCxkI^Up(ht5<{9~68(fIzF2l_wk32Bzg~w<4L{8w-eX@mI`A^_mG(kWi~|+sE>H zHN~-_XU*>i)(RldO0B7FqEyM+V#A@8=Fz_*0tmEHYigTld#aLnv3#bvV{&W&fmWPt z8`(DZy#RI|&ZIn?Km`f4rnY_f^Kd5R;Q|P>QtN1E4Dvml#~><5s5Q0i!=H!a^?3k+ zRy?|#c-NnY^YUE{6(rO;+V%nKbBo{=FMnU814k_qs60ui=v>p5^i2?*%9qjKx|y1t zmC-e}NIrW{LDe$dVtZ(mO`EyMhgFU=ZQ-+t;AqZVnq6n-qzmt#6Gu|C4Iwc=4YYfP8qk_caN}kwn2dbJiBbFQDKuB#lVN=H#B+zPLyYjJx z{#EsTGG6N-j!p@Y+aCPX3>74@2bGK6buZaiWVIukDy3gP*iP>2IV~FrwCeWw3$b#g z^0DboSy8_6%kuuf}wC zF|yc_#xY2s6;^A~wCGhc&4Hhfk;T_Gh(QI37c(mOu4N?~8?Ec{>yg`Lo-=*qh=K)n zB7s&bFACq_t?FETa;LQ1(DqdsR-k1JDoA|g?eA-QGuilM)CV*^iu4sS`|)$~^qLO4 zQ0Z_m#dp0~iZO$}3D!l@v@$zJ%FNH#n{|Ib9fJxIqZZ8d{d-PTPs+X=Cl5Y-&Ro|o zp*bo@d~trRZ{3e6#xkqr)$b(8Ps`^qkA5&M8ws?k9ZPi@Y38%DoCyaKeVua1*L{!Y~Q#zn=T zg2ck3Gkia{Pcv3nK2B^LF6TdM>SfBD+KB{OVO=CmyM3>nY`d_M@cptj1{EZ*%8{o1 zF|&)Dy0WOa{AQLL6(p`#8SCr3Kh0lbt5m5l8ME0f<~M2F>+tf$#z1e4`05s36g_ zNCDr5fvT$f=e;w{hXuxo-zLp}lO>lI^^$ z)+UJ#QO#nIKr5_rq-ih8KX&Qol0;hV5izJBv3As4^B`4$vVDZKdF<)>C_xlSFBw3f z6;?UYwDyBG>LIR?;$Lwm1{Ea6UCR`Yx~X3+D>NIfH+yP=n31)*IVwoJxoL{1OoTl? z2B#JgdE0drZHrFNMgpzc&&d;8<|*aFwY;dPKHGZVb}}l#2)pIIYlVwOUqth-4FQCr z*$QhGXIz} z-kP(bEFVfi0_R6fOZYQP=KrpvIc`d10D)GgKgzdz@up;>$Js{ot!{0qF1H_DWFGf5 zk*FYn^E_2!-&;X`zGuJrFex&CK&wiPFZyIglD{2m*E}}c)4$@>a#WDm*U9HQl$huz zu3joGeT%P{2|q?iRFJ^C9aTv?_lE51vltV!_uSo6nzbJa`bW#Z&0 zi3$>U-=&)5rxu!vZq<_0>6#;fR{QlnzV5}8kEFV8bH~y!8A>fj1&KlL6!cZ1cZb`( zr2EzO=Iq*G(j4iMs33t6ho+B8l1c;;ffH*kidvs(_%JjqV#4>uA*Lo1X_*hxh>Wi9~H`%6+id=#^jj+6(o)qI3CN_ z!|o+Lo+={}emrA-LcIhPBycUFX%SR)XbV;Hm`K+H3A8%(>803B`PA&Qy>qD8IBvQ* zZBmp(1qobJQH71e;iBiT7;^@-90|1AwE1SNn#VM45xt9b49$s^spY63aZKK^)|__B z_l|Ul_>We3>Hj4vNZ@LcY9S4Gi9rKD^w9qY5NP!{{CaFFdY8}@t6y#SK2rSHZ;NLW z^($162)rAlRjnhARhy~jr+$S5TJc%`HY44C1xFsJA&#H@Krci63Kb;q?xShf%9j%t z4jk1}=fbbhLdHH-4TH&&3~IbVH}rX9;(v&-{q zl$c$@p4*jz1jePBHkK*^8C30!YSvhH14W<}--(=a_25gl`D<9XSW5&dNML-eX%lH4 zd79>vl}`|8#rH?&ntwKJwK;BkHSrN$b5xMPb%Lfn`0A)RiF&-c*Q(D#D~=4DzT1i- zj0@D;AGChZ^^x1)jtu8=e>n<@g`D|S@pDwRl})%fop z_?&U>SsWtYuKcAwnp%zu61dW%Iguianx_})>D1eiKr7u>Xm{sxcEm~94~j5;tn1b} z%0LAPj8W-XfUm=(zB^J6^+%Q}dPM@GOzQ3Qo~>3NSJnSq+DRY!d!gN>={;%_XVf$C zb5&H!f7i5Sl=FEhakGc>KBxpE?D27Jb-avjS({ib83}dFR%d=MxVyfYZ28u-HsAD< z8FHz&e#jLa6(j;<>Lq>OlnIG5%vVk>GLb+ljDzXD8C74EJuVfLFP`ojK%f;ywVKxM zZm9hFemPnEg}(#76~lec?pf|LzzdXYdYj8Qf1PV{}xqM2i5$x&l;B+%+a zm+)9$MRj&RGnaa{9qA{BR=lF4f&|8>nwBSNhWG~?(v`1!o;$V3L;|fawxb!YN1Q0Q-KW3%ZQlR_tuRuf?8l0BV$#V!^b(c! z1$-;C>fB^)?4<4){t>m|?8~Bqr;OPC+;$HtNCZZG?e|0qAN_l+{!K3uXoZoQrd2vz zTqL+UidFkx(2+o^uivQ{Tcc;D|6ARREFl_}YbQ2&l5|v%z(|eW6#CIgeNDarVn5AS zNT3x)YP4GUhq0*}rB`49B0PXtwH>lHv<}O`WUGUoQ0?px#)x+!Y-aBm$$p z=pm`*&R(O$`)@{>NT3x)YLr`g`Jg#GPY-dd>1P21T4CHp?-SlrMy{FnipVpzpcj3h zRbYJebi+z=b1z-QZFoPR9cZOuBKz!mY5#G3|6XKNf)V!Fy*IF%^zJKcon0iPwLV#(g7*^qq}+B`1S&{a-*%(As}V!i{GVij3KBSj+qU-qCJR(>M#WDG zB+yFDSKQkFPoRQ?)qAiV>?oPrfeI2hD+PWlB+yEY`GD)eZUibg9`Td@zYipEY--xK zTYAa+j~`nr7QBLZ7S!LHJWBEf5E?2-sAHSp2GD;gSFa^2g*mUg4fB51=6UKx9UI4u}(?4YY_4=#ohR0R;rg zZjg3HP*IRp;}(W?i|friGRDr3F*~Qa^+KW{LcKmS5$?D~?`>VG)+ z?!j9-gnNDH;q`{ktX@fDOAyzCI1+?goOu2F)*r63?d{Sy;NZKfd!|<_zuqC-YySLo zhabP?ereo$(B0JuFIlamhFhHY=;C#UFMjMV(wN!&oa&Q*oL7FiL%7$6w_Rtr!W~P^ z#^-^!BlxGTGh5>;+V_V zuzsA5Idvh%>RMVFve)^-hq*Q6vV|K+~UM48?3@eq`8ZDRU%%^FkU&~ULRe& z%5bMId?3fG67gz=@yabu-1@zhhsXW<2XeeB5wAv!S5CN>w96)5m55g(#w)itA-%GR zS0&J;#JLfBiQ zPgE3$S2f~Q#dzfwCww1N*w3OGD|O6K<&5*0h$t~;&WbbflRFQti`XK}_H1#&*NRCL zZNj~%&6ycB{q4t>J`wp$}uWGHPUI5%#;;(nE|RapIrW`%3D$6S@vwcot)hW3LAH z24RlUBh8q0TuH5Z=9z!0-QontkSlCb!-=-nSBD>6{0$NB{P{ae`yW6&5vq zdBLZex$A^`aTK^-CR^o1+v}_7M{3niu3v7aG`b)fixV7OuESo9hG=`OJ?816kH{80 z3%hUDE{gR}d`t7py;V-&Sy<2S*mKT;zJ9nDM%G66jdT8dZ6D!Y7^gAEG4^AF+YSpF zoF#5?0?z^?(l<+-a4(E(Gb__P}eKD`wlo;s5Ww&Af6;4-x2g&z;b9@KS4g2)8()K8ffV zt6*_2jhl#n`0_)|yz-uNUZtq!eJYA|wm!ByR^eVw=vo?xaE*proZ!r79PWF9p(Wv7 z?xkyKs(p)j?^VnNk z6g}~3g5XT#Kk*6n#Kd56FU~Qpm&s@Dtvc!IuaDpV^Vtc#+zXDbx7~^Vd*EpN_NVHO zhDFg}aj#o$smAXswNP|sn%N#K?xj)aA>5*o{u`~b6&1Xk(9`VE@P4?LW=s#^7R}0M zX%)PN7^C0?dWha9VuSx=pK` zV1L-kwuWX&L%0`5gQL^twjfNA*60G$tj2gQw+_#C;KDuqM zeDZGhT=yOGUffBh`nT&9#pw9oH+yQgIDy=5r=sI795s7tC)^9GmUTFtYjeAru?nry z=!R==ZT8nX$C!V0g3!|pzyIrmdujIc5N^>-3|@ao+k}H4=3EKy~}vv?Z5w0 zq!!g~aYAcTt#SI8f7|8>I>8nuFVI$}zI5&FeXJUb z6WnX@pEyfWt29;(;a*;ID2ku$JZNHxTby9)sM*$F&;8WE(*$N?@WPzNzvB!|ZQ{S% z`w}O(XW*_ZYV@2rgT=jkKUWkpPkybL?Y_HXi>MRt8&2E0&h2XU48hVS!nyrf2(F+w z5?9P}m1VuX&OW#~54wdT%D(*VR(V85Z@FqibXLR|M*21XQa7{2Eo~x12F3QCSQ74~ z_z}DmR~AN%lPgi%`pGES{ZRyC@F0?d1BC zpIx>hn=8W8v-x^)`22k8h%@nd)bwm5E*HVi&y%G~ z(W-qtG9dp-a*5Oe7zXEvvu`(Ej4}sVtWy8=_jbM`9n8Vho5$I z&~PGOFP_bxl2gM8xAYU#*a0)-klRiU8cyVEdZkavsc}6B%#=X5rJo@ErOz%q=p!<{ zcs76LO^uyFq*k>psU=QO13e$4v2r3`FP_bxl2hXj5HHr~x}~3>#%nM`&e9WfB400_ z&7XNw1JArn&)hBj1T~i6{tw?3XQC7Ndhu-jl$;t5th0Bym1etJ`Uz@aMU`nqIgzgy z&*sm(sqw_AN0-Yz64#(x`Uz_Ac_Uthb?!vIUW~ZA%JAL8vvRyD5w8N_mM)P$ahFC_ z;KvF7EL}7{yJJ5{q?qWIeuDi_&x3{&`MP-?($MGzLgN!G{RA}-uS&$L8r>+I$k)xh zlEzOlOa5?IB=nqvrJtY%;#G-w6*Qd4*UkEn#$j=`2SW2TSo(>e5m(d%k?CgD;&bO| zv`VWs5L$P^(oawW@rsdQg2*(z(&y*XxJJBU^a+Gp`U%pASB!8IM5dd#t9~F}F^UF4 zaZr}j5+|skNIgMhy2&4U9!@Bp2TMOe4dtky;Y7Y}@}M-7qXMD46fFG&HJCZiMrJGU z<3zr0^0_n+uWH1rKq$WkOFuyk?Eu1xaw1W%{2TG3u{fc#bD)dj4e(rucZ&F_ zz7y_6ZO+X2e#vjps#Wn$(K2{9!!1teG%1af@vgzuc#q`{kWRQ4q69w8SX~+?;9Y~? zZhFpO18BI#37saT!MAEYf%kE?Mn9ZzFGPtkBSq}TV|a7t?I1n@!YxjGto4ce`|$3^ z+wgwk;b@f;?u9;#8S$dVi$E-m_lll`hFhG_DOLSA3~yLG{^-2&WWM=g_i`^hi!sJg z8b{)-ms|0E)Fl{Qw>ZHw9L7!>H{i{h67Q0I2CZ_U?X@<}wMpZ(AdUxtf3QZfrAzQ6 z9#2Sr!rO+Q*mbHLq90E1I(cC}TR(2WoLU<1C;k`u(Y9oQXWZP6ci`>08e{cEXgJ|s zh!XZZhM0v*|7l+NHfXrT37*0+2h@*u;f<~R@C5mGn-lJZC}H#JSj?&CfjAR{Tb#hT zt@%{8DE5K(!FWG$%?{ySh!VCwwgYhkTK0JmZgGO=bj$(uV#kScr{|Ya*Gqx;~72nV*`xU5m;5bs2}NG?!{4O28!z(@v20;su-`_ z;snQyr~RnGx0VsFD#j}(+>5h^8K{X@CE``Zc;yx+`26vYG!U-_h*ve^l@sp8ISu_B zuLg)$HRF|AoZvi$rZf<*28dTRtM~s~`5U*wsuWH6C zC)!?XW40#^#H$&`suZu1rAx53(Zs6};#HmERU#O#k{4rT?g!%42=S_BylPuA!T6Z_ zfp}FRUe%0OPPi9ietsT^R~6z_&3NS&Cm84R^LY5cyQ}}kGoK3$C)|sJ0~#h8ydkjH9}#>y@I1U2x?%k<2h$k*XK*vuZZ3dD|j=FDn%)LND40)2J|1thYD!%Ga?U zc%pjd(g*}wk}UlMHFihOFU2~fh7C85CGH>%&D}t_rJtaN*5Cw@ z>A21@64F4t;u;JD*Ilyo6VyPwVq};gGEJ|vznaE1;uWJ$Al%YVkVd>>gqt8T9qMpR zYl{N$icvHWjDx8k{RA~IRu$sa1d-{OKl1Z93A1od5qY;1<8IV*f*P;J3^`vlODFPm zsEanUC&a57@hY^6c`44HX;%K5onHPuHGU26dvhhVA>5037f)2r9Pz3~yb2m_=_jax zcvT}_g%#yQzK;8nw3>_Jx7cMYd?XUwCnQThL5*(xiqC;@P*ohn7Jkkdb~WMmz4faJ zLUpD<_tvih;a+O3G`jUG&RMp~3GEZ5f%9OE^WcEzLBE%KX%wWtO@XMc)RthL@@d!FGV|Pbn92CRZi&q zseW|pSBY>hMQv$x>sM)XozOX28aNLQa2_mq9`t*;m$HvEy7j9xOPo+WKpNfpRU+Jr zElqQ}D7y8lWN|`u4Qb#!SmHc5;CayR>#1J_!oAp!6e}m|SIOc8^*EPfEd%xT67}|q^>)9PdvOf8*0~Cb zqFcX87AH7vT$53wTfa(#dvP8xW0}Zu{UZUUbX61 z$>Id(F=J%Z=+>_i;a;2vjQddo@v2q7N){)$9+@4YMz?;Ih_+Wag-N4Zzhai8dY6bf zOYy2zze)t7Px9i-N!mrxtzTtJCOD^ZKf3j+M7S5{K^jAxaXR&@WO0IXDnAd@+bh)D zYu4NSUhc(tkmf>Bbn92i;sobZo>$%aRU+JrElqPe#H&{QDp{OhAM*M@y}d@gy<)xH z@8w<`zqFbs>sQI*1fNA-=iT~MBx3z4(RqJ0jdjlbbfSIUW;IWcRqAKm&@vh)+w=+>_ik?-4_qtuUX{VMJX`w5O!w|pn0 zMz?;IEd2yEy7j9>sN`$bW=}MKf3j+m_K4aBJBhaCGB!Qx}y+ zw|*6~TC87964dC{uM)vo60hU>V2o_d-MYXJXGpU26V&L|uM&~zrcN!5ZvBceo$CDr zHM;eyL~w@0YkH;q)ikcV^{cpBYAV~%bAs31`c)$GePi5B+LQIGY)LI~f*RfWRU$Y; zQa|`4(-;;-w|onh7?IEbqtzRXA{fXCcUy|15Wc?~x`Uz_AXX)h^)W2SOLCwDk$?yEVLhcO}H2SO04;t;i9+^#G+4a zSO4+CsoE`0Ty^Ky$D7V1jo++wRrS;g8`m3j2=~I@uGwD}KeNVF)#pLn1;Q;(>~`L0 z{Gt73)sGXW@2ig4ZRL99i`#^I;jioLZ;}7<;`^#6L44~YQ?*;1*zvjbnE%8z|0j4q zu=9P@CeU!gz3_K_&0jL(t;yY2u5a7rzUmtoUAH*FK2S4i9KQU<_4erfi_j`3+zWrN zXn*f~KZqZ#epR&s2)8)FXTh>1&8r5##ENply)@sXu|DS2Q>$Gy zcm(}%ixZk-(zs^0a{b-u`vzxVeK_G>S~t?T80+JK7vDEH02*#_LTg1DOJUU>xZBF* zrFjj8d%2e)hBStV46g&RRgMf3gx0(?HeK_o>Q&2cTrP!H`Mumrkxv@eBEs#l;>P8& zh`nxcLa|F4pZ((g)l(neu6#dQ<%D}Ff=lB^*Y02K@|o?*&7k2HClrIFq5M%Ye>l~R%HIN5O z`<`9&8Brifbl)R|E23i99%?Jct<{ElzN4@b^&zd9dUqBM{P2grl9@*pEzusEUEB@N`k0rFt2JlGKKr3fw! z*V68mJNF6LrC-1`s>^ zDiUt#BcjHi?%kul^39tD4JXnyz0e1qyrkiTTl$EoaqYKWU%&sbM?wYCiF8dbJPV$@ zr151CXNYi19}zWnd-C}D#>+1X8cw8ZdSOoS#^4TmxJqoYj3qr1{MOynpGlSEuO!OMwp{Jr`yG7VWW zp%&`*>PH~jmPsPEcG)<(p(5-=x~7*#S{l29s4l-K5N_!sqK4+x1d(WZX~sxH^C}Q- z=_8_sW_x%hPNZvkY357A3AgkSQA4XXXgHCs>7^Ac4Mm1PxTTMX8j4pFM55`XNF)u# zt3bG=kBAzIq7y`->7|G&4JX{vM??)}gP`F=x{h8UGf2Y;Wtm{M=P0egcpZOFLUqxSQ31P1Lnj4I2=FPdr*?v?jG)c8g`53(*=y2S}Rf1U@W z@gLYNJ&n4|h8@Da@*a*F%VI}%b*zh)ZgB$hnCC%hoP%B8+p+6=&c#zL!oBidlp6P7 zXZZ|>?_&S%7ALSCc^;I;5}XGM>|VErh7<0U_tezb7W>_sQ5U@tqw5wY&S{K#kvlxD$2JSEKiH&?>)|dnxis;|4^y-BA}^2DLc1IHA}jjW5UZ zAnT$n!o3v1rLiQQ2U!qY%Q^&EMyR32;y z_riP|bL~V8@zth6y#Thu@vtdIvw<-x|{ z1Xh=wQjrI1*McJ9<0eK57IK`Y|wr2-~4$NBFrBr+O0w! ztdR#t%7alO-#6%KtfYrLSR)UPln2>!Z%H83r*IweV2wOjDGxS;d+C|$PRN5b@?fPr z$R`*qPUzW419`AU9;}oH8^XObccp``?R)$YZVx&e*rcAY^ zwk3b&k$xXfuc*nCR`F`?E5j#P zQ3ExZGS&Lr(nmxMR9MPXvveX|(+jgQd=eKmoN!AY5j9YgDXo&)+$+)a!mJFRC`Jv` zWXij8wYIVJ5m5s*nL(-{`@PaNy)ci%C!yu-t%ke3@#!AIEl%wFwk?Nye}AWiZ3TR{dg&G?PW#Sg!{r`& za}VJbC-%8$Xs&4t-E!6)d1duc9o2x_=R&p&wiom{7_;e?)S zN2A-SwpSSGPR~hbW(129nhQM|PPmumLJ#2#fj~ASY^1zr_b-{xf5-#rE!1$y>t7A&m&u$SZ4g3;h`&^+@s-ydr|wa zC-}F>?Vm-ZTby{ooy!g1`L6wXG@NiRj^Tal^Y4WHhqK)+P8@RDGQ)@WUav>P3HRa? zT<^jaI~tt3ZgJwa-!47;%q4YL^WLsD;a(@dc!lw5?_0h{!!1tivF_5tyG~iEN5cvC zy6){OjUQQV*&YqI^bkYu1FsjAPUt##eQ%Yy)<)-jgS3ApN3m{h#n0mbRE2Y z@cj+PgO!#Uw?~TW!!12TkA@Sv4qi{sY&w3)_RDoNI7{5pL-c4kq3huF<88MXKk@hq zJsNK5A$l~N&~@`C*+FWsBpjobcNRQj6GHR5DZ_&j!|Ss&qEPH1iRXt>1*t@)tW z)^NhT6qR~3+~R~{*FwKPubX%k?&V&Jl^qR>yAyCtea z?G>_JkA|{ZusETd*rVZudr`Z8pXe4Rl-qkWeD3;u)%CdO{46Tn;=~SXy#8tAmJ7#u(O0WKhbLcV22#lgT=kR{_7Wvmwl4ok<$KIRJx^0JhkjPe}zaE zC#XGodc6*j`jIS7a760sHtGSOh}`TvVnb%>t251)tDTDY$hS~oqd za>Bi|Zh8o}XceV?{2i@wg1e9Yx{q2l=KA6%?ELhY*O;Nu>Si^~-Nxbs-vLOUH1ZDV zr(I!jFTR!WFv6S)5{eOBDo@O!xz`Y=qNV7Cdk z@GY10S-Rh;O~`_l6@`d!?QXMytBB-3dLx9u4n@ zd+GW25N^@DdX`pk{5eJ(4L&jUK90=a6MdZE4B@EcagA4Dbh%>*7Wd+ewHQa($jQM<`$6sre2zVBSG{Uv$aNX8$ zixcY8vk>m3G3+7SqUZ6yXq6Ls{v8d=&cWhdnr|I~>!WQ6Bihrd&z?I~FMrPkGZ&sa z6;5|JFX>+4d?q4&3+?o5QJewdcmH|8=vol@d(LRdgid|B)9?13UvKuy8%N*RZb6H1 zFMfkd`pyx2Yu!7xt6%)-L#uD^F;%+739lL!#ng>k*1K$Sc6I277PJWW%HL(e)?W1I z4eK*cxTacbda87b6FRr69|yj2Zhi4@msG2~bwP`8ul$`X)Hvn#=hT;6{`>0MH&2yr zae^5&S0G>e2>#CzN6f7cs@jBmF;nMy;^+SPXVng~bL$;`(k9$1e;W;3^}#t;RI9DG zS^b(Lrb@Rs!Tm$7C*D5)>}u{0x2*4d_ktGTUin*fsB!$>J5|@uc~O1j&QqmZoZy}) z*AuTh@y5}A|6#{^=W`ach_+Yyb|7kOwC5V5b>Fw3K6D?x{h2LJaCesLiQE6_#+f(1 zb$-3wntUfU6YiD27l|5A-n?YyeFx63FZh?K(k)JK&zS3pC+>LC;JdqSUElFfZNj~{ zN6pp2{SH5S@cX6b)ziB#Xlb}t{(dL6YU}-G2M6!5ZarK$Rl3Cq?v`_P@aNYr89Z;B zx%JmCT+kxiD}PTFHLg4L$-#%eIj8>PE>opjoZuclR|n5NY;O6}zbvUvJY+$OaIgFg zUDViX#kI-{-g8^E;&D@@Tb$ro1l2*U!Hqt*Wx47~=U4Y#-6q^ir!Wy)ykcIt!bi@o zPWW@1aIgH`WNg*Pp5CE+-G0xl4mn_|bc+)@w@Ksvr*L*qi2>37Ghqxx_fbk@}KxkY?oo~p7G5&<bsh(-2F3 zu|)biRF+IgPj~9sy#~U))LPw1J+G|i6NE-V8r|J1#wrl*rBRoL zo?vB9aDvd<y>=if0}O_tNZq5$ib6Yp+I9dz!wKyMq;Y-RWmMc{_`TeV86vHl zqR>vJvYkxOa6-EpX=t}p*={Ki?xmfRh==2jtm2N$)!hpt&bS-y)a?2y+w}#D6WRev zLp#e6cb0xH_hQCI=9Wg!?loAP;59x`l!kW5Gu$Ejz1)l1SclTkE_`6S@J1uumwn2g zrEVT~`UCFt{a)_HF+@C(hE5X$J52n(pOZj6TSP($Gn`w3BeKIKjArv$Hh1yVrCt_hRhAiC#o^_nL^dS2*db zRo&ey_6Nb@1Y`6Fph?p~9{31%NuSftV2y(YrFm0m8>>;JRilE26U^jmCC5`HtgG9fZFT#v2S;a6aH>}Q7nbp>n}DwySfx-11H>z8T+WC z&XmR_IDdQ$wbzw#{&0&E{x*J5yb86~Z~taVwJ**%PPiAd|1+ys(l`yZ*ZWX=y#%#a zw>aVN?-#{CVzy7C_Bw^LniKBj@9*RP;)>nt9rfJ$XzX5{a4+r`K7PynYSsBTb8d** z>nm~Qbc+-1_xHD%I=lMLomCT}7*;t%t zzwy5=BHYT4?pSY)2$jzjF&&Nq}m?43@6-+@jkD?m#?^1xi)IA+oKNW7AO48!=l&*wZ2VId;KwL zeNMQSzuk!cF93G0A4cuQk}bkdEZ zi?OqG!o8TW-#t7_QS@-tUjG%fSGPE!>pE5wq%m^|GOU6W3Z+nHft5zxQmKJw|#R>o0oT5-{ zFSm)iSH|5yxR+wSG?YI|%O4Yj|HTl#rRBk3al-%dsmZk^ zbFJUYy_AEcp?qFiJ`WZr{BN`HolbGjFt9yCAl%FU<_rJF5bR67^_wMw|AT#rtGk!> zD{7VYJ_FnP1d9{?muUE0J?^gt7h`|r_i``oyQHB#+`#s5!Qw=F$H{%-xv0IKhJB*n u%e{R67^6dc4~N&`ucEO-UX1m|H?-1soyXtDze|k_-!0*fTUtb*Bk?~j?pnJ5 literal 0 HcmV?d00001 diff --git a/resources/quality/ratrig_base/nylon/ratrig_base_0.2_Nylon_super.inst.cfg b/resources/quality/ratrig_base/nylon/ratrig_base_0.2_Nylon_super.inst.cfg new file mode 100644 index 0000000000..986c594aa8 --- /dev/null +++ b/resources/quality/ratrig_base/nylon/ratrig_base_0.2_Nylon_super.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 4 +name = Super Quality +definition = ratrig_base + +[metadata] +setting_version = 22 +type = quality +quality_type = super +material = generic_nylon +variant = 0.2mm Nozzle + +[values] +speed_layer_0 = 15 +wall_thickness = =line_width*8 diff --git a/resources/quality/ratrig_base/nylon/ratrig_base_0.2_Nylon_ultra.inst.cfg b/resources/quality/ratrig_base/nylon/ratrig_base_0.2_Nylon_ultra.inst.cfg new file mode 100644 index 0000000000..8e857ee97c --- /dev/null +++ b/resources/quality/ratrig_base/nylon/ratrig_base_0.2_Nylon_ultra.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 4 +name = Ultra Quality +definition = ratrig_base + +[metadata] +setting_version = 22 +type = quality +quality_type = ultra +material = generic_nylon +variant = 0.2mm Nozzle + +[values] +speed_layer_0 = 15 +wall_thickness = =line_width*8 diff --git a/resources/quality/ratrig_base/nylon/ratrig_base_0.3_Nylon_adaptive.inst.cfg b/resources/quality/ratrig_base/nylon/ratrig_base_0.3_Nylon_adaptive.inst.cfg new file mode 100644 index 0000000000..a63a0ecc02 --- /dev/null +++ b/resources/quality/ratrig_base/nylon/ratrig_base_0.3_Nylon_adaptive.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 4 +name = Dynamic Quality +definition = ratrig_base + +[metadata] +setting_version = 22 +type = quality +quality_type = adaptive +material = generic_nylon +variant = 0.3mm Nozzle + +[values] +speed_layer_0 = 15 +wall_thickness = =line_width*4 diff --git a/resources/quality/ratrig_base/nylon/ratrig_base_0.3_Nylon_low.inst.cfg b/resources/quality/ratrig_base/nylon/ratrig_base_0.3_Nylon_low.inst.cfg new file mode 100644 index 0000000000..968ad34432 --- /dev/null +++ b/resources/quality/ratrig_base/nylon/ratrig_base_0.3_Nylon_low.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 4 +name = Low Quality +definition = ratrig_base + +[metadata] +setting_version = 22 +type = quality +quality_type = low +material = generic_nylon +variant = 0.3mm Nozzle + +[values] +speed_layer_0 = 15 +wall_thickness = =line_width*4 diff --git a/resources/quality/ratrig_base/nylon/ratrig_base_0.3_Nylon_standard.inst.cfg b/resources/quality/ratrig_base/nylon/ratrig_base_0.3_Nylon_standard.inst.cfg new file mode 100644 index 0000000000..f139cc0aa7 --- /dev/null +++ b/resources/quality/ratrig_base/nylon/ratrig_base_0.3_Nylon_standard.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 4 +name = Standard Quality +definition = ratrig_base + +[metadata] +setting_version = 22 +type = quality +quality_type = standard +material = generic_nylon +variant = 0.3mm Nozzle + +[values] +speed_layer_0 = 15 +wall_thickness = =line_width*4 diff --git a/resources/quality/ratrig_base/nylon/ratrig_base_0.3_Nylon_super.inst.cfg b/resources/quality/ratrig_base/nylon/ratrig_base_0.3_Nylon_super.inst.cfg new file mode 100644 index 0000000000..b09d167aa3 --- /dev/null +++ b/resources/quality/ratrig_base/nylon/ratrig_base_0.3_Nylon_super.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 4 +name = Super Quality +definition = ratrig_base + +[metadata] +setting_version = 22 +type = quality +quality_type = super +material = generic_nylon +variant = 0.3mm Nozzle + +[values] +speed_layer_0 = 15 +wall_thickness = =line_width*4 diff --git a/resources/quality/ratrig_base/nylon/ratrig_base_0.4_Nylon_adaptive.inst.cfg b/resources/quality/ratrig_base/nylon/ratrig_base_0.4_Nylon_adaptive.inst.cfg new file mode 100644 index 0000000000..c686218598 --- /dev/null +++ b/resources/quality/ratrig_base/nylon/ratrig_base_0.4_Nylon_adaptive.inst.cfg @@ -0,0 +1,18 @@ +[general] +version = 4 +name = Dynamic Quality +definition = ratrig_base + +[metadata] +setting_version = 22 +type = quality +quality_type = adaptive +material = generic_nylon +variant = 0.4mm Nozzle + +[values] +wall_thickness = =line_width*4 +cool_fan_speed = 40 +retraction_speed = 20 +retraction_amount = 1.6 +material_flow = 94.0 diff --git a/resources/quality/ratrig_base/nylon/ratrig_base_0.4_Nylon_low.inst.cfg b/resources/quality/ratrig_base/nylon/ratrig_base_0.4_Nylon_low.inst.cfg new file mode 100644 index 0000000000..7daca8bac7 --- /dev/null +++ b/resources/quality/ratrig_base/nylon/ratrig_base_0.4_Nylon_low.inst.cfg @@ -0,0 +1,18 @@ +[general] +version = 4 +name = Low Quality +definition = ratrig_base + +[metadata] +setting_version = 22 +type = quality +quality_type = low +material = generic_nylon +variant = 0.4mm Nozzle + +[values] +wall_thickness = =line_width*4 +cool_fan_speed = 40 +retraction_speed = 20 +retraction_amount = 1.6 +material_flow = 94.0 diff --git a/resources/quality/ratrig_base/nylon/ratrig_base_0.4_Nylon_standard.inst.cfg b/resources/quality/ratrig_base/nylon/ratrig_base_0.4_Nylon_standard.inst.cfg new file mode 100644 index 0000000000..9f414288e9 --- /dev/null +++ b/resources/quality/ratrig_base/nylon/ratrig_base_0.4_Nylon_standard.inst.cfg @@ -0,0 +1,18 @@ +[general] +version = 4 +name = Standard Quality +definition = ratrig_base + +[metadata] +setting_version = 22 +type = quality +quality_type = standard +material = generic_nylon +variant = 0.4mm Nozzle + +[values] +wall_thickness = =line_width*4 +cool_fan_speed = 40 +retraction_speed = 20 +retraction_amount = 1.6 +material_flow = 94.0 diff --git a/resources/quality/ratrig_base/nylon/ratrig_base_0.4_Nylon_super.inst.cfg b/resources/quality/ratrig_base/nylon/ratrig_base_0.4_Nylon_super.inst.cfg new file mode 100644 index 0000000000..ef3b84f810 --- /dev/null +++ b/resources/quality/ratrig_base/nylon/ratrig_base_0.4_Nylon_super.inst.cfg @@ -0,0 +1,18 @@ +[general] +version = 4 +name = Super Quality +definition = ratrig_base + +[metadata] +setting_version = 22 +type = quality +quality_type = super +material = generic_nylon +variant = 0.4mm Nozzle + +[values] +wall_thickness = =line_width*4 +cool_fan_speed = 40 +retraction_speed = 20 +retraction_amount = 1.6 +material_flow = 94.0 diff --git a/resources/quality/ratrig_base/nylon/ratrig_base_0.5_Nylon_adaptive.inst.cfg b/resources/quality/ratrig_base/nylon/ratrig_base_0.5_Nylon_adaptive.inst.cfg new file mode 100644 index 0000000000..e3d64001f0 --- /dev/null +++ b/resources/quality/ratrig_base/nylon/ratrig_base_0.5_Nylon_adaptive.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 4 +name = Dynamic Quality +definition = ratrig_base + +[metadata] +setting_version = 22 +type = quality +quality_type = adaptive +material = generic_nylon +variant = 0.5mm Nozzle + +[values] +speed_layer_0 = 15 +wall_thickness = =line_width*4 diff --git a/resources/quality/ratrig_base/nylon/ratrig_base_0.5_Nylon_low.inst.cfg b/resources/quality/ratrig_base/nylon/ratrig_base_0.5_Nylon_low.inst.cfg new file mode 100644 index 0000000000..7468690a7e --- /dev/null +++ b/resources/quality/ratrig_base/nylon/ratrig_base_0.5_Nylon_low.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 4 +name = Low Quality +definition = ratrig_base + +[metadata] +setting_version = 22 +type = quality +quality_type = low +material = generic_nylon +variant = 0.5mm Nozzle + +[values] +speed_layer_0 = 15 +wall_thickness = =line_width*4 diff --git a/resources/quality/ratrig_base/nylon/ratrig_base_0.5_Nylon_standard.inst.cfg b/resources/quality/ratrig_base/nylon/ratrig_base_0.5_Nylon_standard.inst.cfg new file mode 100644 index 0000000000..0a7c369edd --- /dev/null +++ b/resources/quality/ratrig_base/nylon/ratrig_base_0.5_Nylon_standard.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 4 +name = Standard Quality +definition = ratrig_base + +[metadata] +setting_version = 22 +type = quality +quality_type = standard +material = generic_nylon +variant = 0.5mm Nozzle + +[values] +speed_layer_0 = 15 +wall_thickness = =line_width*4 diff --git a/resources/quality/ratrig_base/nylon/ratrig_base_0.5_Nylon_super.inst.cfg b/resources/quality/ratrig_base/nylon/ratrig_base_0.5_Nylon_super.inst.cfg new file mode 100644 index 0000000000..d7cc617a74 --- /dev/null +++ b/resources/quality/ratrig_base/nylon/ratrig_base_0.5_Nylon_super.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 4 +name = Super Quality +definition = ratrig_base + +[metadata] +setting_version = 22 +type = quality +quality_type = super +material = generic_nylon +variant = 0.5mm Nozzle + +[values] +speed_layer_0 = 15 +wall_thickness = =line_width*4 diff --git a/resources/quality/ratrig_base/nylon/ratrig_base_0.6_Nylon_standard.inst.cfg b/resources/quality/ratrig_base/nylon/ratrig_base_0.6_Nylon_standard.inst.cfg new file mode 100644 index 0000000000..bf34041d96 --- /dev/null +++ b/resources/quality/ratrig_base/nylon/ratrig_base_0.6_Nylon_standard.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 4 +name = Standard Quality +definition = ratrig_base + +[metadata] +setting_version = 22 +type = quality +quality_type = standard +material = generic_nylon +variant = 0.6mm Nozzle + +[values] +speed_layer_0 = 15 +wall_thickness = =line_width*3 diff --git a/resources/quality/ratrig_base/nylon/ratrig_base_0.8_Nylon_draft.inst.cfg b/resources/quality/ratrig_base/nylon/ratrig_base_0.8_Nylon_draft.inst.cfg new file mode 100644 index 0000000000..92bc80ceb3 --- /dev/null +++ b/resources/quality/ratrig_base/nylon/ratrig_base_0.8_Nylon_draft.inst.cfg @@ -0,0 +1,16 @@ +[general] +version = 4 +name = Draft Quality +definition = ratrig_base + +[metadata] +setting_version = 22 +type = quality +quality_type = draft +material = generic_nylon +variant = 0.8mm Nozzle + +[values] +speed_layer_0 = 30 +wall_thickness = =line_width*2 +cool_fan_speed = 40 diff --git a/resources/quality/ratrig_base/nylon/ratrig_base_1.0_Nylon_draft.inst.cfg b/resources/quality/ratrig_base/nylon/ratrig_base_1.0_Nylon_draft.inst.cfg new file mode 100644 index 0000000000..860980c0a1 --- /dev/null +++ b/resources/quality/ratrig_base/nylon/ratrig_base_1.0_Nylon_draft.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 4 +name = Draft Quality +definition = ratrig_base + +[metadata] +setting_version = 22 +type = quality +quality_type = draft +material = generic_nylon +variant = 1.0mm Nozzle + +[values] +speed_layer_0 = 15 +wall_thickness = =line_width*3 diff --git a/resources/quality/ratrig_base/petg/ratrig_base_0.2_PETG_super.inst.cfg b/resources/quality/ratrig_base/petg/ratrig_base_0.2_PETG_super.inst.cfg new file mode 100644 index 0000000000..6b0d6caff2 --- /dev/null +++ b/resources/quality/ratrig_base/petg/ratrig_base_0.2_PETG_super.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 4 +name = Super Quality +definition = ratrig_base + +[metadata] +setting_version = 22 +type = quality +quality_type = super +material = generic_petg +variant = 0.2mm Nozzle + +[values] +speed_layer_0 = 15 +wall_thickness = =line_width*8 diff --git a/resources/quality/ratrig_base/petg/ratrig_base_0.2_PETG_ultra.inst.cfg b/resources/quality/ratrig_base/petg/ratrig_base_0.2_PETG_ultra.inst.cfg new file mode 100644 index 0000000000..784001a294 --- /dev/null +++ b/resources/quality/ratrig_base/petg/ratrig_base_0.2_PETG_ultra.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 4 +name = Ultra Quality +definition = ratrig_base + +[metadata] +setting_version = 22 +type = quality +quality_type = ultra +material = generic_petg +variant = 0.2mm Nozzle + +[values] +speed_layer_0 = 15 +wall_thickness = =line_width*8 diff --git a/resources/quality/ratrig_base/petg/ratrig_base_0.3_PETG_adaptive.inst.cfg b/resources/quality/ratrig_base/petg/ratrig_base_0.3_PETG_adaptive.inst.cfg new file mode 100644 index 0000000000..4033896592 --- /dev/null +++ b/resources/quality/ratrig_base/petg/ratrig_base_0.3_PETG_adaptive.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 4 +name = Dynamic Quality +definition = ratrig_base + +[metadata] +setting_version = 22 +type = quality +quality_type = adaptive +material = generic_petg +variant = 0.3mm Nozzle + +[values] +speed_layer_0 = 15 +wall_thickness = =line_width*4 diff --git a/resources/quality/ratrig_base/petg/ratrig_base_0.3_PETG_low.inst.cfg b/resources/quality/ratrig_base/petg/ratrig_base_0.3_PETG_low.inst.cfg new file mode 100644 index 0000000000..aaab545e84 --- /dev/null +++ b/resources/quality/ratrig_base/petg/ratrig_base_0.3_PETG_low.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 4 +name = Low Quality +definition = ratrig_base + +[metadata] +setting_version = 22 +type = quality +quality_type = low +material = generic_petg +variant = 0.3mm Nozzle + +[values] +speed_layer_0 = 15 +wall_thickness = =line_width*4 diff --git a/resources/quality/ratrig_base/petg/ratrig_base_0.3_PETG_standard.inst.cfg b/resources/quality/ratrig_base/petg/ratrig_base_0.3_PETG_standard.inst.cfg new file mode 100644 index 0000000000..6c56665241 --- /dev/null +++ b/resources/quality/ratrig_base/petg/ratrig_base_0.3_PETG_standard.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 4 +name = Standard Quality +definition = ratrig_base + +[metadata] +setting_version = 22 +type = quality +quality_type = standard +material = generic_petg +variant = 0.3mm Nozzle + +[values] +speed_layer_0 = 15 +wall_thickness = =line_width*4 diff --git a/resources/quality/ratrig_base/petg/ratrig_base_0.3_PETG_super.inst.cfg b/resources/quality/ratrig_base/petg/ratrig_base_0.3_PETG_super.inst.cfg new file mode 100644 index 0000000000..5b838bbcb7 --- /dev/null +++ b/resources/quality/ratrig_base/petg/ratrig_base_0.3_PETG_super.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 4 +name = Super Quality +definition = ratrig_base + +[metadata] +setting_version = 22 +type = quality +quality_type = super +material = generic_petg +variant = 0.3mm Nozzle + +[values] +speed_layer_0 = 15 +wall_thickness = =line_width*4 diff --git a/resources/quality/ratrig_base/petg/ratrig_base_0.4_PETG_adaptive.inst.cfg b/resources/quality/ratrig_base/petg/ratrig_base_0.4_PETG_adaptive.inst.cfg new file mode 100644 index 0000000000..5e941ca011 --- /dev/null +++ b/resources/quality/ratrig_base/petg/ratrig_base_0.4_PETG_adaptive.inst.cfg @@ -0,0 +1,18 @@ +[general] +version = 4 +name = Dynamic Quality +definition = ratrig_base + +[metadata] +setting_version = 22 +type = quality +quality_type = adaptive +material = generic_petg +variant = 0.4mm Nozzle + +[values] +wall_thickness = =line_width*4 +cool_fan_speed = 40 +retraction_speed = 20 +retraction_amount = 1.6 +material_flow = 94.0 diff --git a/resources/quality/ratrig_base/petg/ratrig_base_0.4_PETG_low.inst.cfg b/resources/quality/ratrig_base/petg/ratrig_base_0.4_PETG_low.inst.cfg new file mode 100644 index 0000000000..4052b22d10 --- /dev/null +++ b/resources/quality/ratrig_base/petg/ratrig_base_0.4_PETG_low.inst.cfg @@ -0,0 +1,18 @@ +[general] +version = 4 +name = Low Quality +definition = ratrig_base + +[metadata] +setting_version = 22 +type = quality +quality_type = low +material = generic_petg +variant = 0.4mm Nozzle + +[values] +wall_thickness = =line_width*4 +cool_fan_speed = 40 +retraction_speed = 20 +retraction_amount = 1.6 +material_flow = 94.0 diff --git a/resources/quality/ratrig_base/petg/ratrig_base_0.4_PETG_standard.inst.cfg b/resources/quality/ratrig_base/petg/ratrig_base_0.4_PETG_standard.inst.cfg new file mode 100644 index 0000000000..eff9ddabf2 --- /dev/null +++ b/resources/quality/ratrig_base/petg/ratrig_base_0.4_PETG_standard.inst.cfg @@ -0,0 +1,18 @@ +[general] +version = 4 +name = Standard Quality +definition = ratrig_base + +[metadata] +setting_version = 22 +type = quality +quality_type = standard +material = generic_petg +variant = 0.4mm Nozzle + +[values] +wall_thickness = =line_width*4 +cool_fan_speed = 40 +retraction_speed = 20 +retraction_amount = 1.6 +material_flow = 94.0 diff --git a/resources/quality/ratrig_base/petg/ratrig_base_0.4_PETG_super.inst.cfg b/resources/quality/ratrig_base/petg/ratrig_base_0.4_PETG_super.inst.cfg new file mode 100644 index 0000000000..53cd3e7041 --- /dev/null +++ b/resources/quality/ratrig_base/petg/ratrig_base_0.4_PETG_super.inst.cfg @@ -0,0 +1,18 @@ +[general] +version = 4 +name = Super Quality +definition = ratrig_base + +[metadata] +setting_version = 22 +type = quality +quality_type = super +material = generic_petg +variant = 0.4mm Nozzle + +[values] +wall_thickness = =line_width*4 +cool_fan_speed = 40 +retraction_speed = 20 +retraction_amount = 1.6 +material_flow = 94.0 diff --git a/resources/quality/ratrig_base/petg/ratrig_base_0.5_PETG_adaptive.inst.cfg b/resources/quality/ratrig_base/petg/ratrig_base_0.5_PETG_adaptive.inst.cfg new file mode 100644 index 0000000000..58c3531f80 --- /dev/null +++ b/resources/quality/ratrig_base/petg/ratrig_base_0.5_PETG_adaptive.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 4 +name = Dynamic Quality +definition = ratrig_base + +[metadata] +setting_version = 22 +type = quality +quality_type = adaptive +material = generic_petg +variant = 0.5mm Nozzle + +[values] +speed_layer_0 = 15 +wall_thickness = =line_width*4 diff --git a/resources/quality/ratrig_base/petg/ratrig_base_0.5_PETG_low.inst.cfg b/resources/quality/ratrig_base/petg/ratrig_base_0.5_PETG_low.inst.cfg new file mode 100644 index 0000000000..e2c1328fb2 --- /dev/null +++ b/resources/quality/ratrig_base/petg/ratrig_base_0.5_PETG_low.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 4 +name = Low Quality +definition = ratrig_base + +[metadata] +setting_version = 22 +type = quality +quality_type = low +material = generic_petg +variant = 0.5mm Nozzle + +[values] +speed_layer_0 = 15 +wall_thickness = =line_width*4 diff --git a/resources/quality/ratrig_base/petg/ratrig_base_0.5_PETG_standard.inst.cfg b/resources/quality/ratrig_base/petg/ratrig_base_0.5_PETG_standard.inst.cfg new file mode 100644 index 0000000000..35f4a1a08f --- /dev/null +++ b/resources/quality/ratrig_base/petg/ratrig_base_0.5_PETG_standard.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 4 +name = Standard Quality +definition = ratrig_base + +[metadata] +setting_version = 22 +type = quality +quality_type = standard +material = generic_petg +variant = 0.5mm Nozzle + +[values] +speed_layer_0 = 15 +wall_thickness = =line_width*4 diff --git a/resources/quality/ratrig_base/petg/ratrig_base_0.5_PETG_super.inst.cfg b/resources/quality/ratrig_base/petg/ratrig_base_0.5_PETG_super.inst.cfg new file mode 100644 index 0000000000..6b7995b239 --- /dev/null +++ b/resources/quality/ratrig_base/petg/ratrig_base_0.5_PETG_super.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 4 +name = Super Quality +definition = ratrig_base + +[metadata] +setting_version = 22 +type = quality +quality_type = super +material = generic_petg +variant = 0.5mm Nozzle + +[values] +speed_layer_0 = 15 +wall_thickness = =line_width*4 diff --git a/resources/quality/ratrig_base/petg/ratrig_base_0.6_PETG_standard.inst.cfg b/resources/quality/ratrig_base/petg/ratrig_base_0.6_PETG_standard.inst.cfg new file mode 100644 index 0000000000..895fdcacb9 --- /dev/null +++ b/resources/quality/ratrig_base/petg/ratrig_base_0.6_PETG_standard.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 4 +name = Standard Quality +definition = ratrig_base + +[metadata] +setting_version = 22 +type = quality +quality_type = standard +material = generic_petg +variant = 0.6mm Nozzle + +[values] +speed_layer_0 = 15 +wall_thickness = =line_width*3 diff --git a/resources/quality/ratrig_base/petg/ratrig_base_0.8_PETG_draft.inst.cfg b/resources/quality/ratrig_base/petg/ratrig_base_0.8_PETG_draft.inst.cfg new file mode 100644 index 0000000000..a7d04cb10b --- /dev/null +++ b/resources/quality/ratrig_base/petg/ratrig_base_0.8_PETG_draft.inst.cfg @@ -0,0 +1,16 @@ +[general] +version = 4 +name = Draft Quality +definition = ratrig_base + +[metadata] +setting_version = 22 +type = quality +quality_type = draft +material = generic_petg +variant = 0.8mm Nozzle + +[values] +speed_layer_0 = 30 +wall_thickness = =line_width*2 +cool_fan_speed = 40 diff --git a/resources/quality/ratrig_base/petg/ratrig_base_1.0_PETG_draft.inst.cfg b/resources/quality/ratrig_base/petg/ratrig_base_1.0_PETG_draft.inst.cfg new file mode 100644 index 0000000000..8ce4a9fef6 --- /dev/null +++ b/resources/quality/ratrig_base/petg/ratrig_base_1.0_PETG_draft.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 4 +name = Draft Quality +definition = ratrig_base + +[metadata] +setting_version = 22 +type = quality +quality_type = draft +material = generic_petg +variant = 1.0mm Nozzle + +[values] +speed_layer_0 = 15 +wall_thickness = =line_width*3 diff --git a/resources/quality/ratrig_base/pla/ratrig_base_0.2_PLA_super.inst.cfg b/resources/quality/ratrig_base/pla/ratrig_base_0.2_PLA_super.inst.cfg new file mode 100644 index 0000000000..7b009267e3 --- /dev/null +++ b/resources/quality/ratrig_base/pla/ratrig_base_0.2_PLA_super.inst.cfg @@ -0,0 +1,13 @@ +[general] +version = 4 +name = Super Quality +definition = ratrig_base + +[metadata] +setting_version = 22 +type = quality +quality_type = super +material = generic_pla +variant = 0.2mm Nozzle + +[values] diff --git a/resources/quality/ratrig_base/pla/ratrig_base_0.2_PLA_ultra.inst.cfg b/resources/quality/ratrig_base/pla/ratrig_base_0.2_PLA_ultra.inst.cfg new file mode 100644 index 0000000000..1a401148d5 --- /dev/null +++ b/resources/quality/ratrig_base/pla/ratrig_base_0.2_PLA_ultra.inst.cfg @@ -0,0 +1,13 @@ +[general] +version = 4 +name = Ultra Quality +definition = ratrig_base + +[metadata] +setting_version = 22 +type = quality +quality_type = ultra +material = generic_pla +variant = 0.2mm Nozzle + +[values] diff --git a/resources/quality/ratrig_base/pla/ratrig_base_0.3_PLA_adaptive.inst.cfg b/resources/quality/ratrig_base/pla/ratrig_base_0.3_PLA_adaptive.inst.cfg new file mode 100644 index 0000000000..de0067706e --- /dev/null +++ b/resources/quality/ratrig_base/pla/ratrig_base_0.3_PLA_adaptive.inst.cfg @@ -0,0 +1,13 @@ +[general] +version = 4 +name = Dynamic Quality +definition = ratrig_base + +[metadata] +setting_version = 22 +type = quality +quality_type = adaptive +material = generic_pla +variant = 0.3mm Nozzle + +[values] diff --git a/resources/quality/ratrig_base/pla/ratrig_base_0.3_PLA_low.inst.cfg b/resources/quality/ratrig_base/pla/ratrig_base_0.3_PLA_low.inst.cfg new file mode 100644 index 0000000000..31747bda1c --- /dev/null +++ b/resources/quality/ratrig_base/pla/ratrig_base_0.3_PLA_low.inst.cfg @@ -0,0 +1,13 @@ +[general] +version = 4 +name = Low Quality +definition = ratrig_base + +[metadata] +setting_version = 22 +type = quality +quality_type = low +material = generic_pla +variant = 0.3mm Nozzle + +[values] diff --git a/resources/quality/ratrig_base/pla/ratrig_base_0.3_PLA_standard.inst.cfg b/resources/quality/ratrig_base/pla/ratrig_base_0.3_PLA_standard.inst.cfg new file mode 100644 index 0000000000..06000474af --- /dev/null +++ b/resources/quality/ratrig_base/pla/ratrig_base_0.3_PLA_standard.inst.cfg @@ -0,0 +1,13 @@ +[general] +version = 4 +name = Standard Quality +definition = ratrig_base + +[metadata] +setting_version = 22 +type = quality +quality_type = standard +material = generic_pla +variant = 0.3mm Nozzle + +[values] diff --git a/resources/quality/ratrig_base/pla/ratrig_base_0.3_PLA_super.inst.cfg b/resources/quality/ratrig_base/pla/ratrig_base_0.3_PLA_super.inst.cfg new file mode 100644 index 0000000000..24efb55980 --- /dev/null +++ b/resources/quality/ratrig_base/pla/ratrig_base_0.3_PLA_super.inst.cfg @@ -0,0 +1,13 @@ +[general] +version = 4 +name = Super Quality +definition = ratrig_base + +[metadata] +setting_version = 22 +type = quality +quality_type = super +material = generic_pla +variant = 0.3mm Nozzle + +[values] diff --git a/resources/quality/ratrig_base/pla/ratrig_base_0.4_PLA_adaptive.inst.cfg b/resources/quality/ratrig_base/pla/ratrig_base_0.4_PLA_adaptive.inst.cfg new file mode 100644 index 0000000000..de96e7d5fb --- /dev/null +++ b/resources/quality/ratrig_base/pla/ratrig_base_0.4_PLA_adaptive.inst.cfg @@ -0,0 +1,13 @@ +[general] +version = 4 +name = Dynamic Quality +definition = ratrig_base + +[metadata] +setting_version = 22 +type = quality +quality_type = adaptive +material = generic_pla +variant = 0.4mm Nozzle + +[values] diff --git a/resources/quality/ratrig_base/pla/ratrig_base_0.4_PLA_low.inst.cfg b/resources/quality/ratrig_base/pla/ratrig_base_0.4_PLA_low.inst.cfg new file mode 100644 index 0000000000..2e608f8d5c --- /dev/null +++ b/resources/quality/ratrig_base/pla/ratrig_base_0.4_PLA_low.inst.cfg @@ -0,0 +1,13 @@ +[general] +version = 4 +name = Low Quality +definition = ratrig_base + +[metadata] +setting_version = 22 +type = quality +quality_type = low +material = generic_pla +variant = 0.4mm Nozzle + +[values] diff --git a/resources/quality/ratrig_base/pla/ratrig_base_0.4_PLA_standard.inst.cfg b/resources/quality/ratrig_base/pla/ratrig_base_0.4_PLA_standard.inst.cfg new file mode 100644 index 0000000000..5f18e1281b --- /dev/null +++ b/resources/quality/ratrig_base/pla/ratrig_base_0.4_PLA_standard.inst.cfg @@ -0,0 +1,13 @@ +[general] +version = 4 +name = Standard Quality +definition = ratrig_base + +[metadata] +setting_version = 22 +type = quality +quality_type = standard +material = generic_pla +variant = 0.4mm Nozzle + +[values] diff --git a/resources/quality/ratrig_base/pla/ratrig_base_0.4_PLA_super.inst.cfg b/resources/quality/ratrig_base/pla/ratrig_base_0.4_PLA_super.inst.cfg new file mode 100644 index 0000000000..121be5d3cf --- /dev/null +++ b/resources/quality/ratrig_base/pla/ratrig_base_0.4_PLA_super.inst.cfg @@ -0,0 +1,13 @@ +[general] +version = 4 +name = Super Quality +definition = ratrig_base + +[metadata] +setting_version = 22 +type = quality +quality_type = super +material = generic_pla +variant = 0.4mm Nozzle + +[values] diff --git a/resources/quality/ratrig_base/pla/ratrig_base_0.5_PLA_adaptive.inst.cfg b/resources/quality/ratrig_base/pla/ratrig_base_0.5_PLA_adaptive.inst.cfg new file mode 100644 index 0000000000..07dadf89dd --- /dev/null +++ b/resources/quality/ratrig_base/pla/ratrig_base_0.5_PLA_adaptive.inst.cfg @@ -0,0 +1,13 @@ +[general] +version = 4 +name = Dynamic Quality +definition = ratrig_base + +[metadata] +setting_version = 22 +type = quality +quality_type = adaptive +material = generic_pla +variant = 0.5mm Nozzle + +[values] diff --git a/resources/quality/ratrig_base/pla/ratrig_base_0.5_PLA_low.inst.cfg b/resources/quality/ratrig_base/pla/ratrig_base_0.5_PLA_low.inst.cfg new file mode 100644 index 0000000000..7d92038aee --- /dev/null +++ b/resources/quality/ratrig_base/pla/ratrig_base_0.5_PLA_low.inst.cfg @@ -0,0 +1,13 @@ +[general] +version = 4 +name = Low Quality +definition = ratrig_base + +[metadata] +setting_version = 22 +type = quality +quality_type = low +material = generic_pla +variant = 0.5mm Nozzle + +[values] diff --git a/resources/quality/ratrig_base/pla/ratrig_base_0.5_PLA_standard.inst.cfg b/resources/quality/ratrig_base/pla/ratrig_base_0.5_PLA_standard.inst.cfg new file mode 100644 index 0000000000..ed786fb574 --- /dev/null +++ b/resources/quality/ratrig_base/pla/ratrig_base_0.5_PLA_standard.inst.cfg @@ -0,0 +1,13 @@ +[general] +version = 4 +name = Standard Quality +definition = ratrig_base + +[metadata] +setting_version = 22 +type = quality +quality_type = standard +material = generic_pla +variant = 0.5mm Nozzle + +[values] diff --git a/resources/quality/ratrig_base/pla/ratrig_base_0.5_PLA_super.inst.cfg b/resources/quality/ratrig_base/pla/ratrig_base_0.5_PLA_super.inst.cfg new file mode 100644 index 0000000000..ec1c18b046 --- /dev/null +++ b/resources/quality/ratrig_base/pla/ratrig_base_0.5_PLA_super.inst.cfg @@ -0,0 +1,13 @@ +[general] +version = 4 +name = Super Quality +definition = ratrig_base + +[metadata] +setting_version = 22 +type = quality +quality_type = super +material = generic_pla +variant = 0.5mm Nozzle + +[values] diff --git a/resources/quality/ratrig_base/pla/ratrig_base_0.6_PLA_draft.inst.cfg b/resources/quality/ratrig_base/pla/ratrig_base_0.6_PLA_draft.inst.cfg new file mode 100644 index 0000000000..816eaa0e0b --- /dev/null +++ b/resources/quality/ratrig_base/pla/ratrig_base_0.6_PLA_draft.inst.cfg @@ -0,0 +1,13 @@ +[general] +version = 4 +name = Draft Quality +definition = ratrig_base + +[metadata] +setting_version = 22 +type = quality +quality_type = draft +material = generic_pla +variant = 0.6mm Nozzle + +[values] diff --git a/resources/quality/ratrig_base/pla/ratrig_base_0.6_PLA_low.inst.cfg b/resources/quality/ratrig_base/pla/ratrig_base_0.6_PLA_low.inst.cfg new file mode 100644 index 0000000000..0b92dbf172 --- /dev/null +++ b/resources/quality/ratrig_base/pla/ratrig_base_0.6_PLA_low.inst.cfg @@ -0,0 +1,13 @@ +[general] +version = 4 +name = Low Quality +definition = ratrig_base + +[metadata] +setting_version = 22 +type = quality +quality_type = low +material = generic_pla +variant = 0.6mm Nozzle + +[values] diff --git a/resources/quality/ratrig_base/pla/ratrig_base_0.6_PLA_standard.inst.cfg b/resources/quality/ratrig_base/pla/ratrig_base_0.6_PLA_standard.inst.cfg new file mode 100644 index 0000000000..ddd87bec72 --- /dev/null +++ b/resources/quality/ratrig_base/pla/ratrig_base_0.6_PLA_standard.inst.cfg @@ -0,0 +1,13 @@ +[general] +version = 4 +name = Standard Quality +definition = ratrig_base + +[metadata] +setting_version = 22 +type = quality +quality_type = standard +material = generic_pla +variant = 0.6mm Nozzle + +[values] diff --git a/resources/quality/ratrig_base/pla/ratrig_base_0.8_PLA_draft.inst.cfg b/resources/quality/ratrig_base/pla/ratrig_base_0.8_PLA_draft.inst.cfg new file mode 100644 index 0000000000..e1ab1dcab7 --- /dev/null +++ b/resources/quality/ratrig_base/pla/ratrig_base_0.8_PLA_draft.inst.cfg @@ -0,0 +1,13 @@ +[general] +version = 4 +name = Draft Quality +definition = ratrig_base + +[metadata] +setting_version = 22 +type = quality +quality_type = draft +material = generic_pla +variant = 0.8mm Nozzle + +[values] diff --git a/resources/quality/ratrig_base/pla/ratrig_base_1.0_PLA_draft.inst.cfg b/resources/quality/ratrig_base/pla/ratrig_base_1.0_PLA_draft.inst.cfg new file mode 100644 index 0000000000..3dbb26c6ec --- /dev/null +++ b/resources/quality/ratrig_base/pla/ratrig_base_1.0_PLA_draft.inst.cfg @@ -0,0 +1,13 @@ +[general] +version = 4 +name = Draft Quality +definition = ratrig_base + +[metadata] +setting_version = 22 +type = quality +quality_type = draft +material = generic_pla +variant = 1.0mm Nozzle + +[values] diff --git a/resources/quality/ratrig_base/ratrig_base_global_adaptive.inst.cfg b/resources/quality/ratrig_base/ratrig_base_global_adaptive.inst.cfg new file mode 100644 index 0000000000..29786dcdbe --- /dev/null +++ b/resources/quality/ratrig_base/ratrig_base_global_adaptive.inst.cfg @@ -0,0 +1,19 @@ +[general] +version = 4 +name = Dynamic Quality +definition = ratrig_base + +[metadata] +setting_version = 22 +type = quality +quality_type = adaptive +weight = -2 +global_quality = True + +[values] +layer_height = 0.16 +layer_height_0 = 0.20 +top_bottom_thickness = =layer_height_0+layer_height*4 +wall_thickness = =line_width*3 +support_interface_height = =layer_height*6 +adaptive_layer_height_enabled = true diff --git a/resources/quality/ratrig_base/ratrig_base_global_draft.inst.cfg b/resources/quality/ratrig_base/ratrig_base_global_draft.inst.cfg new file mode 100644 index 0000000000..f6fcbb8348 --- /dev/null +++ b/resources/quality/ratrig_base/ratrig_base_global_draft.inst.cfg @@ -0,0 +1,18 @@ +[general] +version = 4 +name = Draft Quality +definition = ratrig_base + +[metadata] +setting_version = 22 +type = quality +quality_type = draft +weight = -5 +global_quality = True + +[values] +layer_height = 0.32 +layer_height_0 = 0.32 +top_bottom_thickness = =layer_height_0+layer_height*3 +wall_thickness = =line_width*2 +support_interface_height = =layer_height*4 diff --git a/resources/quality/ratrig_base/ratrig_base_global_low.inst.cfg b/resources/quality/ratrig_base/ratrig_base_global_low.inst.cfg new file mode 100644 index 0000000000..ad32dcf779 --- /dev/null +++ b/resources/quality/ratrig_base/ratrig_base_global_low.inst.cfg @@ -0,0 +1,18 @@ +[general] +version = 4 +name = Low Quality +definition = ratrig_base + +[metadata] +setting_version = 22 +type = quality +quality_type = low +weight = -4 +global_quality = True + +[values] +layer_height = 0.28 +layer_height_0 = 0.28 +top_bottom_thickness = =layer_height_0+layer_height*3 +wall_thickness = =line_width*2 +support_interface_height = =layer_height*4 diff --git a/resources/quality/ratrig_base/ratrig_base_global_standard.inst.cfg b/resources/quality/ratrig_base/ratrig_base_global_standard.inst.cfg new file mode 100644 index 0000000000..5f31222e11 --- /dev/null +++ b/resources/quality/ratrig_base/ratrig_base_global_standard.inst.cfg @@ -0,0 +1,18 @@ +[general] +version = 4 +name = Standard Quality +definition = ratrig_base + +[metadata] +setting_version = 22 +type = quality +quality_type = standard +weight = -3 +global_quality = True + +[values] +layer_height = 0.2 +layer_height_0 = 0.2 +top_bottom_thickness = =layer_height_0+layer_height*3 +wall_thickness = =line_width*2 +support_interface_height = =layer_height*4 diff --git a/resources/quality/ratrig_base/ratrig_base_global_super.inst.cfg b/resources/quality/ratrig_base/ratrig_base_global_super.inst.cfg new file mode 100644 index 0000000000..3c6460675d --- /dev/null +++ b/resources/quality/ratrig_base/ratrig_base_global_super.inst.cfg @@ -0,0 +1,18 @@ +[general] +version = 4 +name = Super Quality +definition = ratrig_base + +[metadata] +setting_version = 22 +type = quality +quality_type = super +weight = -1 +global_quality = True + +[values] +layer_height = 0.12 +layer_height_0 = 0.12 +top_bottom_thickness = =layer_height_0+layer_height*6 +wall_thickness = =line_width*3 +support_interface_height = =layer_height*8 diff --git a/resources/quality/ratrig_base/ratrig_base_global_ultra.inst.cfg b/resources/quality/ratrig_base/ratrig_base_global_ultra.inst.cfg new file mode 100644 index 0000000000..c1257af094 --- /dev/null +++ b/resources/quality/ratrig_base/ratrig_base_global_ultra.inst.cfg @@ -0,0 +1,18 @@ +[general] +version = 4 +name = Ultra Quality +definition = ratrig_base + +[metadata] +setting_version = 22 +type = quality +quality_type = ultra +weight = 0 +global_quality = True + +[values] +layer_height = 0.08 +layer_height_0 = 0.12 +top_bottom_thickness = =layer_height_0+layer_height*10 +wall_thickness = =line_width*3 +support_interface_height = =layer_height*12 diff --git a/resources/quality/ratrig_base/tpu/ratrig_base_0.3_TPU_adaptive.inst.cfg b/resources/quality/ratrig_base/tpu/ratrig_base_0.3_TPU_adaptive.inst.cfg new file mode 100644 index 0000000000..a7feb4f3e0 --- /dev/null +++ b/resources/quality/ratrig_base/tpu/ratrig_base_0.3_TPU_adaptive.inst.cfg @@ -0,0 +1,13 @@ +[general] +version = 4 +name = Dynamic Quality +definition = ratrig_base + +[metadata] +setting_version = 22 +type = quality +quality_type = adaptive +material = generic_tpu +variant = 0.3mm Nozzle + +[values] diff --git a/resources/quality/ratrig_base/tpu/ratrig_base_0.3_TPU_standard.inst.cfg b/resources/quality/ratrig_base/tpu/ratrig_base_0.3_TPU_standard.inst.cfg new file mode 100644 index 0000000000..de56d84ba8 --- /dev/null +++ b/resources/quality/ratrig_base/tpu/ratrig_base_0.3_TPU_standard.inst.cfg @@ -0,0 +1,13 @@ +[general] +version = 4 +name = Standard Quality +definition = ratrig_base + +[metadata] +setting_version = 22 +type = quality +quality_type = standard +material = generic_tpu +variant = 0.3mm Nozzle + +[values] diff --git a/resources/quality/ratrig_base/tpu/ratrig_base_0.3_TPU_super.inst.cfg b/resources/quality/ratrig_base/tpu/ratrig_base_0.3_TPU_super.inst.cfg new file mode 100644 index 0000000000..2b7b1e711e --- /dev/null +++ b/resources/quality/ratrig_base/tpu/ratrig_base_0.3_TPU_super.inst.cfg @@ -0,0 +1,13 @@ +[general] +version = 4 +name = Super Quality +definition = ratrig_base + +[metadata] +setting_version = 22 +type = quality +quality_type = super +material = generic_tpu +variant = 0.3mm Nozzle + +[values] diff --git a/resources/quality/ratrig_base/tpu/ratrig_base_0.4_TPU_adaptive.inst.cfg b/resources/quality/ratrig_base/tpu/ratrig_base_0.4_TPU_adaptive.inst.cfg new file mode 100644 index 0000000000..dcfc502bae --- /dev/null +++ b/resources/quality/ratrig_base/tpu/ratrig_base_0.4_TPU_adaptive.inst.cfg @@ -0,0 +1,13 @@ +[general] +version = 4 +name = Dynamic Quality +definition = ratrig_base + +[metadata] +setting_version = 22 +type = quality +quality_type = adaptive +material = generic_tpu +variant = 0.4mm Nozzle + +[values] diff --git a/resources/quality/ratrig_base/tpu/ratrig_base_0.4_TPU_standard.inst.cfg b/resources/quality/ratrig_base/tpu/ratrig_base_0.4_TPU_standard.inst.cfg new file mode 100644 index 0000000000..7ff523b68e --- /dev/null +++ b/resources/quality/ratrig_base/tpu/ratrig_base_0.4_TPU_standard.inst.cfg @@ -0,0 +1,13 @@ +[general] +version = 4 +name = Standard Quality +definition = ratrig_base + +[metadata] +setting_version = 22 +type = quality +quality_type = standard +material = generic_tpu +variant = 0.4mm Nozzle + +[values] diff --git a/resources/quality/ratrig_base/tpu/ratrig_base_0.4_TPU_super.inst.cfg b/resources/quality/ratrig_base/tpu/ratrig_base_0.4_TPU_super.inst.cfg new file mode 100644 index 0000000000..a65ad09744 --- /dev/null +++ b/resources/quality/ratrig_base/tpu/ratrig_base_0.4_TPU_super.inst.cfg @@ -0,0 +1,13 @@ +[general] +version = 4 +name = Super Quality +definition = ratrig_base + +[metadata] +setting_version = 22 +type = quality +quality_type = super +material = generic_tpu +variant = 0.4mm Nozzle + +[values] diff --git a/resources/quality/ratrig_base/tpu/ratrig_base_0.5_TPU_adaptive.inst.cfg b/resources/quality/ratrig_base/tpu/ratrig_base_0.5_TPU_adaptive.inst.cfg new file mode 100644 index 0000000000..63e465243d --- /dev/null +++ b/resources/quality/ratrig_base/tpu/ratrig_base_0.5_TPU_adaptive.inst.cfg @@ -0,0 +1,13 @@ +[general] +version = 4 +name = Dynamic Quality +definition = ratrig_base + +[metadata] +setting_version = 22 +type = quality +quality_type = adaptive +material = generic_tpu +variant = 0.5mm Nozzle + +[values] diff --git a/resources/quality/ratrig_base/tpu/ratrig_base_0.5_TPU_standard.inst.cfg b/resources/quality/ratrig_base/tpu/ratrig_base_0.5_TPU_standard.inst.cfg new file mode 100644 index 0000000000..f568375f4c --- /dev/null +++ b/resources/quality/ratrig_base/tpu/ratrig_base_0.5_TPU_standard.inst.cfg @@ -0,0 +1,13 @@ +[general] +version = 4 +name = Standard Quality +definition = ratrig_base + +[metadata] +setting_version = 22 +type = quality +quality_type = standard +material = generic_tpu +variant = 0.5mm Nozzle + +[values] diff --git a/resources/quality/ratrig_base/tpu/ratrig_base_0.5_TPU_super.inst.cfg b/resources/quality/ratrig_base/tpu/ratrig_base_0.5_TPU_super.inst.cfg new file mode 100644 index 0000000000..1265c32061 --- /dev/null +++ b/resources/quality/ratrig_base/tpu/ratrig_base_0.5_TPU_super.inst.cfg @@ -0,0 +1,13 @@ +[general] +version = 4 +name = Super Quality +definition = ratrig_base + +[metadata] +setting_version = 22 +type = quality +quality_type = super +material = generic_tpu +variant = 0.5mm Nozzle + +[values] diff --git a/resources/quality/ratrig_base/tpu/ratrig_base_0.6_TPU_standard.inst.cfg b/resources/quality/ratrig_base/tpu/ratrig_base_0.6_TPU_standard.inst.cfg new file mode 100644 index 0000000000..df3d194177 --- /dev/null +++ b/resources/quality/ratrig_base/tpu/ratrig_base_0.6_TPU_standard.inst.cfg @@ -0,0 +1,13 @@ +[general] +version = 4 +name = Standard Quality +definition = ratrig_base + +[metadata] +setting_version = 22 +type = quality +quality_type = standard +material = generic_tpu +variant = 0.6mm Nozzle + +[values] diff --git a/resources/quality/ratrig_base/tpu/ratrig_base_0.8_TPU_draft.inst.cfg b/resources/quality/ratrig_base/tpu/ratrig_base_0.8_TPU_draft.inst.cfg new file mode 100644 index 0000000000..1db288b6b9 --- /dev/null +++ b/resources/quality/ratrig_base/tpu/ratrig_base_0.8_TPU_draft.inst.cfg @@ -0,0 +1,13 @@ +[general] +version = 4 +name = Draft Quality +definition = ratrig_base + +[metadata] +setting_version = 22 +type = quality +quality_type = draft +material = generic_tpu +variant = 0.8mm Nozzle + +[values] diff --git a/resources/quality/ratrig_base/tpu/ratrig_base_1.0_TPU_draft.inst.cfg b/resources/quality/ratrig_base/tpu/ratrig_base_1.0_TPU_draft.inst.cfg new file mode 100644 index 0000000000..3149efda36 --- /dev/null +++ b/resources/quality/ratrig_base/tpu/ratrig_base_1.0_TPU_draft.inst.cfg @@ -0,0 +1,13 @@ +[general] +version = 4 +name = Draft Quality +definition = ratrig_base + +[metadata] +setting_version = 22 +type = quality +quality_type = draft +material = generic_tpu +variant = 1.0mm Nozzle + +[values] diff --git a/resources/variants/ratrig/ratrig_base_0.2.inst.cfg b/resources/variants/ratrig/ratrig_base_0.2.inst.cfg new file mode 100644 index 0000000000..752f0fc7b3 --- /dev/null +++ b/resources/variants/ratrig/ratrig_base_0.2.inst.cfg @@ -0,0 +1,12 @@ +[general] +name = 0.2mm Nozzle +version = 4 +definition = ratrig_base + +[metadata] +setting_version = 22 +type = variant +hardware_type = nozzle + +[values] +machine_nozzle_size = 0.2 diff --git a/resources/variants/ratrig/ratrig_base_0.3.inst.cfg b/resources/variants/ratrig/ratrig_base_0.3.inst.cfg new file mode 100644 index 0000000000..2ad677756d --- /dev/null +++ b/resources/variants/ratrig/ratrig_base_0.3.inst.cfg @@ -0,0 +1,12 @@ +[general] +name = 0.3mm Nozzle +version = 4 +definition = ratrig_base + +[metadata] +setting_version = 22 +type = variant +hardware_type = nozzle + +[values] +machine_nozzle_size = 0.3 diff --git a/resources/variants/ratrig/ratrig_base_0.4.inst.cfg b/resources/variants/ratrig/ratrig_base_0.4.inst.cfg new file mode 100644 index 0000000000..652ae2b4c7 --- /dev/null +++ b/resources/variants/ratrig/ratrig_base_0.4.inst.cfg @@ -0,0 +1,12 @@ +[general] +name = 0.4mm Nozzle +version = 4 +definition = ratrig_base + +[metadata] +setting_version = 22 +type = variant +hardware_type = nozzle + +[values] +machine_nozzle_size = 0.4 diff --git a/resources/variants/ratrig/ratrig_base_0.6.inst.cfg b/resources/variants/ratrig/ratrig_base_0.6.inst.cfg new file mode 100644 index 0000000000..9316e0d850 --- /dev/null +++ b/resources/variants/ratrig/ratrig_base_0.6.inst.cfg @@ -0,0 +1,12 @@ +[general] +name = 0.6mm Nozzle +version = 4 +definition = ratrig_base + +[metadata] +setting_version = 22 +type = variant +hardware_type = nozzle + +[values] +machine_nozzle_size = 0.6 diff --git a/resources/variants/ratrig/ratrig_base_0.8.inst.cfg b/resources/variants/ratrig/ratrig_base_0.8.inst.cfg new file mode 100644 index 0000000000..ce329c7d6d --- /dev/null +++ b/resources/variants/ratrig/ratrig_base_0.8.inst.cfg @@ -0,0 +1,12 @@ +[general] +name = 0.8mm Nozzle +version = 4 +definition = ratrig_base + +[metadata] +setting_version = 22 +type = variant +hardware_type = nozzle + +[values] +machine_nozzle_size = 0.8 diff --git a/resources/variants/ratrig/ratrig_base_1.0.inst.cfg b/resources/variants/ratrig/ratrig_base_1.0.inst.cfg new file mode 100644 index 0000000000..c1b643b60e --- /dev/null +++ b/resources/variants/ratrig/ratrig_base_1.0.inst.cfg @@ -0,0 +1,12 @@ +[general] +name = 1.0mm Nozzle +version = 4 +definition = ratrig_base + +[metadata] +setting_version = 22 +type = variant +hardware_type = nozzle + +[values] +machine_nozzle_size = 1.0 diff --git a/resources/variants/ratrig/ratrig_vcore3_200_0.2.inst.cfg b/resources/variants/ratrig/ratrig_vcore3_200_0.2.inst.cfg new file mode 100644 index 0000000000..d3ae97b4d4 --- /dev/null +++ b/resources/variants/ratrig/ratrig_vcore3_200_0.2.inst.cfg @@ -0,0 +1,12 @@ +[general] +name = 0.2mm Nozzle +version = 4 +definition = ratrig_vcore3_200 + +[metadata] +setting_version = 22 +type = variant +hardware_type = nozzle + +[values] +machine_nozzle_size = 0.2 diff --git a/resources/variants/ratrig/ratrig_vcore3_200_0.3.inst.cfg b/resources/variants/ratrig/ratrig_vcore3_200_0.3.inst.cfg new file mode 100644 index 0000000000..ad5127866b --- /dev/null +++ b/resources/variants/ratrig/ratrig_vcore3_200_0.3.inst.cfg @@ -0,0 +1,12 @@ +[general] +name = 0.3mm Nozzle +version = 4 +definition = ratrig_vcore3_200 + +[metadata] +setting_version = 22 +type = variant +hardware_type = nozzle + +[values] +machine_nozzle_size = 0.3 diff --git a/resources/variants/ratrig/ratrig_vcore3_200_0.4.inst.cfg b/resources/variants/ratrig/ratrig_vcore3_200_0.4.inst.cfg new file mode 100644 index 0000000000..dc46c98586 --- /dev/null +++ b/resources/variants/ratrig/ratrig_vcore3_200_0.4.inst.cfg @@ -0,0 +1,12 @@ +[general] +name = 0.4mm Nozzle +version = 4 +definition = ratrig_vcore3_200 + +[metadata] +setting_version = 22 +type = variant +hardware_type = nozzle + +[values] +machine_nozzle_size = 0.4 diff --git a/resources/variants/ratrig/ratrig_vcore3_200_0.6.inst.cfg b/resources/variants/ratrig/ratrig_vcore3_200_0.6.inst.cfg new file mode 100644 index 0000000000..24bcfdf234 --- /dev/null +++ b/resources/variants/ratrig/ratrig_vcore3_200_0.6.inst.cfg @@ -0,0 +1,12 @@ +[general] +name = 0.6mm Nozzle +version = 4 +definition = ratrig_vcore3_200 + +[metadata] +setting_version = 22 +type = variant +hardware_type = nozzle + +[values] +machine_nozzle_size = 0.6 diff --git a/resources/variants/ratrig/ratrig_vcore3_200_0.8.inst.cfg b/resources/variants/ratrig/ratrig_vcore3_200_0.8.inst.cfg new file mode 100644 index 0000000000..dc0d5b87e6 --- /dev/null +++ b/resources/variants/ratrig/ratrig_vcore3_200_0.8.inst.cfg @@ -0,0 +1,12 @@ +[general] +name = 0.8mm Nozzle +version = 4 +definition = ratrig_vcore3_200 + +[metadata] +setting_version = 22 +type = variant +hardware_type = nozzle + +[values] +machine_nozzle_size = 0.8 diff --git a/resources/variants/ratrig/ratrig_vcore3_200_1.0.inst.cfg b/resources/variants/ratrig/ratrig_vcore3_200_1.0.inst.cfg new file mode 100644 index 0000000000..fa07e194ee --- /dev/null +++ b/resources/variants/ratrig/ratrig_vcore3_200_1.0.inst.cfg @@ -0,0 +1,12 @@ +[general] +name = 1.0mm Nozzle +version = 4 +definition = ratrig_vcore3_200 + +[metadata] +setting_version = 22 +type = variant +hardware_type = nozzle + +[values] +machine_nozzle_size = 1.0 diff --git a/resources/variants/ratrig/ratrig_vcore3_300_0.2.inst.cfg b/resources/variants/ratrig/ratrig_vcore3_300_0.2.inst.cfg new file mode 100644 index 0000000000..f7e73d584d --- /dev/null +++ b/resources/variants/ratrig/ratrig_vcore3_300_0.2.inst.cfg @@ -0,0 +1,12 @@ +[general] +name = 0.2mm Nozzle +version = 4 +definition = ratrig_vcore3_300 + +[metadata] +setting_version = 22 +type = variant +hardware_type = nozzle + +[values] +machine_nozzle_size = 0.2 diff --git a/resources/variants/ratrig/ratrig_vcore3_300_0.3.inst.cfg b/resources/variants/ratrig/ratrig_vcore3_300_0.3.inst.cfg new file mode 100644 index 0000000000..a3d8ccc385 --- /dev/null +++ b/resources/variants/ratrig/ratrig_vcore3_300_0.3.inst.cfg @@ -0,0 +1,12 @@ +[general] +name = 0.3mm Nozzle +version = 4 +definition = ratrig_vcore3_300 + +[metadata] +setting_version = 22 +type = variant +hardware_type = nozzle + +[values] +machine_nozzle_size = 0.3 diff --git a/resources/variants/ratrig/ratrig_vcore3_300_0.4.inst.cfg b/resources/variants/ratrig/ratrig_vcore3_300_0.4.inst.cfg new file mode 100644 index 0000000000..aa60d45930 --- /dev/null +++ b/resources/variants/ratrig/ratrig_vcore3_300_0.4.inst.cfg @@ -0,0 +1,12 @@ +[general] +name = 0.4mm Nozzle +version = 4 +definition = ratrig_vcore3_300 + +[metadata] +setting_version = 22 +type = variant +hardware_type = nozzle + +[values] +machine_nozzle_size = 0.4 diff --git a/resources/variants/ratrig/ratrig_vcore3_300_0.6.inst.cfg b/resources/variants/ratrig/ratrig_vcore3_300_0.6.inst.cfg new file mode 100644 index 0000000000..cd036160ee --- /dev/null +++ b/resources/variants/ratrig/ratrig_vcore3_300_0.6.inst.cfg @@ -0,0 +1,12 @@ +[general] +name = 0.6mm Nozzle +version = 4 +definition = ratrig_vcore3_300 + +[metadata] +setting_version = 22 +type = variant +hardware_type = nozzle + +[values] +machine_nozzle_size = 0.6 diff --git a/resources/variants/ratrig/ratrig_vcore3_300_0.8.inst.cfg b/resources/variants/ratrig/ratrig_vcore3_300_0.8.inst.cfg new file mode 100644 index 0000000000..a9c568738f --- /dev/null +++ b/resources/variants/ratrig/ratrig_vcore3_300_0.8.inst.cfg @@ -0,0 +1,12 @@ +[general] +name = 0.8mm Nozzle +version = 4 +definition = ratrig_vcore3_300 + +[metadata] +setting_version = 22 +type = variant +hardware_type = nozzle + +[values] +machine_nozzle_size = 0.8 diff --git a/resources/variants/ratrig/ratrig_vcore3_300_1.0.inst.cfg b/resources/variants/ratrig/ratrig_vcore3_300_1.0.inst.cfg new file mode 100644 index 0000000000..96216c6679 --- /dev/null +++ b/resources/variants/ratrig/ratrig_vcore3_300_1.0.inst.cfg @@ -0,0 +1,12 @@ +[general] +name = 1.0mm Nozzle +version = 4 +definition = ratrig_vcore3_300 + +[metadata] +setting_version = 22 +type = variant +hardware_type = nozzle + +[values] +machine_nozzle_size = 1.0 diff --git a/resources/variants/ratrig/ratrig_vcore3_400_0.2.inst.cfg b/resources/variants/ratrig/ratrig_vcore3_400_0.2.inst.cfg new file mode 100644 index 0000000000..73cf813b9e --- /dev/null +++ b/resources/variants/ratrig/ratrig_vcore3_400_0.2.inst.cfg @@ -0,0 +1,12 @@ +[general] +name = 0.2mm Nozzle +version = 4 +definition = ratrig_vcore3_400 + +[metadata] +setting_version = 22 +type = variant +hardware_type = nozzle + +[values] +machine_nozzle_size = 0.2 diff --git a/resources/variants/ratrig/ratrig_vcore3_400_0.3.inst.cfg b/resources/variants/ratrig/ratrig_vcore3_400_0.3.inst.cfg new file mode 100644 index 0000000000..97a30ccae3 --- /dev/null +++ b/resources/variants/ratrig/ratrig_vcore3_400_0.3.inst.cfg @@ -0,0 +1,12 @@ +[general] +name = 0.3mm Nozzle +version = 4 +definition = ratrig_vcore3_400 + +[metadata] +setting_version = 22 +type = variant +hardware_type = nozzle + +[values] +machine_nozzle_size = 0.3 diff --git a/resources/variants/ratrig/ratrig_vcore3_400_0.4.inst.cfg b/resources/variants/ratrig/ratrig_vcore3_400_0.4.inst.cfg new file mode 100644 index 0000000000..3872109417 --- /dev/null +++ b/resources/variants/ratrig/ratrig_vcore3_400_0.4.inst.cfg @@ -0,0 +1,12 @@ +[general] +name = 0.4mm Nozzle +version = 4 +definition = ratrig_vcore3_400 + +[metadata] +setting_version = 22 +type = variant +hardware_type = nozzle + +[values] +machine_nozzle_size = 0.4 diff --git a/resources/variants/ratrig/ratrig_vcore3_400_0.6.inst.cfg b/resources/variants/ratrig/ratrig_vcore3_400_0.6.inst.cfg new file mode 100644 index 0000000000..bacbc75279 --- /dev/null +++ b/resources/variants/ratrig/ratrig_vcore3_400_0.6.inst.cfg @@ -0,0 +1,12 @@ +[general] +name = 0.6mm Nozzle +version = 4 +definition = ratrig_vcore3_400 + +[metadata] +setting_version = 22 +type = variant +hardware_type = nozzle + +[values] +machine_nozzle_size = 0.6 diff --git a/resources/variants/ratrig/ratrig_vcore3_400_0.8.inst.cfg b/resources/variants/ratrig/ratrig_vcore3_400_0.8.inst.cfg new file mode 100644 index 0000000000..96e1f89d1a --- /dev/null +++ b/resources/variants/ratrig/ratrig_vcore3_400_0.8.inst.cfg @@ -0,0 +1,12 @@ +[general] +name = 0.8mm Nozzle +version = 4 +definition = ratrig_vcore3_400 + +[metadata] +setting_version = 22 +type = variant +hardware_type = nozzle + +[values] +machine_nozzle_size = 0.8 diff --git a/resources/variants/ratrig/ratrig_vcore3_400_1.0.inst.cfg b/resources/variants/ratrig/ratrig_vcore3_400_1.0.inst.cfg new file mode 100644 index 0000000000..516ab97275 --- /dev/null +++ b/resources/variants/ratrig/ratrig_vcore3_400_1.0.inst.cfg @@ -0,0 +1,12 @@ +[general] +name = 1.0mm Nozzle +version = 4 +definition = ratrig_vcore3_400 + +[metadata] +setting_version = 22 +type = variant +hardware_type = nozzle + +[values] +machine_nozzle_size = 1.0 diff --git a/resources/variants/ratrig/ratrig_vcore3_500_0.2.inst.cfg b/resources/variants/ratrig/ratrig_vcore3_500_0.2.inst.cfg new file mode 100644 index 0000000000..5d8f552d62 --- /dev/null +++ b/resources/variants/ratrig/ratrig_vcore3_500_0.2.inst.cfg @@ -0,0 +1,12 @@ +[general] +name = 0.2mm Nozzle +version = 4 +definition = ratrig_vcore3_500 + +[metadata] +setting_version = 22 +type = variant +hardware_type = nozzle + +[values] +machine_nozzle_size = 0.2 diff --git a/resources/variants/ratrig/ratrig_vcore3_500_0.3.inst.cfg b/resources/variants/ratrig/ratrig_vcore3_500_0.3.inst.cfg new file mode 100644 index 0000000000..89773c5026 --- /dev/null +++ b/resources/variants/ratrig/ratrig_vcore3_500_0.3.inst.cfg @@ -0,0 +1,12 @@ +[general] +name = 0.3mm Nozzle +version = 4 +definition = ratrig_vcore3_500 + +[metadata] +setting_version = 22 +type = variant +hardware_type = nozzle + +[values] +machine_nozzle_size = 0.3 diff --git a/resources/variants/ratrig/ratrig_vcore3_500_0.4.inst.cfg b/resources/variants/ratrig/ratrig_vcore3_500_0.4.inst.cfg new file mode 100644 index 0000000000..4d97550b3e --- /dev/null +++ b/resources/variants/ratrig/ratrig_vcore3_500_0.4.inst.cfg @@ -0,0 +1,12 @@ +[general] +name = 0.4mm Nozzle +version = 4 +definition = ratrig_vcore3_500 + +[metadata] +setting_version = 22 +type = variant +hardware_type = nozzle + +[values] +machine_nozzle_size = 0.4 diff --git a/resources/variants/ratrig/ratrig_vcore3_500_0.6.inst.cfg b/resources/variants/ratrig/ratrig_vcore3_500_0.6.inst.cfg new file mode 100644 index 0000000000..2092d5c76a --- /dev/null +++ b/resources/variants/ratrig/ratrig_vcore3_500_0.6.inst.cfg @@ -0,0 +1,12 @@ +[general] +name = 0.6mm Nozzle +version = 4 +definition = ratrig_vcore3_500 + +[metadata] +setting_version = 22 +type = variant +hardware_type = nozzle + +[values] +machine_nozzle_size = 0.6 diff --git a/resources/variants/ratrig/ratrig_vcore3_500_0.8.inst.cfg b/resources/variants/ratrig/ratrig_vcore3_500_0.8.inst.cfg new file mode 100644 index 0000000000..9810346ad6 --- /dev/null +++ b/resources/variants/ratrig/ratrig_vcore3_500_0.8.inst.cfg @@ -0,0 +1,12 @@ +[general] +name = 0.8mm Nozzle +version = 4 +definition = ratrig_vcore3_500 + +[metadata] +setting_version = 22 +type = variant +hardware_type = nozzle + +[values] +machine_nozzle_size = 0.8 diff --git a/resources/variants/ratrig/ratrig_vcore3_500_1.0.inst.cfg b/resources/variants/ratrig/ratrig_vcore3_500_1.0.inst.cfg new file mode 100644 index 0000000000..cc790cc53e --- /dev/null +++ b/resources/variants/ratrig/ratrig_vcore3_500_1.0.inst.cfg @@ -0,0 +1,12 @@ +[general] +name = 1.0mm Nozzle +version = 4 +definition = ratrig_vcore3_500 + +[metadata] +setting_version = 22 +type = variant +hardware_type = nozzle + +[values] +machine_nozzle_size = 1.0 diff --git a/resources/variants/ratrig/ratrig_vminion_0.2.inst.cfg b/resources/variants/ratrig/ratrig_vminion_0.2.inst.cfg new file mode 100644 index 0000000000..0a90304e94 --- /dev/null +++ b/resources/variants/ratrig/ratrig_vminion_0.2.inst.cfg @@ -0,0 +1,12 @@ +[general] +name = 0.2mm Nozzle +version = 4 +definition = ratrig_vminion + +[metadata] +setting_version = 22 +type = variant +hardware_type = nozzle + +[values] +machine_nozzle_size = 0.2 diff --git a/resources/variants/ratrig/ratrig_vminion_0.3.inst.cfg b/resources/variants/ratrig/ratrig_vminion_0.3.inst.cfg new file mode 100644 index 0000000000..36c7d9bbca --- /dev/null +++ b/resources/variants/ratrig/ratrig_vminion_0.3.inst.cfg @@ -0,0 +1,12 @@ +[general] +name = 0.3mm Nozzle +version = 4 +definition = ratrig_vminion + +[metadata] +setting_version = 22 +type = variant +hardware_type = nozzle + +[values] +machine_nozzle_size = 0.3 diff --git a/resources/variants/ratrig/ratrig_vminion_0.4.inst.cfg b/resources/variants/ratrig/ratrig_vminion_0.4.inst.cfg new file mode 100644 index 0000000000..50bcd8f69b --- /dev/null +++ b/resources/variants/ratrig/ratrig_vminion_0.4.inst.cfg @@ -0,0 +1,12 @@ +[general] +name = 0.4mm Nozzle +version = 4 +definition = ratrig_vminion + +[metadata] +setting_version = 22 +type = variant +hardware_type = nozzle + +[values] +machine_nozzle_size = 0.4 diff --git a/resources/variants/ratrig/ratrig_vminion_0.6.inst.cfg b/resources/variants/ratrig/ratrig_vminion_0.6.inst.cfg new file mode 100644 index 0000000000..c4ab87616a --- /dev/null +++ b/resources/variants/ratrig/ratrig_vminion_0.6.inst.cfg @@ -0,0 +1,12 @@ +[general] +name = 0.6mm Nozzle +version = 4 +definition = ratrig_vminion + +[metadata] +setting_version = 22 +type = variant +hardware_type = nozzle + +[values] +machine_nozzle_size = 0.6 diff --git a/resources/variants/ratrig/ratrig_vminion_0.8.inst.cfg b/resources/variants/ratrig/ratrig_vminion_0.8.inst.cfg new file mode 100644 index 0000000000..8fb2a33b60 --- /dev/null +++ b/resources/variants/ratrig/ratrig_vminion_0.8.inst.cfg @@ -0,0 +1,12 @@ +[general] +name = 0.8mm Nozzle +version = 4 +definition = ratrig_vminion + +[metadata] +setting_version = 22 +type = variant +hardware_type = nozzle + +[values] +machine_nozzle_size = 0.8 diff --git a/resources/variants/ratrig/ratrig_vminion_1.0.inst.cfg b/resources/variants/ratrig/ratrig_vminion_1.0.inst.cfg new file mode 100644 index 0000000000..c946cfd5f0 --- /dev/null +++ b/resources/variants/ratrig/ratrig_vminion_1.0.inst.cfg @@ -0,0 +1,12 @@ +[general] +name = 1.0mm Nozzle +version = 4 +definition = ratrig_vminion + +[metadata] +setting_version = 22 +type = variant +hardware_type = nozzle + +[values] +machine_nozzle_size = 1.0 From da4f675008a61ff1602e74ed14838cc41ad5d9b3 Mon Sep 17 00:00:00 2001 From: "c.lamboo" Date: Sat, 6 Jan 2024 16:39:04 +0100 Subject: [PATCH 102/182] Optimize wall printing order CURA-11507 --- 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 cf2b7a57af..2b37b3d7ac 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1159,7 +1159,7 @@ "label": "Optimize Wall Printing Order", "description": "Optimize the order in which walls are printed so as to reduce the number of retractions and the distance travelled. Most parts will benefit from this being enabled but some may actually take longer so please compare the print time estimates with and without optimization. First layer is not optimized when choosing brim as build plate adhesion type.", "type": "bool", - "default_value": false, + "default_value": true, "settable_per_mesh": true }, "inset_direction": From 18302d6213788ad49438876833b650ad40546895 Mon Sep 17 00:00:00 2001 From: "c.lamboo" Date: Sun, 7 Jan 2024 11:10:22 +0100 Subject: [PATCH 103/182] attempt to fix binary search --- plugins/SimulationView/SimulationView.py | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/plugins/SimulationView/SimulationView.py b/plugins/SimulationView/SimulationView.py index 92a6a9e853..c070c69939 100644 --- a/plugins/SimulationView/SimulationView.py +++ b/plugins/SimulationView/SimulationView.py @@ -97,7 +97,8 @@ class SimulationView(CuraView): self._min_line_width = sys.float_info.max self._min_flow_rate = sys.float_info.max self._max_flow_rate = sys.float_info.min - self._cumulative_line_duration = {} + self._cumulative_line_duration_layer: Optional[int] = None + self._cumulative_line_duration: List[float] = [] self._global_container_stack: Optional[ContainerStack] = None self._proxy = None @@ -196,7 +197,7 @@ class SimulationView(CuraView): if len(cumulative_line_duration) > 0: self._current_time = time left_i = 0 - right_i = self._max_paths - 1 + right_i = len(cumulative_line_duration) - 1 total_duration = cumulative_line_duration[-1] # make an educated guess about where to start i = int(right_i * max(0.0, min(1.0, self._current_time / total_duration))) @@ -212,7 +213,8 @@ class SimulationView(CuraView): right_value = cumulative_line_duration[i] if not (left_value <= self._current_time <= right_value): - Logger.debug(f"At index {i}: left value {left_value} right value {right_value} and current time is {self._current_time}") + Logger.warn( + f"Binary search error (out of bounds): index {i}: left value {left_value} right value {right_value} and current time is {self._current_time}") fractional_value = (self._current_time - left_value) / (right_value - left_value) @@ -245,21 +247,22 @@ class SimulationView(CuraView): def cumulativeLineDuration(self) -> List[float]: # Make sure _cumulative_line_duration is initialized properly - if self.getCurrentLayer() not in self._cumulative_line_duration: + if self.getCurrentLayer() != self._cumulative_line_duration_layer: #clear cache - self._cumulative_line_duration = {} - self._cumulative_line_duration[self.getCurrentLayer()] = [] + self._cumulative_line_duration = [] total_duration = 0.0 polylines = self.getLayerData() if polylines is not None: for polyline in polylines.polygons: for line_duration in list((polyline.lineLengths / polyline.lineFeedrates)[0]): total_duration += line_duration / SimulationView.SIMULATION_FACTOR - self._cumulative_line_duration[self.getCurrentLayer()].append(total_duration) + self._cumulative_line_duration.append(total_duration) # for tool change we add an extra tool path - self._cumulative_line_duration[self.getCurrentLayer()].append(total_duration) + self._cumulative_line_duration.append(total_duration) + # set current cached layer + self._cumulative_line_duration_layer = self.getCurrentLayer() - return self._cumulative_line_duration[self.getCurrentLayer()] + return self._cumulative_line_duration def getLayerData(self) -> Optional["LayerData"]: scene = self.getController().getScene() From 1a5370d2efd67ef7a5dc5eace7da94152f7946e9 Mon Sep 17 00:00:00 2001 From: GregValiant <64202104+GregValiant@users.noreply.github.com> Date: Sun, 7 Jan 2024 12:41:59 +0100 Subject: [PATCH 104/182] Add 'Advanced Cooling Fan Control' post-processing script. See discussions in #15853 (on github) and (internally) tracking-ticket CURA-11520 --- .../scripts/AddCoolingProfile.py | 879 ++++++++++++++++++ 1 file changed, 879 insertions(+) create mode 100644 plugins/PostProcessingPlugin/scripts/AddCoolingProfile.py diff --git a/plugins/PostProcessingPlugin/scripts/AddCoolingProfile.py b/plugins/PostProcessingPlugin/scripts/AddCoolingProfile.py new file mode 100644 index 0000000000..6f9ac2dc13 --- /dev/null +++ b/plugins/PostProcessingPlugin/scripts/AddCoolingProfile.py @@ -0,0 +1,879 @@ +# January 2023 by GregValiant (Greg Foresi). +# Functions: +# Remove all fan speed lines from the file (optional). +# Enter new M106 lines "By Layer" or "By Feature" (;TYPE:WALL-OUTER, etc.). +# A Starting layer and/or an Ending layer can be defined. +# Fan speeds are scaled PWM (0 - 255) or RepRap (0 - 1) depending on {machine_scale_fan_speed_zero_to_one}. +# A minimum fan speed of 12% is enforced. +# If multiple extruders have separate fan circuits the speeds are set at tool changes and conform to the layer or +# feature setting. There is support for up to 4 layer cooling fan circuits. +# The option for whether or not to remove the existing M106 lines is added to allow multiple instances of this post-processor to be installed without the followup instances wiping out the insertions of previous instances. 1/3 of a file can be 'By Layer' and the second third 'By Feature', and end up with 'By Layer' again. +# My design intent was to make it as full featured and "industrial strength" as I could. +# My thanks to @5axes, @fieldOfView(@AHoeben), @Ghostkeeper, and @Torgeir. +# 9/14/23 added support for One-at-a-Time and removed the kick out code +# 12/15/23 split off some functions. Revised the regex replacements. + +from ..Script import Script +from UM.Application import Application +import re + +class AddCoolingProfile(Script): + + def getSettingDataString(self): + return """{ + "name": "Advanced Cooling Fan Control", + "key": "AddCoolingProfile", + "metadata": {}, + "version": 2, + "settings": + { + "fan_layer_or_feature": + { + "label": "Cooling Control by:", + "description": "A fan percentage of ''0'' turns the fan off. Minimum Fan is 12% (when on). All layer entries are the Cura Preview number. ''By Layer'': Enter as ''Layer#/Fan%'' (foreslash is the delimiter). Your final layer speed will continue to the end of the Gcode. ''By Feature'': If you enable an 'End Layer' then the ''Final %'' is available and is the speed that will finish the file. 'By Feature' is better for large slow prints than it is for short fast prints.", + "type": "enum", + "options": { + "by_layer": "Layer Numbers", + "by_feature": "Feature Types"}, + "default_value": "by_layer" + }, + "delete_existing_m106": + { + "label": "Remove M106 lines prior to inserting new.", + "description": "If you have 2 or more instances of 'Advanced Cooling Fan Control' running (to cool a portion of a print differently), then uncheck this box or the followup instances will remove all the lines inserted by the first instance. Pay attention to the Start and Stop layers. If you want to keep the Cura inserted lines up to the point where this post-processor will start making insertions, then un-check the box.", + "type": "bool", + "enabled": true, + "value": true + }, + "feature_fan_start_layer": + { + "label": "Starting Layer", + "description": "Layer to start the insertion at. Use the Cura preview numbers. Changes will begin at the start of that layer.", + "type": "int", + "default_value": 5, + "minimum_value": 1, + "unit": "Lay# ", + "enabled": "fan_layer_or_feature == 'by_feature'" + }, + "feature_fan_end_layer": + { + "label": "Ending Layer", + "description": "Layer to complete the insertion at. Enter '-1' for the entire file or enter a layer number. Insertions will stop at the END of this layer. If you set an End Layer then you should set the Final % that will finish the file", + "type": "int", + "default_value": -1, + "minimum_value": -1, + "unit": "Lay# ", + "enabled": "fan_layer_or_feature == 'by_feature'" + }, + "layer_fan_1st": + { + "label": "Layer/Percent #1", + "description": "Enter as: 'LAYER / Percent' Ex: 57/100 with the layer first, then a '/' to delimit, and then the fan percentage.", + "type": "str", + "default_value": "5/30", + "unit": "L#/% ", + "enabled": "fan_layer_or_feature == 'by_layer'" + }, + "layer_fan_2nd": + { + "label": "Layer/Percent #2", + "description": "Enter as: 'LAYER / Percent' Ex: 57/100 with the layer first, then a '/' to delimit, and then the fan percentage.", + "type": "str", + "default_value": "", + "unit": "L#/% ", + "enabled": "fan_layer_or_feature == 'by_layer'" + }, + "layer_fan_3rd": + { + "label": "Layer/Percent #3", + "description": "Enter as: 'LAYER / Percent' Ex: 57/100 with the layer first, then a '/' to delimit, and then the fan percentage.", + "type": "str", + "default_value": "", + "unit": "L#/% ", + "enabled": "fan_layer_or_feature == 'by_layer'" + }, + "layer_fan_4th": + { + "label": "Layer/Percent #4", + "description": "Enter as: 'LAYER / Percent' Ex: 57/100 with the layer first, then a '/' to delimit, and then the fan percentage.", + "type": "str", + "default_value": "", + "unit": "L#/% ", + "enabled": "fan_layer_or_feature == 'by_layer'" + }, + "layer_fan_5th": + { + "label": "Layer/Percent #5", + "description": "Enter as: 'LAYER / Percent' Ex: 57/100 with the layer first, then a '/' to delimit, and then the fan percentage.", + "type": "str", + "default_value": "", + "unit": "L#/% ", + "enabled": "fan_layer_or_feature == 'by_layer'" + }, + "layer_fan_6th": + { + "label": "Layer/Percent #6", + "description": "Enter as: 'LAYER / Percent' Ex: 57/100 with the layer first, then a '/' to delimit, and then the fan percentage.", + "type": "str", + "default_value": "", + "unit": "L#/% ", + "enabled": "fan_layer_or_feature == 'by_layer'" + }, + "layer_fan_7th": + { + "label": "Layer/Percent #7", + "description": "Enter as: 'LAYER / Percent' Ex: 57/100 with the layer first, then a '/' to delimit, and then the fan percentage.", + "type": "str", + "default_value": "", + "unit": "L#/% ", + "enabled": "fan_layer_or_feature == 'by_layer'" + }, + "layer_fan_8th": + { + "label": "Layer/Percent #8", + "description": "Enter as: 'LAYER / Percent' Ex: 57/100 with the layer first, then a '/' to delimit, and then the fan percentage.", + "type": "str", + "default_value": "", + "unit": "L#/% ", + "enabled": "fan_layer_or_feature == 'by_layer'" + }, + "feature_fan_skirt": + { + "label": "Skirt/Brim/Ooze Shield %", + "description": "Enter the fan percentage for skirt/brim. If you are starting at a layer above 1 then this setting only affects Ooze Shields and from the Start layer up.", + "type": "int", + "default_value": 0, + "minimum_value": 0, + "maximum_value": 100, + "unit": "% ", + "enabled": "fan_layer_or_feature == 'by_feature'" + }, + "feature_fan_wall_inner": + { + "label": "Inner Walls %", + "description": "Enter the fan percentage for the Wall-Inner.", + "type": "int", + "default_value": 35, + "minimum_value": 0, + "maximum_value": 100, + "unit": "% ", + "enabled": "fan_layer_or_feature == 'by_feature'" + }, + "feature_fan_wall_outer": + { + "label": "Outer Walls %", + "description": "Enter the fan percentage for the Wall-Outer.", + "type": "int", + "default_value": 75, + "minimum_value": 0, + "maximum_value": 100, + "unit": "% ", + "enabled": "fan_layer_or_feature == 'by_feature'" + }, + "feature_fan_fill": + { + "label": "Infill %", + "description": "Enter the fan percentage for the Infill.", + "type": "int", + "default_value": 35, + "minimum_value": 0, + "maximum_value": 100, + "unit": "% ", + "enabled": "fan_layer_or_feature == 'by_feature'" + }, + "feature_fan_skin": + { + "label": "Top/Bottom (Skin) %", + "description": "Enter the fan percentage for the Skins.", + "type": "int", + "default_value": 100, + "minimum_value": 0, + "maximum_value": 100, + "unit": "% ", + "enabled": "fan_layer_or_feature == 'by_feature'" + }, + "feature_fan_support": + { + "label": "Support %", + "description": "Enter the fan percentage for the Supports.", + "type": "int", + "default_value": 35, + "minimum_value": 0, + "maximum_value": 100, + "unit": "% ", + "enabled": "fan_layer_or_feature == 'by_feature'" + }, + "feature_fan_support_interface": + { + "label": "Support Interface %", + "description": "Enter the fan percentage for the Support Interface.", + "type": "int", + "default_value": 100, + "minimum_value": 0, + "maximum_value": 100, + "unit": "% ", + "enabled": "fan_layer_or_feature == 'by_feature'" + }, + "feature_fan_prime_tower": + { + "label": "Prime Tower %", + "description": "Enter the fan percentage for the Prime Tower (whether it's used or not).", + "type": "int", + "default_value": 35, + "minimum_value": 0, + "maximum_value": 100, + "unit": "% ", + "enabled": "fan_layer_or_feature == 'by_feature'" + }, + "feature_fan_bridge": + { + "label": "Bridge %", + "description": "Enter the fan percentage for any Bridging (whether it's used on not).", + "type": "int", + "default_value": 100, + "minimum_value": 0, + "maximum_value": 100, + "unit": "% ", + "enabled": "fan_layer_or_feature == 'by_feature'" + }, + "feature_fan_combing": + { + "label": "Fan 'OFF' during Combing:", + "description": "When checked will set the fan to 0% for combing moves over 5 lines long in the gcode. When un-checked the fan speed during combing is whatever the previous speed is set to.", + "type": "bool", + "enabled": "fan_layer_or_feature == 'by_feature'", + "default_value": true + }, + "feature_fan_feature_final": + { + "label": "Final %", + "description": "If you choose an 'End Layer' then this is the fan speed that will carry through to the end of the gcode file. It will go into effect at the 'END' of your end layer.", + "type": "int", + "default_value": 35, + "minimum_value": 0, + "maximum_value": 100, + "unit": "% ", + "enabled": "(int(feature_fan_end_layer) != -1) and (fan_layer_or_feature == 'by_feature')" + }, + "fan_enable_raft": + { + "label": "Enable Raft Cooling", + "description": "Enable the fan for the raft layers. When enabled the Raft Fan Speed will continue until another Layer or Feature setting over-rides it.", + "type": "bool", + "default_value": false, + "enabled": true + }, + "fan_raft_percent": + { + "label": "Raft Fan %:", + "description": "Enter the percentage for the Raft.", + "type": "int", + "default_value": 35, + "minimum_value": 0, + "maximum_value": 100, + "unit": "% ", + "enabled": "fan_enable_raft" + } + } + }""" + + def initialize(self) -> None: + super().initialize() + scripts = Application.getInstance().getGlobalContainerStack().getMetaDataEntry("post_processing_scripts") + if scripts != None: + script_count = scripts.count("AddCoolingProfile") + if script_count > 0: + ## Set the default to "false" if there is more than one instance of this script running. + self._instance.setProperty("delete_existing_m106", "value", False) + + def execute(self, data): + #Initialize variables that are buried in if statements. + mycura = Application.getInstance().getGlobalContainerStack() + t0_fan = " P0"; t1_fan = " P0"; t2_fan = " P0"; t3_fan = " P0"; is_multi_extr_print = True + + #Get some information from Cura----------------------------------- + extruder = mycura.extruderList + + #This will be true when fan scale is 0-255pwm and false when it's RepRap 0-1 (Cura 5.x) + fan_mode = True + ##For 4.x versions that don't have the 0-1 option + try: + fan_mode = not bool(extruder[0].getProperty("machine_scale_fan_speed_zero_to_one", "value")) + except: + pass + bed_adhesion = (extruder[0].getProperty("adhesion_type", "value")) + extruder_count = mycura.getProperty("machine_extruder_count", "value") + print_sequence = str(mycura.getProperty("print_sequence", "value")) + + #Assign the fan numbers to the tools------------------------------ + if extruder_count == 1: + is_multi_fan = False + is_multi_extr_print = False + if int((extruder[0].getProperty("machine_extruder_cooling_fan_number", "value"))) > 0: + t0_fan = " P" + str((extruder[0].getProperty("machine_extruder_cooling_fan_number", "value"))) + else: + #No P parameter if there is a single fan circuit------------------ + t0_fan = "" + elif extruder_count > 1: + is_multi_fan = True + t0_fan = " P" + str((extruder[0].getProperty("machine_extruder_cooling_fan_number", "value"))) + if is_multi_fan: + if extruder_count > 1: t1_fan = " P" + str((extruder[1].getProperty("machine_extruder_cooling_fan_number", "value"))) + if extruder_count > 2: t2_fan = " P" + str((extruder[2].getProperty("machine_extruder_cooling_fan_number", "value"))) + if extruder_count > 3: t3_fan = " P" + str((extruder[3].getProperty("machine_extruder_cooling_fan_number", "value"))) + + #Initialize the fan_list with defaults---------------------------- + fan_list = ["z"] * 16 + for num in range(0,15,2): + fan_list[num + 1] = "M106 S0" + + #Assign the variable values if "By Layer"------------------------- + by_layer_or_feature = self.getSettingValueByKey("fan_layer_or_feature") + if by_layer_or_feature == "by_layer": + ## By layer doesn't do any feature search + feature_fan_combing = False + fan_list[0] = self.getSettingValueByKey("layer_fan_1st") + fan_list[2] = self.getSettingValueByKey("layer_fan_2nd") + fan_list[4] = self.getSettingValueByKey("layer_fan_3rd") + fan_list[6] = self.getSettingValueByKey("layer_fan_4th") + fan_list[8] = self.getSettingValueByKey("layer_fan_5th") + fan_list[10] = self.getSettingValueByKey("layer_fan_6th") + fan_list[12] = self.getSettingValueByKey("layer_fan_7th") + fan_list[14] = self.getSettingValueByKey("layer_fan_8th") + ## If there is no '/' delimiter then ignore the line else put the settings in a list + for num in range(0,15,2): + if "/" in fan_list[num]: + fan_list[num + 1] = self._layer_checker(fan_list[num], "p", fan_mode) + fan_list[num] = self._layer_checker(fan_list[num], "l", fan_mode) + + ## Assign the variable values if "By Feature" + elif by_layer_or_feature == "by_feature": + the_start_layer = self.getSettingValueByKey("feature_fan_start_layer") - 1 + the_end_layer = self.getSettingValueByKey("feature_fan_end_layer") + try: + if int(the_end_layer) != -1: + ## Catch a possible input error. + if the_end_layer < the_start_layer: + the_end_layer = the_start_layer + except: + the_end_layer = -1 ## If there is an input error default to the entire gcode file. + + ## Get the speed for each feature + # 0;TYPE:SKIRT, 1;TYPE:WALL-INNER, 2;TYPE:WALL-OUTER, 3;TYPE:FILL, 4;TYPE:SKIN, 5;TYPE:SUPPORT, 6;TYPE:SUPPORT-INTERFACE, 7;TYPE:PRIME-TOWER, 8;BRIDGE, 9;FEATURE_FINAL, 10;FAN_COMBING, + fan_sp_skirt = self._feature_checker(self.getSettingValueByKey("feature_fan_skirt"), fan_mode) + fan_sp_wall_inner = self._feature_checker(self.getSettingValueByKey("feature_fan_wall_inner"), fan_mode) + fan_sp_wall_outer = self._feature_checker(self.getSettingValueByKey("feature_fan_wall_outer"), fan_mode) + fan_sp_fill = self._feature_checker(self.getSettingValueByKey("feature_fan_fill"), fan_mode) + fan_sp_skin = self._feature_checker(self.getSettingValueByKey("feature_fan_skin"), fan_mode) + fan_sp_support = self._feature_checker(self.getSettingValueByKey("feature_fan_support"), fan_mode) + fan_sp_support_interface = self._feature_checker(self.getSettingValueByKey("feature_fan_support_interface"), fan_mode) + fan_sp_prime_tower = self._feature_checker(self.getSettingValueByKey("feature_fan_prime_tower"), fan_mode) + fan_sp_bridge = self._feature_checker(self.getSettingValueByKey("feature_fan_bridge"), fan_mode) + fan_sp_feature_final = self._feature_checker(self.getSettingValueByKey("feature_fan_feature_final"), fan_mode) + feature_fan_combing = self.getSettingValueByKey("feature_fan_combing") + if the_end_layer > -1 and by_layer_or_feature == "by_feature": + ## Required so the final speed input can be determined + the_end_is_enabled = True + else: + ## There is no ending layer so do the whole file + the_end_is_enabled = False + if the_end_layer == -1 or the_end_is_enabled == False: + the_end_layer = len(data) + 2 + + ## Find the Layer0Index and the RaftIndex + raft_start_index = 0 + number_of_raft_layers = 0 + layer_0_index = 0 + ## Catch the number of raft layers. + for l_num in range(1,10,1): + layer = data[l_num] + if ";LAYER:-" in layer: + number_of_raft_layers += 1 + if raft_start_index == 0: + raft_start_index = l_num + if ";LAYER:0" in layer: + layer_0_index = l_num + break + + ## Is this a single extruder print on a multi-extruder printer? - get the correct fan number for the extruder being used. + if is_multi_fan: + T0_used = False + T1_used = False + T2_used = False + T3_used = False + ## Bypass the file header and ending gcode. + for num in range(1,len(data)-1,1): + lines = data[num] + if "T0" in lines: + T0_used = True + if "T1" in lines: + T1_used = True + if "T2" in lines: + T2_used = True + if "T3" in lines: + T3_used = True + is_multi_extr_print = True if sum([T0_used, T1_used, T2_used, T3_used]) > 1 else False + + ## On a multi-extruder printer and single extruder print find out which extruder starts the file. + init_fan = t0_fan + if not is_multi_extr_print: + startup = data[1] + lines = startup.split("\n") + for line in lines: + if line == "T1": + t0_fan = t1_fan + elif line == "T2": + t0_fan = t2_fan + elif line == "T3": + t0_fan = t3_fan + elif is_multi_extr_print: + ## On a multi-extruder printer and multi extruder print find out which extruder starts the file. + startup = data[1] + lines = startup.split("\n") + for line in lines: + if line == "T0": + init_fan = t0_fan + elif line == "T1": + init_fan = t1_fan + elif line == "T2": + init_fan = t2_fan + elif line == "T3": + init_fan = t3_fan + else: + init_fan = "" + ## Assign the variable values if "Raft Enabled" + raft_enabled = self.getSettingValueByKey("fan_enable_raft") + if raft_enabled and bed_adhesion == "raft": + fan_sp_raft = self._feature_checker(self.getSettingValueByKey("fan_raft_percent"), fan_mode) + else: + fan_sp_raft = "M106 S0" + + # Start to alter the data----------------------------------------- + ## Strip the existing M106 lines from the file up to the end of the last layer. If a user wants to use more than one instance of this plugin then they won't want to erase the M106 lines that the preceding plugins inserted so 'delete_existing_m106' is an option. + delete_existing_m106 = self.getSettingValueByKey("delete_existing_m106") + if delete_existing_m106: + ## Start deleting from the beginning + start_from = int(raft_start_index) + else: + if by_layer_or_feature == "by_layer": + altered_start_layer = str(len(data)) + ## The fan list layers don't need to be in ascending order. Get the lowest. + for num in range(0,15,2): + if int(fan_list[num]) < int(altered_start_layer): + altered_start_layer = int(fan_list[num]) + elif by_layer_or_feature == "by_feature": + altered_start_layer = int(the_start_layer) - 1 + start_from = int(layer_0_index) + int(altered_start_layer) + + ## Strip the M106 and M107 lines from the file + for l_index in range(int(start_from), len(data) - 1, 1): + data[l_index] = re.sub(re.compile("M106(.*)\n"), "", data[l_index]) + data[l_index] = re.sub(re.compile("M107(.*)\n"), "", data[l_index]) + + ## Deal with a raft and with One-At-A-Time + if raft_enabled and bed_adhesion == "raft": + if print_sequence == "one_at_a_time": + for r_index in range(2,len(data)-2,1): + lines = data[r_index].split("\n") + if not raft_enabled or bed_adhesion != "raft": + if ";LAYER:0" in data[r_index] or ";LAYER:-" in data[r_index]: + lines.insert(1, "M106 S0" + str(t0_fan)) + if raft_enabled and bed_adhesion == "raft": + if ";LAYER:-" in data[r_index]: + ## Turn the raft fan on + lines.insert(1, fan_sp_raft + str(t0_fan)) + ## Shut the raft fan off + if ";LAYER:0" in data[r_index]: + lines.insert(1,"M106 S0" + str(t0_fan)) + data[r_index] = "\n".join(lines) + elif print_sequence == "all_at_once": + layer = data[raft_start_index] + lines = layer.split("\n") + if ";LAYER:-" in layer: + ## Turn the raft fan on + lines.insert(1, fan_sp_raft + str(init_fan)) + layer = "\n".join(lines) + data[raft_start_index] = layer + layer = data[layer_0_index] + lines = layer.split("\n") + ## Shut the raft fan off + lines.insert(1, "M106 S0" + str(init_fan)) + data[layer_0_index] = "\n".join(lines) + else: + for r_index in range(2,len(data)-2,1): + lines = data[r_index].split("\n") + if ";LAYER:0" in data[r_index] or ";LAYER:-" in data[r_index]: + if not "0" in fan_list: + lines.insert(1, "M106 S0" + str(t0_fan)) + data[r_index] = "\n".join(lines) + + ## Turn off all fans at the end of data[1] + temp_startup = data[1].split("\n") + temp_startup.insert(len(temp_startup)-2,"M106 S0" + str(t0_fan)) + ## If there are multiple cooling fans shut them all off + if is_multi_fan: + if extruder_count > 1 and t1_fan != t0_fan: temp_startup.insert(len(temp_startup)-2,"M106 S0" + str(t1_fan)) + if extruder_count > 2 and t2_fan != t1_fan and t2_fan != t0_fan: temp_startup.insert(len(temp_startup)-2,"M106 S0" + str(t2_fan)) + if extruder_count > 3 and t3_fan != t2_fan and t3_fan != t1_fan and t3_fan != t0_fan: temp_startup.insert(len(temp_startup)-2,"M106 S0" + str(t3_fan)) + data[1] = "\n".join(temp_startup) + + ## If 'feature_fan_combing' is True then add additional 'MESH:NONMESH' lines for travel moves over 5 lines long + ## For compatibility with 5.3.0 change any MESH:NOMESH to MESH:NONMESH. + if feature_fan_combing: + for layer_num in range(2,len(data)): + layer = data[layer_num] + data[layer_num] = re.sub(";MESH:NOMESH", ";MESH:NONMESH", layer) + data = self._add_travel_comment(data, layer_0_index) + + # Single Fan "By Layer"-------------------------------------------- + if by_layer_or_feature == "by_layer" and not is_multi_fan: + return self._single_fan_by_layer(data, layer_0_index, fan_list, t0_fan) + + # Multi-Fan "By Layer"--------------------------------------------- + if by_layer_or_feature == "by_layer" and is_multi_fan: + return self._multi_fan_by_layer(data, layer_0_index, fan_list, t0_fan, t1_fan, t2_fan, t3_fan) + + #Single Fan "By Feature"------------------------------------------ + if by_layer_or_feature == "by_feature" and (not is_multi_fan or not is_multi_extr_print): + return self._single_fan_by_feature(data, layer_0_index, the_start_layer, the_end_layer, the_end_is_enabled, fan_list, t0_fan, fan_sp_skirt, fan_sp_wall_inner, fan_sp_wall_outer, fan_sp_fill, fan_sp_skin, fan_sp_support, fan_sp_support_interface, feature_fan_combing, fan_sp_prime_tower, fan_sp_bridge, fan_sp_feature_final) + + #Multi Fan "By Feature"------------------------------------------- + if by_layer_or_feature == "by_feature" and is_multi_fan: + return self._multi_fan_by_feature(data, layer_0_index, the_start_layer, the_end_layer, the_end_is_enabled, fan_list, t0_fan, t1_fan, t2_fan, t3_fan, fan_sp_skirt, fan_sp_wall_inner, fan_sp_wall_outer, fan_sp_fill, fan_sp_skin, fan_sp_support, fan_sp_support_interface, feature_fan_combing, fan_sp_prime_tower, fan_sp_bridge, fan_sp_feature_final) + + # The Single Fan "By Layer"---------------------------------------- + def _single_fan_by_layer(self, data: str, layer_0_index: int, fan_list: str, t0_fan: str)->str: + layer_number = "0" + single_fan_layer = data + for l_index in range(layer_0_index,len(single_fan_layer)-1,1): + layer = single_fan_layer[l_index] + fan_lines = layer.split("\n") + for fan_line in fan_lines: + if ";LAYER:" in fan_line: + layer_number = int(fan_line.split(":")[1]) + ## If there is a match for the current layer number make the insertion. + try: + for num in range(0,15,2): + if int(layer_number) == int(fan_list[num]): + layer = layer.replace(fan_lines[0],fan_lines[0] + "\n" + fan_list[num + 1] + str(t0_fan)) + single_fan_layer[l_index] = layer + except: + continue + return single_fan_layer + + # Multi-Fan "By Layer"----------------------------------------- + def _multi_fan_by_layer(self, data: str, layer_0_index: int, fan_list: str, t0_fan: str, t1_fan: str, t2_fan: str, t3_fan: str)->str: + multi_fan_data = data + layer_number = "0" + current_fan_speed = "0" + prev_fan = str(t0_fan) + this_fan = str(t0_fan) + start_index = str(len(multi_fan_data)) + for num in range(0,15,2): + ## The fan_list may not be in ascending order. Get the lowest layer number + try: + if int(fan_list[num]) < int(start_index): + start_index = str(fan_list[num]) + except: + pass + ## Move the start point if delete_existing_m106 is false + start_index = int(start_index) + int(layer_0_index) + ## Track the tool number + for num in range(1,int(start_index),1): + layer = multi_fan_data[num] + lines = layer.split("\n") + for line in lines: + if line == "T0": + prev_fan = this_fan + this_fan = t0_fan + elif line == "T1": + prev_fan = this_fan + this_fan = t1_fan + elif line == "T2": + prev_fan = this_fan + this_fan = t2_fan + elif line == "T3": + prev_fan = this_fan + this_fan = t3_fan + for l_index in range(int(start_index),len(multi_fan_data)-1,1): + modified_data = "" + layer = multi_fan_data[l_index] + fan_lines = layer.split("\n") + for fan_line in fan_lines: + ## Prepare to shut down the previous fan and start the next one. + if fan_line.startswith("T"): + if fan_line == "T0": this_fan = str(t0_fan) + if fan_line == "T1": this_fan = str(t1_fan) + if fan_line == "T2": this_fan = str(t2_fan) + if fan_line == "T3": this_fan = str(t3_fan) + modified_data += "M106 S0" + prev_fan + "\n" + modified_data += fan_line + "\n" + modified_data += "M106 S" + str(current_fan_speed) + this_fan + "\n" + prev_fan = this_fan + elif ";LAYER:" in fan_line: + modified_data += fan_line + "\n" + layer_number = str(fan_line.split(":")[1]) + for num in range(0,15,2): + if layer_number == str(fan_list[num]): + modified_data += fan_list[num + 1] + this_fan + "\n" + current_fan_speed = str(fan_list[num + 1].split("S")[1]) + current_fan_speed = str(current_fan_speed.split(" ")[0]) ## Just in case + else: + modified_data += fan_line + "\n" + if modified_data.endswith("\n"): modified_data = modified_data[0:-1] + multi_fan_data[l_index] = modified_data + return multi_fan_data + + # Single fan by feature----------------------------------------------- + def _single_fan_by_feature(self, data: str, layer_0_index: int, the_start_layer: str, the_end_layer: str, the_end_is_enabled: str, fan_list: str, t0_fan: str, fan_sp_skirt: str, fan_sp_wall_inner: str, fan_sp_wall_outer: str, fan_sp_fill: str, fan_sp_skin: str, fan_sp_support: str, fan_sp_support_interface: str, feature_fan_combing: str, fan_sp_prime_tower: str, fan_sp_bridge: str, fan_sp_feature_final: str)->str: + single_fan_data = data + layer_number = "0" + index = 1 + ## Start with layer:0 + for l_index in range(layer_0_index,len(single_fan_data)-1,1): + modified_data = "" + layer = single_fan_data[l_index] + lines = layer.split("\n") + for line in lines: + if ";LAYER:" in line: + layer_number = str(line.split(":")[1]) + if int(layer_number) >= int(the_start_layer) and int(layer_number) < int(the_end_layer)-1: + if ";TYPE:SKIRT" in line: + modified_data += fan_sp_skirt + t0_fan + "\n" + elif ";TYPE:WALL-INNER" in line: + modified_data += fan_sp_wall_inner + t0_fan + "\n" + elif ";TYPE:WALL-OUTER" in line: + modified_data += fan_sp_wall_outer + t0_fan + "\n" + elif ";TYPE:FILL" in line: + modified_data += fan_sp_fill + t0_fan + "\n" + elif ";TYPE:SKIN" in line: + modified_data += fan_sp_skin + t0_fan + "\n" + elif line == ";TYPE:SUPPORT": + modified_data += fan_sp_support + t0_fan + "\n" + elif ";TYPE:SUPPORT-INTERFACE" in line: + modified_data += fan_sp_support_interface + t0_fan + "\n" + elif ";MESH:NONMESH" in line: + if feature_fan_combing == True: + modified_data += "M106 S0" + t0_fan + "\n" + elif ";TYPE:PRIME-TOWER" in line: + modified_data += fan_sp_prime_tower + t0_fan + "\n" + elif line == ";BRIDGE": + modified_data += fan_sp_bridge + t0_fan + "\n" + modified_data += line + "\n" + ## If an End Layer is defined and is less than the last layer then insert the Final Speed + if line == ";LAYER:" + str(the_end_layer) and the_end_is_enabled == True: + modified_data += fan_sp_feature_final + t0_fan + "\n" + if modified_data.endswith("\n"): modified_data = modified_data[0: - 1] + single_fan_data[l_index] = modified_data + return single_fan_data + + # Multi-fan by feature------------------------------------------------ + def _multi_fan_by_feature(self, data: str, layer_0_index: int, the_start_layer: str, the_end_layer: str, the_end_is_enabled: str, fan_list: str, t0_fan: str, t1_fan: str, t2_fan: str, t3_fan: str, fan_sp_skirt: str, fan_sp_wall_inner: str, fan_sp_wall_outer: str, fan_sp_fill: str, fan_sp_skin: str, fan_sp_support: str, fan_sp_support_interface: str, feature_fan_combing: str, fan_sp_prime_tower: str, fan_sp_bridge: str, fan_sp_feature_final: str)->str: + multi_fan_data = data + layer_number = "0" + start_index = 1 + prev_fan = t0_fan + this_fan = t0_fan + modified_data = "" + current_fan_speed = "0" + for my_index in range(1, len(multi_fan_data) - 1, 1): + layer = multi_fan_data[my_index] + if ";LAYER:" + str(the_start_layer) + "\n" in layer: + start_index = int(my_index) - 1 + break + ## Track the previous tool changes + for num in range(1,start_index,1): + layer = multi_fan_data[num] + lines = layer.split("\n") + for line in lines: + if line == "T0": + prev_fan = this_fan + this_fan = t0_fan + elif line == "T1": + prev_fan = this_fan + this_fan = t1_fan + elif line == "T2": + prev_fan = this_fan + this_fan = t2_fan + elif line == "T3": + prev_fan = this_fan + this_fan = t3_fan + ## Get the current tool. + for l_index in range(start_index,start_index + 1,1): + layer = multi_fan_data[l_index] + lines = layer.split("\n") + for line in lines: + if line.startswith("T"): + if line == "T0": this_fan = t0_fan + if line == "T1": this_fan = t1_fan + if line == "T2": this_fan = t2_fan + if line == "T3": this_fan = t3_fan + prev_fan = this_fan + + ## Start to make insertions------------------------------------- + for l_index in range(start_index+1,len(multi_fan_data)-1,1): + layer = multi_fan_data[l_index] + lines = layer.split("\n") + for line in lines: + if line.startswith("T"): + if line == "T0": this_fan = t0_fan + if line == "T1": this_fan = t1_fan + if line == "T2": this_fan = t2_fan + if line == "T3": this_fan = t3_fan + ## Turn off the prev fan + modified_data += "M106 S0" + prev_fan + "\n" + modified_data += line + "\n" + ## Turn on the current fan + modified_data += "M106 S" + str(current_fan_speed) + this_fan + "\n" + prev_fan = this_fan + if ";LAYER:" in line: + layer_number = str(line.split(":")[1]) + modified_data += line + "\n" + if int(layer_number) >= int(the_start_layer): # Problem with oneatatime < start + if ";TYPE:SKIRT" in line: + modified_data += line + "\n" + modified_data += fan_sp_skirt + this_fan + "\n" + current_fan_speed = str(fan_sp_skirt.split("S")[1]) + elif ";TYPE:WALL-INNER" in line: + modified_data += line + "\n" + modified_data += fan_sp_wall_inner + this_fan + "\n" + current_fan_speed = str(fan_sp_wall_inner.split("S")[1]) + elif ";TYPE:WALL-OUTER" in line: + modified_data += line + "\n" + modified_data += fan_sp_wall_outer + this_fan + "\n" + current_fan_speed = str(fan_sp_wall_outer.split("S")[1]) + elif ";TYPE:FILL" in line: + modified_data += line + "\n" + modified_data += fan_sp_fill + this_fan + "\n" + current_fan_speed = str(fan_sp_fill.split("S")[1]) + elif ";TYPE:SKIN" in line: + modified_data += line + "\n" + modified_data += fan_sp_skin + this_fan + "\n" + current_fan_speed = str(fan_sp_skin.split("S")[1]) + elif line == ";TYPE:SUPPORT": + modified_data += line + "\n" + modified_data += fan_sp_support + this_fan + "\n" + current_fan_speed = str(fan_sp_support.split("S")[1]) + elif ";TYPE:SUPPORT-INTERFACE" in line: + modified_data += line + "\n" + modified_data += fan_sp_support_interface + this_fan + "\n" + current_fan_speed = str(fan_sp_support_interface.split("S")[1]) + elif ";MESH:NONMESH" in line: + if feature_fan_combing == True: + modified_data += line + "\n" + modified_data += "M106 S0" + this_fan + "\n" + current_fan_speed = "0" + else: + modified_data += line + "\n" + elif ";TYPE:PRIME-TOWER" in line: + modified_data += line + "\n" + modified_data += fan_sp_prime_tower + this_fan + "\n" + current_fan_speed = str(fan_sp_prime_tower.split("S")[1]) + elif line == ";BRIDGE": + modified_data += line + "\n" + modified_data += fan_sp_bridge + this_fan + "\n" + current_fan_speed = str(fan_sp_bridge.split("S")[1]) + ## If an end layer is defined - Insert the final speed and set the other variables to Final Speed to finish the file + ## There cannot be a break here because if there are multiple fan numbers they still need to be shut off and turned on. + elif line == ";LAYER:" + str(the_end_layer): + modified_data += fan_sp_feature_final + this_fan + "\n" + fan_sp_skirt = fan_sp_feature_final + fan_sp_wall_inner = fan_sp_feature_final + fan_sp_wall_outer = fan_sp_feature_final + fan_sp_fill = fan_sp_feature_final + fan_sp_skin = fan_sp_feature_final + fan_sp_support = fan_sp_feature_final + fan_sp_support_interface = fan_sp_feature_final + fan_sp_prime_tower = fan_sp_feature_final + fan_sp_bridge = fan_sp_feature_final + else: + ## Layer and Tool get inserted into modified_data above. All other lines go into modified_data here + if not line.startswith("T") and not line.startswith(";LAYER:"): modified_data += line + "\n" + if modified_data.endswith("\n"): modified_data = modified_data[0: - 1] + multi_fan_data[l_index] = modified_data + modified_data = "" + return multi_fan_data + + #Try to catch layer input errors, set the minimum speed to 12%, and put the strings together + def _layer_checker(self, fan_string: str, ty_pe: str, fan_mode: bool) -> str: + fan_string_l = str(fan_string.split("/")[0]) + try: + if int(fan_string_l) <= 1: fan_string_l = "1" + if fan_string_l == "": fan_string_l = str(len(data)) + except ValueError: + fan_string_l = str(len(data)) + fan_string_l = str(int(fan_string_l) - 1) + fan_string_p = str(fan_string.split("/")[1]) + if fan_string_p == "": fan_string_p = "0" + try: + if int(fan_string_p) < 0: fan_string_p = "0" + if int(fan_string_p) > 100: fan_string_p = "100" + except ValueError: + fan_string_p = "0" + ## Set the minimum fan speed to 12% + if int(fan_string_p) < 12 and int(fan_string_p) != 0: + fan_string_p = "12" + fan_layer_line = str(fan_string_l) + if fan_mode: + fan_percent_line = "M106 S" + str(round(int(fan_string_p) * 2.55)) + else: + fan_percent_line = "M106 S" + str(round(int(fan_string_p) / 100, 1)) + if ty_pe == "l": + return str(fan_layer_line) + elif ty_pe == "p": + return fan_percent_line + + #Try to catch feature input errors, set the minimum speed to 12%, and put the strings together when 'By Feature' + def _feature_checker(self, fan_feat_string: int, fan_mode: bool) -> str: + if fan_feat_string < 0: fan_feat_string = 0 + ## Set the minimum fan speed to 12% + if fan_feat_string > 0 and fan_feat_string < 12: fan_feat_string = 12 + if fan_feat_string > 100: fan_feat_string = 100 + if fan_mode: + fan_sp_feat = "M106 S" + str(round(fan_feat_string * 2.55)) + else: + fan_sp_feat = "M106 S" + str(round(fan_feat_string / 100, 1)) + return fan_sp_feat + + # Add additional travel comments to turn the fan off during combing. + def _add_travel_comment(self, the_data: str, lay_0_index: str) -> str: + for lay_num in range(int(lay_0_index), len(the_data)-1,1): + layer = the_data[lay_num] + lines = layer.split("\n") + ## Copy the data to new_data and make the insertions there + new_data = lines + g0_count = 0 + g0_index = -1 + feature_type = ";TYPE:SUPPORT" + is_travel = False + for index, line in enumerate(lines): + insert_index = 0 + if ";TYPE:" in line: + feature_type = line + is_travel = False + g0_count = 0 + if ";MESH:NONMESH" in line: + is_travel = True + g0_count = 0 + if line.startswith("G0 ") and not is_travel: + g0_count += 1 + if g0_index == -1: + g0_index = lines.index(line) + elif not line.startswith("G0 ") and not is_travel: + ## Add additional 'NONMESH' lines to shut the fan off during long combing moves-------- + if g0_count > 5: + if not is_travel: + new_data.insert(g0_index + insert_index, ";MESH:NONMESH") + insert_index += 1 + ## Add the feature_type at the end of the combing move to turn the fan back on + new_data.insert(g0_index + g0_count + 1, feature_type) + insert_index += 1 + g0_count = 0 + g0_index = -1 + is_travel = False + elif g0_count <= 5: + g0_count = 0 + g0_index = -1 + is_travel = False + the_data[lay_num] = "\n".join(new_data) + return the_data \ No newline at end of file From 13deab505ea06e8a352bd93615bfabe67775b210 Mon Sep 17 00:00:00 2001 From: Erwan MATHIEU Date: Mon, 8 Jan 2024 11:32:25 +0100 Subject: [PATCH 105/182] Add/reorganize settings for raft walls CURA-11228 --- resources/definitions/fdmprinter.def.json | 59 ++++++++++++++++++----- resources/setting_visibility/expert.cfg | 1 + 2 files changed, 49 insertions(+), 11 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 2b37b3d7ac..32908b6f3e 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -6329,6 +6329,54 @@ "settable_per_extruder": true, "limit_to_extruder": "raft_base_extruder_nr" }, + "raft_wall_count": + { + "label": "Raft Wall Count", + "description": "The number of contours to print around the linear pattern of the raft.", + "type": "int", + "default_value": 1, + "minimum_value": "0", + "enabled": "resolveOrValue('adhesion_type') == 'raft'", + "settable_per_mesh": false, + "settable_per_extruder": false, + "children": + { + "raft_surface_wall_count": + { + "label": "Raft Top Wall Count", + "description": "The number of contours to print around the linear pattern in the top layers of the raft.", + "type": "int", + "default_value": 0, + "minimum_value": "0", + "enabled": "resolveOrValue('adhesion_type') == 'raft'", + "settable_per_mesh": false, + "settable_per_extruder": false + }, + "raft_interface_wall_count": + { + "label": "Raft Middle Wall Count", + "description": "The number of contours to print around the linear pattern in the middle layers of the raft.", + "type": "int", + "default_value": 0, + "minimum_value": "0", + "enabled": "resolveOrValue('adhesion_type') == 'raft'", + "settable_per_mesh": false, + "settable_per_extruder": false + }, + "raft_base_wall_count": + { + "label": "Raft Base Wall Count", + "description": "The number of contours to print around the linear pattern in the base layer of the raft.", + "type": "int", + "default_value": 1, + "value": "raft_wall_count", + "minimum_value": "0", + "enabled": "resolveOrValue('adhesion_type') == 'raft'", + "settable_per_mesh": false, + "settable_per_extruder": false + } + } + }, "raft_speed": { "label": "Raft Print Speed", @@ -8286,17 +8334,6 @@ "settable_per_mesh": false, "settable_per_extruder": false }, - "raft_base_wall_count": - { - "label": "Raft Base Wall Count", - "description": "The number of contours to print around the linear pattern in the base layer of the raft.", - "type": "int", - "default_value": 1, - "enabled": "resolveOrValue('adhesion_type') == 'raft'", - "resolve": "max(extruderValues('raft_base_wall_count'))", - "settable_per_mesh": false, - "settable_per_extruder": false - }, "group_outer_walls": { "label": "Group Outer Walls", diff --git a/resources/setting_visibility/expert.cfg b/resources/setting_visibility/expert.cfg index 2f2dd7671d..384f8d2528 100644 --- a/resources/setting_visibility/expert.cfg +++ b/resources/setting_visibility/expert.cfg @@ -344,6 +344,7 @@ raft_interface_line_spacing raft_base_thickness raft_base_line_width raft_base_line_spacing +raft_wall_count raft_speed raft_acceleration raft_jerk From 68460c55474ac92b6c781df29db6d5567bcd3323 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Mon, 8 Jan 2024 12:47:28 +0100 Subject: [PATCH 106/182] Also run on 5.6E branch Fixes CURA-11523 --- .github/workflows/conan-package.yml | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/.github/workflows/conan-package.yml b/.github/workflows/conan-package.yml index 7ca2b0c467..faa970270d 100644 --- a/.github/workflows/conan-package.yml +++ b/.github/workflows/conan-package.yml @@ -20,12 +20,8 @@ on: - 'main' - 'CURA-*' - 'PP-*' - - '[0-9].[0-9]' - - '[0-9].[0-9][0-9]' - tags: - - '[0-9].[0-9].[0-9]*' - - '[0-9].[0-9].[0-9]' - - '[0-9].[0-9][0-9].[0-9]*' + - '[0-9].[0-9]*' + - '[0-9].[0-9][0-9]*' env: CONAN_LOGIN_USERNAME_CURA: ${{ secrets.CONAN_USER }} From 677f35b5159e53fded2d4c31b2ca58ede6b28373 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Mon, 8 Jan 2024 11:06:20 +0100 Subject: [PATCH 107/182] use `input` instead of the `github.events` Fixes CURA-11523 --- .github/workflows/installers.yml | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/.github/workflows/installers.yml b/.github/workflows/installers.yml index 6e531ba833..9c51cfe820 100644 --- a/.github/workflows/installers.yml +++ b/.github/workflows/installers.yml @@ -54,9 +54,9 @@ jobs: needs: [ default_values ] with: cura_conan_version: ${{ needs.default_values.outputs.cura_conan_version }} - conan_args: ${{ github.event.inputs.conan_args }} - enterprise: ${{ github.event.inputs.enterprise == 'true' }} - staging: ${{ github.event.inputs.staging == 'true' }} + conan_args: ${{ inputs.conan_args }} + enterprise: ${{ inputs.enterprise }} + staging: ${{ inputs.staging }} architecture: X64 operating_system: windows-2022 secrets: inherit @@ -66,9 +66,9 @@ jobs: needs: [ default_values ] with: cura_conan_version: ${{ needs.default_values.outputs.cura_conan_version }} - conan_args: ${{ github.event.inputs.conan_args }} - enterprise: ${{ github.event.inputs.enterprise == 'true' }} - staging: ${{ github.event.inputs.staging == 'true' }} + conan_args: ${{ inputs.conan_args }} + enterprise: ${{ inputs.enterprise }} + staging: ${{ inputs.staging }} architecture: X64 operating_system: ubuntu-22.04 secrets: inherit @@ -78,9 +78,9 @@ jobs: needs: [ default_values ] with: cura_conan_version: ${{ needs.default_values.outputs.cura_conan_version }} - conan_args: ${{ github.event.inputs.conan_args }} - enterprise: ${{ github.event.inputs.enterprise == 'true' }} - staging: ${{ github.event.inputs.staging == 'true' }} + conan_args: ${{ inputs.conan_args }} + enterprise: ${{ inputs.enterprise }} + staging: ${{ inputs.staging }} architecture: X64 operating_system: self-hosted-X64 secrets: inherit @@ -90,9 +90,9 @@ jobs: needs: [ default_values ] with: cura_conan_version: ${{ needs.default_values.outputs.cura_conan_version }} - conan_args: ${{ github.event.inputs.conan_args }} - enterprise: ${{ github.event.inputs.enterprise == 'true' }} - staging: ${{ github.event.inputs.staging == 'true' }} + conan_args: ${{ inputs.conan_args }} + enterprise: ${{ inputs.enterprise }} + staging: ${{ inputs.staging }} architecture: ARM64 operating_system: self-hosted-ARM64 secrets: inherit From 85a762aec38e8fc99d39addc0b58279f8e45078a Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Mon, 8 Jan 2024 11:17:16 +0100 Subject: [PATCH 108/182] sync workflow with 5.6E branch Fixes CURA-11523 --- .github/workflows/linux.yml | 11 +++-------- .github/workflows/macos.yml | 11 +++-------- .github/workflows/windows.yml | 11 +++-------- 3 files changed, 9 insertions(+), 24 deletions(-) diff --git a/.github/workflows/linux.yml b/.github/workflows/linux.yml index f88b77a022..08c59c9158 100644 --- a/.github/workflows/linux.yml +++ b/.github/workflows/linux.yml @@ -39,19 +39,14 @@ on: options: - ubuntu-22.04 -env: - CONAN_ARGS: ${{ inputs.conan_args || '' }} - ENTERPRISE: ${{ inputs.enterprise || false }} - STAGING: ${{ inputs.staging || false }} - jobs: - installer: + linux-installer: uses: ultimaker/cura-workflows/.github/workflows/cura-installer-linux.yml@main with: cura_conan_version: ${{ inputs.cura_conan_version }} conan_args: ${{ inputs.conan_args }} - enterprise: ${{ inputs.enterprise == 'true' }} - staging: ${{ inputs.staging == 'true' }} + enterprise: ${{ inputs.enterprise }} + staging: ${{ inputs.staging }} architecture: ${{ inputs.architecture }} operating_system: ${{ inputs.operating_system }} secrets: inherit \ No newline at end of file diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml index e909b9f839..9c940330e1 100644 --- a/.github/workflows/macos.yml +++ b/.github/workflows/macos.yml @@ -43,19 +43,14 @@ on: - macos-11 - macos-12 -env: - CONAN_ARGS: ${{ inputs.conan_args || '' }} - ENTERPRISE: ${{ inputs.enterprise || false }} - STAGING: ${{ inputs.staging || false }} - jobs: - installer: + macos-installer: uses: ultimaker/cura-workflows/.github/workflows/cura-installer-macos.yml@main with: cura_conan_version: ${{ inputs.cura_conan_version }} conan_args: ${{ inputs.conan_args }} - enterprise: ${{ inputs.enterprise == 'true' }} - staging: ${{ inputs.staging == 'true' }} + enterprise: ${{ inputs.enterprise }} + staging: ${{ inputs.staging }} architecture: ${{ inputs.architecture }} operating_system: ${{ inputs.operating_system }} secrets: inherit \ No newline at end of file diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index 151935c3f3..22a81e9b2a 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -39,19 +39,14 @@ on: options: - windows-2022 -env: - CONAN_ARGS: ${{ inputs.conan_args || '' }} - ENTERPRISE: ${{ inputs.enterprise || false }} - STAGING: ${{ inputs.staging || false }} - jobs: - installer: + windows-installer: uses: ultimaker/cura-workflows/.github/workflows/cura-installer-windows.yml@main with: cura_conan_version: ${{ inputs.cura_conan_version }} conan_args: ${{ inputs.conan_args }} - enterprise: ${{ inputs.enterprise == 'true' }} - staging: ${{ inputs.staging == 'true' }} + enterprise: ${{ inputs.enterprise }} + staging: ${{ inputs.staging }} architecture: ${{ inputs.architecture }} operating_system: ${{ inputs.operating_system }} secrets: inherit \ No newline at end of file From b60b07e2b26f4d676222d56d135a5dc274ffa41f Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Mon, 8 Jan 2024 13:13:53 +0100 Subject: [PATCH 109/182] build Conan packages This will compile the mo files. But be sure that `enable_i18n` option is still removed from the `package_id`. Such that the build conan package can also be used Fixes CURA-11497 --- .github/workflows/conan-package.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.github/workflows/conan-package.yml b/.github/workflows/conan-package.yml index faa970270d..8faf1e27e1 100644 --- a/.github/workflows/conan-package.yml +++ b/.github/workflows/conan-package.yml @@ -40,3 +40,11 @@ jobs: recipe_id_full: ${{ needs.conan-recipe-version.outputs.recipe_id_full }} recipe_id_latest: ${{ needs.conan-recipe-version.outputs.recipe_id_latest }} secrets: inherit + + conan-package-create: + needs: [ conan-recipe-version, conan-package-export ] + uses: ultimaker/cura-workflows/.github/workflows/conan-package-create-linux.yml@main + with: + recipe_id_full: ${{ needs.conan-recipe-version.outputs.recipe_id_full }} + conan_extra_args: "-o cura:enable_i18n=True" + secrets: inherit \ No newline at end of file From 11aa71a5dfa6e6bf321313511df61c019b80717b Mon Sep 17 00:00:00 2001 From: "saumya.jain" Date: Mon, 8 Jan 2024 14:41:41 +0100 Subject: [PATCH 110/182] Singleton management in Cura -QualityManagementModel, MaterialManagementModel, SimpleModeSettingsManager, MachineActionManager and CustomQualityProfilesDropDownMenuModel *deleted* -QualityProfilesDropDownmenuModel changed to RegisterType CURA-7812 --- cura/CuraApplication.py | 22 +++++++++---------- resources/qml/Preferences/MachinesPage.qml | 4 +++- .../Custom/QualitiesWithIntentMenu.qml | 2 +- .../ProfileWarningReset.qml | 4 ++-- 4 files changed, 17 insertions(+), 15 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 1ef2f63a9e..3243260b6e 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -1138,6 +1138,10 @@ class CuraApplication(QtApplication): return cast(MachineActionManager.MachineActionManager, self._machine_action_manager) + @pyqtSlot(result = QObject) + def getMachineActionManagerQml(self)-> MachineActionManager.MachineActionManager: + return cast(QObject, self._machine_action_manager) + @pyqtSlot(result = QObject) def getMaterialManagementModel(self) -> MaterialManagementModel: if not self._material_management_model: @@ -1150,7 +1154,8 @@ class CuraApplication(QtApplication): self._quality_management_model = QualityManagementModel(parent = self) return self._quality_management_model - def getSimpleModeSettingsManager(self, *args): + @pyqtSlot(result=QObject) + def getSimpleModeSettingsManager(self)-> SimpleModeSettingsManager: if self._simple_mode_settings_manager is None: self._simple_mode_settings_manager = SimpleModeSettingsManager() return self._simple_mode_settings_manager @@ -1193,12 +1198,14 @@ class CuraApplication(QtApplication): return self._print_information - def getQualityProfilesDropDownMenuModel(self, *args, **kwargs): + pyqtSlot(result =QObject) + def getQualityProfilesDropDownMenuModel(self, *args, **kwargs)-> QualityProfilesDropDownMenuModel: if self._quality_profile_drop_down_menu_model is None: self._quality_profile_drop_down_menu_model = QualityProfilesDropDownMenuModel(self) return self._quality_profile_drop_down_menu_model - def getCustomQualityProfilesDropDownMenuModel(self, *args, **kwargs): + pyqtSlot(result=QObject) + def getCustomQualityProfilesDropDownMenuModel(self, *args, **kwargs)->CustomQualityProfilesDropDownMenuModel: if self._custom_quality_profile_drop_down_menu_model is None: self._custom_quality_profile_drop_down_menu_model = CustomQualityProfilesDropDownMenuModel(self) return self._custom_quality_profile_drop_down_menu_model @@ -1231,8 +1238,6 @@ class CuraApplication(QtApplication): qmlRegisterSingletonType(MachineManager, "Cura", 1, 0, self.getMachineManager, "MachineManager") qmlRegisterSingletonType(IntentManager, "Cura", 1, 6, self.getIntentManager, "IntentManager") qmlRegisterSingletonType(SettingInheritanceManager, "Cura", 1, 0, self.getSettingInheritanceManager, "SettingInheritanceManager") - qmlRegisterSingletonType(SimpleModeSettingsManager, "Cura", 1, 0, self.getSimpleModeSettingsManager, "SimpleModeSettingsManager") - qmlRegisterSingletonType(MachineActionManager.MachineActionManager, "Cura", 1, 0, self.getMachineActionManager, "MachineActionManager") self.processEvents() qmlRegisterType(NetworkingUtil, "Cura", 1, 5, "NetworkingUtil") @@ -1257,16 +1262,11 @@ class CuraApplication(QtApplication): qmlRegisterType(FavoriteMaterialsModel, "Cura", 1, 0, "FavoriteMaterialsModel") qmlRegisterType(GenericMaterialsModel, "Cura", 1, 0, "GenericMaterialsModel") qmlRegisterType(MaterialBrandsModel, "Cura", 1, 0, "MaterialBrandsModel") - qmlRegisterSingletonType(QualityManagementModel, "Cura", 1, 0, self.getQualityManagementModel, "QualityManagementModel") - qmlRegisterSingletonType(MaterialManagementModel, "Cura", 1, 5, self.getMaterialManagementModel, "MaterialManagementModel") self.processEvents() qmlRegisterType(DiscoveredPrintersModel, "Cura", 1, 0, "DiscoveredPrintersModel") qmlRegisterType(DiscoveredCloudPrintersModel, "Cura", 1, 7, "DiscoveredCloudPrintersModel") - qmlRegisterSingletonType(QualityProfilesDropDownMenuModel, "Cura", 1, 0, - self.getQualityProfilesDropDownMenuModel, "QualityProfilesDropDownMenuModel") - qmlRegisterSingletonType(CustomQualityProfilesDropDownMenuModel, "Cura", 1, 0, - self.getCustomQualityProfilesDropDownMenuModel, "CustomQualityProfilesDropDownMenuModel") + qmlRegisterType(QualityProfilesDropDownMenuModel, "Cura", 1, 0, "QualityProfilesDropDownMenuModel") qmlRegisterType(NozzleModel, "Cura", 1, 0, "NozzleModel") qmlRegisterType(IntentModel, "Cura", 1, 6, "IntentModel") qmlRegisterType(IntentCategoryModel, "Cura", 1, 6, "IntentCategoryModel") diff --git a/resources/qml/Preferences/MachinesPage.qml b/resources/qml/Preferences/MachinesPage.qml index fb98cb59c5..971de03696 100644 --- a/resources/qml/Preferences/MachinesPage.qml +++ b/resources/qml/Preferences/MachinesPage.qml @@ -12,6 +12,7 @@ import Cura 1.0 as Cura UM.ManagementPage { id: base + property var machineActionManager: CuraApplication.getMachineActionManagerQml() Item { enabled: false; UM.I18nCatalog { id: catalog; name: "cura"} } title: catalog.i18nc("@title:tab", "Printers") @@ -58,10 +59,11 @@ UM.ManagementPage anchors.fill: parent spacing: UM.Theme.getSize("default_margin").height + Repeater { id: machineActionRepeater - model: base.currentItem ? Cura.MachineActionManager.getSupportedActions(Cura.MachineManager.getDefinitionByMachineId(base.currentItem.id)) : null + model: base.currentItem ? machineActionManager.getSupportedActions(Cura.MachineManager.getDefinitionByMachineId(base.currentItem.id)) : null Item { diff --git a/resources/qml/PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml b/resources/qml/PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml index 646e835cb2..9facc5095e 100644 --- a/resources/qml/PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml +++ b/resources/qml/PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml @@ -187,7 +187,7 @@ Popup //Add all the custom profiles. Repeater { - model: Cura.CustomQualityProfilesDropDownMenuModel + model: CuraApplication.getCustomQualityProfilesDropDownMenuModel() MenuButton { onClicked: Cura.MachineManager.setQualityChangesGroup(model.quality_changes_group) diff --git a/resources/qml/PrintSetupSelector/ProfileWarningReset.qml b/resources/qml/PrintSetupSelector/ProfileWarningReset.qml index c44fcc8cc2..bf4385446d 100644 --- a/resources/qml/PrintSetupSelector/ProfileWarningReset.qml +++ b/resources/qml/PrintSetupSelector/ProfileWarningReset.qml @@ -11,7 +11,7 @@ import "../Dialogs" Item { property bool fullWarning: true // <- Can you see the warning icon and the text, or is it just the buttons? - + property var simpleModeSettingsManager :CuraApplication.getSimpleModeSettingsManager() height: visible ? UM.Theme.getSize("action_button_icon").height : 0 width: visible ? childrenRect.width: 0 visible: Cura.MachineManager.hasUserSettings || (fullWarning && Cura.MachineManager.hasCustomQuality) @@ -96,7 +96,7 @@ Item State { name: "custom settings changed" - when: Cura.SimpleModeSettingsManager.isProfileCustomized + when: simpleModeSettingsManager.isProfileCustomized PropertyChanges { target: warning From a7137c5e634264b036ca3b38c8084423fbd8c2f1 Mon Sep 17 00:00:00 2001 From: "c.lamboo" Date: Mon, 8 Jan 2024 14:44:17 +0100 Subject: [PATCH 111/182] Add raft settings to make margin and remove inside corners configurable per raft-type Added teh following settings - raft_base_margin - raft_interface_margin - raft_surface_margin - raft_base_smoothing - raft_interface_smoothing - raft_surface_smoothing - raft_base_remove_inside_corners - raft_interface_remove_inside_corners - raft_surface_remove_inside_corners --- resources/definitions/fdmprinter.def.json | 129 +++++++++++++++++++++- resources/setting_visibility/expert.cfg | 9 ++ 2 files changed, 135 insertions(+), 3 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 2b37b3d7ac..b40e074f1c 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -6114,7 +6114,51 @@ "enabled": "resolveOrValue('adhesion_type') == 'raft'", "limit_to_extruder": "adhesion_extruder_nr", "settable_per_mesh": false, - "settable_per_extruder": true + "settable_per_extruder": true, + "children": { + "raft_base_margin": { + "label": "Raft Base Extra Margin", + "description": "If the raft base is enabled, this is the extra raft area around the model which is also given a raft. Increasing this margin will create a stronger raft while using more material and leaving less area for your print.", + "unit": "mm", + "type": "float", + "value": "raft_margin", + "default_value": 15, + "minimum_value_warning": "raft_interface_line_width", + "maximum_value_warning": "20", + "enabled": "resolveOrValue('adhesion_type') == 'raft'", + "limit_to_extruder": "adhesion_extruder_nr", + "settable_per_mesh": false, + "settable_per_extruder": true + }, + "raft_interface_margin": { + "label": "Raft Middle Extra Margin", + "description": "If the raft middle is enabled, this is the extra raft area around the model which is also given a raft. Increasing this margin will create a stronger raft while using more material and leaving less area for your print.", + "unit": "mm", + "type": "float", + "value": "raft_margin", + "default_value": 15, + "minimum_value_warning": "raft_interface_line_width", + "maximum_value_warning": "20", + "enabled": "resolveOrValue('adhesion_type') == 'raft'", + "limit_to_extruder": "adhesion_extruder_nr", + "settable_per_mesh": false, + "settable_per_extruder": true + }, + "raft_surface_margin": { + "label": "Raft Top Extra Margin", + "description": "If the raft top is enabled, this is the extra raft area around the model which is also given a raft. Increasing this margin will create a stronger raft while using more material and leaving less area for your print.", + "unit": "mm", + "type": "float", + "value": "raft_margin", + "default_value": 15, + "minimum_value_warning": "raft_interface_line_width", + "maximum_value_warning": "20", + "enabled": "resolveOrValue('adhesion_type') == 'raft'", + "limit_to_extruder": "adhesion_extruder_nr", + "settable_per_mesh": false, + "settable_per_extruder": true + } + } }, "raft_smoothing": { @@ -6128,7 +6172,51 @@ "enabled": "resolveOrValue('adhesion_type') == 'raft' and not raft_remove_inside_corners", "limit_to_extruder": "adhesion_extruder_nr", "settable_per_mesh": false, - "settable_per_extruder": true + "settable_per_extruder": true, + "children": { + "raft_base_smoothing": { + "label": "Raft Base Smoothing", + "description": "This setting controls how much inner corners in the raft base outline are rounded. Inward corners are rounded to a semi circle with a radius equal to the value given here. This setting also removes holes in the raft outline which are smaller than such a circle.", + "unit": "mm", + "type": "float", + "value": "raft_smoothing", + "default_value": 5, + "minimum_value": "0", + "minimum_value_warning": "raft_interface_line_width", + "enabled": "resolveOrValue('adhesion_type') == 'raft' and not raft_base_remove_inside_corners", + "limit_to_extruder": "adhesion_extruder_nr", + "settable_per_mesh": false, + "settable_per_extruder": true + }, + "raft_interface_smoothing": { + "label": "Raft Middle Smoothing", + "description": "This setting controls how much inner corners in the raft middle outline are rounded. Inward corners are rounded to a semi circle with a radius equal to the value given here. This setting also removes holes in the raft outline which are smaller than such a circle.", + "unit": "mm", + "type": "float", + "value": "raft_smoothing", + "default_value": 5, + "minimum_value": "0", + "minimum_value_warning": "raft_interface_line_width", + "enabled": "resolveOrValue('adhesion_type') == 'raft' and not raft_interface_remove_inside_corners", + "limit_to_extruder": "adhesion_extruder_nr", + "settable_per_mesh": false, + "settable_per_extruder": true + }, + "raft_surface_smoothing": { + "label": "Raft Top Smoothing", + "description": "This setting controls how much inner corners in the raft top outline are rounded. Inward corners are rounded to a semi circle with a radius equal to the value given here. This setting also removes holes in the raft outline which are smaller than such a circle.", + "unit": "mm", + "type": "float", + "value": "raft_smoothing", + "default_value": 5, + "minimum_value": "0", + "minimum_value_warning": "raft_interface_line_width", + "enabled": "resolveOrValue('adhesion_type') == 'raft' and not raft_surface_remove_inside_corners", + "limit_to_extruder": "adhesion_extruder_nr", + "settable_per_mesh": false, + "settable_per_extruder": true + } + } }, "raft_airgap": { @@ -8284,7 +8372,42 @@ "resolve": "any(extruderValues('raft_remove_inside_corners'))", "enabled": "resolveOrValue('adhesion_type') == 'raft'", "settable_per_mesh": false, - "settable_per_extruder": false + "settable_per_extruder": false, + "children": { + "raft_base_remove_inside_corners": { + "label": "Remove Raft Base Inside Corners", + "description": "Remove inside corners from the raft base, causing the raft to become convex.", + "type": "bool", + "value": "raft_remove_inside_corners", + "default_value": false, + "resolve": "any(extruderValues('raft_remove_inside_corners'))", + "enabled": "resolveOrValue('adhesion_type') == 'raft'", + "settable_per_mesh": false, + "settable_per_extruder": false + }, + "raft_interface_remove_inside_corners": { + "label": "Remove Raft Middle Inside Corners", + "description": "Remove inside corners from the raft middle part, causing the raft to become convex.", + "type": "bool", + "value": "raft_remove_inside_corners", + "default_value": false, + "resolve": "any(extruderValues('raft_remove_inside_corners'))", + "enabled": "resolveOrValue('adhesion_type') == 'raft'", + "settable_per_mesh": false, + "settable_per_extruder": false + }, + "raft_surface_remove_inside_corners": { + "label": "Remove Raft Top Inside Corners", + "description": "Remove inside corners from the raft top part, causing the raft to become convex.", + "type": "bool", + "value": "raft_remove_inside_corners", + "default_value": false, + "resolve": "any(extruderValues('raft_remove_inside_corners'))", + "enabled": "resolveOrValue('adhesion_type') == 'raft'", + "settable_per_mesh": false, + "settable_per_extruder": false + } + } }, "raft_base_wall_count": { diff --git a/resources/setting_visibility/expert.cfg b/resources/setting_visibility/expert.cfg index 2f2dd7671d..ebab2357dd 100644 --- a/resources/setting_visibility/expert.cfg +++ b/resources/setting_visibility/expert.cfg @@ -331,7 +331,13 @@ brim_line_count brim_outside_only brim_smart_ordering raft_margin +raft_base_margin +raft_interface_margin +raft_surface_margin raft_smoothing +raft_base_smoothing +raft_interface_smoothing +raft_surface_smoothing raft_airgap raft_surface_layers raft_surface_thickness @@ -467,3 +473,6 @@ small_hole_max_size small_feature_max_length small_feature_speed_factor small_feature_speed_factor_0 +raft_base_remove_inside_corners +raft_interface_remove_inside_corners +raft_surface_remove_inside_corners \ No newline at end of file From ff45f566d6ee27779fe01b3347c7239865bf1719 Mon Sep 17 00:00:00 2001 From: casperlamboo Date: Mon, 8 Jan 2024 13:46:14 +0000 Subject: [PATCH 112/182] Applied printer-linter format --- resources/definitions/fdmprinter.def.json | 36 +++++++++++++++-------- 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index b40e074f1c..ff09a16228 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -6115,8 +6115,10 @@ "limit_to_extruder": "adhesion_extruder_nr", "settable_per_mesh": false, "settable_per_extruder": true, - "children": { - "raft_base_margin": { + "children": + { + "raft_base_margin": + { "label": "Raft Base Extra Margin", "description": "If the raft base is enabled, this is the extra raft area around the model which is also given a raft. Increasing this margin will create a stronger raft while using more material and leaving less area for your print.", "unit": "mm", @@ -6130,7 +6132,8 @@ "settable_per_mesh": false, "settable_per_extruder": true }, - "raft_interface_margin": { + "raft_interface_margin": + { "label": "Raft Middle Extra Margin", "description": "If the raft middle is enabled, this is the extra raft area around the model which is also given a raft. Increasing this margin will create a stronger raft while using more material and leaving less area for your print.", "unit": "mm", @@ -6144,7 +6147,8 @@ "settable_per_mesh": false, "settable_per_extruder": true }, - "raft_surface_margin": { + "raft_surface_margin": + { "label": "Raft Top Extra Margin", "description": "If the raft top is enabled, this is the extra raft area around the model which is also given a raft. Increasing this margin will create a stronger raft while using more material and leaving less area for your print.", "unit": "mm", @@ -6173,8 +6177,10 @@ "limit_to_extruder": "adhesion_extruder_nr", "settable_per_mesh": false, "settable_per_extruder": true, - "children": { - "raft_base_smoothing": { + "children": + { + "raft_base_smoothing": + { "label": "Raft Base Smoothing", "description": "This setting controls how much inner corners in the raft base outline are rounded. Inward corners are rounded to a semi circle with a radius equal to the value given here. This setting also removes holes in the raft outline which are smaller than such a circle.", "unit": "mm", @@ -6188,7 +6194,8 @@ "settable_per_mesh": false, "settable_per_extruder": true }, - "raft_interface_smoothing": { + "raft_interface_smoothing": + { "label": "Raft Middle Smoothing", "description": "This setting controls how much inner corners in the raft middle outline are rounded. Inward corners are rounded to a semi circle with a radius equal to the value given here. This setting also removes holes in the raft outline which are smaller than such a circle.", "unit": "mm", @@ -6202,7 +6209,8 @@ "settable_per_mesh": false, "settable_per_extruder": true }, - "raft_surface_smoothing": { + "raft_surface_smoothing": + { "label": "Raft Top Smoothing", "description": "This setting controls how much inner corners in the raft top outline are rounded. Inward corners are rounded to a semi circle with a radius equal to the value given here. This setting also removes holes in the raft outline which are smaller than such a circle.", "unit": "mm", @@ -8373,8 +8381,10 @@ "enabled": "resolveOrValue('adhesion_type') == 'raft'", "settable_per_mesh": false, "settable_per_extruder": false, - "children": { - "raft_base_remove_inside_corners": { + "children": + { + "raft_base_remove_inside_corners": + { "label": "Remove Raft Base Inside Corners", "description": "Remove inside corners from the raft base, causing the raft to become convex.", "type": "bool", @@ -8385,7 +8395,8 @@ "settable_per_mesh": false, "settable_per_extruder": false }, - "raft_interface_remove_inside_corners": { + "raft_interface_remove_inside_corners": + { "label": "Remove Raft Middle Inside Corners", "description": "Remove inside corners from the raft middle part, causing the raft to become convex.", "type": "bool", @@ -8396,7 +8407,8 @@ "settable_per_mesh": false, "settable_per_extruder": false }, - "raft_surface_remove_inside_corners": { + "raft_surface_remove_inside_corners": + { "label": "Remove Raft Top Inside Corners", "description": "Remove inside corners from the raft top part, causing the raft to become convex.", "type": "bool", From 35131d5d7ce03b3ec7c5af4260b2baef43183382 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Mon, 8 Jan 2024 15:54:32 +0100 Subject: [PATCH 113/182] Inherit secrets for UT Fixes CURA-11497 --- .github/workflows/unit-test-post.yml | 1 + .github/workflows/unit-test.yml | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/unit-test-post.yml b/.github/workflows/unit-test-post.yml index eaf69692a7..a8e9f26b8b 100644 --- a/.github/workflows/unit-test-post.yml +++ b/.github/workflows/unit-test-post.yml @@ -11,3 +11,4 @@ jobs: with: event: ${{ github.event.workflow_run.event }} conclusion: ${{ github.event.workflow_run.conclusion }} + secrets: inherit diff --git a/.github/workflows/unit-test.yml b/.github/workflows/unit-test.yml index 7c6910b39f..9a42f4f85d 100644 --- a/.github/workflows/unit-test.yml +++ b/.github/workflows/unit-test.yml @@ -58,4 +58,5 @@ jobs: conan_extra_args: '-g VirtualPythonEnv -o cura:devtools=True -c tools.build:skip_test=False' unit_test_cmd: 'pytest --junitxml=junit_cura.xml' unit_test_dir: 'tests' - conan_generator_dir: './venv/bin' \ No newline at end of file + conan_generator_dir: './venv/bin' + secrets: inherit \ No newline at end of file From 90ce6d7f765358c38308b46b4bcbcee3df01b2d6 Mon Sep 17 00:00:00 2001 From: Erwan MATHIEU Date: Mon, 8 Jan 2024 16:53:10 +0100 Subject: [PATCH 114/182] Reorganize raft settings to a user-intuitive order CURA-11228 --- resources/definitions/fdmprinter.def.json | 250 +++++++++++----------- 1 file changed, 125 insertions(+), 125 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 32908b6f3e..a49d613ce1 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -6159,66 +6159,53 @@ "settable_per_extruder": true, "limit_to_extruder": "raft_surface_extruder_nr" }, - "raft_surface_layers": + "raft_base_thickness": { - "label": "Raft Top Layers", - "description": "The number of top layers on top of the 2nd raft layer. These are fully filled layers that the model sits on. 2 layers result in a smoother top surface than 1.", - "type": "int", - "default_value": 2, - "minimum_value": "0", - "maximum_value_warning": "20", + "label": "Raft Base Thickness", + "description": "Layer thickness of the base raft layer. This should be a thick layer which sticks firmly to the printer build plate.", + "unit": "mm", + "type": "float", + "default_value": 0.3, + "value": "resolveOrValue('layer_height_0') * 1.2", + "minimum_value": "0.001", + "minimum_value_warning": "0.04", + "maximum_value_warning": "0.75 * raft_base_line_width", "enabled": "resolveOrValue('adhesion_type') == 'raft'", "settable_per_mesh": false, "settable_per_extruder": true, - "limit_to_extruder": "raft_surface_extruder_nr" + "limit_to_extruder": "raft_base_extruder_nr" }, - "raft_surface_thickness": + "raft_base_line_width": { - "label": "Raft Top Layer Thickness", - "description": "Layer thickness of the top raft layers.", + "label": "Raft Base Line Width", + "description": "Width of the lines in the base raft layer. These should be thick lines to assist in build plate adhesion.", "unit": "mm", "type": "float", - "default_value": 0.1, - "value": "resolveOrValue('layer_height')", + "default_value": 0.8, "minimum_value": "0.001", - "minimum_value_warning": "0.04", - "maximum_value_warning": "0.75 * machine_nozzle_size", - "enabled": "resolveOrValue('adhesion_type') == 'raft' and raft_surface_layers > 0", + "value": "machine_nozzle_size * 2", + "minimum_value_warning": "machine_nozzle_size * 0.5", + "maximum_value_warning": "machine_nozzle_size * 3", + "enabled": "resolveOrValue('adhesion_type') == 'raft'", "settable_per_mesh": false, "settable_per_extruder": true, - "limit_to_extruder": "raft_surface_extruder_nr" + "limit_to_extruder": "raft_base_extruder_nr" }, - "raft_surface_line_width": + "raft_base_line_spacing": { - "label": "Raft Top Line Width", - "description": "Width of the lines in the top surface of the raft. These can be thin lines so that the top of the raft becomes smooth.", + "label": "Raft Base Line Spacing", + "description": "The distance between the raft lines for the base raft layer. Wide spacing makes for easy removal of the raft from the build plate.", "unit": "mm", "type": "float", - "default_value": 0.4, - "value": "line_width", - "minimum_value": "0.001", - "minimum_value_warning": "machine_nozzle_size * 0.1", - "maximum_value_warning": "machine_nozzle_size * 2", - "enabled": "resolveOrValue('adhesion_type') == 'raft' and raft_surface_layers > 0", - "settable_per_mesh": false, - "settable_per_extruder": true, - "limit_to_extruder": "raft_surface_extruder_nr" - }, - "raft_surface_line_spacing": - { - "label": "Raft Top Spacing", - "description": "The distance between the raft lines for the top raft layers. The spacing should be equal to the line width, so that the surface is solid.", - "unit": "mm", - "type": "float", - "default_value": 0.4, + "default_value": 1.6, + "value": "raft_base_line_width * 2", "minimum_value": "0", - "minimum_value_warning": "raft_surface_line_width", - "maximum_value_warning": "raft_surface_line_width * 3", - "enabled": "resolveOrValue('adhesion_type') == 'raft' and raft_surface_layers > 0", - "value": "raft_surface_line_width", + "minimum_value_warning": "raft_base_line_width", + "maximum_value_warning": "100", + "enabled": "resolveOrValue('adhesion_type') == 'raft'", "settable_per_mesh": false, "settable_per_extruder": true, - "limit_to_extruder": "raft_surface_extruder_nr" + "limit_to_extruder": "raft_base_extruder_nr" }, "raft_interface_layers": { @@ -6281,53 +6268,66 @@ "settable_per_extruder": true, "limit_to_extruder": "raft_interface_extruder_nr" }, - "raft_base_thickness": + "raft_surface_layers": { - "label": "Raft Base Thickness", - "description": "Layer thickness of the base raft layer. This should be a thick layer which sticks firmly to the printer build plate.", + "label": "Raft Top Layers", + "description": "The number of top layers on top of the 2nd raft layer. These are fully filled layers that the model sits on. 2 layers result in a smoother top surface than 1.", + "type": "int", + "default_value": 2, + "minimum_value": "0", + "maximum_value_warning": "20", + "enabled": "resolveOrValue('adhesion_type') == 'raft'", + "settable_per_mesh": false, + "settable_per_extruder": true, + "limit_to_extruder": "raft_surface_extruder_nr" + }, + "raft_surface_thickness": + { + "label": "Raft Top Layer Thickness", + "description": "Layer thickness of the top raft layers.", "unit": "mm", "type": "float", - "default_value": 0.3, - "value": "resolveOrValue('layer_height_0') * 1.2", + "default_value": 0.1, + "value": "resolveOrValue('layer_height')", "minimum_value": "0.001", "minimum_value_warning": "0.04", - "maximum_value_warning": "0.75 * raft_base_line_width", - "enabled": "resolveOrValue('adhesion_type') == 'raft'", + "maximum_value_warning": "0.75 * machine_nozzle_size", + "enabled": "resolveOrValue('adhesion_type') == 'raft' and raft_surface_layers > 0", "settable_per_mesh": false, "settable_per_extruder": true, - "limit_to_extruder": "raft_base_extruder_nr" + "limit_to_extruder": "raft_surface_extruder_nr" }, - "raft_base_line_width": + "raft_surface_line_width": { - "label": "Raft Base Line Width", - "description": "Width of the lines in the base raft layer. These should be thick lines to assist in build plate adhesion.", + "label": "Raft Top Line Width", + "description": "Width of the lines in the top surface of the raft. These can be thin lines so that the top of the raft becomes smooth.", "unit": "mm", "type": "float", - "default_value": 0.8, + "default_value": 0.4, + "value": "line_width", "minimum_value": "0.001", - "value": "machine_nozzle_size * 2", - "minimum_value_warning": "machine_nozzle_size * 0.5", - "maximum_value_warning": "machine_nozzle_size * 3", - "enabled": "resolveOrValue('adhesion_type') == 'raft'", + "minimum_value_warning": "machine_nozzle_size * 0.1", + "maximum_value_warning": "machine_nozzle_size * 2", + "enabled": "resolveOrValue('adhesion_type') == 'raft' and raft_surface_layers > 0", "settable_per_mesh": false, "settable_per_extruder": true, - "limit_to_extruder": "raft_base_extruder_nr" + "limit_to_extruder": "raft_surface_extruder_nr" }, - "raft_base_line_spacing": + "raft_surface_line_spacing": { - "label": "Raft Base Line Spacing", - "description": "The distance between the raft lines for the base raft layer. Wide spacing makes for easy removal of the raft from the build plate.", + "label": "Raft Top Spacing", + "description": "The distance between the raft lines for the top raft layers. The spacing should be equal to the line width, so that the surface is solid.", "unit": "mm", "type": "float", - "default_value": 1.6, - "value": "raft_base_line_width * 2", + "default_value": 0.4, "minimum_value": "0", - "minimum_value_warning": "raft_base_line_width", - "maximum_value_warning": "100", - "enabled": "resolveOrValue('adhesion_type') == 'raft'", + "minimum_value_warning": "raft_surface_line_width", + "maximum_value_warning": "raft_surface_line_width * 3", + "enabled": "resolveOrValue('adhesion_type') == 'raft' and raft_surface_layers > 0", + "value": "raft_surface_line_width", "settable_per_mesh": false, "settable_per_extruder": true, - "limit_to_extruder": "raft_base_extruder_nr" + "limit_to_extruder": "raft_surface_extruder_nr" }, "raft_wall_count": { @@ -6341,12 +6341,13 @@ "settable_per_extruder": false, "children": { - "raft_surface_wall_count": + "raft_base_wall_count": { - "label": "Raft Top Wall Count", - "description": "The number of contours to print around the linear pattern in the top layers of the raft.", + "label": "Raft Base Wall Count", + "description": "The number of contours to print around the linear pattern in the base layer of the raft.", "type": "int", - "default_value": 0, + "default_value": 1, + "value": "raft_wall_count", "minimum_value": "0", "enabled": "resolveOrValue('adhesion_type') == 'raft'", "settable_per_mesh": false, @@ -6363,13 +6364,12 @@ "settable_per_mesh": false, "settable_per_extruder": false }, - "raft_base_wall_count": + "raft_surface_wall_count": { - "label": "Raft Base Wall Count", - "description": "The number of contours to print around the linear pattern in the base layer of the raft.", + "label": "Raft Top Wall Count", + "description": "The number of contours to print around the linear pattern in the top layers of the raft.", "type": "int", - "default_value": 1, - "value": "raft_wall_count", + "default_value": 0, "minimum_value": "0", "enabled": "resolveOrValue('adhesion_type') == 'raft'", "settable_per_mesh": false, @@ -6394,21 +6394,21 @@ "limit_to_extruder": "adhesion_extruder_nr", "children": { - "raft_surface_speed": + "raft_base_speed": { - "label": "Raft Top Print Speed", - "description": "The speed at which the top raft layers are printed. These should be printed a bit slower, so that the nozzle can slowly smooth out adjacent surface lines.", + "label": "Raft Base Print Speed", + "description": "The speed at which the base raft layer is printed. This should be printed quite slowly, as the volume of material coming out of the nozzle is quite high.", "unit": "mm/s", "type": "float", - "default_value": 20, + "default_value": 15, "minimum_value": "0.1", "maximum_value": "math.sqrt(machine_max_feedrate_x ** 2 + machine_max_feedrate_y ** 2)", - "maximum_value_warning": "100", - "enabled": "resolveOrValue('adhesion_type') == 'raft' and raft_surface_layers > 0", - "value": "raft_speed", + "maximum_value_warning": "200", + "enabled": "resolveOrValue('adhesion_type') == 'raft'", + "value": "0.75 * raft_speed", "settable_per_mesh": false, "settable_per_extruder": true, - "limit_to_extruder": "raft_surface_extruder_nr" + "limit_to_extruder": "raft_base_extruder_nr" }, "raft_interface_speed": { @@ -6426,21 +6426,21 @@ "settable_per_extruder": true, "limit_to_extruder": "raft_interface_extruder_nr" }, - "raft_base_speed": + "raft_surface_speed": { - "label": "Raft Base Print Speed", - "description": "The speed at which the base raft layer is printed. This should be printed quite slowly, as the volume of material coming out of the nozzle is quite high.", + "label": "Raft Top Print Speed", + "description": "The speed at which the top raft layers are printed. These should be printed a bit slower, so that the nozzle can slowly smooth out adjacent surface lines.", "unit": "mm/s", "type": "float", - "default_value": 15, + "default_value": 20, "minimum_value": "0.1", "maximum_value": "math.sqrt(machine_max_feedrate_x ** 2 + machine_max_feedrate_y ** 2)", - "maximum_value_warning": "200", - "enabled": "resolveOrValue('adhesion_type') == 'raft'", - "value": "0.75 * raft_speed", + "maximum_value_warning": "100", + "enabled": "resolveOrValue('adhesion_type') == 'raft' and raft_surface_layers > 0", + "value": "raft_speed", "settable_per_mesh": false, "settable_per_extruder": true, - "limit_to_extruder": "raft_base_extruder_nr" + "limit_to_extruder": "raft_surface_extruder_nr" } } }, @@ -6460,10 +6460,10 @@ "limit_to_extruder": "adhesion_extruder_nr", "children": { - "raft_surface_acceleration": + "raft_base_acceleration": { - "label": "Raft Top Print Acceleration", - "description": "The acceleration with which the top raft layers are printed.", + "label": "Raft Base Print Acceleration", + "description": "The acceleration with which the base raft layer is printed.", "unit": "mm/s\u00b2", "type": "float", "default_value": 3000, @@ -6471,9 +6471,9 @@ "minimum_value": "0.1", "minimum_value_warning": "100", "maximum_value_warning": "10000", - "enabled": "resolveOrValue('adhesion_type') == 'raft' and resolveOrValue('acceleration_enabled') and raft_surface_layers > 0", + "enabled": "resolveOrValue('adhesion_type') == 'raft' and resolveOrValue('acceleration_enabled')", "settable_per_mesh": false, - "limit_to_extruder": "raft_surface_extruder_nr" + "limit_to_extruder": "raft_base_extruder_nr" }, "raft_interface_acceleration": { @@ -6490,10 +6490,10 @@ "settable_per_mesh": false, "limit_to_extruder": "raft_interface_extruder_nr" }, - "raft_base_acceleration": + "raft_surface_acceleration": { - "label": "Raft Base Print Acceleration", - "description": "The acceleration with which the base raft layer is printed.", + "label": "Raft Top Print Acceleration", + "description": "The acceleration with which the top raft layers are printed.", "unit": "mm/s\u00b2", "type": "float", "default_value": 3000, @@ -6501,9 +6501,9 @@ "minimum_value": "0.1", "minimum_value_warning": "100", "maximum_value_warning": "10000", - "enabled": "resolveOrValue('adhesion_type') == 'raft' and resolveOrValue('acceleration_enabled')", + "enabled": "resolveOrValue('adhesion_type') == 'raft' and resolveOrValue('acceleration_enabled') and raft_surface_layers > 0", "settable_per_mesh": false, - "limit_to_extruder": "raft_base_extruder_nr" + "limit_to_extruder": "raft_surface_extruder_nr" } } }, @@ -6523,20 +6523,20 @@ "limit_to_extruder": "adhesion_extruder_nr", "children": { - "raft_surface_jerk": + "raft_base_jerk": { - "label": "Raft Top Print Jerk", - "description": "The jerk with which the top raft layers are printed.", + "label": "Raft Base Print Jerk", + "description": "The jerk with which the base raft layer is printed.", "unit": "mm/s", "type": "float", "default_value": 20, "value": "raft_jerk", "minimum_value": "0", "minimum_value_warning": "5", - "maximum_value_warning": "100", - "enabled": "resolveOrValue('adhesion_type') == 'raft' and resolveOrValue('jerk_enabled') and raft_surface_layers > 0", + "maximum_value_warning": "50", + "enabled": "resolveOrValue('adhesion_type') == 'raft' and resolveOrValue('jerk_enabled')", "settable_per_mesh": false, - "limit_to_extruder": "raft_surface_extruder_nr" + "limit_to_extruder": "raft_base_extruder_nr" }, "raft_interface_jerk": { @@ -6553,20 +6553,20 @@ "settable_per_mesh": false, "limit_to_extruder": "raft_interface_extruder_nr" }, - "raft_base_jerk": + "raft_surface_jerk": { - "label": "Raft Base Print Jerk", - "description": "The jerk with which the base raft layer is printed.", + "label": "Raft Top Print Jerk", + "description": "The jerk with which the top raft layers are printed.", "unit": "mm/s", "type": "float", "default_value": 20, "value": "raft_jerk", "minimum_value": "0", "minimum_value_warning": "5", - "maximum_value_warning": "50", - "enabled": "resolveOrValue('adhesion_type') == 'raft' and resolveOrValue('jerk_enabled')", + "maximum_value_warning": "100", + "enabled": "resolveOrValue('adhesion_type') == 'raft' and resolveOrValue('jerk_enabled') and raft_surface_layers > 0", "settable_per_mesh": false, - "limit_to_extruder": "raft_base_extruder_nr" + "limit_to_extruder": "raft_surface_extruder_nr" } } }, @@ -6585,20 +6585,20 @@ "limit_to_extruder": "adhesion_extruder_nr", "children": { - "raft_surface_fan_speed": + "raft_base_fan_speed": { - "label": "Raft Top Fan Speed", - "description": "The fan speed for the top raft layers.", + "label": "Raft Base Fan Speed", + "description": "The fan speed for the base raft layer.", "unit": "%", "type": "float", "minimum_value": "0", "maximum_value": "100", "default_value": 0, "value": "raft_fan_speed", - "enabled": "resolveOrValue('adhesion_type') == 'raft' and raft_surface_layers > 0", + "enabled": "resolveOrValue('adhesion_type') == 'raft'", "settable_per_mesh": false, "settable_per_extruder": true, - "limit_to_extruder": "raft_surface_extruder_nr" + "limit_to_extruder": "raft_base_extruder_nr" }, "raft_interface_fan_speed": { @@ -6615,20 +6615,20 @@ "settable_per_extruder": true, "limit_to_extruder": "raft_interface_extruder_nr" }, - "raft_base_fan_speed": + "raft_surface_fan_speed": { - "label": "Raft Base Fan Speed", - "description": "The fan speed for the base raft layer.", + "label": "Raft Top Fan Speed", + "description": "The fan speed for the top raft layers.", "unit": "%", "type": "float", "minimum_value": "0", "maximum_value": "100", "default_value": 0, "value": "raft_fan_speed", - "enabled": "resolveOrValue('adhesion_type') == 'raft'", + "enabled": "resolveOrValue('adhesion_type') == 'raft' and raft_surface_layers > 0", "settable_per_mesh": false, "settable_per_extruder": true, - "limit_to_extruder": "raft_base_extruder_nr" + "limit_to_extruder": "raft_surface_extruder_nr" } } } From d01b5c17678a853b87f1af1eb26b13fbae1f78e6 Mon Sep 17 00:00:00 2001 From: "saumya.jain" Date: Mon, 8 Jan 2024 17:46:04 +0100 Subject: [PATCH 115/182] Renmoved singleton Um.Application CURA-7812 --- cura/CuraApplication.py | 2 +- resources/qml/Dialogs/AboutDialog.qml | 2 +- .../qml/PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 3243260b6e..20048e3d3f 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -1266,7 +1266,7 @@ class CuraApplication(QtApplication): self.processEvents() qmlRegisterType(DiscoveredPrintersModel, "Cura", 1, 0, "DiscoveredPrintersModel") qmlRegisterType(DiscoveredCloudPrintersModel, "Cura", 1, 7, "DiscoveredCloudPrintersModel") - qmlRegisterType(QualityProfilesDropDownMenuModel, "Cura", 1, 0, "QualityProfilesDropDownMenuModel") + qmlRegisterType(CustomQualityProfilesDropDownMenuModel, "Cura", 1, 0, "CustomQualityProfilesDropDownMenuModel") qmlRegisterType(NozzleModel, "Cura", 1, 0, "NozzleModel") qmlRegisterType(IntentModel, "Cura", 1, 6, "IntentModel") qmlRegisterType(IntentCategoryModel, "Cura", 1, 6, "IntentCategoryModel") diff --git a/resources/qml/Dialogs/AboutDialog.qml b/resources/qml/Dialogs/AboutDialog.qml index 947b46269a..79cad92b25 100644 --- a/resources/qml/Dialogs/AboutDialog.qml +++ b/resources/qml/Dialogs/AboutDialog.qml @@ -58,7 +58,7 @@ UM.Dialog UM.Label { id: version - text: catalog.i18nc("@label","version: %1").arg(UM.Application.version) + text: catalog.i18nc("@label","version: %1").arg(CuraApplication.applicationVersion()) font: UM.Theme.getFont("large_bold") color: UM.Theme.getColor("button_text") anchors.right : logo.right diff --git a/resources/qml/PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml b/resources/qml/PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml index 9facc5095e..646e835cb2 100644 --- a/resources/qml/PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml +++ b/resources/qml/PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml @@ -187,7 +187,7 @@ Popup //Add all the custom profiles. Repeater { - model: CuraApplication.getCustomQualityProfilesDropDownMenuModel() + model: Cura.CustomQualityProfilesDropDownMenuModel MenuButton { onClicked: Cura.MachineManager.setQualityChangesGroup(model.quality_changes_group) From 023a8f232588ce6c5fd84adf57960caabc99a210 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Tue, 9 Jan 2024 08:32:33 +0100 Subject: [PATCH 116/182] Ensure that nightlies have default values Fixes CURA-11528 --- .github/workflows/installers.yml | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/.github/workflows/installers.yml b/.github/workflows/installers.yml index 9c51cfe820..29ff24c2b5 100644 --- a/.github/workflows/installers.yml +++ b/.github/workflows/installers.yml @@ -54,9 +54,9 @@ jobs: needs: [ default_values ] with: cura_conan_version: ${{ needs.default_values.outputs.cura_conan_version }} - conan_args: ${{ inputs.conan_args }} - enterprise: ${{ inputs.enterprise }} - staging: ${{ inputs.staging }} + conan_args: ${{ env.CONAN_ARGS }} + enterprise: ${{ env.ENTERPRISE }} + staging: ${{ env.STAGING }} architecture: X64 operating_system: windows-2022 secrets: inherit @@ -66,9 +66,9 @@ jobs: needs: [ default_values ] with: cura_conan_version: ${{ needs.default_values.outputs.cura_conan_version }} - conan_args: ${{ inputs.conan_args }} - enterprise: ${{ inputs.enterprise }} - staging: ${{ inputs.staging }} + conan_args: ${{ env.CONAN_ARGS }} + enterprise: ${{ env.ENTERPRISE }} + staging: ${{ env.STAGING }} architecture: X64 operating_system: ubuntu-22.04 secrets: inherit @@ -78,9 +78,9 @@ jobs: needs: [ default_values ] with: cura_conan_version: ${{ needs.default_values.outputs.cura_conan_version }} - conan_args: ${{ inputs.conan_args }} - enterprise: ${{ inputs.enterprise }} - staging: ${{ inputs.staging }} + conan_args: ${{ env.CONAN_ARGS }} + enterprise: ${{ env.ENTERPRISE }} + staging: ${{ env.STAGING }} architecture: X64 operating_system: self-hosted-X64 secrets: inherit @@ -90,9 +90,9 @@ jobs: needs: [ default_values ] with: cura_conan_version: ${{ needs.default_values.outputs.cura_conan_version }} - conan_args: ${{ inputs.conan_args }} - enterprise: ${{ inputs.enterprise }} - staging: ${{ inputs.staging }} + conan_args: ${{ env.CONAN_ARGS }} + enterprise: ${{ env.ENTERPRISE }} + staging: ${{ env.STAGING }} architecture: ARM64 operating_system: self-hosted-ARM64 secrets: inherit From 7244ba4e24d516a97ea04f558a239ef3d747179e Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Tue, 9 Jan 2024 08:38:17 +0100 Subject: [PATCH 117/182] Revert "Ensure that nightlies have default values" This reverts commit 023a8f232588ce6c5fd84adf57960caabc99a210. --- .github/workflows/installers.yml | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/.github/workflows/installers.yml b/.github/workflows/installers.yml index 29ff24c2b5..9c51cfe820 100644 --- a/.github/workflows/installers.yml +++ b/.github/workflows/installers.yml @@ -54,9 +54,9 @@ jobs: needs: [ default_values ] with: cura_conan_version: ${{ needs.default_values.outputs.cura_conan_version }} - conan_args: ${{ env.CONAN_ARGS }} - enterprise: ${{ env.ENTERPRISE }} - staging: ${{ env.STAGING }} + conan_args: ${{ inputs.conan_args }} + enterprise: ${{ inputs.enterprise }} + staging: ${{ inputs.staging }} architecture: X64 operating_system: windows-2022 secrets: inherit @@ -66,9 +66,9 @@ jobs: needs: [ default_values ] with: cura_conan_version: ${{ needs.default_values.outputs.cura_conan_version }} - conan_args: ${{ env.CONAN_ARGS }} - enterprise: ${{ env.ENTERPRISE }} - staging: ${{ env.STAGING }} + conan_args: ${{ inputs.conan_args }} + enterprise: ${{ inputs.enterprise }} + staging: ${{ inputs.staging }} architecture: X64 operating_system: ubuntu-22.04 secrets: inherit @@ -78,9 +78,9 @@ jobs: needs: [ default_values ] with: cura_conan_version: ${{ needs.default_values.outputs.cura_conan_version }} - conan_args: ${{ env.CONAN_ARGS }} - enterprise: ${{ env.ENTERPRISE }} - staging: ${{ env.STAGING }} + conan_args: ${{ inputs.conan_args }} + enterprise: ${{ inputs.enterprise }} + staging: ${{ inputs.staging }} architecture: X64 operating_system: self-hosted-X64 secrets: inherit @@ -90,9 +90,9 @@ jobs: needs: [ default_values ] with: cura_conan_version: ${{ needs.default_values.outputs.cura_conan_version }} - conan_args: ${{ env.CONAN_ARGS }} - enterprise: ${{ env.ENTERPRISE }} - staging: ${{ env.STAGING }} + conan_args: ${{ inputs.conan_args }} + enterprise: ${{ inputs.enterprise }} + staging: ${{ inputs.staging }} architecture: ARM64 operating_system: self-hosted-ARM64 secrets: inherit From 76b93c31719822916507560069e19f15fe6639ab Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Tue, 9 Jan 2024 08:40:30 +0100 Subject: [PATCH 118/182] Revert "use `input` instead of the `github.events`" This reverts commit 677f35b5159e53fded2d4c31b2ca58ede6b28373. --- .github/workflows/installers.yml | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/.github/workflows/installers.yml b/.github/workflows/installers.yml index 9c51cfe820..6e531ba833 100644 --- a/.github/workflows/installers.yml +++ b/.github/workflows/installers.yml @@ -54,9 +54,9 @@ jobs: needs: [ default_values ] with: cura_conan_version: ${{ needs.default_values.outputs.cura_conan_version }} - conan_args: ${{ inputs.conan_args }} - enterprise: ${{ inputs.enterprise }} - staging: ${{ inputs.staging }} + conan_args: ${{ github.event.inputs.conan_args }} + enterprise: ${{ github.event.inputs.enterprise == 'true' }} + staging: ${{ github.event.inputs.staging == 'true' }} architecture: X64 operating_system: windows-2022 secrets: inherit @@ -66,9 +66,9 @@ jobs: needs: [ default_values ] with: cura_conan_version: ${{ needs.default_values.outputs.cura_conan_version }} - conan_args: ${{ inputs.conan_args }} - enterprise: ${{ inputs.enterprise }} - staging: ${{ inputs.staging }} + conan_args: ${{ github.event.inputs.conan_args }} + enterprise: ${{ github.event.inputs.enterprise == 'true' }} + staging: ${{ github.event.inputs.staging == 'true' }} architecture: X64 operating_system: ubuntu-22.04 secrets: inherit @@ -78,9 +78,9 @@ jobs: needs: [ default_values ] with: cura_conan_version: ${{ needs.default_values.outputs.cura_conan_version }} - conan_args: ${{ inputs.conan_args }} - enterprise: ${{ inputs.enterprise }} - staging: ${{ inputs.staging }} + conan_args: ${{ github.event.inputs.conan_args }} + enterprise: ${{ github.event.inputs.enterprise == 'true' }} + staging: ${{ github.event.inputs.staging == 'true' }} architecture: X64 operating_system: self-hosted-X64 secrets: inherit @@ -90,9 +90,9 @@ jobs: needs: [ default_values ] with: cura_conan_version: ${{ needs.default_values.outputs.cura_conan_version }} - conan_args: ${{ inputs.conan_args }} - enterprise: ${{ inputs.enterprise }} - staging: ${{ inputs.staging }} + conan_args: ${{ github.event.inputs.conan_args }} + enterprise: ${{ github.event.inputs.enterprise == 'true' }} + staging: ${{ github.event.inputs.staging == 'true' }} architecture: ARM64 operating_system: self-hosted-ARM64 secrets: inherit From 37f350b134d69518ef6455f214f152e4e04737b6 Mon Sep 17 00:00:00 2001 From: "c.lamboo" Date: Tue, 9 Jan 2024 10:15:17 +0100 Subject: [PATCH 119/182] Limit settings to their correct extruders --- resources/definitions/fdmprinter.def.json | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 95588c2f24..3253e25cf3 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -6128,7 +6128,7 @@ "minimum_value_warning": "raft_interface_line_width", "maximum_value_warning": "20", "enabled": "resolveOrValue('adhesion_type') == 'raft'", - "limit_to_extruder": "adhesion_extruder_nr", + "limit_to_extruder": "raft_base_extruder_nr", "settable_per_mesh": false, "settable_per_extruder": true }, @@ -6143,7 +6143,7 @@ "minimum_value_warning": "raft_interface_line_width", "maximum_value_warning": "20", "enabled": "resolveOrValue('adhesion_type') == 'raft'", - "limit_to_extruder": "adhesion_extruder_nr", + "limit_to_extruder": "raft_interface_extruder_nr", "settable_per_mesh": false, "settable_per_extruder": true }, @@ -6158,7 +6158,7 @@ "minimum_value_warning": "raft_interface_line_width", "maximum_value_warning": "20", "enabled": "resolveOrValue('adhesion_type') == 'raft'", - "limit_to_extruder": "adhesion_extruder_nr", + "limit_to_extruder": "raft_surface_extruder_nr", "settable_per_mesh": false, "settable_per_extruder": true } @@ -6190,7 +6190,7 @@ "minimum_value": "0", "minimum_value_warning": "raft_interface_line_width", "enabled": "resolveOrValue('adhesion_type') == 'raft' and not raft_base_remove_inside_corners", - "limit_to_extruder": "adhesion_extruder_nr", + "limit_to_extruder": "raft_base_extruder_nr", "settable_per_mesh": false, "settable_per_extruder": true }, @@ -6205,7 +6205,7 @@ "minimum_value": "0", "minimum_value_warning": "raft_interface_line_width", "enabled": "resolveOrValue('adhesion_type') == 'raft' and not raft_interface_remove_inside_corners", - "limit_to_extruder": "adhesion_extruder_nr", + "limit_to_extruder": "raft_interface_extruder_nr", "settable_per_mesh": false, "settable_per_extruder": true }, @@ -6220,7 +6220,7 @@ "minimum_value": "0", "minimum_value_warning": "raft_interface_line_width", "enabled": "resolveOrValue('adhesion_type') == 'raft' and not raft_surface_remove_inside_corners", - "limit_to_extruder": "adhesion_extruder_nr", + "limit_to_extruder": "raft_surface_extruder_nr", "settable_per_mesh": false, "settable_per_extruder": true } @@ -8440,6 +8440,7 @@ "default_value": false, "resolve": "any(extruderValues('raft_remove_inside_corners'))", "enabled": "resolveOrValue('adhesion_type') == 'raft'", + "limit_to_extruder": "raft_base_extruder_nr", "settable_per_mesh": false, "settable_per_extruder": false }, @@ -8452,6 +8453,7 @@ "default_value": false, "resolve": "any(extruderValues('raft_remove_inside_corners'))", "enabled": "resolveOrValue('adhesion_type') == 'raft'", + "limit_to_extruder": "raft_interface_extruder_nr", "settable_per_mesh": false, "settable_per_extruder": false }, @@ -8464,6 +8466,7 @@ "default_value": false, "resolve": "any(extruderValues('raft_remove_inside_corners'))", "enabled": "resolveOrValue('adhesion_type') == 'raft'", + "limit_to_extruder": "raft_surface_extruder_nr", "settable_per_mesh": false, "settable_per_extruder": false } From af51ccf5f37c5fdaf93bf31de307c5d3678f3691 Mon Sep 17 00:00:00 2001 From: "c.lamboo" Date: Tue, 9 Jan 2024 10:17:10 +0100 Subject: [PATCH 120/182] Move "Remove Raft Inside Corners" outside experimental --- resources/definitions/fdmprinter.def.json | 101 ++++++++++------------ 1 file changed, 48 insertions(+), 53 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 3253e25cf3..ce165d1f3d 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -6164,6 +6164,54 @@ } } }, + "raft_remove_inside_corners": { + "label": "Remove Raft Inside Corners", + "description": "Remove inside corners from the raft, causing the raft to become convex.", + "type": "bool", + "default_value": false, + "resolve": "any(extruderValues('raft_remove_inside_corners'))", + "enabled": "resolveOrValue('adhesion_type') == 'raft'", + "settable_per_mesh": false, + "settable_per_extruder": false, + "children": { + "raft_base_remove_inside_corners": { + "label": "Remove Raft Base Inside Corners", + "description": "Remove inside corners from the raft base, causing the raft to become convex.", + "type": "bool", + "value": "raft_remove_inside_corners", + "default_value": false, + "resolve": "any(extruderValues('raft_remove_inside_corners'))", + "enabled": "resolveOrValue('adhesion_type') == 'raft'", + "limit_to_extruder": "raft_base_extruder_nr", + "settable_per_mesh": false, + "settable_per_extruder": false + }, + "raft_interface_remove_inside_corners": { + "label": "Remove Raft Middle Inside Corners", + "description": "Remove inside corners from the raft middle part, causing the raft to become convex.", + "type": "bool", + "value": "raft_remove_inside_corners", + "default_value": false, + "resolve": "any(extruderValues('raft_remove_inside_corners'))", + "enabled": "resolveOrValue('adhesion_type') == 'raft'", + "limit_to_extruder": "raft_interface_extruder_nr", + "settable_per_mesh": false, + "settable_per_extruder": false + }, + "raft_surface_remove_inside_corners": { + "label": "Remove Raft Top Inside Corners", + "description": "Remove inside corners from the raft top part, causing the raft to become convex.", + "type": "bool", + "value": "raft_remove_inside_corners", + "default_value": false, + "resolve": "any(extruderValues('raft_remove_inside_corners'))", + "enabled": "resolveOrValue('adhesion_type') == 'raft'", + "limit_to_extruder": "raft_surface_extruder_nr", + "settable_per_mesh": false, + "settable_per_extruder": false + } + } + }, "raft_smoothing": { "label": "Raft Smoothing", @@ -8419,59 +8467,6 @@ "settable_per_mesh": true, "settable_per_extruder": true }, - "raft_remove_inside_corners": - { - "label": "Remove Raft Inside Corners", - "description": "Remove inside corners from the raft, causing the raft to become convex.", - "type": "bool", - "default_value": false, - "resolve": "any(extruderValues('raft_remove_inside_corners'))", - "enabled": "resolveOrValue('adhesion_type') == 'raft'", - "settable_per_mesh": false, - "settable_per_extruder": false, - "children": - { - "raft_base_remove_inside_corners": - { - "label": "Remove Raft Base Inside Corners", - "description": "Remove inside corners from the raft base, causing the raft to become convex.", - "type": "bool", - "value": "raft_remove_inside_corners", - "default_value": false, - "resolve": "any(extruderValues('raft_remove_inside_corners'))", - "enabled": "resolveOrValue('adhesion_type') == 'raft'", - "limit_to_extruder": "raft_base_extruder_nr", - "settable_per_mesh": false, - "settable_per_extruder": false - }, - "raft_interface_remove_inside_corners": - { - "label": "Remove Raft Middle Inside Corners", - "description": "Remove inside corners from the raft middle part, causing the raft to become convex.", - "type": "bool", - "value": "raft_remove_inside_corners", - "default_value": false, - "resolve": "any(extruderValues('raft_remove_inside_corners'))", - "enabled": "resolveOrValue('adhesion_type') == 'raft'", - "limit_to_extruder": "raft_interface_extruder_nr", - "settable_per_mesh": false, - "settable_per_extruder": false - }, - "raft_surface_remove_inside_corners": - { - "label": "Remove Raft Top Inside Corners", - "description": "Remove inside corners from the raft top part, causing the raft to become convex.", - "type": "bool", - "value": "raft_remove_inside_corners", - "default_value": false, - "resolve": "any(extruderValues('raft_remove_inside_corners'))", - "enabled": "resolveOrValue('adhesion_type') == 'raft'", - "limit_to_extruder": "raft_surface_extruder_nr", - "settable_per_mesh": false, - "settable_per_extruder": false - } - } - }, "group_outer_walls": { "label": "Group Outer Walls", From 594e4a5ea67fc0266783dfe8052f2b3a8b0191cc Mon Sep 17 00:00:00 2001 From: "c.lamboo" Date: Tue, 9 Jan 2024 10:18:22 +0100 Subject: [PATCH 121/182] Warn if raft extra margin exceeds raft margin of layer below --- resources/definitions/fdmprinter.def.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index ce165d1f3d..48321bae2f 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -6126,7 +6126,7 @@ "value": "raft_margin", "default_value": 15, "minimum_value_warning": "raft_interface_line_width", - "maximum_value_warning": "20", + "maximum_value_warning": "min(raft_interface_margin, 20)", "enabled": "resolveOrValue('adhesion_type') == 'raft'", "limit_to_extruder": "raft_base_extruder_nr", "settable_per_mesh": false, @@ -6141,7 +6141,7 @@ "value": "raft_margin", "default_value": 15, "minimum_value_warning": "raft_interface_line_width", - "maximum_value_warning": "20", + "maximum_value_warning": "min(raft_surface_margin, 20)", "enabled": "resolveOrValue('adhesion_type') == 'raft'", "limit_to_extruder": "raft_interface_extruder_nr", "settable_per_mesh": false, From 4489b8db462e28777e24947fbcc09517566ecfe2 Mon Sep 17 00:00:00 2001 From: "c.lamboo" Date: Tue, 9 Jan 2024 10:21:55 +0100 Subject: [PATCH 122/182] Make expert more consistent Only include parent settings --- resources/setting_visibility/expert.cfg | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/resources/setting_visibility/expert.cfg b/resources/setting_visibility/expert.cfg index 7f72dfe8ab..ab0d2aa920 100644 --- a/resources/setting_visibility/expert.cfg +++ b/resources/setting_visibility/expert.cfg @@ -331,10 +331,8 @@ brim_line_count brim_outside_only brim_smart_ordering raft_margin -raft_base_margin -raft_interface_margin -raft_surface_margin raft_smoothing +raft_remove_inside_corners raft_base_smoothing raft_interface_smoothing raft_surface_smoothing @@ -474,6 +472,3 @@ small_hole_max_size small_feature_max_length small_feature_speed_factor small_feature_speed_factor_0 -raft_base_remove_inside_corners -raft_interface_remove_inside_corners -raft_surface_remove_inside_corners \ No newline at end of file From d9feb88b24836d4015365f953b132fbc0528216d Mon Sep 17 00:00:00 2001 From: casperlamboo Date: Tue, 9 Jan 2024 09:22:53 +0000 Subject: [PATCH 123/182] Applied printer-linter format --- resources/definitions/fdmprinter.def.json | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 48321bae2f..af041bd803 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -6164,7 +6164,8 @@ } } }, - "raft_remove_inside_corners": { + "raft_remove_inside_corners": + { "label": "Remove Raft Inside Corners", "description": "Remove inside corners from the raft, causing the raft to become convex.", "type": "bool", @@ -6173,8 +6174,10 @@ "enabled": "resolveOrValue('adhesion_type') == 'raft'", "settable_per_mesh": false, "settable_per_extruder": false, - "children": { - "raft_base_remove_inside_corners": { + "children": + { + "raft_base_remove_inside_corners": + { "label": "Remove Raft Base Inside Corners", "description": "Remove inside corners from the raft base, causing the raft to become convex.", "type": "bool", @@ -6186,7 +6189,8 @@ "settable_per_mesh": false, "settable_per_extruder": false }, - "raft_interface_remove_inside_corners": { + "raft_interface_remove_inside_corners": + { "label": "Remove Raft Middle Inside Corners", "description": "Remove inside corners from the raft middle part, causing the raft to become convex.", "type": "bool", @@ -6198,7 +6202,8 @@ "settable_per_mesh": false, "settable_per_extruder": false }, - "raft_surface_remove_inside_corners": { + "raft_surface_remove_inside_corners": + { "label": "Remove Raft Top Inside Corners", "description": "Remove inside corners from the raft top part, causing the raft to become convex.", "type": "bool", From 676099ccf6455576cfe444e9823817c678ed29d9 Mon Sep 17 00:00:00 2001 From: "saumya.jain" Date: Tue, 9 Jan 2024 10:29:45 +0100 Subject: [PATCH 124/182] Removed singleton UM.OperationStack, merged with CuraActions Removed ActiveTool singleton added to controller singleton CURA-7812 --- cura/CuraActions.py | 26 ++++++++++++++++++- .../PerObjectSettingsTool/PerObjectItem.qml | 2 +- .../PerObjectSettingsPanel.qml | 22 ++++++++-------- resources/qml/Actions.qml | 8 +++--- .../Custom/CustomPrintSetup.qml | 2 +- resources/qml/Settings/SettingTextField.qml | 2 +- resources/qml/Toolbar.qml | 4 +-- 7 files changed, 45 insertions(+), 21 deletions(-) diff --git a/cura/CuraActions.py b/cura/CuraActions.py index 9a61a1c4f0..36c69618dd 100644 --- a/cura/CuraActions.py +++ b/cura/CuraActions.py @@ -3,10 +3,11 @@ from typing import List, cast -from PyQt6.QtCore import QObject, QUrl, QMimeData +from PyQt6.QtCore import QObject, QUrl, pyqtSignal, pyqtProperty from PyQt6.QtGui import QDesktopServices from PyQt6.QtWidgets import QApplication +from UM.Application import Application from UM.Event import CallFunctionEvent from UM.FlameProfiler import pyqtSlot from UM.Math.Vector import Vector @@ -37,6 +38,10 @@ class CuraActions(QObject): def __init__(self, parent: QObject = None) -> None: super().__init__(parent) + self._operation_stack = Application.getInstance().getOperationStack() + self._operation_stack.changed.connect(self._onUndoStackChanged) + + undoStackChanged = pyqtSignal() @pyqtSlot() def openDocumentation(self) -> None: # Starting a web browser from a signal handler connected to a menu will crash on windows. @@ -45,6 +50,25 @@ class CuraActions(QObject): event = CallFunctionEvent(self._openUrl, [QUrl("https://ultimaker.com/en/resources/manuals/software?utm_source=cura&utm_medium=software&utm_campaign=dropdown-documentation")], {}) cura.CuraApplication.CuraApplication.getInstance().functionEvent(event) + @pyqtProperty(bool, notify=undoStackChanged) + def canUndo(self): + return self._operation_stack.canUndo() + + @pyqtProperty(bool, notify=undoStackChanged) + def canRedo(self): + return self._operation_stack.canRedo() + + @pyqtSlot() + def undo(self): + self._operation_stack.undo() + + @pyqtSlot() + def redo(self): + self._operation_stack.redo() + + def _onUndoStackChanged(self): + self.undoStackChanged.emit() + @pyqtSlot() def openBugReportPage(self) -> None: event = CallFunctionEvent(self._openUrl, [QUrl("https://github.com/Ultimaker/Cura/issues/new/choose")], {}) diff --git a/plugins/PerObjectSettingsTool/PerObjectItem.qml b/plugins/PerObjectSettingsTool/PerObjectItem.qml index b6cf13943b..cd406c80af 100644 --- a/plugins/PerObjectSettingsTool/PerObjectItem.qml +++ b/plugins/PerObjectSettingsTool/PerObjectItem.qml @@ -25,7 +25,7 @@ UM.TooltipArea onClicked: { addedSettingsModel.setVisible(model.key, checked); - UM.ActiveTool.forceUpdate(); + UM.Controller.forceUpdate(); } } diff --git a/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml b/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml index 0ddedee897..78d6643034 100644 --- a/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml +++ b/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml @@ -23,7 +23,7 @@ Item readonly property string infillMeshType: "infill_mesh" readonly property string antiOverhangMeshType: "anti_overhang_mesh" - property var currentMeshType: UM.ActiveTool.properties.getValue("MeshType") + property var currentMeshType: UM.Controller.properties.getValue("MeshType") // Update the view every time the currentMeshType changes onCurrentMeshTypeChanged: @@ -56,7 +56,7 @@ Item function setMeshType(type) { - UM.ActiveTool.setProperty("MeshType", type) + UM.Controller.setProperty("MeshType", type) updateMeshTypeCheckedState(type) } @@ -224,7 +224,7 @@ Item visibilityHandler: Cura.PerObjectSettingVisibilityHandler { id: visibility_handler - selectedObjectId: UM.ActiveTool.properties.getValue("SelectedObjectId") + selectedObjectId: UM.Controller.properties.getValue("SelectedObjectId") } // For some reason the model object is updated after removing him from the memory and @@ -320,7 +320,7 @@ Item { id: provider - containerStackId: UM.ActiveTool.properties.getValue("ContainerID") + containerStackId: UM.Controller.properties.getValue("ContainerID") key: model.key watchedProperties: [ "value", "enabled", "validationState" ] storeIndex: 0 @@ -330,7 +330,7 @@ Item UM.SettingPropertyProvider { id: inheritStackProvider - containerStackId: UM.ActiveTool.properties.getValue("ContainerID") + containerStackId: UM.Controller.properties.getValue("ContainerID") key: model.key watchedProperties: [ "limit_to_extruder" ] } @@ -381,22 +381,22 @@ Item Connections { - target: UM.ActiveTool + target: UM.Controller function onPropertiesChanged() { - // the values cannot be bound with UM.ActiveTool.properties.getValue() calls, + // the values cannot be bound with UM.Controller.properties.getValue() calls, // so here we connect to the signal and update the those values. - if (typeof UM.ActiveTool.properties.getValue("SelectedObjectId") !== "undefined") + if (typeof UM.Controller.properties.getValue("SelectedObjectId") !== "undefined") { - const selectedObjectId = UM.ActiveTool.properties.getValue("SelectedObjectId") + const selectedObjectId = UM.Controller.properties.getValue("SelectedObjectId") if (addedSettingsModel.visibilityHandler.selectedObjectId != selectedObjectId) { addedSettingsModel.visibilityHandler.selectedObjectId = selectedObjectId } } - if (typeof UM.ActiveTool.properties.getValue("ContainerID") !== "undefined") + if (typeof UM.Controller.properties.getValue("ContainerID") !== "undefined") { - const containerId = UM.ActiveTool.properties.getValue("ContainerID") + const containerId = UM.Controller.properties.getValue("ContainerID") if (provider.containerStackId !== containerId) { provider.containerStackId = containerId diff --git a/resources/qml/Actions.qml b/resources/qml/Actions.qml index 458d7fcaae..7eac124a8f 100644 --- a/resources/qml/Actions.qml +++ b/resources/qml/Actions.qml @@ -120,8 +120,8 @@ Item text: catalog.i18nc("@action:inmenu menubar:edit", "&Undo") icon.name: "edit-undo" shortcut: StandardKey.Undo - onTriggered: UM.OperationStack.undo() - enabled: UM.OperationStack.canUndo + onTriggered: UM.CuraActions.undo() + enabled: UM.CuraActions.canUndo } Action @@ -130,8 +130,8 @@ Item text: catalog.i18nc("@action:inmenu menubar:edit", "&Redo") icon.name: "edit-redo" shortcut: StandardKey.Redo - onTriggered: UM.OperationStack.redo() - enabled: UM.OperationStack.canRedo + onTriggered: UM.CuraActions.redo() + enabled: UM.CuraActions.canRedo } Action diff --git a/resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml b/resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml index 41ab40eb31..4cc1e3034a 100644 --- a/resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml +++ b/resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml @@ -160,7 +160,7 @@ Item ProfileWarningReset { id: profileWarningReset - width: childrenRect.width + width: parent.width anchors.right: parent.right anchors.verticalCenter: parent.verticalCenter fullWarning: false diff --git a/resources/qml/Settings/SettingTextField.qml b/resources/qml/Settings/SettingTextField.qml index d8e90e4951..f49b688c18 100644 --- a/resources/qml/Settings/SettingTextField.qml +++ b/resources/qml/Settings/SettingTextField.qml @@ -223,7 +223,7 @@ SettingItem cursorShape: Qt.IBeamCursor - onPressed: { + onPressed:(mouse)=> { if (!input.activeFocus) { base.focusGainedByClick = true diff --git a/resources/qml/Toolbar.qml b/resources/qml/Toolbar.qml index fd48ef7448..1af4e958f4 100644 --- a/resources/qml/Toolbar.qml +++ b/resources/qml/Toolbar.qml @@ -203,7 +203,7 @@ Item x: UM.Theme.getSize("default_margin").width y: UM.Theme.getSize("default_margin").height - source: UM.ActiveTool.valid ? UM.ActiveTool.activeToolPanel : "" + source: UM.Controller.valid ? UM.Controller.activeToolPanel : "" enabled: UM.Controller.toolsEnabled } } @@ -222,7 +222,7 @@ Item UM.Label { id: toolHint - text: UM.ActiveTool.properties.getValue("ToolHint") != undefined ? UM.ActiveTool.properties.getValue("ToolHint") : "" + text: UM.Controller.properties.getValue("ToolHint") != undefined ? UM.ActiveTool.properties.getValue("ToolHint") : "" color: UM.Theme.getColor("tooltip_text") anchors.horizontalCenter: parent.horizontalCenter } From 0ddf92ce62ff69b8e06a6704d0bae59edd49463e Mon Sep 17 00:00:00 2001 From: "saumya.jain" Date: Tue, 9 Jan 2024 10:33:02 +0100 Subject: [PATCH 125/182] fix for proper path for CuraAction undo redo CURA-7812 --- resources/qml/Actions.qml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/resources/qml/Actions.qml b/resources/qml/Actions.qml index 7eac124a8f..3717e778d3 100644 --- a/resources/qml/Actions.qml +++ b/resources/qml/Actions.qml @@ -120,8 +120,8 @@ Item text: catalog.i18nc("@action:inmenu menubar:edit", "&Undo") icon.name: "edit-undo" shortcut: StandardKey.Undo - onTriggered: UM.CuraActions.undo() - enabled: UM.CuraActions.canUndo + onTriggered: CuraActions.undo() + enabled: CuraActions.canUndo } Action @@ -130,8 +130,8 @@ Item text: catalog.i18nc("@action:inmenu menubar:edit", "&Redo") icon.name: "edit-redo" shortcut: StandardKey.Redo - onTriggered: UM.CuraActions.redo() - enabled: UM.CuraActions.canRedo + onTriggered: CuraActions.redo() + enabled: CuraActions.canRedo } Action From 1f7b8efff0d7369ae576410d86c0c1ff15e087e6 Mon Sep 17 00:00:00 2001 From: "c.lamboo" Date: Tue, 9 Jan 2024 16:26:14 +0100 Subject: [PATCH 126/182] Don't make `raft_smoothing` settable per extruder CURA-11395 --- resources/definitions/fdmprinter.def.json | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index af041bd803..0bdfa7c602 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -6196,7 +6196,6 @@ "type": "bool", "value": "raft_remove_inside_corners", "default_value": false, - "resolve": "any(extruderValues('raft_remove_inside_corners'))", "enabled": "resolveOrValue('adhesion_type') == 'raft'", "limit_to_extruder": "raft_interface_extruder_nr", "settable_per_mesh": false, @@ -6229,7 +6228,7 @@ "enabled": "resolveOrValue('adhesion_type') == 'raft' and not raft_remove_inside_corners", "limit_to_extruder": "adhesion_extruder_nr", "settable_per_mesh": false, - "settable_per_extruder": true, + "settable_per_extruder": false, "children": { "raft_base_smoothing": @@ -6245,7 +6244,7 @@ "enabled": "resolveOrValue('adhesion_type') == 'raft' and not raft_base_remove_inside_corners", "limit_to_extruder": "raft_base_extruder_nr", "settable_per_mesh": false, - "settable_per_extruder": true + "settable_per_extruder": false }, "raft_interface_smoothing": { @@ -6260,7 +6259,7 @@ "enabled": "resolveOrValue('adhesion_type') == 'raft' and not raft_interface_remove_inside_corners", "limit_to_extruder": "raft_interface_extruder_nr", "settable_per_mesh": false, - "settable_per_extruder": true + "settable_per_extruder": false }, "raft_surface_smoothing": { @@ -6275,7 +6274,7 @@ "enabled": "resolveOrValue('adhesion_type') == 'raft' and not raft_surface_remove_inside_corners", "limit_to_extruder": "raft_surface_extruder_nr", "settable_per_mesh": false, - "settable_per_extruder": true + "settable_per_extruder": false } } }, From 30b25975df64990c3ac063699f4b56587ebe7dc8 Mon Sep 17 00:00:00 2001 From: Erwan MATHIEU Date: Tue, 9 Jan 2024 16:38:57 +0100 Subject: [PATCH 127/182] Make settings not settable par extruder CURA-11395 --- resources/definitions/fdmprinter.def.json | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 0bdfa7c602..8531fdcbe3 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -6170,7 +6170,6 @@ "description": "Remove inside corners from the raft, causing the raft to become convex.", "type": "bool", "default_value": false, - "resolve": "any(extruderValues('raft_remove_inside_corners'))", "enabled": "resolveOrValue('adhesion_type') == 'raft'", "settable_per_mesh": false, "settable_per_extruder": false, @@ -6183,9 +6182,7 @@ "type": "bool", "value": "raft_remove_inside_corners", "default_value": false, - "resolve": "any(extruderValues('raft_remove_inside_corners'))", "enabled": "resolveOrValue('adhesion_type') == 'raft'", - "limit_to_extruder": "raft_base_extruder_nr", "settable_per_mesh": false, "settable_per_extruder": false }, @@ -6197,7 +6194,6 @@ "value": "raft_remove_inside_corners", "default_value": false, "enabled": "resolveOrValue('adhesion_type') == 'raft'", - "limit_to_extruder": "raft_interface_extruder_nr", "settable_per_mesh": false, "settable_per_extruder": false }, @@ -6208,9 +6204,7 @@ "type": "bool", "value": "raft_remove_inside_corners", "default_value": false, - "resolve": "any(extruderValues('raft_remove_inside_corners'))", "enabled": "resolveOrValue('adhesion_type') == 'raft'", - "limit_to_extruder": "raft_surface_extruder_nr", "settable_per_mesh": false, "settable_per_extruder": false } @@ -6226,7 +6220,6 @@ "minimum_value": "0", "minimum_value_warning": "raft_interface_line_width", "enabled": "resolveOrValue('adhesion_type') == 'raft' and not raft_remove_inside_corners", - "limit_to_extruder": "adhesion_extruder_nr", "settable_per_mesh": false, "settable_per_extruder": false, "children": @@ -6242,7 +6235,6 @@ "minimum_value": "0", "minimum_value_warning": "raft_interface_line_width", "enabled": "resolveOrValue('adhesion_type') == 'raft' and not raft_base_remove_inside_corners", - "limit_to_extruder": "raft_base_extruder_nr", "settable_per_mesh": false, "settable_per_extruder": false }, @@ -6257,7 +6249,6 @@ "minimum_value": "0", "minimum_value_warning": "raft_interface_line_width", "enabled": "resolveOrValue('adhesion_type') == 'raft' and not raft_interface_remove_inside_corners", - "limit_to_extruder": "raft_interface_extruder_nr", "settable_per_mesh": false, "settable_per_extruder": false }, @@ -6272,7 +6263,6 @@ "minimum_value": "0", "minimum_value_warning": "raft_interface_line_width", "enabled": "resolveOrValue('adhesion_type') == 'raft' and not raft_surface_remove_inside_corners", - "limit_to_extruder": "raft_surface_extruder_nr", "settable_per_mesh": false, "settable_per_extruder": false } From 2ad2afd1f41b70acffa0674cd53afa315d05cef2 Mon Sep 17 00:00:00 2001 From: GregValiant <64202104+GregValiant@users.noreply.github.com> Date: Tue, 9 Jan 2024 19:55:03 +0100 Subject: [PATCH 128/182] Update 'Advanced Cooling Fan Control' post-processing script. See discussions in #15853 (on github) and (internally) tracking-ticket CURA-11520 --- .../scripts/AddCoolingProfile.py | 258 ++++++++---------- 1 file changed, 108 insertions(+), 150 deletions(-) diff --git a/plugins/PostProcessingPlugin/scripts/AddCoolingProfile.py b/plugins/PostProcessingPlugin/scripts/AddCoolingProfile.py index 6f9ac2dc13..44709afd24 100644 --- a/plugins/PostProcessingPlugin/scripts/AddCoolingProfile.py +++ b/plugins/PostProcessingPlugin/scripts/AddCoolingProfile.py @@ -1,17 +1,16 @@ -# January 2023 by GregValiant (Greg Foresi). -# Functions: -# Remove all fan speed lines from the file (optional). -# Enter new M106 lines "By Layer" or "By Feature" (;TYPE:WALL-OUTER, etc.). -# A Starting layer and/or an Ending layer can be defined. -# Fan speeds are scaled PWM (0 - 255) or RepRap (0 - 1) depending on {machine_scale_fan_speed_zero_to_one}. -# A minimum fan speed of 12% is enforced. -# If multiple extruders have separate fan circuits the speeds are set at tool changes and conform to the layer or -# feature setting. There is support for up to 4 layer cooling fan circuits. -# The option for whether or not to remove the existing M106 lines is added to allow multiple instances of this post-processor to be installed without the followup instances wiping out the insertions of previous instances. 1/3 of a file can be 'By Layer' and the second third 'By Feature', and end up with 'By Layer' again. -# My design intent was to make it as full featured and "industrial strength" as I could. -# My thanks to @5axes, @fieldOfView(@AHoeben), @Ghostkeeper, and @Torgeir. -# 9/14/23 added support for One-at-a-Time and removed the kick out code -# 12/15/23 split off some functions. Revised the regex replacements. +# Designed in January 2023 by GregValiant (Greg Foresi) +## My design intent was to make this as full featured and "industrial strength" as I could. People printing exotic materials on large custom printers may want to turn the fans off for certain layers, and then back on again later in the print. This script allows that. +# Functions: +## Remove all fan speed lines from the file (optional). This should be enabled for the first instance of the script. It is disabled by default in any following instances. +## "By Layer" allows the user to adjust the fan speed up, or down, or off, within the print. "By Feature" allows different fan speeds for different features (;TYPE:WALL-OUTER, etc.). +## If 'By Feature' then a Start Layer and/or an End Layer can be defined. +## Fan speeds are scaled PWM (0 - 255) or RepRap (0.0 - 1.0) depending on {machine_scale_fan_speed_zero_to_one}. +## A minimum fan speed of 12% is enforced. It is the slowest speed that my cooling fan will turn on so that's what I used. 'M106 S14' (as Cura might insert) was pretty useless. +## If multiple extruders have separate fan circuits the speeds are set at tool changes and conform to the layer or feature setting. There is support for up to 4 layer cooling fan circuits. +## My thanks to @5axes(@CUQ), @fieldOfView(@AHoeben), @Ghostkeeper, and @Torgeir. A special thanks to @RBurema for his patience in reviewing my 'non-pythonic' script. +## 9/14/23 (Greg Foresi) Added support for One-at-a-Time print sequence. +## 12/15/23 (Greg Foresi) Split off 'Single Fan By Layer', 'Multi-fan By Layer', 'Single Fan By Feature', and 'Multi-fan By Feature' from the main 'execute' script. +## 1/5/24 (Greg Foresi) Revised the regex replacements. from ..Script import Script from UM.Application import Application @@ -40,10 +39,11 @@ class AddCoolingProfile(Script): "delete_existing_m106": { "label": "Remove M106 lines prior to inserting new.", - "description": "If you have 2 or more instances of 'Advanced Cooling Fan Control' running (to cool a portion of a print differently), then uncheck this box or the followup instances will remove all the lines inserted by the first instance. Pay attention to the Start and Stop layers. If you want to keep the Cura inserted lines up to the point where this post-processor will start making insertions, then un-check the box.", + "description": "If you have 2 or more instances of 'Advanced Cooling Fan Control' running (to cool a portion of a print differently), then you must uncheck this box or the followup instances will remove all the lines inserted by the first instance. Pay attention to the Start and Stop layers. Regardless of this setting: The script always removes M106 lines starting with the lowest layer number (when 'By Layer') or the starting layer number (when 'By Feature'). If you want to keep the M106 lines that Cura inserted up to the point where this post-processor will start making insertions, then un-check the box.", "type": "bool", "enabled": true, - "value": true + "value": true, + "default_value": true }, "feature_fan_start_layer": { @@ -65,73 +65,73 @@ class AddCoolingProfile(Script): "unit": "Lay# ", "enabled": "fan_layer_or_feature == 'by_feature'" }, - "layer_fan_1st": + "layer_fan_1": { "label": "Layer/Percent #1", - "description": "Enter as: 'LAYER / Percent' Ex: 57/100 with the layer first, then a '/' to delimit, and then the fan percentage.", + "description": "Enter as: 'LAYER / Percent' Ex: 55/100 with the layer first, then a '/' to delimit, and then the fan percentage. There are up to 8 changes. If you need more then add a second instance of this script and remember to turn off 'Remove M106 lines' in the second instance. The layer numbers in the second instance must start with a layer number higher than the last layer number in a previous script. You can't end the first script with a setting for layer 80 and then start the second script with a setting for layer 40 because 'Remove M106 lines' always starts with the lowest layer number when 'By Layer' is selected.", "type": "str", "default_value": "5/30", "unit": "L#/% ", "enabled": "fan_layer_or_feature == 'by_layer'" }, - "layer_fan_2nd": + "layer_fan_2": { "label": "Layer/Percent #2", - "description": "Enter as: 'LAYER / Percent' Ex: 57/100 with the layer first, then a '/' to delimit, and then the fan percentage.", + "description": "Enter as: 'LAYER / Percent' Ex: 55/100 with the layer first, then a '/' to delimit, and then the fan percentage.", "type": "str", "default_value": "", "unit": "L#/% ", "enabled": "fan_layer_or_feature == 'by_layer'" }, - "layer_fan_3rd": + "layer_fan_3": { "label": "Layer/Percent #3", - "description": "Enter as: 'LAYER / Percent' Ex: 57/100 with the layer first, then a '/' to delimit, and then the fan percentage.", + "description": "Enter as: 'LAYER / Percent' Ex: 55/100 with the layer first, then a '/' to delimit, and then the fan percentage.", "type": "str", "default_value": "", "unit": "L#/% ", "enabled": "fan_layer_or_feature == 'by_layer'" }, - "layer_fan_4th": + "layer_fan_4": { "label": "Layer/Percent #4", - "description": "Enter as: 'LAYER / Percent' Ex: 57/100 with the layer first, then a '/' to delimit, and then the fan percentage.", + "description": "Enter as: 'LAYER / Percent' Ex: 55/100 with the layer first, then a '/' to delimit, and then the fan percentage.", "type": "str", "default_value": "", "unit": "L#/% ", "enabled": "fan_layer_or_feature == 'by_layer'" }, - "layer_fan_5th": + "layer_fan_5": { "label": "Layer/Percent #5", - "description": "Enter as: 'LAYER / Percent' Ex: 57/100 with the layer first, then a '/' to delimit, and then the fan percentage.", + "description": "Enter as: 'LAYER / Percent' Ex: 55/100 with the layer first, then a '/' to delimit, and then the fan percentage.", "type": "str", "default_value": "", "unit": "L#/% ", "enabled": "fan_layer_or_feature == 'by_layer'" }, - "layer_fan_6th": + "layer_fan_6": { "label": "Layer/Percent #6", - "description": "Enter as: 'LAYER / Percent' Ex: 57/100 with the layer first, then a '/' to delimit, and then the fan percentage.", + "description": "Enter as: 'LAYER / Percent' Ex: 55/100 with the layer first, then a '/' to delimit, and then the fan percentage.", "type": "str", "default_value": "", "unit": "L#/% ", "enabled": "fan_layer_or_feature == 'by_layer'" }, - "layer_fan_7th": + "layer_fan_7": { "label": "Layer/Percent #7", - "description": "Enter as: 'LAYER / Percent' Ex: 57/100 with the layer first, then a '/' to delimit, and then the fan percentage.", + "description": "Enter as: 'LAYER / Percent' Ex: 55/100 with the layer first, then a '/' to delimit, and then the fan percentage.", "type": "str", "default_value": "", "unit": "L#/% ", "enabled": "fan_layer_or_feature == 'by_layer'" }, - "layer_fan_8th": + "layer_fan_8": { "label": "Layer/Percent #8", - "description": "Enter as: 'LAYER / Percent' Ex: 57/100 with the layer first, then a '/' to delimit, and then the fan percentage.", + "description": "Enter as: 'LAYER / Percent' Ex: 55/100 with the layer first, then a '/' to delimit, and then the fan percentage.", "type": "str", "default_value": "", "unit": "L#/% ", @@ -140,7 +140,7 @@ class AddCoolingProfile(Script): "feature_fan_skirt": { "label": "Skirt/Brim/Ooze Shield %", - "description": "Enter the fan percentage for skirt/brim. If you are starting at a layer above 1 then this setting only affects Ooze Shields and from the Start layer up.", + "description": "Enter the fan percentage for skirt/brim. If you are starting at a layer above 1 then this setting only affects Ooze Shields and from the Start Layer up.", "type": "int", "default_value": 0, "minimum_value": 0, @@ -247,7 +247,7 @@ class AddCoolingProfile(Script): "feature_fan_feature_final": { "label": "Final %", - "description": "If you choose an 'End Layer' then this is the fan speed that will carry through to the end of the gcode file. It will go into effect at the 'END' of your end layer.", + "description": "If you choose an 'End Layer' then this is the fan speed that will carry through to the end of the gcode file. It will go into effect at the 'END' of your End layer.", "type": "int", "default_value": 35, "minimum_value": 0, @@ -283,7 +283,7 @@ class AddCoolingProfile(Script): if scripts != None: script_count = scripts.count("AddCoolingProfile") if script_count > 0: - ## Set the default to "false" if there is more than one instance of this script running. + ## Set 'Remove M106 lines' to "false" if there is already an instance of this script running. self._instance.setProperty("delete_existing_m106", "value", False) def execute(self, data): @@ -314,6 +314,8 @@ class AddCoolingProfile(Script): else: #No P parameter if there is a single fan circuit------------------ t0_fan = "" + + #Get the cooling fan numbers for each extruder if the printer has multiple extruders elif extruder_count > 1: is_multi_fan = True t0_fan = " P" + str((extruder[0].getProperty("machine_extruder_cooling_fan_number", "value"))) @@ -325,21 +327,22 @@ class AddCoolingProfile(Script): #Initialize the fan_list with defaults---------------------------- fan_list = ["z"] * 16 for num in range(0,15,2): + fan_list[num] = len(data) fan_list[num + 1] = "M106 S0" #Assign the variable values if "By Layer"------------------------- by_layer_or_feature = self.getSettingValueByKey("fan_layer_or_feature") if by_layer_or_feature == "by_layer": - ## By layer doesn't do any feature search + ## By layer doesn't do any feature search so there is no need to look for combing moves feature_fan_combing = False - fan_list[0] = self.getSettingValueByKey("layer_fan_1st") - fan_list[2] = self.getSettingValueByKey("layer_fan_2nd") - fan_list[4] = self.getSettingValueByKey("layer_fan_3rd") - fan_list[6] = self.getSettingValueByKey("layer_fan_4th") - fan_list[8] = self.getSettingValueByKey("layer_fan_5th") - fan_list[10] = self.getSettingValueByKey("layer_fan_6th") - fan_list[12] = self.getSettingValueByKey("layer_fan_7th") - fan_list[14] = self.getSettingValueByKey("layer_fan_8th") + fan_list[0] = self.getSettingValueByKey("layer_fan_1") + fan_list[2] = self.getSettingValueByKey("layer_fan_2") + fan_list[4] = self.getSettingValueByKey("layer_fan_3") + fan_list[6] = self.getSettingValueByKey("layer_fan_4") + fan_list[8] = self.getSettingValueByKey("layer_fan_5") + fan_list[10] = self.getSettingValueByKey("layer_fan_6") + fan_list[12] = self.getSettingValueByKey("layer_fan_7") + fan_list[14] = self.getSettingValueByKey("layer_fan_8") ## If there is no '/' delimiter then ignore the line else put the settings in a list for num in range(0,15,2): if "/" in fan_list[num]: @@ -359,17 +362,18 @@ class AddCoolingProfile(Script): the_end_layer = -1 ## If there is an input error default to the entire gcode file. ## Get the speed for each feature - # 0;TYPE:SKIRT, 1;TYPE:WALL-INNER, 2;TYPE:WALL-OUTER, 3;TYPE:FILL, 4;TYPE:SKIN, 5;TYPE:SUPPORT, 6;TYPE:SUPPORT-INTERFACE, 7;TYPE:PRIME-TOWER, 8;BRIDGE, 9;FEATURE_FINAL, 10;FAN_COMBING, - fan_sp_skirt = self._feature_checker(self.getSettingValueByKey("feature_fan_skirt"), fan_mode) - fan_sp_wall_inner = self._feature_checker(self.getSettingValueByKey("feature_fan_wall_inner"), fan_mode) - fan_sp_wall_outer = self._feature_checker(self.getSettingValueByKey("feature_fan_wall_outer"), fan_mode) - fan_sp_fill = self._feature_checker(self.getSettingValueByKey("feature_fan_fill"), fan_mode) - fan_sp_skin = self._feature_checker(self.getSettingValueByKey("feature_fan_skin"), fan_mode) - fan_sp_support = self._feature_checker(self.getSettingValueByKey("feature_fan_support"), fan_mode) - fan_sp_support_interface = self._feature_checker(self.getSettingValueByKey("feature_fan_support_interface"), fan_mode) - fan_sp_prime_tower = self._feature_checker(self.getSettingValueByKey("feature_fan_prime_tower"), fan_mode) - fan_sp_bridge = self._feature_checker(self.getSettingValueByKey("feature_fan_bridge"), fan_mode) - fan_sp_feature_final = self._feature_checker(self.getSettingValueByKey("feature_fan_feature_final"), fan_mode) + feature_name_list = [] + feature_speed_list = [] + feature_speed_list.append(self._feature_checker(self.getSettingValueByKey("feature_fan_skirt"), fan_mode)); feature_name_list.append(";TYPE:SKIRT") + feature_speed_list.append(self._feature_checker(self.getSettingValueByKey("feature_fan_wall_inner"), fan_mode)); feature_name_list.append(";TYPE:WALL-INNER") + feature_speed_list.append(self._feature_checker(self.getSettingValueByKey("feature_fan_wall_outer"), fan_mode)); feature_name_list.append(";TYPE:WALL-OUTER") + feature_speed_list.append(self._feature_checker(self.getSettingValueByKey("feature_fan_fill"), fan_mode)); feature_name_list.append(";TYPE:FILL") + feature_speed_list.append(self._feature_checker(self.getSettingValueByKey("feature_fan_skin"), fan_mode)); feature_name_list.append(";TYPE:SKIN") + feature_speed_list.append(self._feature_checker(self.getSettingValueByKey("feature_fan_support"), fan_mode)); feature_name_list.append(";TYPE:SUPPORT") + feature_speed_list.append(self._feature_checker(self.getSettingValueByKey("feature_fan_support_interface"), fan_mode)); feature_name_list.append(";TYPE:SUPPORT-INTERFACE") + feature_speed_list.append(self._feature_checker(self.getSettingValueByKey("feature_fan_prime_tower"), fan_mode)); feature_name_list.append(";TYPE:PRIME-TOWER") + feature_speed_list.append(self._feature_checker(self.getSettingValueByKey("feature_fan_bridge"), fan_mode)); feature_name_list.append(";BRIDGE") + feature_speed_list.append(self._feature_checker(self.getSettingValueByKey("feature_fan_feature_final"), fan_mode)); feature_name_list.append("FINAL_FAN") feature_fan_combing = self.getSettingValueByKey("feature_fan_combing") if the_end_layer > -1 and by_layer_or_feature == "by_feature": ## Required so the final speed input can be determined @@ -459,18 +463,20 @@ class AddCoolingProfile(Script): altered_start_layer = str(len(data)) ## The fan list layers don't need to be in ascending order. Get the lowest. for num in range(0,15,2): - if int(fan_list[num]) < int(altered_start_layer): - altered_start_layer = int(fan_list[num]) + try: + if int(fan_list[num]) < int(altered_start_layer): + altered_start_layer = int(fan_list[num]) + except: + pass elif by_layer_or_feature == "by_feature": altered_start_layer = int(the_start_layer) - 1 start_from = int(layer_0_index) + int(altered_start_layer) - ## Strip the M106 and M107 lines from the file for l_index in range(int(start_from), len(data) - 1, 1): data[l_index] = re.sub(re.compile("M106(.*)\n"), "", data[l_index]) data[l_index] = re.sub(re.compile("M107(.*)\n"), "", data[l_index]) - ## Deal with a raft and with One-At-A-Time + ## Deal with a raft and with One-At-A-Time print sequence if raft_enabled and bed_adhesion == "raft": if print_sequence == "one_at_a_time": for r_index in range(2,len(data)-2,1): @@ -482,7 +488,7 @@ class AddCoolingProfile(Script): if ";LAYER:-" in data[r_index]: ## Turn the raft fan on lines.insert(1, fan_sp_raft + str(t0_fan)) - ## Shut the raft fan off + ## Shut the raft fan off at layer 0 if ";LAYER:0" in data[r_index]: lines.insert(1,"M106 S0" + str(t0_fan)) data[r_index] = "\n".join(lines) @@ -507,7 +513,7 @@ class AddCoolingProfile(Script): lines.insert(1, "M106 S0" + str(t0_fan)) data[r_index] = "\n".join(lines) - ## Turn off all fans at the end of data[1] + ## Turn off all fans at the end of data[1]. If more than one instance of this script is running then this will result in multiple M106 lines. temp_startup = data[1].split("\n") temp_startup.insert(len(temp_startup)-2,"M106 S0" + str(t0_fan)) ## If there are multiple cooling fans shut them all off @@ -535,31 +541,28 @@ class AddCoolingProfile(Script): #Single Fan "By Feature"------------------------------------------ if by_layer_or_feature == "by_feature" and (not is_multi_fan or not is_multi_extr_print): - return self._single_fan_by_feature(data, layer_0_index, the_start_layer, the_end_layer, the_end_is_enabled, fan_list, t0_fan, fan_sp_skirt, fan_sp_wall_inner, fan_sp_wall_outer, fan_sp_fill, fan_sp_skin, fan_sp_support, fan_sp_support_interface, feature_fan_combing, fan_sp_prime_tower, fan_sp_bridge, fan_sp_feature_final) + return self._single_fan_by_feature(data, layer_0_index, the_start_layer, the_end_layer, the_end_is_enabled, fan_list, t0_fan, feature_speed_list, feature_name_list, feature_fan_combing) #Multi Fan "By Feature"------------------------------------------- if by_layer_or_feature == "by_feature" and is_multi_fan: - return self._multi_fan_by_feature(data, layer_0_index, the_start_layer, the_end_layer, the_end_is_enabled, fan_list, t0_fan, t1_fan, t2_fan, t3_fan, fan_sp_skirt, fan_sp_wall_inner, fan_sp_wall_outer, fan_sp_fill, fan_sp_skin, fan_sp_support, fan_sp_support_interface, feature_fan_combing, fan_sp_prime_tower, fan_sp_bridge, fan_sp_feature_final) + return self._multi_fan_by_feature(data, layer_0_index, the_start_layer, the_end_layer, the_end_is_enabled, fan_list, t0_fan, t1_fan, t2_fan, t3_fan, feature_speed_list, feature_name_list, feature_fan_combing) # The Single Fan "By Layer"---------------------------------------- def _single_fan_by_layer(self, data: str, layer_0_index: int, fan_list: str, t0_fan: str)->str: layer_number = "0" - single_fan_layer = data - for l_index in range(layer_0_index,len(single_fan_layer)-1,1): - layer = single_fan_layer[l_index] + single_fan_data = data + for l_index in range(layer_0_index,len(single_fan_data)-1,1): + layer = single_fan_data[l_index] fan_lines = layer.split("\n") for fan_line in fan_lines: if ";LAYER:" in fan_line: - layer_number = int(fan_line.split(":")[1]) - ## If there is a match for the current layer number make the insertion. - try: - for num in range(0,15,2): - if int(layer_number) == int(fan_list[num]): - layer = layer.replace(fan_lines[0],fan_lines[0] + "\n" + fan_list[num + 1] + str(t0_fan)) - single_fan_layer[l_index] = layer - except: - continue - return single_fan_layer + layer_number = str(fan_line.split(":")[1]) + ## If there is a match for the current layer number make the insertion + for num in range(0,15,2): + if layer_number == str(fan_list[num]): + layer = layer.replace(fan_lines[0],fan_lines[0] + "\n" + fan_list[num + 1] + str(t0_fan)) + single_fan_data[l_index] = layer + return single_fan_data # Multi-Fan "By Layer"----------------------------------------- def _multi_fan_by_layer(self, data: str, layer_0_index: int, fan_list: str, t0_fan: str, t1_fan: str, t2_fan: str, t3_fan: str)->str: @@ -625,7 +628,7 @@ class AddCoolingProfile(Script): return multi_fan_data # Single fan by feature----------------------------------------------- - def _single_fan_by_feature(self, data: str, layer_0_index: int, the_start_layer: str, the_end_layer: str, the_end_is_enabled: str, fan_list: str, t0_fan: str, fan_sp_skirt: str, fan_sp_wall_inner: str, fan_sp_wall_outer: str, fan_sp_fill: str, fan_sp_skin: str, fan_sp_support: str, fan_sp_support_interface: str, feature_fan_combing: str, fan_sp_prime_tower: str, fan_sp_bridge: str, fan_sp_feature_final: str)->str: + def _single_fan_by_feature(self, data: str, layer_0_index: int, the_start_layer: str, the_end_layer: str, the_end_is_enabled: str, fan_list: str, t0_fan: str, feature_speed_list: str, feature_name_list: str, feature_fan_combing: bool)->str: single_fan_data = data layer_number = "0" index = 1 @@ -638,37 +641,26 @@ class AddCoolingProfile(Script): if ";LAYER:" in line: layer_number = str(line.split(":")[1]) if int(layer_number) >= int(the_start_layer) and int(layer_number) < int(the_end_layer)-1: - if ";TYPE:SKIRT" in line: - modified_data += fan_sp_skirt + t0_fan + "\n" - elif ";TYPE:WALL-INNER" in line: - modified_data += fan_sp_wall_inner + t0_fan + "\n" - elif ";TYPE:WALL-OUTER" in line: - modified_data += fan_sp_wall_outer + t0_fan + "\n" - elif ";TYPE:FILL" in line: - modified_data += fan_sp_fill + t0_fan + "\n" - elif ";TYPE:SKIN" in line: - modified_data += fan_sp_skin + t0_fan + "\n" - elif line == ";TYPE:SUPPORT": - modified_data += fan_sp_support + t0_fan + "\n" - elif ";TYPE:SUPPORT-INTERFACE" in line: - modified_data += fan_sp_support_interface + t0_fan + "\n" + temp = line.split(" ")[0] + try: + name_index = feature_name_list.index(temp) + except: + name_index = -1 + if name_index != -1: + modified_data += feature_speed_list[name_index] + t0_fan + "\n" elif ";MESH:NONMESH" in line: if feature_fan_combing == True: modified_data += "M106 S0" + t0_fan + "\n" - elif ";TYPE:PRIME-TOWER" in line: - modified_data += fan_sp_prime_tower + t0_fan + "\n" - elif line == ";BRIDGE": - modified_data += fan_sp_bridge + t0_fan + "\n" modified_data += line + "\n" ## If an End Layer is defined and is less than the last layer then insert the Final Speed - if line == ";LAYER:" + str(the_end_layer) and the_end_is_enabled == True: - modified_data += fan_sp_feature_final + t0_fan + "\n" + if line == ";LAYER:" + str(the_end_layer) and the_end_is_enabled == True: + modified_data += feature_speed_list[len(feature_speed_list) - 1] + t0_fan + "\n" if modified_data.endswith("\n"): modified_data = modified_data[0: - 1] single_fan_data[l_index] = modified_data return single_fan_data # Multi-fan by feature------------------------------------------------ - def _multi_fan_by_feature(self, data: str, layer_0_index: int, the_start_layer: str, the_end_layer: str, the_end_is_enabled: str, fan_list: str, t0_fan: str, t1_fan: str, t2_fan: str, t3_fan: str, fan_sp_skirt: str, fan_sp_wall_inner: str, fan_sp_wall_outer: str, fan_sp_fill: str, fan_sp_skin: str, fan_sp_support: str, fan_sp_support_interface: str, feature_fan_combing: str, fan_sp_prime_tower: str, fan_sp_bridge: str, fan_sp_feature_final: str)->str: + def _multi_fan_by_feature(self, data: str, layer_0_index: int, the_start_layer: str, the_end_layer: str, the_end_is_enabled: str, fan_list: str, t0_fan: str, t1_fan: str, t2_fan: str, t3_fan: str, feature_speed_list: str, feature_name_list: str, feature_fan_combing: bool)->str: multi_fan_data = data layer_number = "0" start_index = 1 @@ -729,35 +721,16 @@ class AddCoolingProfile(Script): if ";LAYER:" in line: layer_number = str(line.split(":")[1]) modified_data += line + "\n" - if int(layer_number) >= int(the_start_layer): # Problem with oneatatime < start - if ";TYPE:SKIRT" in line: - modified_data += line + "\n" - modified_data += fan_sp_skirt + this_fan + "\n" - current_fan_speed = str(fan_sp_skirt.split("S")[1]) - elif ";TYPE:WALL-INNER" in line: - modified_data += line + "\n" - modified_data += fan_sp_wall_inner + this_fan + "\n" - current_fan_speed = str(fan_sp_wall_inner.split("S")[1]) - elif ";TYPE:WALL-OUTER" in line: - modified_data += line + "\n" - modified_data += fan_sp_wall_outer + this_fan + "\n" - current_fan_speed = str(fan_sp_wall_outer.split("S")[1]) - elif ";TYPE:FILL" in line: - modified_data += line + "\n" - modified_data += fan_sp_fill + this_fan + "\n" - current_fan_speed = str(fan_sp_fill.split("S")[1]) - elif ";TYPE:SKIN" in line: - modified_data += line + "\n" - modified_data += fan_sp_skin + this_fan + "\n" - current_fan_speed = str(fan_sp_skin.split("S")[1]) - elif line == ";TYPE:SUPPORT": - modified_data += line + "\n" - modified_data += fan_sp_support + this_fan + "\n" - current_fan_speed = str(fan_sp_support.split("S")[1]) - elif ";TYPE:SUPPORT-INTERFACE" in line: - modified_data += line + "\n" - modified_data += fan_sp_support_interface + this_fan + "\n" - current_fan_speed = str(fan_sp_support_interface.split("S")[1]) + if int(layer_number) >= int(the_start_layer): + temp = line.split(" ")[0] + try: + name_index = feature_name_list.index(temp) + except: + name_index = -1 + if name_index != -1: + modified_data += line + "\n" + feature_speed_list[name_index] + this_fan + "\n" + #modified_data += feature_speed_list[name_index] + this_fan + "\n" + current_fan_speed = str(feature_speed_list[name_index].split("S")[1]) elif ";MESH:NONMESH" in line: if feature_fan_combing == True: modified_data += line + "\n" @@ -765,27 +738,12 @@ class AddCoolingProfile(Script): current_fan_speed = "0" else: modified_data += line + "\n" - elif ";TYPE:PRIME-TOWER" in line: - modified_data += line + "\n" - modified_data += fan_sp_prime_tower + this_fan + "\n" - current_fan_speed = str(fan_sp_prime_tower.split("S")[1]) - elif line == ";BRIDGE": - modified_data += line + "\n" - modified_data += fan_sp_bridge + this_fan + "\n" - current_fan_speed = str(fan_sp_bridge.split("S")[1]) ## If an end layer is defined - Insert the final speed and set the other variables to Final Speed to finish the file ## There cannot be a break here because if there are multiple fan numbers they still need to be shut off and turned on. elif line == ";LAYER:" + str(the_end_layer): - modified_data += fan_sp_feature_final + this_fan + "\n" - fan_sp_skirt = fan_sp_feature_final - fan_sp_wall_inner = fan_sp_feature_final - fan_sp_wall_outer = fan_sp_feature_final - fan_sp_fill = fan_sp_feature_final - fan_sp_skin = fan_sp_feature_final - fan_sp_support = fan_sp_feature_final - fan_sp_support_interface = fan_sp_feature_final - fan_sp_prime_tower = fan_sp_feature_final - fan_sp_bridge = fan_sp_feature_final + modified_data += feature_speed_list[len(feature_speed_list) - 1] + this_fan + "\n" + for set_speed in range(0, len(feature_speed_list) - 2): + feature_speed_list[set_speed] = feature_speed_list[len(feature_speed_list) - 1] else: ## Layer and Tool get inserted into modified_data above. All other lines go into modified_data here if not line.startswith("T") and not line.startswith(";LAYER:"): modified_data += line + "\n" @@ -836,9 +794,9 @@ class AddCoolingProfile(Script): return fan_sp_feat # Add additional travel comments to turn the fan off during combing. - def _add_travel_comment(self, the_data: str, lay_0_index: str) -> str: - for lay_num in range(int(lay_0_index), len(the_data)-1,1): - layer = the_data[lay_num] + def _add_travel_comment(self, comment_data: str, lay_0_index: str) -> str: + for lay_num in range(int(lay_0_index), len(comment_data)-1,1): + layer = comment_data[lay_num] lines = layer.split("\n") ## Copy the data to new_data and make the insertions there new_data = lines @@ -875,5 +833,5 @@ class AddCoolingProfile(Script): g0_count = 0 g0_index = -1 is_travel = False - the_data[lay_num] = "\n".join(new_data) - return the_data \ No newline at end of file + comment_data[lay_num] = "\n".join(new_data) + return comment_data \ No newline at end of file From b3825ee1c7f43a7e21784462433a921ea4a612a9 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Wed, 10 Jan 2024 05:39:59 +0100 Subject: [PATCH 129/182] actually use f string Contributes to CURA-11482 --- plugins/CuraEngineBackend/StartSliceJob.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index fe7137150b..935eb81afa 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -337,7 +337,7 @@ class StartSliceJob(Job): user_id = uuid.getnode() # On all of Cura's supported platforms, this returns the MAC address which is pseudonymical information (!= anonymous). user_id %= 2 ** 16 # So to make it anonymous, apply a bitmask selecting only the last 16 bits. This prevents it from being traceable to a specific user but still gives somewhat of an idea of whether it's just the same user hitting the same crash over and over again, or if it's widespread. - self._slice_message.sentry_id = "{user_id}" + self._slice_message.sentry_id = f"{user_id}" self._slice_message.cura_version = CuraVersion # Build messages for extruder stacks From e47698c9ec312c666a14290bdd3440e1dda76e36 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Wed, 10 Jan 2024 06:49:27 +0100 Subject: [PATCH 130/182] Use engine version from branch CURA-11482 Contributes to CURA-11482 --- conandata.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conandata.yml b/conandata.yml index a0a5a204ca..dcf883c630 100644 --- a/conandata.yml +++ b/conandata.yml @@ -1,7 +1,7 @@ version: "5.7.0-alpha.0" requirements: - "uranium/(latest)@ultimaker/testing" - - "curaengine/(latest)@ultimaker/testing" + - "curaengine/(latest)@ultimaker/cura_11482" - "cura_binary_data/(latest)@ultimaker/testing" - "fdm_materials/(latest)@ultimaker/testing" - "curaengine_plugin_gradual_flow/(latest)@ultimaker/stable" From c64dcb785cb2abbcee0f7ceb98d2be0ea466fef5 Mon Sep 17 00:00:00 2001 From: Remco Burema Date: Wed, 10 Jan 2024 08:55:56 +0100 Subject: [PATCH 131/182] Remove 'support_interface_skip_height' setting. Was used for run-time efficiency, but it wasn't really ever set beyond one layer-height, which made it rather useless. frontend part of CURA-11157 -- needed version upgrader as well, since it's the first alteration --- .../VersionUpgrade56to57.py | 95 +++++++++++++++++++ .../VersionUpgrade56to57/__init__.py | 61 ++++++++++++ .../VersionUpgrade56to57/plugin.json | 8 ++ resources/definitions/ankermake_m5.def.json | 1 - resources/definitions/artillery_base.def.json | 1 - .../atmat_signal_pro_base.def.json | 1 - resources/definitions/biqu_base.def.json | 1 - resources/definitions/blocks_base.def.json | 1 - resources/definitions/fdmprinter.def.json | 14 --- .../definitions/flyingbear_base.def.json | 1 - resources/definitions/fusion3_f410.def.json | 1 - resources/definitions/kingroon_base.def.json | 1 - resources/definitions/koonovo_base.def.json | 1 - resources/definitions/koonovo_kn3.def.json | 1 - resources/definitions/koonovo_kn5.def.json | 1 - resources/definitions/longer_base.def.json | 1 - resources/definitions/mingda_base.def.json | 1 - resources/definitions/tank_m_base.def.json | 1 - resources/definitions/tronxy_x.def.json | 1 - resources/definitions/two_trees_base.def.json | 1 - resources/definitions/vivedino_base.def.json | 1 - resources/i18n/fdmprinter.def.json.pot | 8 -- .../quality/beamup_l/beamup_l_coarse.inst.cfg | 1 - .../quality/beamup_l/beamup_l_draft.inst.cfg | 1 - .../beamup_l/beamup_l_extra_fine.inst.cfg | 1 - .../quality/beamup_l/beamup_l_fine.inst.cfg | 1 - .../quality/beamup_l/beamup_l_normal.inst.cfg | 1 - .../quality/beamup_s/beamup_s_coarse.inst.cfg | 1 - .../quality/beamup_s/beamup_s_draft.inst.cfg | 1 - .../beamup_s/beamup_s_extra_fine.inst.cfg | 1 - .../quality/beamup_s/beamup_s_fine.inst.cfg | 1 - .../quality/beamup_s/beamup_s_normal.inst.cfg | 1 - .../quality/flsun_sr/flsun_sr_fine.inst.cfg | 1 - .../quality/flsun_sr/flsun_sr_normal.inst.cfg | 1 - .../flsun_v400/flsun_v400_normal.inst.cfg | 1 - .../imade3d_jellybox_coarse.inst.cfg | 1 - .../imade3d_jellybox_fine.inst.cfg | 1 - .../imade3d_jellybox_normal.inst.cfg | 1 - .../imade3d_jellybox_ultrafine.inst.cfg | 1 - .../jb2_global_coarse.inst.cfg | 1 - .../jb2_global_fine.inst.cfg | 1 - .../jb2_global_normal.inst.cfg | 1 - .../jb2_global_ultrafine.inst.cfg | 1 - resources/setting_visibility/expert.cfg | 1 - .../variants/arjun/arjun300_pva_0.2.inst.cfg | 1 - .../variants/arjun/arjun300_pva_0.3.inst.cfg | 1 - .../variants/arjun/arjun300_pva_0.4.inst.cfg | 1 - .../variants/arjun/arjun300_pva_0.5.inst.cfg | 1 - .../variants/arjun/arjun300_pva_0.6.inst.cfg | 1 - .../variants/arjun/arjun300_pva_0.8.inst.cfg | 1 - .../arjun/arjunpro300_pva_0.2.inst.cfg | 1 - .../arjun/arjunpro300_pva_0.3.inst.cfg | 1 - .../arjun/arjunpro300_pva_0.4.inst.cfg | 1 - .../arjun/arjunpro300_pva_0.5.inst.cfg | 1 - .../arjun/arjunpro300_pva_0.6.inst.cfg | 1 - .../arjun/arjunpro300_pva_0.8.inst.cfg | 1 - .../kosher/kosher220_pva_0.2.inst.cfg | 1 - .../kosher/kosher220_pva_0.3.inst.cfg | 1 - .../kosher/kosher220_pva_0.4.inst.cfg | 1 - .../kosher/kosher220_pva_0.5.inst.cfg | 1 - .../kosher/kosher220_pva_0.6.inst.cfg | 1 - .../kosher/kosher220_pva_0.8.inst.cfg | 1 - 62 files changed, 164 insertions(+), 79 deletions(-) create mode 100644 plugins/VersionUpgrade/VersionUpgrade56to57/VersionUpgrade56to57.py create mode 100644 plugins/VersionUpgrade/VersionUpgrade56to57/__init__.py create mode 100644 plugins/VersionUpgrade/VersionUpgrade56to57/plugin.json diff --git a/plugins/VersionUpgrade/VersionUpgrade56to57/VersionUpgrade56to57.py b/plugins/VersionUpgrade/VersionUpgrade56to57/VersionUpgrade56to57.py new file mode 100644 index 0000000000..8e94f7963c --- /dev/null +++ b/plugins/VersionUpgrade/VersionUpgrade56to57/VersionUpgrade56to57.py @@ -0,0 +1,95 @@ +# Copyright (c) 2024 UltiMaker +# Cura is released under the terms of the LGPLv3 or higher. + +import configparser +from typing import Tuple, List +import io +from UM.VersionUpgrade import VersionUpgrade + +_REMOVED_SETTINGS = { + "support_interface_skip_height", +} +_NEW_SETTING_VERSION = "23" + + +class VersionUpgrade56to57(VersionUpgrade): + def upgradePreferences(self, serialized: str, filename: str) -> Tuple[List[str], List[str]]: + """ + Upgrades preferences to remove from the visibility list the settings that were removed in this version. + It also changes the preferences to have the new version number. + + This removes any settings that were removed in the new Cura version. + :param serialized: The original contents of the preferences file. + :param filename: The file name of the preferences file. + :return: A list of new file names, and a list of the new contents for + those files. + """ + parser = configparser.ConfigParser(interpolation = None) + parser.read_string(serialized) + + # Update version number. + parser["metadata"]["setting_version"] = _NEW_SETTING_VERSION + + # Remove deleted settings from the visible settings list. + if "general" in parser and "visible_settings" in parser["general"]: + visible_settings = set(parser["general"]["visible_settings"].split(";")) + for removed in _REMOVED_SETTINGS: + if removed in visible_settings: + visible_settings.remove(removed) + + parser["general"]["visible_settings"] = ";".join(visible_settings) + + result = io.StringIO() + parser.write(result) + return [filename], [result.getvalue()] + + def upgradeInstanceContainer(self, serialized: str, filename: str) -> Tuple[List[str], List[str]]: + """ + Upgrades instance containers to remove the settings that were removed in this version. + It also changes the instance containers to have the new version number. + + This removes any settings that were removed in the new Cura version and updates settings that need to be updated + with a new value. + + :param serialized: The original contents of the instance container. + :param filename: The original file name of the instance container. + :return: A list of new file names, and a list of the new contents for + those files. + """ + parser = configparser.ConfigParser(interpolation = None, comment_prefixes = ()) + parser.read_string(serialized) + + # Update version number. + parser["metadata"]["setting_version"] = _NEW_SETTING_VERSION + + if "values" in parser: + # Remove deleted settings from the instance containers. + for removed in _REMOVED_SETTINGS: + if removed in parser["values"]: + del parser["values"][removed] + + result = io.StringIO() + parser.write(result) + return [filename], [result.getvalue()] + + def upgradeStack(self, serialized: str, filename: str) -> Tuple[List[str], List[str]]: + """ + Upgrades stacks to have the new version number. + + :param serialized: The original contents of the stack. + :param filename: The original file name of the stack. + :return: A list of new file names, and a list of the new contents for + those files. + """ + parser = configparser.ConfigParser(interpolation = None) + parser.read_string(serialized) + + # Update version number. + if "metadata" not in parser: + parser["metadata"] = {} + + parser["metadata"]["setting_version"] = _NEW_SETTING_VERSION + + result = io.StringIO() + parser.write(result) + return [filename], [result.getvalue()] diff --git a/plugins/VersionUpgrade/VersionUpgrade56to57/__init__.py b/plugins/VersionUpgrade/VersionUpgrade56to57/__init__.py new file mode 100644 index 0000000000..62e72c8da4 --- /dev/null +++ b/plugins/VersionUpgrade/VersionUpgrade56to57/__init__.py @@ -0,0 +1,61 @@ +# Copyright (c) 2024 UltiMaker +# Cura is released under the terms of the LGPLv3 or higher. + +from typing import Any, Dict, TYPE_CHECKING + +from . import VersionUpgrade56to57 + +if TYPE_CHECKING: + from UM.Application import Application + +upgrade = VersionUpgrade56to57.VersionUpgrade56to57() + + +def getMetaData() -> Dict[str, Any]: + return { + "version_upgrade": { + # From To Upgrade function + ("preferences", 7000022): ("preferences", 7000023, upgrade.upgradePreferences), + ("machine_stack", 6000022): ("machine_stack", 6000023, upgrade.upgradeStack), + ("extruder_train", 6000022): ("extruder_train", 6000023, upgrade.upgradeStack), + ("definition_changes", 4000022): ("definition_changes", 4000023, upgrade.upgradeInstanceContainer), + ("quality_changes", 4000022): ("quality_changes", 4000023, upgrade.upgradeInstanceContainer), + ("quality", 4000022): ("quality", 4000023, upgrade.upgradeInstanceContainer), + ("user", 4000022): ("user", 4000023, upgrade.upgradeInstanceContainer), + ("intent", 4000022): ("intent", 4000023, upgrade.upgradeInstanceContainer), + }, + "sources": { + "preferences": { + "get_version": upgrade.getCfgVersion, + "location": {"."} + }, + "machine_stack": { + "get_version": upgrade.getCfgVersion, + "location": {"./machine_instances"} + }, + "extruder_train": { + "get_version": upgrade.getCfgVersion, + "location": {"./extruders"} + }, + "definition_changes": { + "get_version": upgrade.getCfgVersion, + "location": {"./definition_changes"} + }, + "quality_changes": { + "get_version": upgrade.getCfgVersion, + "location": {"./quality_changes"} + }, + "quality": { + "get_version": upgrade.getCfgVersion, + "location": {"./quality"} + }, + "user": { + "get_version": upgrade.getCfgVersion, + "location": {"./user"} + } + } + } + + +def register(app: "Application") -> Dict[str, Any]: + return {"version_upgrade": upgrade} diff --git a/plugins/VersionUpgrade/VersionUpgrade56to57/plugin.json b/plugins/VersionUpgrade/VersionUpgrade56to57/plugin.json new file mode 100644 index 0000000000..1752d64aa0 --- /dev/null +++ b/plugins/VersionUpgrade/VersionUpgrade56to57/plugin.json @@ -0,0 +1,8 @@ +{ + "name": "Version Upgrade 5.6 to 5.7", + "author": "UltiMaker", + "version": "1.0.0", + "description": "Upgrades configurations from Cura 5.6 to Cura 5.7.", + "api": 8, + "i18n-catalog": "cura" +} diff --git a/resources/definitions/ankermake_m5.def.json b/resources/definitions/ankermake_m5.def.json index 0880f0b007..4e4b3498b3 100644 --- a/resources/definitions/ankermake_m5.def.json +++ b/resources/definitions/ankermake_m5.def.json @@ -112,7 +112,6 @@ "support_interface_density": { "value": 33.333 }, "support_interface_enable": { "value": true }, "support_interface_pattern": { "value": "'grid'" }, - "support_interface_skip_height": { "value": 0.2 }, "support_roof_enable": { "value": true }, "support_xy_distance": { "value": "wall_line_width_0 * 2" }, "support_xy_distance_overhang": { "value": "wall_line_width_0" }, diff --git a/resources/definitions/artillery_base.def.json b/resources/definitions/artillery_base.def.json index d9e71e4333..38d9531f7f 100644 --- a/resources/definitions/artillery_base.def.json +++ b/resources/definitions/artillery_base.def.json @@ -114,7 +114,6 @@ "support_interface_enable": { "value": true }, "support_interface_height": { "value": "layer_height * 4" }, "support_interface_pattern": { "value": "'grid'" }, - "support_interface_skip_height": { "value": 0.2 }, "support_xy_distance": { "value": "wall_line_width_0 * 2" }, "support_xy_distance_overhang": { "value": "wall_line_width_0" }, "support_xy_overrides_z": { "value": "'xy_overrides_z'" }, diff --git a/resources/definitions/atmat_signal_pro_base.def.json b/resources/definitions/atmat_signal_pro_base.def.json index f19dc8920d..cd59e1c169 100644 --- a/resources/definitions/atmat_signal_pro_base.def.json +++ b/resources/definitions/atmat_signal_pro_base.def.json @@ -154,7 +154,6 @@ "support_infill_rate": { "value": "20" }, "support_interface_enable": { "value": "True" }, "support_interface_height": { "value": "1" }, - "support_interface_skip_height": { "value": "layer_height" }, "support_join_distance": { "value": "1" }, "support_offset": { "value": "1.5" }, "support_pattern": { "default_value": "zigzag" }, diff --git a/resources/definitions/biqu_base.def.json b/resources/definitions/biqu_base.def.json index 78edc62b74..a42f4044a0 100755 --- a/resources/definitions/biqu_base.def.json +++ b/resources/definitions/biqu_base.def.json @@ -108,7 +108,6 @@ "support_interface_enable": { "value": true }, "support_interface_height": { "value": "layer_height * 4" }, "support_interface_pattern": { "value": "'grid'" }, - "support_interface_skip_height": { "value": 0.2 }, "support_pattern": { "value": "'zigzag'" }, "support_wall_count": { "value": 1 }, "support_xy_distance": { "value": "wall_line_width_0 * 2" }, diff --git a/resources/definitions/blocks_base.def.json b/resources/definitions/blocks_base.def.json index d83e6b31f6..fde5f912da 100644 --- a/resources/definitions/blocks_base.def.json +++ b/resources/definitions/blocks_base.def.json @@ -97,7 +97,6 @@ "support_interface_enable": { "value": true }, "support_interface_height": { "value": "layer_height * 4" }, "support_interface_pattern": { "value": "'grid'" }, - "support_interface_skip_height": { "value": 0.2 }, "support_pattern": { "value": "'zigzag'" }, "support_xy_distance": { "value": "wall_line_width_0 * 2" }, "support_xy_distance_overhang": { "value": "wall_line_width_0" }, diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 8531fdcbe3..31a67d0122 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -5423,20 +5423,6 @@ } } }, - "support_interface_skip_height": - { - "label": "Support Interface Resolution", - "description": "When checking where there's model above and below the support, take steps of the given height. Lower values will slice slower, while higher values may cause normal support to be printed in some places where there should have been support interface.", - "unit": "mm", - "type": "float", - "default_value": 0.2, - "value": "layer_height", - "minimum_value": "0", - "maximum_value_warning": "support_interface_height", - "limit_to_extruder": "support_interface_extruder_nr", - "enabled": "support_interface_enable and (support_enable or support_meshes_present)", - "settable_per_mesh": true - }, "support_interface_density": { "label": "Support Interface Density", diff --git a/resources/definitions/flyingbear_base.def.json b/resources/definitions/flyingbear_base.def.json index 268d8a169b..8733a85a84 100644 --- a/resources/definitions/flyingbear_base.def.json +++ b/resources/definitions/flyingbear_base.def.json @@ -92,7 +92,6 @@ "support_interface_height": { "value": "layer_height * 4" }, "support_interface_line_width": { "value": "line_width - 0.1" }, "support_interface_pattern": { "value": "'grid'" }, - "support_interface_skip_height": { "value": 0.2 }, "support_pattern": { "value": "'zigzag'" }, "support_wall_count": { "value": 1 }, "support_xy_distance": { "value": "wall_line_width_0 * 2" }, diff --git a/resources/definitions/fusion3_f410.def.json b/resources/definitions/fusion3_f410.def.json index 6f50a15fd8..83fdb8affd 100644 --- a/resources/definitions/fusion3_f410.def.json +++ b/resources/definitions/fusion3_f410.def.json @@ -112,7 +112,6 @@ "support_interface_density": { "value": 33.333 }, "support_interface_height": { "value": "layer_height * 4" }, "support_interface_pattern": { "value": "'grid'" }, - "support_interface_skip_height": { "value": 0.2 }, "support_pattern": { "value": "'zigzag'" }, "support_wall_count": { "value": 0 }, "support_xy_distance": { "value": "wall_line_width_0 * 3" }, diff --git a/resources/definitions/kingroon_base.def.json b/resources/definitions/kingroon_base.def.json index 7b318018f7..b800b81cca 100644 --- a/resources/definitions/kingroon_base.def.json +++ b/resources/definitions/kingroon_base.def.json @@ -133,7 +133,6 @@ "support_interface_enable": { "value": true }, "support_interface_height": { "value": "layer_height * 4" }, "support_interface_pattern": { "value": "'grid'" }, - "support_interface_skip_height": { "value": 0.2 }, "support_pattern": { "value": "'zigzag'" }, "support_wall_count": { "value": 1 }, "support_xy_distance": { "value": "wall_line_width_0 * 2" }, diff --git a/resources/definitions/koonovo_base.def.json b/resources/definitions/koonovo_base.def.json index b22a4267d1..f46c39ec1e 100644 --- a/resources/definitions/koonovo_base.def.json +++ b/resources/definitions/koonovo_base.def.json @@ -70,7 +70,6 @@ "support_interface_enable": { "value": true }, "support_interface_height": { "value": "layer_height * 4" }, "support_interface_pattern": { "value": "'grid'" }, - "support_interface_skip_height": { "value": 0.2 }, "support_pattern": { "value": "'zigzag'" }, "support_wall_count": { "value": 1 }, "support_xy_distance": { "value": "wall_line_width_0 * 2" }, diff --git a/resources/definitions/koonovo_kn3.def.json b/resources/definitions/koonovo_kn3.def.json index ae978b12e0..06cf226ff4 100644 --- a/resources/definitions/koonovo_kn3.def.json +++ b/resources/definitions/koonovo_kn3.def.json @@ -88,7 +88,6 @@ "support_interface_enable": { "value": true }, "support_interface_height": { "value": "layer_height * 4" }, "support_interface_pattern": { "value": "'grid'" }, - "support_interface_skip_height": { "value": 0.2 }, "support_pattern": { "value": "'zigzag'" }, "support_wall_count": { "value": 1 }, "support_xy_distance": { "value": "wall_line_width_0 * 2" }, diff --git a/resources/definitions/koonovo_kn5.def.json b/resources/definitions/koonovo_kn5.def.json index 96ae03a6d9..c8e444f5d4 100644 --- a/resources/definitions/koonovo_kn5.def.json +++ b/resources/definitions/koonovo_kn5.def.json @@ -88,7 +88,6 @@ "support_interface_enable": { "value": true }, "support_interface_height": { "value": "layer_height * 4" }, "support_interface_pattern": { "value": "'grid'" }, - "support_interface_skip_height": { "value": 0.2 }, "support_pattern": { "value": "'zigzag'" }, "support_wall_count": { "value": 1 }, "support_xy_distance": { "value": "wall_line_width_0 * 2" }, diff --git a/resources/definitions/longer_base.def.json b/resources/definitions/longer_base.def.json index fdc78b838b..6010b7af46 100644 --- a/resources/definitions/longer_base.def.json +++ b/resources/definitions/longer_base.def.json @@ -109,7 +109,6 @@ "support_interface_enable": { "value": true }, "support_interface_height": { "value": "layer_height * 4" }, "support_interface_pattern": { "value": "'grid'" }, - "support_interface_skip_height": { "value": 0.2 }, "support_pattern": { "value": "'zigzag'" }, "support_wall_count": { "value": 1 }, "support_xy_distance": { "value": "wall_line_width_0 * 2" }, diff --git a/resources/definitions/mingda_base.def.json b/resources/definitions/mingda_base.def.json index 23dcf21f48..b07dbe458f 100644 --- a/resources/definitions/mingda_base.def.json +++ b/resources/definitions/mingda_base.def.json @@ -119,7 +119,6 @@ "support_interface_enable": { "value": true }, "support_interface_height": { "value": "layer_height * 4" }, "support_interface_pattern": { "value": "'grid'" }, - "support_interface_skip_height": { "value": 0.2 }, "support_pattern": { "value": "'zigzag'" }, "support_wall_count": { "value": 1 }, "support_xy_distance": { "value": "wall_line_width_0 * 2" }, diff --git a/resources/definitions/tank_m_base.def.json b/resources/definitions/tank_m_base.def.json index 3692793259..dfeaa7e9d8 100644 --- a/resources/definitions/tank_m_base.def.json +++ b/resources/definitions/tank_m_base.def.json @@ -70,7 +70,6 @@ "support_interface_enable": { "value": true }, "support_interface_height": { "value": "layer_height * 4" }, "support_interface_pattern": { "value": "'grid'" }, - "support_interface_skip_height": { "value": 0.2 }, "support_pattern": { "value": "'zigzag'" }, "support_wall_count": { "value": 1 }, "support_xy_distance": { "value": "wall_line_width_0 * 2" }, diff --git a/resources/definitions/tronxy_x.def.json b/resources/definitions/tronxy_x.def.json index 683761a81b..233dbb1c64 100644 --- a/resources/definitions/tronxy_x.def.json +++ b/resources/definitions/tronxy_x.def.json @@ -111,7 +111,6 @@ "support_interface_density": { "value": 33.333 }, "support_interface_height": { "value": "layer_height * 4" }, "support_interface_pattern": { "value": "'grid'" }, - "support_interface_skip_height": { "value": 0.2 }, "support_pattern": { "value": "'zigzag'" }, "support_wall_count": { "value": "1 if (support_structure == 'tree') else 0" }, "support_xy_distance": { "value": "wall_line_width_0 * 3" }, diff --git a/resources/definitions/two_trees_base.def.json b/resources/definitions/two_trees_base.def.json index ff01e46f6f..c83476db65 100644 --- a/resources/definitions/two_trees_base.def.json +++ b/resources/definitions/two_trees_base.def.json @@ -68,7 +68,6 @@ "support_interface_density": { "value": 33.333 }, "support_interface_height": { "value": "layer_height * 4" }, "support_interface_pattern": { "value": "'grid'" }, - "support_interface_skip_height": { "value": 0.2 }, "support_pattern": { "value": "'zigzag'" }, "support_wall_count": { "value": "1 if (support_structure == 'tree') else 0" }, "support_xy_distance": { "value": "wall_line_width_0 * 2" }, diff --git a/resources/definitions/vivedino_base.def.json b/resources/definitions/vivedino_base.def.json index a638fc105c..a5cf0def87 100644 --- a/resources/definitions/vivedino_base.def.json +++ b/resources/definitions/vivedino_base.def.json @@ -99,7 +99,6 @@ "support_interface_enable": { "value": true }, "support_interface_height": { "value": "layer_height * 4" }, "support_interface_pattern": { "value": "'grid'" }, - "support_interface_skip_height": { "value": 0.2 }, "support_pattern": { "value": "'zigzag'" }, "support_wall_count": { "value": 1 }, "support_xy_distance": { "value": "wall_line_width_0 * 2" }, diff --git a/resources/i18n/fdmprinter.def.json.pot b/resources/i18n/fdmprinter.def.json.pot index 6b61ec3173..ab63530018 100644 --- a/resources/i18n/fdmprinter.def.json.pot +++ b/resources/i18n/fdmprinter.def.json.pot @@ -3548,14 +3548,6 @@ msgctxt "support_bottom_height description" msgid "The thickness of the support floors. This controls the number of dense layers that are printed on top of places of a model on which support rests." msgstr "" -msgctxt "support_interface_skip_height label" -msgid "Support Interface Resolution" -msgstr "" - -msgctxt "support_interface_skip_height description" -msgid "When checking where there's model above and below the support, take steps of the given height. Lower values will slice slower, while higher values may cause normal support to be printed in some places where there should have been support interface." -msgstr "" - msgctxt "support_interface_density label" msgid "Support Interface Density" msgstr "" diff --git a/resources/quality/beamup_l/beamup_l_coarse.inst.cfg b/resources/quality/beamup_l/beamup_l_coarse.inst.cfg index e298d659f7..2fd1b8afca 100644 --- a/resources/quality/beamup_l/beamup_l_coarse.inst.cfg +++ b/resources/quality/beamup_l/beamup_l_coarse.inst.cfg @@ -33,7 +33,6 @@ support_infill_rate = 20 support_interface_enable = True support_interface_height = 0.60 support_interface_pattern = zigzag -support_interface_skip_height = 0.30 support_offset = 0.8 support_z_distance = 0.4 wall_thickness = 1.6 diff --git a/resources/quality/beamup_l/beamup_l_draft.inst.cfg b/resources/quality/beamup_l/beamup_l_draft.inst.cfg index 16f8536a02..e3cf82651b 100644 --- a/resources/quality/beamup_l/beamup_l_draft.inst.cfg +++ b/resources/quality/beamup_l/beamup_l_draft.inst.cfg @@ -33,7 +33,6 @@ support_infill_rate = 20 support_interface_enable = True support_interface_height = 0.60 support_interface_pattern = zigzag -support_interface_skip_height = 0.20 support_offset = 0.8 support_z_distance = 0.3 wall_thickness = 1.6 diff --git a/resources/quality/beamup_l/beamup_l_extra_fine.inst.cfg b/resources/quality/beamup_l/beamup_l_extra_fine.inst.cfg index cacf5289e7..8b4e8eccc7 100644 --- a/resources/quality/beamup_l/beamup_l_extra_fine.inst.cfg +++ b/resources/quality/beamup_l/beamup_l_extra_fine.inst.cfg @@ -33,7 +33,6 @@ support_infill_rate = 20 support_interface_enable = True support_interface_height = 0.30 support_interface_pattern = zigzag -support_interface_skip_height = 0.06 support_offset = 0.8 support_z_distance = 0.12 wall_thickness = 1.6 diff --git a/resources/quality/beamup_l/beamup_l_fine.inst.cfg b/resources/quality/beamup_l/beamup_l_fine.inst.cfg index f977de059b..87ed50905c 100644 --- a/resources/quality/beamup_l/beamup_l_fine.inst.cfg +++ b/resources/quality/beamup_l/beamup_l_fine.inst.cfg @@ -33,7 +33,6 @@ support_infill_rate = 20 support_interface_enable = True support_interface_height = 0.30 support_interface_pattern = zigzag -support_interface_skip_height = 0.10 support_offset = 0.8 support_z_distance = 0.2 wall_thickness = 1.6 diff --git a/resources/quality/beamup_l/beamup_l_normal.inst.cfg b/resources/quality/beamup_l/beamup_l_normal.inst.cfg index cc78f01198..59ad26fc03 100644 --- a/resources/quality/beamup_l/beamup_l_normal.inst.cfg +++ b/resources/quality/beamup_l/beamup_l_normal.inst.cfg @@ -33,7 +33,6 @@ support_infill_rate = 20 support_interface_enable = True support_interface_height = 0.45 support_interface_pattern = zigzag -support_interface_skip_height = 0.15 support_offset = 0.8 support_z_distance = 0.25 wall_thickness = 1.6 diff --git a/resources/quality/beamup_s/beamup_s_coarse.inst.cfg b/resources/quality/beamup_s/beamup_s_coarse.inst.cfg index d4d8b3551b..673950dca8 100644 --- a/resources/quality/beamup_s/beamup_s_coarse.inst.cfg +++ b/resources/quality/beamup_s/beamup_s_coarse.inst.cfg @@ -33,7 +33,6 @@ support_infill_rate = 20 support_interface_enable = True support_interface_height = 0.60 support_interface_pattern = zigzag -support_interface_skip_height = 0.30 support_offset = 0.8 support_z_distance = 0.2 wall_thickness = 0.8 diff --git a/resources/quality/beamup_s/beamup_s_draft.inst.cfg b/resources/quality/beamup_s/beamup_s_draft.inst.cfg index 14dc4ad964..a307f2d872 100644 --- a/resources/quality/beamup_s/beamup_s_draft.inst.cfg +++ b/resources/quality/beamup_s/beamup_s_draft.inst.cfg @@ -33,7 +33,6 @@ support_infill_rate = 20 support_interface_enable = True support_interface_height = 0.40 support_interface_pattern = zigzag -support_interface_skip_height = 0.20 support_offset = 0.8 support_z_distance = 0.2 wall_thickness = 0.8 diff --git a/resources/quality/beamup_s/beamup_s_extra_fine.inst.cfg b/resources/quality/beamup_s/beamup_s_extra_fine.inst.cfg index fe490f5dd4..daf1c8c5e5 100644 --- a/resources/quality/beamup_s/beamup_s_extra_fine.inst.cfg +++ b/resources/quality/beamup_s/beamup_s_extra_fine.inst.cfg @@ -33,7 +33,6 @@ support_infill_rate = 20 support_interface_enable = True support_interface_height = 0.30 support_interface_pattern = zigzag -support_interface_skip_height = 0.06 support_offset = 0.8 support_z_distance = 0.2 wall_thickness = 0.8 diff --git a/resources/quality/beamup_s/beamup_s_fine.inst.cfg b/resources/quality/beamup_s/beamup_s_fine.inst.cfg index ea86894268..798cc6bb68 100644 --- a/resources/quality/beamup_s/beamup_s_fine.inst.cfg +++ b/resources/quality/beamup_s/beamup_s_fine.inst.cfg @@ -33,7 +33,6 @@ support_infill_rate = 20 support_interface_enable = True support_interface_height = 0.30 support_interface_pattern = zigzag -support_interface_skip_height = 0.10 support_offset = 0.8 support_z_distance = 0.2 wall_thickness = 0.8 diff --git a/resources/quality/beamup_s/beamup_s_normal.inst.cfg b/resources/quality/beamup_s/beamup_s_normal.inst.cfg index c034f9bfd4..cab5840330 100644 --- a/resources/quality/beamup_s/beamup_s_normal.inst.cfg +++ b/resources/quality/beamup_s/beamup_s_normal.inst.cfg @@ -33,7 +33,6 @@ support_infill_rate = 20 support_interface_enable = True support_interface_height = 0.45 support_interface_pattern = zigzag -support_interface_skip_height = 0.15 support_offset = 0.8 support_z_distance = 0.2 wall_thickness = 0.8 diff --git a/resources/quality/flsun_sr/flsun_sr_fine.inst.cfg b/resources/quality/flsun_sr/flsun_sr_fine.inst.cfg index 7ba7f82e9a..c54130d953 100644 --- a/resources/quality/flsun_sr/flsun_sr_fine.inst.cfg +++ b/resources/quality/flsun_sr/flsun_sr_fine.inst.cfg @@ -65,7 +65,6 @@ support_interface_density = 60 support_interface_enable = True support_interface_height = 0.96 support_interface_pattern = grid -support_interface_skip_height = 0.12 support_roof_density = 60 support_type = everywhere support_wall_count = 1 diff --git a/resources/quality/flsun_sr/flsun_sr_normal.inst.cfg b/resources/quality/flsun_sr/flsun_sr_normal.inst.cfg index 5091ec6d97..373e5dbf6f 100644 --- a/resources/quality/flsun_sr/flsun_sr_normal.inst.cfg +++ b/resources/quality/flsun_sr/flsun_sr_normal.inst.cfg @@ -65,7 +65,6 @@ support_interface_density = 60 support_interface_enable = True support_interface_height = 0.6 support_interface_pattern = grid -support_interface_skip_height = 0.2 support_roof_density = 60 support_type = everywhere support_wall_count = 1 diff --git a/resources/quality/flsun_v400/flsun_v400_normal.inst.cfg b/resources/quality/flsun_v400/flsun_v400_normal.inst.cfg index 321f44a8bd..9c99046939 100644 --- a/resources/quality/flsun_v400/flsun_v400_normal.inst.cfg +++ b/resources/quality/flsun_v400/flsun_v400_normal.inst.cfg @@ -100,7 +100,6 @@ support_interface_density = 70 support_interface_enable = True support_interface_height = 0.6 support_interface_pattern = lines -support_interface_skip_height = 0.2 support_pattern = zigzag support_roof_density = 70 support_type = everywhere diff --git a/resources/quality/imade3d_jellybox/imade3d_jellybox_coarse.inst.cfg b/resources/quality/imade3d_jellybox/imade3d_jellybox_coarse.inst.cfg index 4363815718..b84019e791 100644 --- a/resources/quality/imade3d_jellybox/imade3d_jellybox_coarse.inst.cfg +++ b/resources/quality/imade3d_jellybox/imade3d_jellybox_coarse.inst.cfg @@ -65,7 +65,6 @@ support_interface_density = 70 support_interface_enable = True support_interface_height = 2 support_interface_pattern = concentric -support_interface_skip_height = 0.1 support_type = everywhere support_use_towers = False support_xy_distance = 0.8 diff --git a/resources/quality/imade3d_jellybox/imade3d_jellybox_fine.inst.cfg b/resources/quality/imade3d_jellybox/imade3d_jellybox_fine.inst.cfg index ad1786e646..8aa8ee6203 100644 --- a/resources/quality/imade3d_jellybox/imade3d_jellybox_fine.inst.cfg +++ b/resources/quality/imade3d_jellybox/imade3d_jellybox_fine.inst.cfg @@ -65,7 +65,6 @@ support_interface_density = 70 support_interface_enable = True support_interface_height = 2 support_interface_pattern = concentric -support_interface_skip_height = 0.1 support_type = everywhere support_use_towers = False support_xy_distance = 0.8 diff --git a/resources/quality/imade3d_jellybox/imade3d_jellybox_normal.inst.cfg b/resources/quality/imade3d_jellybox/imade3d_jellybox_normal.inst.cfg index 9d20162475..5e6ed2682c 100644 --- a/resources/quality/imade3d_jellybox/imade3d_jellybox_normal.inst.cfg +++ b/resources/quality/imade3d_jellybox/imade3d_jellybox_normal.inst.cfg @@ -65,7 +65,6 @@ support_interface_density = 70 support_interface_enable = True support_interface_height = 2 support_interface_pattern = concentric -support_interface_skip_height = 0.1 support_type = everywhere support_use_towers = False support_xy_distance = 0.8 diff --git a/resources/quality/imade3d_jellybox/imade3d_jellybox_ultrafine.inst.cfg b/resources/quality/imade3d_jellybox/imade3d_jellybox_ultrafine.inst.cfg index 9cf8367db5..db92713bd0 100644 --- a/resources/quality/imade3d_jellybox/imade3d_jellybox_ultrafine.inst.cfg +++ b/resources/quality/imade3d_jellybox/imade3d_jellybox_ultrafine.inst.cfg @@ -65,7 +65,6 @@ support_interface_density = 70 support_interface_enable = True support_interface_height = 2 support_interface_pattern = concentric -support_interface_skip_height = 0.1 support_type = everywhere support_use_towers = False support_xy_distance = 0.8 diff --git a/resources/quality/imade3d_jellybox_2/jb2_global_coarse.inst.cfg b/resources/quality/imade3d_jellybox_2/jb2_global_coarse.inst.cfg index a445dc28be..9fde6a87ea 100644 --- a/resources/quality/imade3d_jellybox_2/jb2_global_coarse.inst.cfg +++ b/resources/quality/imade3d_jellybox_2/jb2_global_coarse.inst.cfg @@ -65,7 +65,6 @@ support_interface_density = 70 support_interface_enable = True support_interface_height = 2 support_interface_pattern = concentric -support_interface_skip_height = 0.1 support_type = everywhere support_use_towers = False support_xy_distance = 0.8 diff --git a/resources/quality/imade3d_jellybox_2/jb2_global_fine.inst.cfg b/resources/quality/imade3d_jellybox_2/jb2_global_fine.inst.cfg index df0a0bf3f0..419fa6b300 100644 --- a/resources/quality/imade3d_jellybox_2/jb2_global_fine.inst.cfg +++ b/resources/quality/imade3d_jellybox_2/jb2_global_fine.inst.cfg @@ -65,7 +65,6 @@ support_interface_density = 70 support_interface_enable = True support_interface_height = 2 support_interface_pattern = concentric -support_interface_skip_height = 0.1 support_type = everywhere support_use_towers = False support_xy_distance = 0.8 diff --git a/resources/quality/imade3d_jellybox_2/jb2_global_normal.inst.cfg b/resources/quality/imade3d_jellybox_2/jb2_global_normal.inst.cfg index be43962f72..c352981f2d 100644 --- a/resources/quality/imade3d_jellybox_2/jb2_global_normal.inst.cfg +++ b/resources/quality/imade3d_jellybox_2/jb2_global_normal.inst.cfg @@ -65,7 +65,6 @@ support_interface_density = 70 support_interface_enable = True support_interface_height = 2 support_interface_pattern = concentric -support_interface_skip_height = 0.1 support_type = everywhere support_use_towers = False support_xy_distance = 0.8 diff --git a/resources/quality/imade3d_jellybox_2/jb2_global_ultrafine.inst.cfg b/resources/quality/imade3d_jellybox_2/jb2_global_ultrafine.inst.cfg index b3b35aca97..a1496e36cc 100644 --- a/resources/quality/imade3d_jellybox_2/jb2_global_ultrafine.inst.cfg +++ b/resources/quality/imade3d_jellybox_2/jb2_global_ultrafine.inst.cfg @@ -65,7 +65,6 @@ support_interface_density = 70 support_interface_enable = True support_interface_height = 2 support_interface_pattern = concentric -support_interface_skip_height = 0.1 support_type = everywhere support_use_towers = False support_xy_distance = 0.8 diff --git a/resources/setting_visibility/expert.cfg b/resources/setting_visibility/expert.cfg index ab0d2aa920..2a71993998 100644 --- a/resources/setting_visibility/expert.cfg +++ b/resources/setting_visibility/expert.cfg @@ -293,7 +293,6 @@ support_bottom_wall_count support_interface_height support_roof_height support_bottom_height -support_interface_skip_height support_interface_density support_roof_density support_bottom_density diff --git a/resources/variants/arjun/arjun300_pva_0.2.inst.cfg b/resources/variants/arjun/arjun300_pva_0.2.inst.cfg index 26440e5486..065fecd92b 100644 --- a/resources/variants/arjun/arjun300_pva_0.2.inst.cfg +++ b/resources/variants/arjun/arjun300_pva_0.2.inst.cfg @@ -21,7 +21,6 @@ support_interface_density = 100 support_interface_enable = True support_interface_height = =layer_height * 5 support_interface_pattern = concentric -support_interface_skip_height = =layer_height support_join_distance = 3 support_offset = 3 support_pattern = triangles diff --git a/resources/variants/arjun/arjun300_pva_0.3.inst.cfg b/resources/variants/arjun/arjun300_pva_0.3.inst.cfg index 5edaddba92..cef64896b1 100644 --- a/resources/variants/arjun/arjun300_pva_0.3.inst.cfg +++ b/resources/variants/arjun/arjun300_pva_0.3.inst.cfg @@ -21,7 +21,6 @@ support_interface_density = 100 support_interface_enable = True support_interface_height = =layer_height * 5 support_interface_pattern = concentric -support_interface_skip_height = =layer_height support_join_distance = 3 support_offset = 3 support_pattern = triangles diff --git a/resources/variants/arjun/arjun300_pva_0.4.inst.cfg b/resources/variants/arjun/arjun300_pva_0.4.inst.cfg index a5ca8ffb7a..273bab3848 100644 --- a/resources/variants/arjun/arjun300_pva_0.4.inst.cfg +++ b/resources/variants/arjun/arjun300_pva_0.4.inst.cfg @@ -21,7 +21,6 @@ support_interface_density = 100 support_interface_enable = True support_interface_height = =layer_height * 5 support_interface_pattern = concentric -support_interface_skip_height = =layer_height support_join_distance = 3 support_offset = 3 support_pattern = triangles diff --git a/resources/variants/arjun/arjun300_pva_0.5.inst.cfg b/resources/variants/arjun/arjun300_pva_0.5.inst.cfg index 2145714b0d..4ac74b10b0 100644 --- a/resources/variants/arjun/arjun300_pva_0.5.inst.cfg +++ b/resources/variants/arjun/arjun300_pva_0.5.inst.cfg @@ -21,7 +21,6 @@ support_interface_density = 100 support_interface_enable = True support_interface_height = =layer_height * 5 support_interface_pattern = concentric -support_interface_skip_height = =layer_height support_join_distance = 3 support_offset = 3 support_pattern = triangles diff --git a/resources/variants/arjun/arjun300_pva_0.6.inst.cfg b/resources/variants/arjun/arjun300_pva_0.6.inst.cfg index 40e0c5f3ba..9522f1a103 100644 --- a/resources/variants/arjun/arjun300_pva_0.6.inst.cfg +++ b/resources/variants/arjun/arjun300_pva_0.6.inst.cfg @@ -21,7 +21,6 @@ support_interface_density = 100 support_interface_enable = True support_interface_height = =layer_height * 5 support_interface_pattern = concentric -support_interface_skip_height = =layer_height support_join_distance = 3 support_offset = 3 support_pattern = triangles diff --git a/resources/variants/arjun/arjun300_pva_0.8.inst.cfg b/resources/variants/arjun/arjun300_pva_0.8.inst.cfg index ee6e5557fb..1e47424034 100644 --- a/resources/variants/arjun/arjun300_pva_0.8.inst.cfg +++ b/resources/variants/arjun/arjun300_pva_0.8.inst.cfg @@ -21,7 +21,6 @@ support_interface_density = 100 support_interface_enable = True support_interface_height = =layer_height * 5 support_interface_pattern = concentric -support_interface_skip_height = =layer_height support_join_distance = 3 support_offset = 3 support_pattern = triangles diff --git a/resources/variants/arjun/arjunpro300_pva_0.2.inst.cfg b/resources/variants/arjun/arjunpro300_pva_0.2.inst.cfg index 60d7f77d7b..3fc340152c 100644 --- a/resources/variants/arjun/arjunpro300_pva_0.2.inst.cfg +++ b/resources/variants/arjun/arjunpro300_pva_0.2.inst.cfg @@ -21,7 +21,6 @@ support_interface_density = 100 support_interface_enable = True support_interface_height = =layer_height * 5 support_interface_pattern = concentric -support_interface_skip_height = =layer_height support_join_distance = 3 support_offset = 3 support_pattern = triangles diff --git a/resources/variants/arjun/arjunpro300_pva_0.3.inst.cfg b/resources/variants/arjun/arjunpro300_pva_0.3.inst.cfg index f4c0c7e37a..8ae2ffb70a 100644 --- a/resources/variants/arjun/arjunpro300_pva_0.3.inst.cfg +++ b/resources/variants/arjun/arjunpro300_pva_0.3.inst.cfg @@ -21,7 +21,6 @@ support_interface_density = 100 support_interface_enable = True support_interface_height = =layer_height * 5 support_interface_pattern = concentric -support_interface_skip_height = =layer_height support_join_distance = 3 support_offset = 3 support_pattern = triangles diff --git a/resources/variants/arjun/arjunpro300_pva_0.4.inst.cfg b/resources/variants/arjun/arjunpro300_pva_0.4.inst.cfg index 25f40aa829..b444d14925 100644 --- a/resources/variants/arjun/arjunpro300_pva_0.4.inst.cfg +++ b/resources/variants/arjun/arjunpro300_pva_0.4.inst.cfg @@ -21,7 +21,6 @@ support_interface_density = 100 support_interface_enable = True support_interface_height = =layer_height * 5 support_interface_pattern = concentric -support_interface_skip_height = =layer_height support_join_distance = 3 support_offset = 3 support_pattern = triangles diff --git a/resources/variants/arjun/arjunpro300_pva_0.5.inst.cfg b/resources/variants/arjun/arjunpro300_pva_0.5.inst.cfg index cbb9ea3deb..e78ca2f27a 100644 --- a/resources/variants/arjun/arjunpro300_pva_0.5.inst.cfg +++ b/resources/variants/arjun/arjunpro300_pva_0.5.inst.cfg @@ -21,7 +21,6 @@ support_interface_density = 100 support_interface_enable = True support_interface_height = =layer_height * 5 support_interface_pattern = concentric -support_interface_skip_height = =layer_height support_join_distance = 3 support_offset = 3 support_pattern = triangles diff --git a/resources/variants/arjun/arjunpro300_pva_0.6.inst.cfg b/resources/variants/arjun/arjunpro300_pva_0.6.inst.cfg index d9459b476a..d6a3770cd9 100644 --- a/resources/variants/arjun/arjunpro300_pva_0.6.inst.cfg +++ b/resources/variants/arjun/arjunpro300_pva_0.6.inst.cfg @@ -21,7 +21,6 @@ support_interface_density = 100 support_interface_enable = True support_interface_height = =layer_height * 5 support_interface_pattern = concentric -support_interface_skip_height = =layer_height support_join_distance = 3 support_offset = 3 support_pattern = triangles diff --git a/resources/variants/arjun/arjunpro300_pva_0.8.inst.cfg b/resources/variants/arjun/arjunpro300_pva_0.8.inst.cfg index cf5df5f37d..c19c8ca79a 100644 --- a/resources/variants/arjun/arjunpro300_pva_0.8.inst.cfg +++ b/resources/variants/arjun/arjunpro300_pva_0.8.inst.cfg @@ -21,7 +21,6 @@ support_interface_density = 100 support_interface_enable = True support_interface_height = =layer_height * 5 support_interface_pattern = concentric -support_interface_skip_height = =layer_height support_join_distance = 3 support_offset = 3 support_pattern = triangles diff --git a/resources/variants/kosher/kosher220_pva_0.2.inst.cfg b/resources/variants/kosher/kosher220_pva_0.2.inst.cfg index e5893c3e65..ea3b821cea 100644 --- a/resources/variants/kosher/kosher220_pva_0.2.inst.cfg +++ b/resources/variants/kosher/kosher220_pva_0.2.inst.cfg @@ -21,7 +21,6 @@ support_interface_density = 100 support_interface_enable = True support_interface_height = =layer_height * 5 support_interface_pattern = concentric -support_interface_skip_height = =layer_height support_join_distance = 3 support_offset = 3 support_pattern = triangles diff --git a/resources/variants/kosher/kosher220_pva_0.3.inst.cfg b/resources/variants/kosher/kosher220_pva_0.3.inst.cfg index e1fbeaaf69..216388c64b 100644 --- a/resources/variants/kosher/kosher220_pva_0.3.inst.cfg +++ b/resources/variants/kosher/kosher220_pva_0.3.inst.cfg @@ -21,7 +21,6 @@ support_interface_density = 100 support_interface_enable = True support_interface_height = =layer_height * 5 support_interface_pattern = concentric -support_interface_skip_height = =layer_height support_join_distance = 3 support_offset = 3 support_pattern = triangles diff --git a/resources/variants/kosher/kosher220_pva_0.4.inst.cfg b/resources/variants/kosher/kosher220_pva_0.4.inst.cfg index 40de699118..024d842630 100644 --- a/resources/variants/kosher/kosher220_pva_0.4.inst.cfg +++ b/resources/variants/kosher/kosher220_pva_0.4.inst.cfg @@ -21,7 +21,6 @@ support_interface_density = 100 support_interface_enable = True support_interface_height = =layer_height * 5 support_interface_pattern = concentric -support_interface_skip_height = =layer_height support_join_distance = 3 support_offset = 3 support_pattern = triangles diff --git a/resources/variants/kosher/kosher220_pva_0.5.inst.cfg b/resources/variants/kosher/kosher220_pva_0.5.inst.cfg index 2a4c88d022..6197e0ab9c 100644 --- a/resources/variants/kosher/kosher220_pva_0.5.inst.cfg +++ b/resources/variants/kosher/kosher220_pva_0.5.inst.cfg @@ -21,7 +21,6 @@ support_interface_density = 100 support_interface_enable = True support_interface_height = =layer_height * 5 support_interface_pattern = concentric -support_interface_skip_height = =layer_height support_join_distance = 3 support_offset = 3 support_pattern = triangles diff --git a/resources/variants/kosher/kosher220_pva_0.6.inst.cfg b/resources/variants/kosher/kosher220_pva_0.6.inst.cfg index a3781a00bd..211a361c2b 100644 --- a/resources/variants/kosher/kosher220_pva_0.6.inst.cfg +++ b/resources/variants/kosher/kosher220_pva_0.6.inst.cfg @@ -21,7 +21,6 @@ support_interface_density = 100 support_interface_enable = True support_interface_height = =layer_height * 5 support_interface_pattern = concentric -support_interface_skip_height = =layer_height support_join_distance = 3 support_offset = 3 support_pattern = triangles diff --git a/resources/variants/kosher/kosher220_pva_0.8.inst.cfg b/resources/variants/kosher/kosher220_pva_0.8.inst.cfg index 4faf6729b6..6f6a9dd6b4 100644 --- a/resources/variants/kosher/kosher220_pva_0.8.inst.cfg +++ b/resources/variants/kosher/kosher220_pva_0.8.inst.cfg @@ -21,7 +21,6 @@ support_interface_density = 100 support_interface_enable = True support_interface_height = =layer_height * 5 support_interface_pattern = concentric -support_interface_skip_height = =layer_height support_join_distance = 3 support_offset = 3 support_pattern = triangles From 16737dccf21165709bacad5c3496b9477d7f2a8d Mon Sep 17 00:00:00 2001 From: Paul Kuiper <46715907+pkuiper-ultimaker@users.noreply.github.com> Date: Wed, 10 Jan 2024 10:02:46 +0100 Subject: [PATCH 132/182] Set initial fan speed for AA0.25 ABS 0.1mm print mode to 0% to increase adhesion robustness. PP-422 --- resources/quality/ultimaker_s3/um_s3_aa0.25_abs_0.1mm.inst.cfg | 1 + .../quality/ultimaker_s3/um_s3_aa0.25_um-abs_0.1mm.inst.cfg | 1 + resources/quality/ultimaker_s5/um_s5_aa0.25_abs_0.1mm.inst.cfg | 1 + .../quality/ultimaker_s5/um_s5_aa0.25_um-abs_0.1mm.inst.cfg | 1 + 4 files changed, 4 insertions(+) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.25_abs_0.1mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.25_abs_0.1mm.inst.cfg index 5e0afa0015..ec9ff192a9 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.25_abs_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.25_abs_0.1mm.inst.cfg @@ -12,6 +12,7 @@ variant = AA 0.25 weight = 0 [values] +cool_fan_speed_0 = 0 material_print_temperature = =default_material_print_temperature - 20 speed_topbottom = =math.ceil(speed_print * 30 / 55) support_bottom_distance = =support_z_distance diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.25_um-abs_0.1mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.25_um-abs_0.1mm.inst.cfg index ada1c2cefb..40058561ac 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.25_um-abs_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.25_um-abs_0.1mm.inst.cfg @@ -12,6 +12,7 @@ variant = AA 0.25 weight = 0 [values] +cool_fan_speed_0 = 0 material_print_temperature = =default_material_print_temperature - 20 speed_topbottom = =math.ceil(speed_print * 30 / 55) support_bottom_distance = =support_z_distance diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.25_abs_0.1mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.25_abs_0.1mm.inst.cfg index 2e09727a19..d26fe0daee 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.25_abs_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.25_abs_0.1mm.inst.cfg @@ -12,6 +12,7 @@ variant = AA 0.25 weight = 0 [values] +cool_fan_speed_0 = 0 material_print_temperature = =default_material_print_temperature - 20 speed_topbottom = =math.ceil(speed_print * 30 / 55) support_bottom_distance = =support_z_distance diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.25_um-abs_0.1mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.25_um-abs_0.1mm.inst.cfg index 1b6c680650..0dc15571d7 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.25_um-abs_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.25_um-abs_0.1mm.inst.cfg @@ -12,6 +12,7 @@ variant = AA 0.25 weight = 0 [values] +cool_fan_speed_0 = 0 material_print_temperature = =default_material_print_temperature - 20 speed_topbottom = =math.ceil(speed_print * 30 / 55) support_bottom_distance = =support_z_distance From ed47c05e4b0d91c6eca826f6f50a398a62f692d9 Mon Sep 17 00:00:00 2001 From: Remco Burema Date: Wed, 10 Jan 2024 10:36:23 +0100 Subject: [PATCH 133/182] Fix QML warning. done as part of CURA-11396 --- resources/qml/PrinterSelector/PrintSelectorCard.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/PrinterSelector/PrintSelectorCard.qml b/resources/qml/PrinterSelector/PrintSelectorCard.qml index efcbe07c87..1c3e78adbf 100644 --- a/resources/qml/PrinterSelector/PrintSelectorCard.qml +++ b/resources/qml/PrinterSelector/PrintSelectorCard.qml @@ -79,7 +79,7 @@ Rectangle anchors.verticalCenter: extruderIcon.verticalCenter anchors.left: extruderIcon.right anchors.leftMargin: UM.Theme.getSize("default_margin").width - text: modelData.core + text: modelData ? (modelData.core ? modelData.core : "" ) : "" font: UM.Theme.getFont("default_bold") } From 34da282275073432f04ce37cda9d7fbcd3670702 Mon Sep 17 00:00:00 2001 From: "saumya.jain" Date: Wed, 10 Jan 2024 15:09:26 +0100 Subject: [PATCH 134/182] Uranium fixing API breaks. deprecated message shows up when user uses it. will remove them in future CURA-7812 --- resources/qml/Dialogs/AboutDialog.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/Dialogs/AboutDialog.qml b/resources/qml/Dialogs/AboutDialog.qml index 79cad92b25..5c80964e38 100644 --- a/resources/qml/Dialogs/AboutDialog.qml +++ b/resources/qml/Dialogs/AboutDialog.qml @@ -58,7 +58,7 @@ UM.Dialog UM.Label { id: version - text: catalog.i18nc("@label","version: %1").arg(CuraApplication.applicationVersion()) + text: catalog.i18nc("@label","version: %1").arg(CuraApplication.version()) font: UM.Theme.getFont("large_bold") color: UM.Theme.getColor("button_text") anchors.right : logo.right From bb0c17b2fd5c30cb912d5768c010f27309f6f83c Mon Sep 17 00:00:00 2001 From: HellAholic Date: Wed, 10 Jan 2024 15:41:20 +0100 Subject: [PATCH 135/182] Revert "qt6.6 scroll issues" --- conanfile.py | 1 - cura_app.py | 5 ----- packaging/AppImage-builder/AppImageBuilder.yml.jinja | 1 - packaging/AppImage/AppRun | 1 - 4 files changed, 8 deletions(-) diff --git a/conanfile.py b/conanfile.py index 5ebcf5a4c4..a3ca8f1c89 100644 --- a/conanfile.py +++ b/conanfile.py @@ -71,7 +71,6 @@ class CuraConan(ConanFile): self._cura_env = Environment() self._cura_env.define("QML2_IMPORT_PATH", str(self._site_packages.joinpath("PyQt6", "Qt6", "qml"))) self._cura_env.define("QT_PLUGIN_PATH", str(self._site_packages.joinpath("PyQt6", "Qt6", "plugins"))) - self._cura_env.define("QT_QUICK_FLICKABLE_WHEEL_DECELERATION", "5000") if not self.in_local_cache: self._cura_env.define("CURA_DATA_ROOT", str(self._share_dir.joinpath("cura"))) diff --git a/cura_app.py b/cura_app.py index 7e80bbac79..905d8f4ee0 100755 --- a/cura_app.py +++ b/cura_app.py @@ -17,11 +17,6 @@ import faulthandler import os if sys.platform != "linux": # Turns out the Linux build _does_ use this, but we're not making an Enterprise release for that system anyway. os.environ["QT_PLUGIN_PATH"] = "" # Security workaround: Don't need it, and introduces an attack vector, so set to nul. - try: - # try converting to integer - os.environ["QT_QUICK_FLICKABLE_WHEEL_DECELERATION"] = str(int(os.environ["QT_QUICK_FLICKABLE_WHEEL_DECELERATION"])) - except ValueError: - os.environ["QT_QUICK_FLICKABLE_WHEEL_DECELERATION"] = "5000" os.environ["QML2_IMPORT_PATH"] = "" # Security workaround: Don't need it, and introduces an attack vector, so set to nul. os.environ["QT_OPENGL_DLL"] = "" # Security workaround: Don't need it, and introduces an attack vector, so set to nul. diff --git a/packaging/AppImage-builder/AppImageBuilder.yml.jinja b/packaging/AppImage-builder/AppImageBuilder.yml.jinja index ae6cabcaa1..9090a5f209 100644 --- a/packaging/AppImage-builder/AppImageBuilder.yml.jinja +++ b/packaging/AppImage-builder/AppImageBuilder.yml.jinja @@ -45,7 +45,6 @@ AppDir: LD_LIBRARY_PATH: "$APPDIR:$APPDIR/runtime/compat/:$APPDIR/usr/lib/x86_64-linux-gnu:$APPDIR/lib/x86_64-linux-gnu:$APPDIR/usr/lib:$APPDIR/usr/lib/x86_64-linux-gnu/gdk-pixbuf-2.0/2.10.0/loaders" PYTHONPATH: "$APPDIR" QT_PLUGIN_PATH: "$APPDIR/qt/plugins" - QT_QUICK_FLICKABLE_WHEEL_DECELERATION: "5000" QML2_IMPORT_PATH: "$APPDIR/qt/qml" QT_QPA_PLATFORMTHEME: xdgdesktopportal GDK_PIXBUF_MODULEDIR: $APPDIR/usr/lib/x86_64-linux-gnu/gdk-pixbuf-2.0/2.10.0/loaders diff --git a/packaging/AppImage/AppRun b/packaging/AppImage/AppRun index 9926df1878..369ce54c6c 100644 --- a/packaging/AppImage/AppRun +++ b/packaging/AppImage/AppRun @@ -5,7 +5,6 @@ scriptdir=$(dirname $0) export PYTHONPATH="$scriptdir/lib/python3.10" export LD_LIBRARY_PATH=$scriptdir export QT_PLUGIN_PATH="$scriptdir/qt/plugins" -export QT_QUICK_FLICKABLE_WHEEL_DECELERATION="5000" export QML2_IMPORT_PATH="$scriptdir/qt/qml" export QT_QPA_FONTDIR=/usr/share/fonts export QT_QPA_PLATFORMTHEME=xdgdesktopportal From d0560ae790ad027ee32ab4b87c456299c9642056 Mon Sep 17 00:00:00 2001 From: "saumya.jain" Date: Wed, 10 Jan 2024 17:54:02 +0100 Subject: [PATCH 136/182] restoring qmlregistersingletons in Cura adding wrapper for deprecation warning CURA-7812 --- cura/CuraApplication.py | 42 ++++++++++++++++--- .../Custom/QualitiesWithIntentMenu.qml | 2 +- 2 files changed, 37 insertions(+), 7 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 20048e3d3f..67c420028b 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -15,13 +15,13 @@ import numpy from PyQt6.QtCore import QObject, QTimer, QUrl, QUrlQuery, pyqtSignal, pyqtProperty, QEvent, pyqtEnum, QCoreApplication, \ QByteArray from PyQt6.QtGui import QColor, QIcon -from PyQt6.QtQml import qmlRegisterUncreatableType, qmlRegisterUncreatableMetaObject, qmlRegisterSingletonType, qmlRegisterType +from PyQt6.QtQml import qmlRegisterUncreatableMetaObject, qmlRegisterSingletonType, qmlRegisterType from PyQt6.QtWidgets import QMessageBox import UM.Util import cura.Settings.cura_empty_instance_containers from UM.Application import Application -from UM.Decorators import override +from UM.Decorators import override, deprecated from UM.FlameProfiler import pyqtSlot from UM.Logger import Logger from UM.Math.AxisAlignedBox import AxisAlignedBox @@ -191,7 +191,7 @@ class CuraApplication(QtApplication): self.empty_container = None # type: EmptyInstanceContainer self.empty_definition_changes_container = None # type: EmptyInstanceContainer self.empty_variant_container = None # type: EmptyInstanceContainer - self.empty_intent_container = None # type: EmptyInstanceContainer + self.empty_intent_container = None # type: EmptyInstanceContainer self.empty_material_container = None # type: EmptyInstanceContainer self.empty_quality_container = None # type: EmptyInstanceContainer self.empty_quality_changes_container = None # type: EmptyInstanceContainer @@ -1198,18 +1198,43 @@ class CuraApplication(QtApplication): return self._print_information - pyqtSlot(result =QObject) + @pyqtSlot(result=QObject) def getQualityProfilesDropDownMenuModel(self, *args, **kwargs)-> QualityProfilesDropDownMenuModel: if self._quality_profile_drop_down_menu_model is None: self._quality_profile_drop_down_menu_model = QualityProfilesDropDownMenuModel(self) return self._quality_profile_drop_down_menu_model - pyqtSlot(result=QObject) + @pyqtSlot(result=QObject) def getCustomQualityProfilesDropDownMenuModel(self, *args, **kwargs)->CustomQualityProfilesDropDownMenuModel: if self._custom_quality_profile_drop_down_menu_model is None: self._custom_quality_profile_drop_down_menu_model = CustomQualityProfilesDropDownMenuModel(self) return self._custom_quality_profile_drop_down_menu_model + @deprecated("SimpleModeSettingsManager is deprecated and will be removed in major SDK release, Use getSimpleModeSettingsManager() instead", since = "5.7.0") + def getSimpleModeSettingsManagerWrapper(self, *args, **kwargs): + return self.getSimpleModeSettingsManager() + + @deprecated("MachineActionManager is deprecated and will be removed in major SDK release, Use getMachineActionManager() instead", since="5.7.0") + def getMachineActionManagerWrapper(self, *args, **kwargs): + return self.getMachineActionManager() + + @deprecated("QualityManagementModel is deprecated and will be removed in major SDK release, Use getQualityManagementModel() instead", since="5.7.0") + def getQualityManagementModelWrapper(self, *args, **kwargs): + return self.getQualityManagementModel() + + @deprecated("MaterialManagementModel is deprecated and will be removed in major SDK release, Use getMaterialManagementModel() instead", since = "5.7.0") + def getMaterialManagementModelWrapper(self, *args, **kwargs): + return self.getMaterialManagementModel() + + @deprecated("QualityProfilesDropDownMenuModel is deprecated and will be removed in major SDK release, Use getQualityProfilesDropDownMenuModel() instead", since = "5.7.0") + def getQualityProfilesDropDownMenuModelWrapper(self, *args, **kwargs): + return self.getQualityProfilesDropDownMenuModel() + + @deprecated("CustomQualityProfilesDropDownMenuModel is deprecated and will be removed in major SDK release, Use getCustomQualityProfilesDropDownMenuModel() instead", since = "5.7.0") + def getCustomQualityProfilesDropDownMenuModelWrapper(self, *args, **kwargs): + return self.getCustomQualityProfilesDropDownMenuModel() + + def getCuraAPI(self, *args, **kwargs) -> "CuraAPI": return self._cura_API @@ -1238,6 +1263,8 @@ class CuraApplication(QtApplication): qmlRegisterSingletonType(MachineManager, "Cura", 1, 0, self.getMachineManager, "MachineManager") qmlRegisterSingletonType(IntentManager, "Cura", 1, 6, self.getIntentManager, "IntentManager") qmlRegisterSingletonType(SettingInheritanceManager, "Cura", 1, 0, self.getSettingInheritanceManager, "SettingInheritanceManager") + qmlRegisterSingletonType(SimpleModeSettingsManager, "Cura", 1, 0, self.getSimpleModeSettingsManagerWrapper, "SimpleModeSettingsManager") + qmlRegisterSingletonType(MachineActionManager.MachineActionManager, "Cura", 1, 0, self.getMachineActionManagerWrapper, "MachineActionManager") self.processEvents() qmlRegisterType(NetworkingUtil, "Cura", 1, 5, "NetworkingUtil") @@ -1262,11 +1289,14 @@ class CuraApplication(QtApplication): qmlRegisterType(FavoriteMaterialsModel, "Cura", 1, 0, "FavoriteMaterialsModel") qmlRegisterType(GenericMaterialsModel, "Cura", 1, 0, "GenericMaterialsModel") qmlRegisterType(MaterialBrandsModel, "Cura", 1, 0, "MaterialBrandsModel") + qmlRegisterSingletonType(QualityManagementModel, "Cura", 1, 0, self.getQualityManagementModelWrapper,"QualityManagementModel") + qmlRegisterSingletonType(MaterialManagementModel, "Cura", 1, 5, self.getMaterialManagementModelWrapper,"MaterialManagementModel") self.processEvents() qmlRegisterType(DiscoveredPrintersModel, "Cura", 1, 0, "DiscoveredPrintersModel") qmlRegisterType(DiscoveredCloudPrintersModel, "Cura", 1, 7, "DiscoveredCloudPrintersModel") - qmlRegisterType(CustomQualityProfilesDropDownMenuModel, "Cura", 1, 0, "CustomQualityProfilesDropDownMenuModel") + qmlRegisterSingletonType(QualityProfilesDropDownMenuModel, "Cura", 1, 0, self.getQualityProfilesDropDownMenuModelWrapper, "QualityProfilesDropDownMenuModel") + qmlRegisterSingletonType(CustomQualityProfilesDropDownMenuModel, "Cura", 1, 0, self.getCustomQualityProfilesDropDownMenuModelWrapper, "CustomQualityProfilesDropDownMenuModel") qmlRegisterType(NozzleModel, "Cura", 1, 0, "NozzleModel") qmlRegisterType(IntentModel, "Cura", 1, 6, "IntentModel") qmlRegisterType(IntentCategoryModel, "Cura", 1, 6, "IntentCategoryModel") diff --git a/resources/qml/PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml b/resources/qml/PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml index 646e835cb2..9facc5095e 100644 --- a/resources/qml/PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml +++ b/resources/qml/PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml @@ -187,7 +187,7 @@ Popup //Add all the custom profiles. Repeater { - model: Cura.CustomQualityProfilesDropDownMenuModel + model: CuraApplication.getCustomQualityProfilesDropDownMenuModel() MenuButton { onClicked: Cura.MachineManager.setQualityChangesGroup(model.quality_changes_group) From 8f29e8d77bdd141a52528932af9c1a298981990b Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Thu, 11 Jan 2024 09:00:19 +0100 Subject: [PATCH 137/182] Fix wrongful removal of i18n option This caused the option to be always be removed, while we only needed the info of the option to be removed Contributes to CURA-11497 --- conanfile.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/conanfile.py b/conanfile.py index a3ca8f1c89..ea1ac2e1f9 100644 --- a/conanfile.py +++ b/conanfile.py @@ -518,7 +518,8 @@ echo "CURA_APP_NAME={{ cura_app_name }}" >> ${{ env_prefix }}GITHUB_ENV del self.info.options.cloud_api_version del self.info.options.display_name del self.info.options.cura_debug_mode - self.options.rm_safe("enable_i18n") + if self.options.get_safe("enable_i18n", False): + del self.info.options.enable_i18n # TODO: Use the hash of requirements.txt and requirements-ultimaker.txt, Because changing these will actually result in a different # Cura. This is needed because the requirements.txt aren't managed by Conan and therefor not resolved in the package_id. This isn't From b7970dadee75b0c4f029f4503062624f4b873410 Mon Sep 17 00:00:00 2001 From: "saumya.jain" Date: Thu, 11 Jan 2024 13:03:48 +0100 Subject: [PATCH 138/182] Setting QT_QUICK_FLICKABLE_WHEEL_DECELERATION only while opening cura application CURA-11468 --- conanfile.py | 1 - cura_app.py | 9 ++++----- packaging/AppImage-builder/AppImageBuilder.yml.jinja | 1 - packaging/AppImage/AppRun | 1 - 4 files changed, 4 insertions(+), 8 deletions(-) diff --git a/conanfile.py b/conanfile.py index 5ebcf5a4c4..a3ca8f1c89 100644 --- a/conanfile.py +++ b/conanfile.py @@ -71,7 +71,6 @@ class CuraConan(ConanFile): self._cura_env = Environment() self._cura_env.define("QML2_IMPORT_PATH", str(self._site_packages.joinpath("PyQt6", "Qt6", "qml"))) self._cura_env.define("QT_PLUGIN_PATH", str(self._site_packages.joinpath("PyQt6", "Qt6", "plugins"))) - self._cura_env.define("QT_QUICK_FLICKABLE_WHEEL_DECELERATION", "5000") if not self.in_local_cache: self._cura_env.define("CURA_DATA_ROOT", str(self._share_dir.joinpath("cura"))) diff --git a/cura_app.py b/cura_app.py index 7e80bbac79..87cd1a59ed 100755 --- a/cura_app.py +++ b/cura_app.py @@ -15,13 +15,12 @@ if "" in sys.path: import argparse import faulthandler import os + +# try converting to integer +os.environ["QT_QUICK_FLICKABLE_WHEEL_DECELERATION"] = str(int(os.environ.get("QT_QUICK_FLICKABLE_WHEEL_DECELERATION", "5000"))) + if sys.platform != "linux": # Turns out the Linux build _does_ use this, but we're not making an Enterprise release for that system anyway. os.environ["QT_PLUGIN_PATH"] = "" # Security workaround: Don't need it, and introduces an attack vector, so set to nul. - try: - # try converting to integer - os.environ["QT_QUICK_FLICKABLE_WHEEL_DECELERATION"] = str(int(os.environ["QT_QUICK_FLICKABLE_WHEEL_DECELERATION"])) - except ValueError: - os.environ["QT_QUICK_FLICKABLE_WHEEL_DECELERATION"] = "5000" os.environ["QML2_IMPORT_PATH"] = "" # Security workaround: Don't need it, and introduces an attack vector, so set to nul. os.environ["QT_OPENGL_DLL"] = "" # Security workaround: Don't need it, and introduces an attack vector, so set to nul. diff --git a/packaging/AppImage-builder/AppImageBuilder.yml.jinja b/packaging/AppImage-builder/AppImageBuilder.yml.jinja index ae6cabcaa1..9090a5f209 100644 --- a/packaging/AppImage-builder/AppImageBuilder.yml.jinja +++ b/packaging/AppImage-builder/AppImageBuilder.yml.jinja @@ -45,7 +45,6 @@ AppDir: LD_LIBRARY_PATH: "$APPDIR:$APPDIR/runtime/compat/:$APPDIR/usr/lib/x86_64-linux-gnu:$APPDIR/lib/x86_64-linux-gnu:$APPDIR/usr/lib:$APPDIR/usr/lib/x86_64-linux-gnu/gdk-pixbuf-2.0/2.10.0/loaders" PYTHONPATH: "$APPDIR" QT_PLUGIN_PATH: "$APPDIR/qt/plugins" - QT_QUICK_FLICKABLE_WHEEL_DECELERATION: "5000" QML2_IMPORT_PATH: "$APPDIR/qt/qml" QT_QPA_PLATFORMTHEME: xdgdesktopportal GDK_PIXBUF_MODULEDIR: $APPDIR/usr/lib/x86_64-linux-gnu/gdk-pixbuf-2.0/2.10.0/loaders diff --git a/packaging/AppImage/AppRun b/packaging/AppImage/AppRun index 9926df1878..369ce54c6c 100644 --- a/packaging/AppImage/AppRun +++ b/packaging/AppImage/AppRun @@ -5,7 +5,6 @@ scriptdir=$(dirname $0) export PYTHONPATH="$scriptdir/lib/python3.10" export LD_LIBRARY_PATH=$scriptdir export QT_PLUGIN_PATH="$scriptdir/qt/plugins" -export QT_QUICK_FLICKABLE_WHEEL_DECELERATION="5000" export QML2_IMPORT_PATH="$scriptdir/qt/qml" export QT_QPA_FONTDIR=/usr/share/fonts export QT_QPA_PLATFORMTHEME=xdgdesktopportal From db94117cf18ec9f9ec93ceb9d92844401c52292e Mon Sep 17 00:00:00 2001 From: "saumya.jain" Date: Thu, 11 Jan 2024 13:08:47 +0100 Subject: [PATCH 139/182] description changed CURA-11468 --- cura_app.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura_app.py b/cura_app.py index 87cd1a59ed..bcea032789 100755 --- a/cura_app.py +++ b/cura_app.py @@ -16,7 +16,7 @@ import argparse import faulthandler import os -# try converting to integer +# set the environment variable QT_QUICK_FLICKABLE_WHEEL_DECELERATION to 5000 as mentioned in qt6.6 update log to overcome scroll related issues os.environ["QT_QUICK_FLICKABLE_WHEEL_DECELERATION"] = str(int(os.environ.get("QT_QUICK_FLICKABLE_WHEEL_DECELERATION", "5000"))) if sys.platform != "linux": # Turns out the Linux build _does_ use this, but we're not making an Enterprise release for that system anyway. From f19e6347820b868f495d5a0a31d982ff7abb9623 Mon Sep 17 00:00:00 2001 From: Paul Kuiper <46715907+pkuiper-ultimaker@users.noreply.github.com> Date: Fri, 12 Jan 2024 09:43:46 +0100 Subject: [PATCH 140/182] Set the printing temperature (instead of initial) and do not wait for setpoint to be reached (the 5s wait after that command will be enough + Cura also directly does a M109 after the switch) PP-417 --- resources/extruders/ultimaker_methodx_extruder_left.def.json | 2 +- resources/extruders/ultimaker_methodx_extruder_right.def.json | 2 +- resources/extruders/ultimaker_methodxl_extruder_left.def.json | 2 +- resources/extruders/ultimaker_methodxl_extruder_right.def.json | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/resources/extruders/ultimaker_methodx_extruder_left.def.json b/resources/extruders/ultimaker_methodx_extruder_left.def.json index 273a2c922e..41b2322ff3 100644 --- a/resources/extruders/ultimaker_methodx_extruder_left.def.json +++ b/resources/extruders/ultimaker_methodx_extruder_left.def.json @@ -15,7 +15,7 @@ "maximum_value": "1" }, "machine_extruder_end_code": { "default_value": "M106 P{extruder_nr} S1.0\nG91\nG0 Z0.4 F600\nG90\nG0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000" }, - "machine_extruder_start_code": { "default_value": "G0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000\nM109 S{material_initial_print_temperature}\nG4 S5\nG91\nG0 Z-0.4 F600\nG90\nM107 P{(extruder_nr+1)%2}\nM106 P{extruder_nr} S{cool_fan_speed/100}" }, + "machine_extruder_start_code": { "default_value": "G0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000\nM104 S{material_print_temperature}\nG4 S5\nG91\nG0 Z-0.4 F600\nG90\nM107 P{(extruder_nr+1)%2}\nM106 P{extruder_nr} S{cool_fan_speed/100}" }, "machine_nozzle_offset_x": { "default_value": 0 }, "machine_nozzle_offset_y": { "default_value": 0 }, "machine_nozzle_size": { "default_value": 0.4 }, diff --git a/resources/extruders/ultimaker_methodx_extruder_right.def.json b/resources/extruders/ultimaker_methodx_extruder_right.def.json index bb8f1d89c2..0524d73e94 100644 --- a/resources/extruders/ultimaker_methodx_extruder_right.def.json +++ b/resources/extruders/ultimaker_methodx_extruder_right.def.json @@ -15,7 +15,7 @@ "maximum_value": "1" }, "machine_extruder_end_code": { "default_value": "M106 P{extruder_nr} S1.0\nG91\nG0 Z0.4 F600\nG90\nG0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000" }, - "machine_extruder_start_code": { "default_value": "G0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000\nM109 S{material_initial_print_temperature}\nG4 S5\nG91\nG0 Z-0.4 F600\nG90\nM107 P{(extruder_nr+1)%2}\nM106 P{extruder_nr} S{cool_fan_speed/100}" }, + "machine_extruder_start_code": { "default_value": "G0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000\nM104 S{material_print_temperature}\nG4 S5\nG91\nG0 Z-0.4 F600\nG90\nM107 P{(extruder_nr+1)%2}\nM106 P{extruder_nr} S{cool_fan_speed/100}" }, "machine_nozzle_offset_x": { "default_value": 0 }, "machine_nozzle_offset_y": { "default_value": 0 }, "machine_nozzle_size": { "default_value": 0.4 }, diff --git a/resources/extruders/ultimaker_methodxl_extruder_left.def.json b/resources/extruders/ultimaker_methodxl_extruder_left.def.json index ba4a3f0157..b37cd5e446 100644 --- a/resources/extruders/ultimaker_methodxl_extruder_left.def.json +++ b/resources/extruders/ultimaker_methodxl_extruder_left.def.json @@ -15,7 +15,7 @@ "maximum_value": "1" }, "machine_extruder_end_code": { "default_value": "M106 P{extruder_nr} S1.0\nG91\nG0 Z0.4 F600\nG90\nG0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000" }, - "machine_extruder_start_code": { "default_value": "G0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000\nM109 S{material_initial_print_temperature}\nG4 S5\nG91\nG0 Z-0.4 F600\nG90\nM107 P{(extruder_nr+1)%2}\nM106 P{extruder_nr} S{cool_fan_speed/100}" }, + "machine_extruder_start_code": { "default_value": "G0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000\nM104 S{material_print_temperature}\nG4 S5\nG91\nG0 Z-0.4 F600\nG90\nM107 P{(extruder_nr+1)%2}\nM106 P{extruder_nr} S{cool_fan_speed/100}" }, "machine_nozzle_offset_x": { "default_value": 0 }, "machine_nozzle_offset_y": { "default_value": 0 }, "machine_nozzle_size": { "default_value": 0.4 }, diff --git a/resources/extruders/ultimaker_methodxl_extruder_right.def.json b/resources/extruders/ultimaker_methodxl_extruder_right.def.json index 32fbf1dd08..8a0b0e4635 100644 --- a/resources/extruders/ultimaker_methodxl_extruder_right.def.json +++ b/resources/extruders/ultimaker_methodxl_extruder_right.def.json @@ -15,7 +15,7 @@ "maximum_value": "1" }, "machine_extruder_end_code": { "default_value": "M106 P{extruder_nr} S1.0\nG91\nG0 Z0.4 F600\nG90\nG0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000" }, - "machine_extruder_start_code": { "default_value": "G0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000\nM109 S{material_initial_print_temperature}\nG4 S5\nG91\nG0 Z-0.4 F600\nG90\nM107 P{(extruder_nr+1)%2}\nM106 P{extruder_nr} S{cool_fan_speed/100}" }, + "machine_extruder_start_code": { "default_value": "G0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000\nM104 S{material_print_temperature}\nG4 S5\nG91\nG0 Z-0.4 F600\nG90\nM107 P{(extruder_nr+1)%2}\nM106 P{extruder_nr} S{cool_fan_speed/100}" }, "machine_nozzle_offset_x": { "default_value": 0 }, "machine_nozzle_offset_y": { "default_value": 0 }, "machine_nozzle_size": { "default_value": 0.4 }, From 90472bb6477fb7f1027ecdcba38a33ff1e3e55a6 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Fri, 12 Jan 2024 10:57:24 +0100 Subject: [PATCH 141/182] Use Arcus with published Sentry debug-files Contributes to CURA-11482 --- conandata.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conandata.yml b/conandata.yml index dcf883c630..a3456c44b1 100644 --- a/conandata.yml +++ b/conandata.yml @@ -6,7 +6,7 @@ requirements: - "fdm_materials/(latest)@ultimaker/testing" - "curaengine_plugin_gradual_flow/(latest)@ultimaker/stable" - "dulcificum/latest@ultimaker/testing" - - "pyarcus/5.3.0" + - "arcus/(latest)@ultimaker/cura_11482" - "pysavitar/5.3.0" - "pynest2d/5.3.0" - "curaengine_grpc_definitions/(latest)@ultimaker/testing" From ec1c82535263761ba8c72a6cbd74a32a96ee5797 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Fri, 12 Jan 2024 11:00:18 +0100 Subject: [PATCH 142/182] Don't package pdb Contributes to CURA-11482 --- conanfile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conanfile.py b/conanfile.py index ea1ac2e1f9..7ce196c90d 100644 --- a/conanfile.py +++ b/conanfile.py @@ -242,7 +242,7 @@ class CuraConan(ConanFile): self.output.warning(f"Source path for binary {binary['binary']} does not exist") continue - for bin in Path(src_path).glob(binary["binary"] + "*[.exe|.dll|.so|.dylib|.so.|.pdb]*"): + for bin in Path(src_path).glob(binary["binary"] + "*[.exe|.dll|.so|.dylib|.so.]*"): binaries.append((str(bin), binary["dst"])) for bin in Path(src_path).glob(binary["binary"]): binaries.append((str(bin), binary["dst"])) From 0661fe5dcb0b6b3796fd57e04f07fab5c51cd0f7 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Fri, 12 Jan 2024 11:04:31 +0100 Subject: [PATCH 143/182] Enable Sentry for Arcus Contributes to CURA-11482 --- conanfile.py | 1 + 1 file changed, 1 insertion(+) diff --git a/conanfile.py b/conanfile.py index 7ce196c90d..9eac9218b1 100644 --- a/conanfile.py +++ b/conanfile.py @@ -320,6 +320,7 @@ class CuraConan(ConanFile): self.options["openssl"].shared = True if self.conf.get("user.curaengine:sentry_url", "", check_type=str) != "": self.options["curaengine"].enable_sentry = True + self.options["arcus"].enable_sentry = True def validate(self): version = self.conf.get("user.cura:version", default = self.version, check_type = str) From 34e7ea81850e85f6e3f4a4a22acf016dabd2b28b Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Fri, 12 Jan 2024 14:28:01 +0100 Subject: [PATCH 144/182] Use clipper with Sentry support Contributes to CURA-11482 --- conanfile.py | 1 + 1 file changed, 1 insertion(+) diff --git a/conanfile.py b/conanfile.py index 9eac9218b1..3402e4dc54 100644 --- a/conanfile.py +++ b/conanfile.py @@ -336,6 +336,7 @@ class CuraConan(ConanFile): for req in self.conan_data["requirements_internal"]: self.requires(req) self.requires("cpython/3.10.4@ultimaker/stable") + self.requires("clipper/6.4.2@ultimaker/cura_11482") # TODO: change channel to `testing` once merged self.requires("openssl/3.2.0") self.requires("boost/1.82.0") self.requires("spdlog/1.12.0") From 2bcdacef7239779db21cef3a069e174ff4a4831d Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Sat, 13 Jan 2024 11:12:46 +0100 Subject: [PATCH 145/182] Allow for opt-in of DF User name for Sentry crash reports This will help us with triage of bugs for our customers. Contributes to CURA-11482 --- .../CuraEngineBackend/CuraEngineBackend.py | 10 +++- resources/qml/Preferences/GeneralPage.qml | 47 ++++++++++++++++++- 2 files changed, 54 insertions(+), 3 deletions(-) diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index 818766d766..f67d14aafe 100755 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -164,6 +164,7 @@ class CuraEngineBackend(QObject, Backend): application.getPreferences().addPreference("general/auto_slice", False) application.getPreferences().addPreference("info/send_engine_crash", True) + application.getPreferences().addPreference("info/anonymous_engine_crash_report", True) self._use_timer: bool = False @@ -198,6 +199,7 @@ class CuraEngineBackend(QObject, Backend): # Ensure that the initial value for send_engine_crash is handled correctly. application.callLater(self._onPreferencesChanged, "info/send_engine_crash") + application.callLater(self._onPreferencesChanged, "info/anonymous_engine_crash_report") def startPlugins(self) -> None: """ @@ -1094,14 +1096,18 @@ class CuraEngineBackend(QObject, Backend): self._change_timer.timeout.disconnect(self.slice) def _onPreferencesChanged(self, preference: str) -> None: - if preference != "general/auto_slice" and preference != "info/send_engine_crash": + if preference != "general/auto_slice" and preference != "info/send_engine_crash" and preference != "info/anonymous_engine_crash_report": return if preference == "general/auto_slice": auto_slice = self.determineAutoSlicing() if auto_slice: self._change_timer.start() elif preference == "info/send_engine_crash": - os.environ["use_sentry"] = "1" if CuraApplication.getInstance().getPreferences().getValue("info/send_engine_crash") else "0" + os.environ["USE_SENTRY"] = "1" if CuraApplication.getInstance().getPreferences().getValue("info/send_engine_crash") else "0" + elif preference == "info/anonymous_engine_crash_report": + account = CuraApplication.getInstance().getCuraAPI().account + if account and account.isLoggedIn and not CuraApplication.getInstance().getPreferences().getValue("info/anonymous_engine_crash_report"): + os.environ["CURAENGINE_SENTRY_USER"] = account.userName def tickle(self) -> None: """Tickle the backend so in case of auto slicing, it starts the timer.""" diff --git a/resources/qml/Preferences/GeneralPage.qml b/resources/qml/Preferences/GeneralPage.qml index 587084444c..708cc4a441 100644 --- a/resources/qml/Preferences/GeneralPage.qml +++ b/resources/qml/Preferences/GeneralPage.qml @@ -124,6 +124,9 @@ UM.PreferencesPage UM.Preferences.resetPreference("info/send_engine_crash") sendEngineCrashCheckbox.checked = boolCheck(UM.Preferences.getValue("info/send_engine_crash")) + UM.Preferences.resetPreference("info/anonymous_engine_crash_report") + sendEngineCrashCheckboxAnonymous.checked = boolCheck(UM.Preferences.getValue("info/anonymous_engine_crash_report")) + UM.Preferences.resetPreference("info/automatic_update_check") checkUpdatesCheckbox.checked = boolCheck(UM.Preferences.getValue("info/automatic_update_check")) @@ -859,11 +862,12 @@ UM.PreferencesPage font: UM.Theme.getFont("medium_bold") text: catalog.i18nc("@label", "Privacy") } + UM.TooltipArea { width: childrenRect.width height: visible ? childrenRect.height : 0 - text: catalog.i18nc("@info:tooltip", "Should slicing crashes be automatically reported to Ultimaker? Note, no models, IP addresses or other personally identifiable information is sent or stored.") + text: catalog.i18nc("@info:tooltip", "Should slicing crashes be automatically reported to Ultimaker? Note, no models, IP addresses or other personally identifiable information is sent or stored, unless you give explicit permission.") UM.CheckBox { @@ -874,6 +878,47 @@ UM.PreferencesPage } } + ButtonGroup + { + id: curaCrashGroup + buttons: [sendEngineCrashCheckboxAnonymous, sendEngineCrashCheckboxUser] + } + + UM.TooltipArea + { + width: childrenRect.width + height: visible ? childrenRect.height : 0 + visible: Cura.API.account.isLoggedIn + text: catalog.i18nc("@info:tooltip", "Send crash reports without any personally identifiable information or models data to UltiMaker.") + anchors.left: parent.left + anchors.leftMargin: UM.Theme.getSize("default_margin").width + Cura.RadioButton + { + id: sendEngineCrashCheckboxAnonymous + text: catalog.i18nc("@option:radio", "Anonymous crash reports") + enabled: sendEngineCrashCheckbox.checked + checked: boolCheck(UM.Preferences.getValue("info/anonymous_engine_crash_report")) + onClicked: UM.Preferences.setValue("info/anonymous_engine_crash_report", true) + } + } + UM.TooltipArea + { + width: childrenRect.width + height: visible ? childrenRect.height : 0 + visible: Cura.API.account.isLoggedIn + text: catalog.i18nc("@info:tooltip", "Send crash reports with your registered UltiMaker account email adress to UltiMaker. No model data is being send.") + anchors.left: parent.left + anchors.leftMargin: UM.Theme.getSize("default_margin").width + Cura.RadioButton + { + id: sendEngineCrashCheckboxUser + text: catalog.i18nc("@option:radio", "Crash reports with email adress") + enabled: sendEngineCrashCheckbox.checked + checked: !boolCheck(UM.Preferences.getValue("info/anonymous_engine_crash_report")) && Cura.API.account.isLoggedIn + onClicked: UM.Preferences.setValue("info/anonymous_engine_crash_report", false) + } + } + UM.TooltipArea { width: childrenRect.width From e91322d0707a44e4687848ce793a619d272c328d Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Mon, 15 Jan 2024 08:06:16 +0100 Subject: [PATCH 146/182] ALso enable Sentry for Clipper Contributes to CURA-11482 --- conanfile.py | 1 + 1 file changed, 1 insertion(+) diff --git a/conanfile.py b/conanfile.py index 3402e4dc54..4aa0b07bbf 100644 --- a/conanfile.py +++ b/conanfile.py @@ -321,6 +321,7 @@ class CuraConan(ConanFile): if self.conf.get("user.curaengine:sentry_url", "", check_type=str) != "": self.options["curaengine"].enable_sentry = True self.options["arcus"].enable_sentry = True + self.options["clipper"].enable_sentry = True def validate(self): version = self.conf.get("user.cura:version", default = self.version, check_type = str) From 773805963169eee52b6c4b0abb4d8d789a22f8ba Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Mon, 15 Jan 2024 10:44:43 +0100 Subject: [PATCH 147/182] Add optional (opt-in) project_name to Sentry Needed for automatic Issue handling in the future Contributes to CURA-11482 --- plugins/CuraEngineBackend/Cura.proto | 1 + plugins/CuraEngineBackend/StartSliceJob.py | 5 +++++ resources/qml/Preferences/GeneralPage.qml | 4 ++-- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/plugins/CuraEngineBackend/Cura.proto b/plugins/CuraEngineBackend/Cura.proto index 9593b83528..b03298f695 100644 --- a/plugins/CuraEngineBackend/Cura.proto +++ b/plugins/CuraEngineBackend/Cura.proto @@ -35,6 +35,7 @@ message Slice repeated EnginePlugin engine_plugins = 5; string sentry_id = 6; // The anonymized Sentry user id that requested the slice string cura_version = 7; // The version of Cura that requested the slice + optional string project_name = 8; // The name of the project that requested the slice } message Extruder diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index 935eb81afa..8826d2e1f6 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -340,6 +340,11 @@ class StartSliceJob(Job): self._slice_message.sentry_id = f"{user_id}" self._slice_message.cura_version = CuraVersion + # Add the project name to the message if the user allows for non-anonymous crash data collection. + account = CuraApplication.getInstance().getCuraAPI().account + if account and account.isLoggedIn and not CuraApplication.getInstance().getPreferences().getValue("info/anonymous_engine_crash_report"): + self._slice_message.project_name = CuraApplication.getInstance().getPrintInformation().baseName + # Build messages for extruder stacks for extruder_stack in global_stack.extruderList: self._buildExtruderMessage(extruder_stack) diff --git a/resources/qml/Preferences/GeneralPage.qml b/resources/qml/Preferences/GeneralPage.qml index 708cc4a441..e540fc1b1f 100644 --- a/resources/qml/Preferences/GeneralPage.qml +++ b/resources/qml/Preferences/GeneralPage.qml @@ -906,13 +906,13 @@ UM.PreferencesPage width: childrenRect.width height: visible ? childrenRect.height : 0 visible: Cura.API.account.isLoggedIn - text: catalog.i18nc("@info:tooltip", "Send crash reports with your registered UltiMaker account email adress to UltiMaker. No model data is being send.") + text: catalog.i18nc("@info:tooltip", "Send crash reports with your registered UltiMaker account name and the project name to UltiMaker Sentry. No actual model data is being send.") anchors.left: parent.left anchors.leftMargin: UM.Theme.getSize("default_margin").width Cura.RadioButton { id: sendEngineCrashCheckboxUser - text: catalog.i18nc("@option:radio", "Crash reports with email adress") + text: catalog.i18nc("@option:radio", "Send crash reports with UltiMaker account name") enabled: sendEngineCrashCheckbox.checked checked: !boolCheck(UM.Preferences.getValue("info/anonymous_engine_crash_report")) && Cura.API.account.isLoggedIn onClicked: UM.Preferences.setValue("info/anonymous_engine_crash_report", false) From 783f51aef2a020b7aa18a83d6a85d80909eb3767 Mon Sep 17 00:00:00 2001 From: Paul Kuiper <46715907+pkuiper-ultimaker@users.noreply.github.com> Date: Mon, 15 Jan 2024 11:48:23 +0100 Subject: [PATCH 148/182] Let the wall count of the middle and top raft interface follow the raft wall count PP-414 --- resources/definitions/ultimaker_method_base.def.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/resources/definitions/ultimaker_method_base.def.json b/resources/definitions/ultimaker_method_base.def.json index 4f03a8dbe1..16464f0e67 100644 --- a/resources/definitions/ultimaker_method_base.def.json +++ b/resources/definitions/ultimaker_method_base.def.json @@ -361,8 +361,10 @@ "raft_interface_line_width": { "value": 0.7 }, "raft_interface_speed": { "value": 90 }, "raft_interface_thickness": { "value": 0.3 }, - "raft_margin": { "value": 3 }, + "raft_interface_wall_count": { "value": "raft_wall_count" }, + "raft_margin": { "value": 1.2 }, "raft_surface_extruder_nr": { "value": "int(anyExtruderWithMaterial('material_is_support_material')) if support_enable and extruderValue(support_extruder_nr,'material_is_support_material') else raft_base_extruder_nr" }, + "raft_surface_wall_count": { "value": "raft_wall_count" }, "retraction_amount": { "value": 0.75 }, "retraction_combing": { "value": "'off'" }, "retraction_combing_max_distance": { "value": "speed_travel / 10" }, From fe440a664350441c0d3f9aa8d3a635a16667deac Mon Sep 17 00:00:00 2001 From: "c.lamboo" Date: Mon, 15 Jan 2024 11:52:11 +0100 Subject: [PATCH 149/182] Allow for expressions in start/end machine/extruder code extruder_nr field CURA-11536 --- plugins/CuraEngineBackend/StartSliceJob.py | 49 ++++++++++++---------- 1 file changed, 27 insertions(+), 22 deletions(-) diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index 935eb81afa..fda1542e0a 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023 UltiMaker +# Copyright (c) 2024 UltiMaker # Cura is released under the terms of the LGPLv3 or higher. import uuid @@ -63,13 +63,12 @@ class GcodeStartEndFormatter(Formatter): # will be used. Alternatively, if the expression is formatted as "{[expression], [extruder_nr]}", # then the expression will be evaluated with the extruder stack of the specified extruder_nr. - _extruder_regex = re.compile(r"^\s*(?P.*)\s*,\s*(?P\d+)\s*$") + _extruder_regex = re.compile(r"^\s*(?P.*)\s*,\s*(?P.*)\s*$") - def __init__(self, default_extruder_nr: int = -1, *, - additional_per_extruder_settings: Optional[Dict[str, Dict[str, any]]] = None) -> None: + def __init__(self, all_extruder_settings: Dict[str, Any], default_extruder_nr: int = -1) -> None: super().__init__() + self._all_extruder_settings: Dict[str, Any] = all_extruder_settings self._default_extruder_nr: int = default_extruder_nr - self._additional_per_extruder_settings: Optional[Dict[str, Dict[str, any]]] = additional_per_extruder_settings def get_field(self, field_name, args: [str], kwargs: dict) -> Tuple[str, str]: # get_field method parses all fields in the format-string and parses them individually to the get_value method. @@ -88,22 +87,31 @@ class GcodeStartEndFormatter(Formatter): if expression in post_slice_data_variables: return f"{{{expression}}}" - extruder_nr = self._default_extruder_nr + extruder_nr = str(self._default_extruder_nr) # The settings may specify a specific extruder to use. This is done by - # formatting the expression as "{expression}, {extruder_nr}". If the + # formatting the expression as "{expression}, {extruder_nr_expr}". If the # expression is formatted like this, we extract the extruder_nr and use # it to get the value from the correct extruder stack. match = self._extruder_regex.match(expression) if match: expression = match.group("expression") - extruder_nr = int(match.group("extruder_nr")) + extruder_nr_expr = match.group("extruder_nr_expr") - if self._additional_per_extruder_settings is not None and str( - extruder_nr) in self._additional_per_extruder_settings: - additional_variables = self._additional_per_extruder_settings[str(extruder_nr)] + if extruder_nr_expr.isdigit(): + extruder_nr = extruder_nr_expr + else: + # We get the value of the extruder_nr_expr from `_all_extruder_settings` dictionary + # rather than the global container stack. The `_all_extruder_settings["-1"]` is a + # dict-representation of the global container stack, with additional properties such + # as `initial_extruder_nr`. As users may enter such expressions we can't use the + # global container stack. + extruder_nr = self._all_extruder_settings["-1"].get(extruder_nr_expr, "-1") + + if extruder_nr in self._all_extruder_settings: + additional_variables = self._all_extruder_settings[extruder_nr] else: - additional_variables = dict() + additional_variables = self._all_extruder_settings["-1"] # Add the arguments and keyword arguments to the additional settings. These # are currently _not_ used, but they are added for consistency with the @@ -113,7 +121,7 @@ class GcodeStartEndFormatter(Formatter): for key, value in kwargs.items(): additional_variables[key] = value - if extruder_nr == -1: + if extruder_nr == "-1": container_stack = CuraApplication.getInstance().getGlobalContainerStack() else: container_stack = ExtruderManager.getInstance().getExtruderStack(extruder_nr) @@ -121,7 +129,6 @@ class GcodeStartEndFormatter(Formatter): setting_function = SettingFunction(expression) value = setting_function(container_stack, additional_variables=additional_variables) - return value @@ -131,12 +138,13 @@ class StartSliceJob(Job): def __init__(self, slice_message: Arcus.PythonMessage) -> None: super().__init__() - self._scene = CuraApplication.getInstance().getController().getScene() #type: Scene + self._scene: Scene = CuraApplication.getInstance().getController().getScene() self._slice_message: Arcus.PythonMessage = slice_message - self._is_cancelled = False #type: bool - self._build_plate_number = None #type: Optional[int] + self._is_cancelled: bool = False + self._build_plate_number: Optional[int] = None - self._all_extruders_settings = None #type: Optional[Dict[str, Any]] # cache for all setting values from all stacks (global & extruder) for the current machine + # cache for all setting values from all stacks (global & extruder) for the current machine + self._all_extruders_settings: Optional[Dict[str, Any]] = None def getSliceMessage(self) -> Arcus.PythonMessage: return self._slice_message @@ -471,10 +479,7 @@ class StartSliceJob(Job): # Get "replacement-keys" for the extruders. In the formatter the settings stack is used to get the # replacement values for the setting-keys. However, the values for `material_id`, `material_type`, # etc are not in the settings stack. - additional_per_extruder_settings = self._all_extruders_settings.copy() - additional_per_extruder_settings["default_extruder_nr"] = default_extruder_nr - fmt = GcodeStartEndFormatter(default_extruder_nr=default_extruder_nr, - additional_per_extruder_settings=additional_per_extruder_settings) + fmt = GcodeStartEndFormatter(self._all_extruders_settings, default_extruder_nr=default_extruder_nr) return str(fmt.format(value)) except: Logger.logException("w", "Unable to do token replacement on start/end g-code") From 5da4dfcb705b519ded069245fd0cf5bfbaf0f244 Mon Sep 17 00:00:00 2001 From: "c.lamboo" Date: Mon, 15 Jan 2024 12:03:42 +0100 Subject: [PATCH 150/182] Improve unhappy flow CURA-11536 --- plugins/CuraEngineBackend/StartSliceJob.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index fda1542e0a..04345bf747 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -111,6 +111,7 @@ class GcodeStartEndFormatter(Formatter): if extruder_nr in self._all_extruder_settings: additional_variables = self._all_extruder_settings[extruder_nr] else: + Logger.warning(f"Extruder {extruder_nr} does not exist, using global settings") additional_variables = self._all_extruder_settings["-1"] # Add the arguments and keyword arguments to the additional settings. These @@ -125,6 +126,9 @@ class GcodeStartEndFormatter(Formatter): container_stack = CuraApplication.getInstance().getGlobalContainerStack() else: container_stack = ExtruderManager.getInstance().getExtruderStack(extruder_nr) + if not container_stack: + Logger.warning(f"Extruder {extruder_nr} does not exist, using global settings") + container_stack = CuraApplication.getInstance().getGlobalContainerStack() setting_function = SettingFunction(expression) value = setting_function(container_stack, additional_variables=additional_variables) From 68152e6f3111a17d8d5c17d4e353db01b1a8d65d Mon Sep 17 00:00:00 2001 From: Erwan MATHIEU Date: Mon, 15 Jan 2024 12:04:55 +0100 Subject: [PATCH 151/182] Code readability CURA-11482 --- plugins/CuraEngineBackend/CuraEngineBackend.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index f67d14aafe..a22d6b5306 100755 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -1105,9 +1105,10 @@ class CuraEngineBackend(QObject, Backend): elif preference == "info/send_engine_crash": os.environ["USE_SENTRY"] = "1" if CuraApplication.getInstance().getPreferences().getValue("info/send_engine_crash") else "0" elif preference == "info/anonymous_engine_crash_report": - account = CuraApplication.getInstance().getCuraAPI().account - if account and account.isLoggedIn and not CuraApplication.getInstance().getPreferences().getValue("info/anonymous_engine_crash_report"): - os.environ["CURAENGINE_SENTRY_USER"] = account.userName + if not CuraApplication.getInstance().getPreferences().getValue("info/anonymous_engine_crash_report"): + account = CuraApplication.getInstance().getCuraAPI().account + if account and account.isLoggedIn: + os.environ["CURAENGINE_SENTRY_USER"] = account.userName def tickle(self) -> None: """Tickle the backend so in case of auto slicing, it starts the timer.""" From 9d78c9ed5860de5b94f4a5c301cd9003edd86132 Mon Sep 17 00:00:00 2001 From: "c.lamboo" Date: Mon, 15 Jan 2024 12:39:10 +0100 Subject: [PATCH 152/182] Don't mutate/pollute `_all_extruder_settings` with additional values CURA-11536 --- plugins/CuraEngineBackend/StartSliceJob.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index 04345bf747..5039e9a3de 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -109,10 +109,10 @@ class GcodeStartEndFormatter(Formatter): extruder_nr = self._all_extruder_settings["-1"].get(extruder_nr_expr, "-1") if extruder_nr in self._all_extruder_settings: - additional_variables = self._all_extruder_settings[extruder_nr] + additional_variables = self._all_extruder_settings[extruder_nr].copy() else: Logger.warning(f"Extruder {extruder_nr} does not exist, using global settings") - additional_variables = self._all_extruder_settings["-1"] + additional_variables = self._all_extruder_settings["-1"].copy() # Add the arguments and keyword arguments to the additional settings. These # are currently _not_ used, but they are added for consistency with the From 399a8171783b4686f5522fce18dc4035b96a9966 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Mon, 15 Jan 2024 13:37:54 +0100 Subject: [PATCH 153/182] Use `self-hosted-Windows-X64` as default Contributes to CURA-11544 --- .github/workflows/installers.yml | 2 +- .github/workflows/windows.yml | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/installers.yml b/.github/workflows/installers.yml index 6e531ba833..f1bd4b2d19 100644 --- a/.github/workflows/installers.yml +++ b/.github/workflows/installers.yml @@ -58,7 +58,7 @@ jobs: enterprise: ${{ github.event.inputs.enterprise == 'true' }} staging: ${{ github.event.inputs.staging == 'true' }} architecture: X64 - operating_system: windows-2022 + operating_system: self-hosted-Windows-X64 secrets: inherit linux-installer: diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index 22a81e9b2a..09f972bb1a 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -34,9 +34,10 @@ on: operating_system: description: 'OS' required: true - default: 'windows-2022' + default: 'self-hosted-Windows-X64' type: choice options: + - self-hosted-Windows-X64 - windows-2022 jobs: From 557a95568c9f220ae4a23be44fd61e386698ebc7 Mon Sep 17 00:00:00 2001 From: Erwan MATHIEU Date: Mon, 15 Jan 2024 13:42:24 +0100 Subject: [PATCH 154/182] More explicit crash report configuration CURA-11482 --- resources/qml/Preferences/GeneralPage.qml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/resources/qml/Preferences/GeneralPage.qml b/resources/qml/Preferences/GeneralPage.qml index e540fc1b1f..8871944523 100644 --- a/resources/qml/Preferences/GeneralPage.qml +++ b/resources/qml/Preferences/GeneralPage.qml @@ -872,7 +872,7 @@ UM.PreferencesPage UM.CheckBox { id: sendEngineCrashCheckbox - text: catalog.i18nc("@option:check","Send (anonymous) engine crash reports") + text: catalog.i18nc("@option:check","Send engine crash reports") checked: boolCheck(UM.Preferences.getValue("info/send_engine_crash")) onCheckedChanged: UM.Preferences.setValue("info/send_engine_crash", checked) } @@ -888,7 +888,6 @@ UM.PreferencesPage { width: childrenRect.width height: visible ? childrenRect.height : 0 - visible: Cura.API.account.isLoggedIn text: catalog.i18nc("@info:tooltip", "Send crash reports without any personally identifiable information or models data to UltiMaker.") anchors.left: parent.left anchors.leftMargin: UM.Theme.getSize("default_margin").width @@ -896,7 +895,7 @@ UM.PreferencesPage { id: sendEngineCrashCheckboxAnonymous text: catalog.i18nc("@option:radio", "Anonymous crash reports") - enabled: sendEngineCrashCheckbox.checked + enabled: sendEngineCrashCheckbox.checked && Cura.API.account.isLoggedIn checked: boolCheck(UM.Preferences.getValue("info/anonymous_engine_crash_report")) onClicked: UM.Preferences.setValue("info/anonymous_engine_crash_report", true) } @@ -905,15 +904,16 @@ UM.PreferencesPage { width: childrenRect.width height: visible ? childrenRect.height : 0 - visible: Cura.API.account.isLoggedIn - text: catalog.i18nc("@info:tooltip", "Send crash reports with your registered UltiMaker account name and the project name to UltiMaker Sentry. No actual model data is being send.") + text: Cura.API.account.isLoggedIn ? + catalog.i18nc("@info:tooltip", "Send crash reports with your registered UltiMaker account name and the project name to UltiMaker Sentry. No actual model data is being send.") : + catalog.i18nc("@info:tooltip", "Please sign in to your UltiMaker account to allow sending non-anonymous data.") anchors.left: parent.left anchors.leftMargin: UM.Theme.getSize("default_margin").width Cura.RadioButton { id: sendEngineCrashCheckboxUser - text: catalog.i18nc("@option:radio", "Send crash reports with UltiMaker account name") - enabled: sendEngineCrashCheckbox.checked + text: catalog.i18nc("@option:radio", "Include UltiMaker account name") + enabled: sendEngineCrashCheckbox.checked && Cura.API.account.isLoggedIn checked: !boolCheck(UM.Preferences.getValue("info/anonymous_engine_crash_report")) && Cura.API.account.isLoggedIn onClicked: UM.Preferences.setValue("info/anonymous_engine_crash_report", false) } From ab322ae703024026e80dd4d9857dd95705184a80 Mon Sep 17 00:00:00 2001 From: Erwan MATHIEU Date: Mon, 15 Jan 2024 15:22:25 +0100 Subject: [PATCH 155/182] Always send user name for Sentry if available CURA-11482 --- plugins/CuraEngineBackend/Cura.proto | 1 + plugins/CuraEngineBackend/CuraEngineBackend.py | 6 ------ plugins/CuraEngineBackend/StartSliceJob.py | 1 + 3 files changed, 2 insertions(+), 6 deletions(-) diff --git a/plugins/CuraEngineBackend/Cura.proto b/plugins/CuraEngineBackend/Cura.proto index b03298f695..238829ba64 100644 --- a/plugins/CuraEngineBackend/Cura.proto +++ b/plugins/CuraEngineBackend/Cura.proto @@ -36,6 +36,7 @@ message Slice string sentry_id = 6; // The anonymized Sentry user id that requested the slice string cura_version = 7; // The version of Cura that requested the slice optional string project_name = 8; // The name of the project that requested the slice + optional string user_name = 9; // The Digital Factory account name of the user that requested the slice } message Extruder diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index a22d6b5306..0c4003fadc 100755 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -199,7 +199,6 @@ class CuraEngineBackend(QObject, Backend): # Ensure that the initial value for send_engine_crash is handled correctly. application.callLater(self._onPreferencesChanged, "info/send_engine_crash") - application.callLater(self._onPreferencesChanged, "info/anonymous_engine_crash_report") def startPlugins(self) -> None: """ @@ -1104,11 +1103,6 @@ class CuraEngineBackend(QObject, Backend): self._change_timer.start() elif preference == "info/send_engine_crash": os.environ["USE_SENTRY"] = "1" if CuraApplication.getInstance().getPreferences().getValue("info/send_engine_crash") else "0" - elif preference == "info/anonymous_engine_crash_report": - if not CuraApplication.getInstance().getPreferences().getValue("info/anonymous_engine_crash_report"): - account = CuraApplication.getInstance().getCuraAPI().account - if account and account.isLoggedIn: - os.environ["CURAENGINE_SENTRY_USER"] = account.userName def tickle(self) -> None: """Tickle the backend so in case of auto slicing, it starts the timer.""" diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index 8826d2e1f6..633352d616 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -344,6 +344,7 @@ class StartSliceJob(Job): account = CuraApplication.getInstance().getCuraAPI().account if account and account.isLoggedIn and not CuraApplication.getInstance().getPreferences().getValue("info/anonymous_engine_crash_report"): self._slice_message.project_name = CuraApplication.getInstance().getPrintInformation().baseName + self._slice_message.user_name = account.userName # Build messages for extruder stacks for extruder_stack in global_stack.extruderList: From c1e7bc15285ef7feb2c31bc38dc5f3b8c39471e1 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Mon, 15 Jan 2024 17:12:30 +0100 Subject: [PATCH 156/182] Use updated CPython recipe Contributes to CURA-11544 --- conanfile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conanfile.py b/conanfile.py index ea1ac2e1f9..f9e452cb9d 100644 --- a/conanfile.py +++ b/conanfile.py @@ -334,7 +334,7 @@ class CuraConan(ConanFile): if self._internal: for req in self.conan_data["requirements_internal"]: self.requires(req) - self.requires("cpython/3.10.4@ultimaker/stable") + self.requires("cpython/3.10.4@ultimaker/cura_11544") # FIXME: once merged to main self.requires("openssl/3.2.0") self.requires("boost/1.82.0") self.requires("spdlog/1.12.0") From 1a57f121729a153902c0485d66a400298851fbeb Mon Sep 17 00:00:00 2001 From: HellAholic Date: Tue, 16 Jan 2024 10:01:26 +0100 Subject: [PATCH 157/182] change label to name to align with items in global_container_stack check --- cura/Machines/Models/ExtrudersModel.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/Machines/Models/ExtrudersModel.py b/cura/Machines/Models/ExtrudersModel.py index 2677894bff..f31f7c8717 100644 --- a/cura/Machines/Models/ExtrudersModel.py +++ b/cura/Machines/Models/ExtrudersModel.py @@ -227,7 +227,7 @@ class ExtrudersModel(ListModel): "material_brand": "", "color_name": "", "material_type": "", - "material_label": "" + "material_name": "" } items.append(item) if self._items != items: From 54df08f47fa30a4462317ca40d8328a5649491af Mon Sep 17 00:00:00 2001 From: Erwan MATHIEU Date: Tue, 16 Jan 2024 13:14:49 +0100 Subject: [PATCH 158/182] Fix specific extruder not being used CURA-11536 --- plugins/CuraEngineBackend/StartSliceJob.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index 5039e9a3de..6ede9fa219 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -106,7 +106,7 @@ class GcodeStartEndFormatter(Formatter): # dict-representation of the global container stack, with additional properties such # as `initial_extruder_nr`. As users may enter such expressions we can't use the # global container stack. - extruder_nr = self._all_extruder_settings["-1"].get(extruder_nr_expr, "-1") + extruder_nr = str(self._all_extruder_settings["-1"].get(extruder_nr_expr, "-1")) if extruder_nr in self._all_extruder_settings: additional_variables = self._all_extruder_settings[extruder_nr].copy() From 1514d755b0c9ccf474c374080557d81c81d3ef0d Mon Sep 17 00:00:00 2001 From: Erwan MATHIEU Date: Wed, 17 Jan 2024 11:03:32 +0100 Subject: [PATCH 159/182] Set proper dependancies versions --- conandata.yml | 3 +-- conanfile.py | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/conandata.yml b/conandata.yml index a3456c44b1..9b0e2e337b 100644 --- a/conandata.yml +++ b/conandata.yml @@ -1,12 +1,11 @@ version: "5.7.0-alpha.0" requirements: - "uranium/(latest)@ultimaker/testing" - - "curaengine/(latest)@ultimaker/cura_11482" + - "curaengine/(latest)@ultimaker/testing" - "cura_binary_data/(latest)@ultimaker/testing" - "fdm_materials/(latest)@ultimaker/testing" - "curaengine_plugin_gradual_flow/(latest)@ultimaker/stable" - "dulcificum/latest@ultimaker/testing" - - "arcus/(latest)@ultimaker/cura_11482" - "pysavitar/5.3.0" - "pynest2d/5.3.0" - "curaengine_grpc_definitions/(latest)@ultimaker/testing" diff --git a/conanfile.py b/conanfile.py index 4aa0b07bbf..ca8427ad70 100644 --- a/conanfile.py +++ b/conanfile.py @@ -337,7 +337,7 @@ class CuraConan(ConanFile): for req in self.conan_data["requirements_internal"]: self.requires(req) self.requires("cpython/3.10.4@ultimaker/stable") - self.requires("clipper/6.4.2@ultimaker/cura_11482") # TODO: change channel to `testing` once merged + self.requires("clipper/6.4.2@ultimaker/stable") self.requires("openssl/3.2.0") self.requires("boost/1.82.0") self.requires("spdlog/1.12.0") From e6235063aa866a863f176dc8baaf6a3ea1d21169 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Wed, 17 Jan 2024 12:05:42 +0100 Subject: [PATCH 160/182] Revert "Use updated CPython recipe" This reverts commit c1e7bc15285ef7feb2c31bc38dc5f3b8c39471e1. --- conanfile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conanfile.py b/conanfile.py index f9e452cb9d..ea1ac2e1f9 100644 --- a/conanfile.py +++ b/conanfile.py @@ -334,7 +334,7 @@ class CuraConan(ConanFile): if self._internal: for req in self.conan_data["requirements_internal"]: self.requires(req) - self.requires("cpython/3.10.4@ultimaker/cura_11544") # FIXME: once merged to main + self.requires("cpython/3.10.4@ultimaker/stable") self.requires("openssl/3.2.0") self.requires("boost/1.82.0") self.requires("spdlog/1.12.0") From 668a527d335e6ef2c1cdd895c2f7b2c7d15bd4fa Mon Sep 17 00:00:00 2001 From: Paul Kuiper <46715907+pkuiper-ultimaker@users.noreply.github.com> Date: Wed, 17 Jan 2024 13:24:34 +0100 Subject: [PATCH 161/182] Reduce initial layer speed to improve reliability for S3 and S5 machines when no glue is used. PP-421 --- .../quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.15mm.inst.cfg | 2 +- .../quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.2mm.inst.cfg | 2 +- .../quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.3mm.inst.cfg | 2 +- .../quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.15mm.inst.cfg | 2 +- .../quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.2mm.inst.cfg | 2 +- .../quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.3mm.inst.cfg | 2 +- .../quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.15mm.inst.cfg | 2 +- .../quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.2mm.inst.cfg | 2 +- .../quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.3mm.inst.cfg | 2 +- .../ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.15mm.inst.cfg | 2 +- .../ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.2mm.inst.cfg | 2 +- .../ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.3mm.inst.cfg | 2 +- .../quality/ultimaker_s3/um_s3_aa0.8_um-abs_0.2mm.inst.cfg | 2 +- .../quality/ultimaker_s3/um_s3_aa0.8_um-abs_0.3mm.inst.cfg | 2 +- .../quality/ultimaker_s3/um_s3_aa0.8_um-abs_0.4mm.inst.cfg | 2 +- .../quality/ultimaker_s3/um_s3_aa0.8_um-petg_0.2mm.inst.cfg | 2 +- .../quality/ultimaker_s3/um_s3_aa0.8_um-petg_0.3mm.inst.cfg | 2 +- .../quality/ultimaker_s3/um_s3_aa0.8_um-petg_0.4mm.inst.cfg | 2 +- .../quality/ultimaker_s3/um_s3_aa0.8_um-pla_0.2mm.inst.cfg | 2 +- .../quality/ultimaker_s3/um_s3_aa0.8_um-pla_0.3mm.inst.cfg | 2 +- .../quality/ultimaker_s3/um_s3_aa0.8_um-pla_0.4mm.inst.cfg | 2 +- .../ultimaker_s3/um_s3_aa0.8_um-tough-pla_0.2mm.inst.cfg | 2 +- .../ultimaker_s3/um_s3_aa0.8_um-tough-pla_0.3mm.inst.cfg | 2 +- .../ultimaker_s3/um_s3_aa0.8_um-tough-pla_0.4mm.inst.cfg | 2 +- .../quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.15mm.inst.cfg | 2 +- .../quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.2mm.inst.cfg | 2 +- .../quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.3mm.inst.cfg | 2 +- .../quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.15mm.inst.cfg | 2 +- .../quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.2mm.inst.cfg | 2 +- .../quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.3mm.inst.cfg | 2 +- .../quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.15mm.inst.cfg | 2 +- .../quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.2mm.inst.cfg | 2 +- .../quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.3mm.inst.cfg | 2 +- .../ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.15mm.inst.cfg | 2 +- .../ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.2mm.inst.cfg | 2 +- .../ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.3mm.inst.cfg | 2 +- .../quality/ultimaker_s5/um_s5_aa0.8_um-abs_0.2mm.inst.cfg | 2 +- .../quality/ultimaker_s5/um_s5_aa0.8_um-abs_0.3mm.inst.cfg | 2 +- .../quality/ultimaker_s5/um_s5_aa0.8_um-abs_0.4mm.inst.cfg | 2 +- .../quality/ultimaker_s5/um_s5_aa0.8_um-petg_0.2mm.inst.cfg | 2 +- .../quality/ultimaker_s5/um_s5_aa0.8_um-petg_0.3mm.inst.cfg | 2 +- .../quality/ultimaker_s5/um_s5_aa0.8_um-petg_0.4mm.inst.cfg | 2 +- .../quality/ultimaker_s5/um_s5_aa0.8_um-pla_0.2mm.inst.cfg | 2 +- .../quality/ultimaker_s5/um_s5_aa0.8_um-pla_0.3mm.inst.cfg | 2 +- .../quality/ultimaker_s5/um_s5_aa0.8_um-pla_0.4mm.inst.cfg | 2 +- .../ultimaker_s5/um_s5_aa0.8_um-tough-pla_0.2mm.inst.cfg | 2 +- .../ultimaker_s5/um_s5_aa0.8_um-tough-pla_0.3mm.inst.cfg | 2 +- .../ultimaker_s5/um_s5_aa0.8_um-tough-pla_0.4mm.inst.cfg | 2 +- 48 files changed, 48 insertions(+), 48 deletions(-) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.15mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.15mm.inst.cfg index cd8e392dfa..ee0525c13e 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.15mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.15mm.inst.cfg @@ -52,7 +52,7 @@ small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print speed_ironing = 20 -speed_layer_0 = =speed_roofing +speed_layer_0 = 30 speed_prime_tower = =speed_wall_0 speed_print = 100 speed_roofing = =math.ceil(speed_wall*(45/100)) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.2mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.2mm.inst.cfg index 29f3cb056f..57413c4b30 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.2mm.inst.cfg @@ -53,7 +53,7 @@ small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print speed_ironing = 20 -speed_layer_0 = =speed_roofing +speed_layer_0 = 30 speed_prime_tower = =speed_wall_0 speed_print = 100 speed_roofing = =math.ceil(speed_wall*(45/100)) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.3mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.3mm.inst.cfg index 94535ab9c1..0052ce90cd 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.3mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.3mm.inst.cfg @@ -53,7 +53,7 @@ small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print speed_ironing = 20 -speed_layer_0 = =speed_roofing +speed_layer_0 = 30 speed_prime_tower = =speed_wall_0 speed_print = 100 speed_roofing = =math.ceil(speed_wall*(45/100)) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.15mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.15mm.inst.cfg index 4c2861436a..8732c3ad63 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.15mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.15mm.inst.cfg @@ -51,7 +51,7 @@ small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print speed_ironing = 20 -speed_layer_0 = =speed_roofing +speed_layer_0 = 30 speed_prime_tower = =speed_wall_0 speed_print = 100 speed_roofing = =math.ceil(speed_wall*(45/100)) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.2mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.2mm.inst.cfg index 7e29e3a9d0..e7e50350c0 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.2mm.inst.cfg @@ -52,7 +52,7 @@ small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print speed_ironing = 20 -speed_layer_0 = =speed_roofing +speed_layer_0 = 30 speed_prime_tower = =speed_wall_0 speed_print = 100 speed_roofing = =math.ceil(speed_wall*(45/100)) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.3mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.3mm.inst.cfg index 2a74986a2a..5ecaa739db 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.3mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.3mm.inst.cfg @@ -52,7 +52,7 @@ small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print speed_ironing = 20 -speed_layer_0 = =speed_roofing +speed_layer_0 = 30 speed_prime_tower = =speed_wall_0 speed_print = 100 speed_roofing = =math.ceil(speed_wall*(45/100)) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.15mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.15mm.inst.cfg index 0f3fee265b..136a3bed42 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.15mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.15mm.inst.cfg @@ -52,7 +52,7 @@ small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print speed_ironing = 20 -speed_layer_0 = =speed_roofing +speed_layer_0 = 30 speed_prime_tower = =speed_wall_0 speed_print = 100 speed_roofing = =math.ceil(speed_wall*(45/100)) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.2mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.2mm.inst.cfg index 100f2485ba..dcbb580edb 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.2mm.inst.cfg @@ -53,7 +53,7 @@ small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print speed_ironing = 20 -speed_layer_0 = =speed_roofing +speed_layer_0 = 30 speed_prime_tower = =speed_wall_0 speed_print = 100 speed_roofing = =math.ceil(speed_wall*(45/100)) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.3mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.3mm.inst.cfg index d06fa7c63b..fc2a185be4 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.3mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.3mm.inst.cfg @@ -53,7 +53,7 @@ small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print speed_ironing = 20 -speed_layer_0 = =speed_roofing +speed_layer_0 = 30 speed_prime_tower = =speed_wall_0 speed_print = 100 speed_roofing = =math.ceil(speed_wall*(45/100)) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.15mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.15mm.inst.cfg index d0a2747ea4..2aa24f805d 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.15mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.15mm.inst.cfg @@ -52,7 +52,7 @@ small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print speed_ironing = 20 -speed_layer_0 = =speed_roofing +speed_layer_0 = 26 speed_prime_tower = =speed_wall_0 speed_print = 100 speed_roofing = =math.ceil(speed_wall*(45/100)) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.2mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.2mm.inst.cfg index ea4761463c..151af3ed50 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.2mm.inst.cfg @@ -52,7 +52,7 @@ small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print speed_ironing = 20 -speed_layer_0 = =speed_roofing +speed_layer_0 = 26 speed_prime_tower = =speed_wall_0 speed_print = 100 speed_roofing = =math.ceil(speed_wall*(45/100)) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.3mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.3mm.inst.cfg index 4ba2b956e9..56c097d890 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.3mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.3mm.inst.cfg @@ -53,7 +53,7 @@ small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print speed_ironing = 20 -speed_layer_0 = =speed_roofing +speed_layer_0 = 26 speed_prime_tower = =speed_wall_0 speed_print = 100 speed_roofing = =math.ceil(speed_wall*(45/100)) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-abs_0.2mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-abs_0.2mm.inst.cfg index 2051530eee..9d7b4455d6 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-abs_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-abs_0.2mm.inst.cfg @@ -56,7 +56,7 @@ small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print speed_ironing = 20 -speed_layer_0 = =speed_roofing +speed_layer_0 = 30 speed_prime_tower = =speed_wall_0 speed_print = 100 speed_roofing = =math.ceil(speed_wall*(45/100)) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-abs_0.3mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-abs_0.3mm.inst.cfg index 897b0e8688..e2a5c54c66 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-abs_0.3mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-abs_0.3mm.inst.cfg @@ -53,7 +53,7 @@ small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print speed_ironing = 20 -speed_layer_0 = =speed_roofing +speed_layer_0 = 30 speed_prime_tower = =speed_wall_0 speed_print = 75 speed_roofing = =math.ceil(speed_wall*(45/100)) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-abs_0.4mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-abs_0.4mm.inst.cfg index 12e37a25d9..26d3dc7fb8 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-abs_0.4mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-abs_0.4mm.inst.cfg @@ -53,7 +53,7 @@ small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print speed_ironing = 20 -speed_layer_0 = =speed_roofing +speed_layer_0 = 30 speed_prime_tower = =speed_wall_0 speed_print = 50 speed_roofing = =math.ceil(speed_wall*(45/100)) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-petg_0.2mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-petg_0.2mm.inst.cfg index e62880cf41..b1dae1cb7a 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-petg_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-petg_0.2mm.inst.cfg @@ -55,7 +55,7 @@ small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print speed_ironing = 20 -speed_layer_0 = =speed_roofing +speed_layer_0 = 30 speed_prime_tower = =speed_wall_0 speed_print = 100 speed_roofing = =math.ceil(speed_wall*(45/100)) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-petg_0.3mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-petg_0.3mm.inst.cfg index 0c35b29fe0..4d4ffa0059 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-petg_0.3mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-petg_0.3mm.inst.cfg @@ -54,7 +54,7 @@ small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print speed_ironing = 20 -speed_layer_0 = =speed_roofing +speed_layer_0 = 30 speed_prime_tower = =speed_wall_0 speed_print = 75 speed_roofing = =math.ceil(speed_wall*(45/100)) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-petg_0.4mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-petg_0.4mm.inst.cfg index 1c8ba2c88b..5cc6a43e13 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-petg_0.4mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-petg_0.4mm.inst.cfg @@ -54,7 +54,7 @@ small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print speed_ironing = 20 -speed_layer_0 = =speed_roofing +speed_layer_0 = 30 speed_prime_tower = =speed_wall_0 speed_print = 50 speed_roofing = =math.ceil(speed_wall*(45/100)) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-pla_0.2mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-pla_0.2mm.inst.cfg index f51cd7df60..59f8409483 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-pla_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-pla_0.2mm.inst.cfg @@ -56,7 +56,7 @@ small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print speed_ironing = 20 -speed_layer_0 = =speed_roofing +speed_layer_0 = 30 speed_prime_tower = =speed_wall_0 speed_print = 100 speed_roofing = =math.ceil(speed_wall*(45/100)) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-pla_0.3mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-pla_0.3mm.inst.cfg index 347f3bd093..a4cdd898f1 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-pla_0.3mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-pla_0.3mm.inst.cfg @@ -53,7 +53,7 @@ small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print speed_ironing = 20 -speed_layer_0 = =speed_roofing +speed_layer_0 = 30 speed_prime_tower = =speed_wall_0 speed_print = 65 speed_roofing = =math.ceil(speed_wall*(45/100)) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-pla_0.4mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-pla_0.4mm.inst.cfg index 6aaf0461e2..79dc105f86 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-pla_0.4mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-pla_0.4mm.inst.cfg @@ -53,7 +53,7 @@ small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print speed_ironing = 20 -speed_layer_0 = =speed_roofing +speed_layer_0 = 30 speed_prime_tower = =speed_wall_0 speed_print = 45 speed_roofing = =math.ceil(speed_wall*(45/100)) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-tough-pla_0.2mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-tough-pla_0.2mm.inst.cfg index 4064af789f..a76864a1a3 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-tough-pla_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-tough-pla_0.2mm.inst.cfg @@ -56,7 +56,7 @@ small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print speed_ironing = 20 -speed_layer_0 = =speed_roofing +speed_layer_0 = 26 speed_prime_tower = =speed_wall_0 speed_print = 100 speed_roofing = =math.ceil(speed_wall*(45/100)) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-tough-pla_0.3mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-tough-pla_0.3mm.inst.cfg index d509a82bb6..d364232726 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-tough-pla_0.3mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-tough-pla_0.3mm.inst.cfg @@ -53,7 +53,7 @@ small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print speed_ironing = 20 -speed_layer_0 = =speed_roofing +speed_layer_0 = 26 speed_prime_tower = =speed_wall_0 speed_print = 65 speed_roofing = =math.ceil(speed_wall*(45/100)) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-tough-pla_0.4mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-tough-pla_0.4mm.inst.cfg index a6ac3f3895..02a71fa9b7 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-tough-pla_0.4mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-tough-pla_0.4mm.inst.cfg @@ -53,7 +53,7 @@ small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print speed_ironing = 20 -speed_layer_0 = =speed_roofing +speed_layer_0 = 26 speed_prime_tower = =speed_wall_0 speed_print = 45 speed_roofing = =math.ceil(speed_wall*(45/100)) diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.15mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.15mm.inst.cfg index 1085472560..9c7ceca13b 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.15mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.15mm.inst.cfg @@ -52,7 +52,7 @@ small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print speed_ironing = 20 -speed_layer_0 = =speed_roofing +speed_layer_0 = 30 speed_prime_tower = =speed_wall_0 speed_print = 100 speed_roofing = =math.ceil(speed_wall*(45/100)) diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.2mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.2mm.inst.cfg index 22ef09c921..f430e6bc16 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.2mm.inst.cfg @@ -53,7 +53,7 @@ small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print speed_ironing = 20 -speed_layer_0 = =speed_roofing +speed_layer_0 = 30 speed_prime_tower = =speed_wall_0 speed_print = 100 speed_roofing = =math.ceil(speed_wall*(45/100)) diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.3mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.3mm.inst.cfg index 9067d8fb33..98ca8927b6 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.3mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.3mm.inst.cfg @@ -53,7 +53,7 @@ small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print speed_ironing = 20 -speed_layer_0 = =speed_roofing +speed_layer_0 = 30 speed_prime_tower = =speed_wall_0 speed_print = 100 speed_roofing = =math.ceil(speed_wall*(45/100)) diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.15mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.15mm.inst.cfg index 8a64a81ab1..201c663d5c 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.15mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.15mm.inst.cfg @@ -51,7 +51,7 @@ small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print speed_ironing = 20 -speed_layer_0 = =speed_roofing +speed_layer_0 = 30 speed_prime_tower = =speed_wall_0 speed_print = 100 speed_roofing = =math.ceil(speed_wall*(45/100)) diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.2mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.2mm.inst.cfg index 70ee9b0309..55696eccb4 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.2mm.inst.cfg @@ -52,7 +52,7 @@ small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print speed_ironing = 20 -speed_layer_0 = =speed_roofing +speed_layer_0 = 30 speed_prime_tower = =speed_wall_0 speed_print = 100 speed_roofing = =math.ceil(speed_wall*(45/100)) diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.3mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.3mm.inst.cfg index 65c8343d85..fe3eeb67ad 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.3mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.3mm.inst.cfg @@ -52,7 +52,7 @@ small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print speed_ironing = 20 -speed_layer_0 = =speed_roofing +speed_layer_0 = 30 speed_prime_tower = =speed_wall_0 speed_print = 100 speed_roofing = =math.ceil(speed_wall*(45/100)) diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.15mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.15mm.inst.cfg index ac6cce0b10..713f94219f 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.15mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.15mm.inst.cfg @@ -52,7 +52,7 @@ small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print speed_ironing = 20 -speed_layer_0 = =speed_roofing +speed_layer_0 = 30 speed_prime_tower = =speed_wall_0 speed_print = 100 speed_roofing = =math.ceil(speed_wall*(45/100)) diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.2mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.2mm.inst.cfg index dbea8c6436..02d22b06b8 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.2mm.inst.cfg @@ -53,7 +53,7 @@ small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print speed_ironing = 20 -speed_layer_0 = =speed_roofing +speed_layer_0 = 30 speed_prime_tower = =speed_wall_0 speed_print = 100 speed_roofing = =math.ceil(speed_wall*(45/100)) diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.3mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.3mm.inst.cfg index dcb2e0c516..b0d5d41d0f 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.3mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.3mm.inst.cfg @@ -53,7 +53,7 @@ small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print speed_ironing = 20 -speed_layer_0 = =speed_roofing +speed_layer_0 = 30 speed_prime_tower = =speed_wall_0 speed_print = 100 speed_roofing = =math.ceil(speed_wall*(45/100)) diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.15mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.15mm.inst.cfg index 59044a7f04..55e724da9d 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.15mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.15mm.inst.cfg @@ -52,7 +52,7 @@ small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print speed_ironing = 20 -speed_layer_0 = =speed_roofing +speed_layer_0 = 26 speed_prime_tower = =speed_wall_0 speed_print = 100 speed_roofing = =math.ceil(speed_wall*(45/100)) diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.2mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.2mm.inst.cfg index 74e6d5d972..ee0ee279e6 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.2mm.inst.cfg @@ -52,7 +52,7 @@ small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print speed_ironing = 20 -speed_layer_0 = =speed_roofing +speed_layer_0 = 26 speed_prime_tower = =speed_wall_0 speed_print = 100 speed_roofing = =math.ceil(speed_wall*(45/100)) diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.3mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.3mm.inst.cfg index a9cb1c6865..875bd5a669 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.3mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.3mm.inst.cfg @@ -53,7 +53,7 @@ small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print speed_ironing = 20 -speed_layer_0 = =speed_roofing +speed_layer_0 = 26 speed_prime_tower = =speed_wall_0 speed_print = 100 speed_roofing = =math.ceil(speed_wall*(45/100)) diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-abs_0.2mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-abs_0.2mm.inst.cfg index c6e3042130..9ba4a38c6e 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-abs_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-abs_0.2mm.inst.cfg @@ -56,7 +56,7 @@ small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print speed_ironing = 20 -speed_layer_0 = =speed_roofing +speed_layer_0 = 30 speed_prime_tower = =speed_wall_0 speed_print = 100 speed_roofing = =math.ceil(speed_wall*(45/100)) diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-abs_0.3mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-abs_0.3mm.inst.cfg index 764a0cb9ac..4ab74980ef 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-abs_0.3mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-abs_0.3mm.inst.cfg @@ -53,7 +53,7 @@ small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print speed_ironing = 20 -speed_layer_0 = =speed_roofing +speed_layer_0 = 30 speed_prime_tower = =speed_wall_0 speed_print = 75 speed_roofing = =math.ceil(speed_wall*(45/100)) diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-abs_0.4mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-abs_0.4mm.inst.cfg index 1f02428548..269d51dd4b 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-abs_0.4mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-abs_0.4mm.inst.cfg @@ -53,7 +53,7 @@ small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print speed_ironing = 20 -speed_layer_0 = =speed_roofing +speed_layer_0 = 30 speed_prime_tower = =speed_wall_0 speed_print = 50 speed_roofing = =math.ceil(speed_wall*(45/100)) diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-petg_0.2mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-petg_0.2mm.inst.cfg index a144394b5a..4f56167ffd 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-petg_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-petg_0.2mm.inst.cfg @@ -55,7 +55,7 @@ small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print speed_ironing = 20 -speed_layer_0 = =speed_roofing +speed_layer_0 = 30 speed_prime_tower = =speed_wall_0 speed_print = 100 speed_roofing = =math.ceil(speed_wall*(45/100)) diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-petg_0.3mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-petg_0.3mm.inst.cfg index 8af2e7c1bb..9fdf9a665b 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-petg_0.3mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-petg_0.3mm.inst.cfg @@ -54,7 +54,7 @@ small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print speed_ironing = 20 -speed_layer_0 = =speed_roofing +speed_layer_0 = 30 speed_prime_tower = =speed_wall_0 speed_print = 75 speed_roofing = =math.ceil(speed_wall*(45/100)) diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-petg_0.4mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-petg_0.4mm.inst.cfg index bd74c294e1..3368ae6e2d 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-petg_0.4mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-petg_0.4mm.inst.cfg @@ -54,7 +54,7 @@ small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print speed_ironing = 20 -speed_layer_0 = =speed_roofing +speed_layer_0 = 30 speed_prime_tower = =speed_wall_0 speed_print = 50 speed_roofing = =math.ceil(speed_wall*(45/100)) diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-pla_0.2mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-pla_0.2mm.inst.cfg index 32cc67a02b..ca93df9dc1 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-pla_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-pla_0.2mm.inst.cfg @@ -56,7 +56,7 @@ small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print speed_ironing = 20 -speed_layer_0 = =speed_roofing +speed_layer_0 = 30 speed_prime_tower = =speed_wall_0 speed_print = 100 speed_roofing = =math.ceil(speed_wall*(45/100)) diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-pla_0.3mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-pla_0.3mm.inst.cfg index 79df2f65f0..4461ae0772 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-pla_0.3mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-pla_0.3mm.inst.cfg @@ -53,7 +53,7 @@ small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print speed_ironing = 20 -speed_layer_0 = =speed_roofing +speed_layer_0 = 30 speed_prime_tower = =speed_wall_0 speed_print = 65 speed_roofing = =math.ceil(speed_wall*(45/100)) diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-pla_0.4mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-pla_0.4mm.inst.cfg index acfbcb1f1e..1acdad53a0 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-pla_0.4mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-pla_0.4mm.inst.cfg @@ -53,7 +53,7 @@ small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print speed_ironing = 20 -speed_layer_0 = =speed_roofing +speed_layer_0 = 30 speed_prime_tower = =speed_wall_0 speed_print = 45 speed_roofing = =math.ceil(speed_wall*(45/100)) diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-tough-pla_0.2mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-tough-pla_0.2mm.inst.cfg index 0ea97ff531..4973ec35bb 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-tough-pla_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-tough-pla_0.2mm.inst.cfg @@ -56,7 +56,7 @@ small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print speed_ironing = 20 -speed_layer_0 = =speed_roofing +speed_layer_0 = 26 speed_prime_tower = =speed_wall_0 speed_print = 100 speed_roofing = =math.ceil(speed_wall*(45/100)) diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-tough-pla_0.3mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-tough-pla_0.3mm.inst.cfg index 0f21a87568..2bcf3fa82d 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-tough-pla_0.3mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-tough-pla_0.3mm.inst.cfg @@ -53,7 +53,7 @@ small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print speed_ironing = 20 -speed_layer_0 = =speed_roofing +speed_layer_0 = 26 speed_prime_tower = =speed_wall_0 speed_print = 65 speed_roofing = =math.ceil(speed_wall*(45/100)) diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-tough-pla_0.4mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-tough-pla_0.4mm.inst.cfg index 70234b8524..3e4693c115 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-tough-pla_0.4mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-tough-pla_0.4mm.inst.cfg @@ -53,7 +53,7 @@ small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print speed_ironing = 20 -speed_layer_0 = =speed_roofing +speed_layer_0 = 26 speed_prime_tower = =speed_wall_0 speed_print = 45 speed_roofing = =math.ceil(speed_wall*(45/100)) From ff478559b0f169a0606fbb2e34429dc929130dcb Mon Sep 17 00:00:00 2001 From: Erwan MATHIEU Date: Wed, 17 Jan 2024 19:50:46 +0100 Subject: [PATCH 162/182] Change bool setting to more flexible callback function --- cura/OAuth2/AuthorizationService.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/cura/OAuth2/AuthorizationService.py b/cura/OAuth2/AuthorizationService.py index 06478e911b..29c426e46f 100644 --- a/cura/OAuth2/AuthorizationService.py +++ b/cura/OAuth2/AuthorizationService.py @@ -34,7 +34,7 @@ class AuthorizationService: def __init__(self, settings: "OAuth2Settings", preferences: Optional["Preferences"] = None, - get_user_profile: bool = True) -> None: + callback_auth_data_retrieved: Callable[[], None] = None) -> None: # Emit signal when authentication is completed. self.onAuthStateChanged = Signal() @@ -48,7 +48,7 @@ class AuthorizationService: self._auth_url = "{}/authorize".format(self._settings.OAUTH_SERVER_URL) self._auth_data: Optional[AuthenticationResponse] = None self._user_profile: Optional["UserProfile"] = None - self._get_user_profile: bool = get_user_profile + self._callback_auth_data_retrieved = self.getUserProfile if callback_auth_data_retrieved is None else callback_auth_data_retrieved self._preferences = preferences self._server = LocalAuthorizationServer(self._auth_helpers, self._onAuthStateChanged, daemon=True) self._currently_refreshing_token = False # Whether we are currently in the process of refreshing auth. Don't make new requests while busy. @@ -298,8 +298,7 @@ class AuthorizationService: self._auth_data = auth_data self._currently_refreshing_token = False if auth_data: - if self._get_user_profile: - self.getUserProfile() + self._callback_auth_data_retrieved() self._preferences.setValue(self._settings.AUTH_DATA_PREFERENCE_KEY, json.dumps(auth_data.dump())) else: Logger.log("d", "Clearing the user profile") From 5bcc37d7d72dfbd592f8aaf8dba8b74ec0533ed7 Mon Sep 17 00:00:00 2001 From: Remco Burema Date: Thu, 18 Jan 2024 10:44:15 +0100 Subject: [PATCH 163/182] Revert "Change bool setting to more flexible callback function" This reverts commit ff478559b0f169a0606fbb2e34429dc929130dcb. --- cura/OAuth2/AuthorizationService.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/cura/OAuth2/AuthorizationService.py b/cura/OAuth2/AuthorizationService.py index 29c426e46f..06478e911b 100644 --- a/cura/OAuth2/AuthorizationService.py +++ b/cura/OAuth2/AuthorizationService.py @@ -34,7 +34,7 @@ class AuthorizationService: def __init__(self, settings: "OAuth2Settings", preferences: Optional["Preferences"] = None, - callback_auth_data_retrieved: Callable[[], None] = None) -> None: + get_user_profile: bool = True) -> None: # Emit signal when authentication is completed. self.onAuthStateChanged = Signal() @@ -48,7 +48,7 @@ class AuthorizationService: self._auth_url = "{}/authorize".format(self._settings.OAUTH_SERVER_URL) self._auth_data: Optional[AuthenticationResponse] = None self._user_profile: Optional["UserProfile"] = None - self._callback_auth_data_retrieved = self.getUserProfile if callback_auth_data_retrieved is None else callback_auth_data_retrieved + self._get_user_profile: bool = get_user_profile self._preferences = preferences self._server = LocalAuthorizationServer(self._auth_helpers, self._onAuthStateChanged, daemon=True) self._currently_refreshing_token = False # Whether we are currently in the process of refreshing auth. Don't make new requests while busy. @@ -298,7 +298,8 @@ class AuthorizationService: self._auth_data = auth_data self._currently_refreshing_token = False if auth_data: - self._callback_auth_data_retrieved() + if self._get_user_profile: + self.getUserProfile() self._preferences.setValue(self._settings.AUTH_DATA_PREFERENCE_KEY, json.dumps(auth_data.dump())) else: Logger.log("d", "Clearing the user profile") From 80d5662a78981810ad600af5c54d6994c7613a6d Mon Sep 17 00:00:00 2001 From: Paul Kuiper <46715907+pkuiper-ultimaker@users.noreply.github.com> Date: Thu, 18 Jan 2024 13:43:59 +0100 Subject: [PATCH 164/182] Regenerated from autogenerate PP-391 --- .../um_s3_aa0.4_um-abs_0.06mm_visual.inst.cfg | 12 +++- ...s3_aa0.4_um-abs_0.1mm_engineering.inst.cfg | 6 +- .../um_s3_aa0.4_um-abs_0.1mm_visual.inst.cfg | 12 +++- ...3_aa0.4_um-petg_0.1mm_engineering.inst.cfg | 6 +- .../um_s3_aa0.4_um-pla_0.06mm_visual.inst.cfg | 12 +++- ...s3_aa0.4_um-pla_0.1mm_engineering.inst.cfg | 6 +- .../um_s3_aa0.4_um-pla_0.1mm_visual.inst.cfg | 12 +++- ..._aa0.4_um-tough-pla_0.06mm_visual.inst.cfg | 12 +++- ....4_um-tough-pla_0.1mm_engineering.inst.cfg | 6 +- ...3_aa0.4_um-tough-pla_0.1mm_visual.inst.cfg | 12 +++- .../um_s5_aa0.4_um-abs_0.06mm_visual.inst.cfg | 12 +++- ...s5_aa0.4_um-abs_0.1mm_engineering.inst.cfg | 6 +- .../um_s5_aa0.4_um-abs_0.1mm_visual.inst.cfg | 12 +++- ...5_aa0.4_um-petg_0.1mm_engineering.inst.cfg | 6 +- .../um_s5_aa0.4_um-pla_0.06mm_visual.inst.cfg | 12 +++- ...s5_aa0.4_um-pla_0.1mm_engineering.inst.cfg | 6 +- .../um_s5_aa0.4_um-pla_0.1mm_visual.inst.cfg | 12 +++- ..._aa0.4_um-tough-pla_0.06mm_visual.inst.cfg | 12 +++- ....4_um-tough-pla_0.1mm_engineering.inst.cfg | 6 +- ...5_aa0.4_um-tough-pla_0.1mm_visual.inst.cfg | 12 +++- .../um_s3_aa0.25_um-abs_0.1mm.inst.cfg | 59 +++++++++++++++-- .../um_s3_aa0.25_um-petg_0.1mm.inst.cfg | 59 +++++++++++++++-- .../um_s3_aa0.25_um-pla_0.1mm.inst.cfg | 65 +++++++++++++++---- .../um_s3_aa0.4_um-abs_0.06mm.inst.cfg | 63 +++++++++++++++--- .../um_s3_aa0.4_um-abs_0.15mm.inst.cfg | 2 +- .../um_s3_aa0.4_um-abs_0.1mm.inst.cfg | 63 +++++++++++++++--- .../um_s3_aa0.4_um-abs_0.2mm.inst.cfg | 2 +- .../um_s3_aa0.4_um-abs_0.3mm.inst.cfg | 2 +- .../um_s3_aa0.4_um-petg_0.06mm.inst.cfg | 64 +++++++++++++++--- .../um_s3_aa0.4_um-petg_0.15mm.inst.cfg | 2 +- .../um_s3_aa0.4_um-petg_0.1mm.inst.cfg | 64 +++++++++++++++--- .../um_s3_aa0.4_um-petg_0.2mm.inst.cfg | 2 +- .../um_s3_aa0.4_um-petg_0.3mm.inst.cfg | 2 +- .../um_s3_aa0.4_um-pla_0.06mm.inst.cfg | 59 +++++++++++++++-- .../um_s3_aa0.4_um-pla_0.1mm.inst.cfg | 55 +++++++++++++++- .../um_s3_aa0.4_um-tough-pla_0.06mm.inst.cfg | 61 ++++++++++++++--- .../um_s3_aa0.4_um-tough-pla_0.1mm.inst.cfg | 61 ++++++++++++++--- .../um_s5_aa0.25_um-abs_0.1mm.inst.cfg | 59 +++++++++++++++-- .../um_s5_aa0.25_um-petg_0.1mm.inst.cfg | 59 +++++++++++++++-- .../um_s5_aa0.25_um-pla_0.1mm.inst.cfg | 65 +++++++++++++++---- .../um_s5_aa0.4_um-abs_0.06mm.inst.cfg | 63 +++++++++++++++--- .../um_s5_aa0.4_um-abs_0.15mm.inst.cfg | 2 +- .../um_s5_aa0.4_um-abs_0.1mm.inst.cfg | 63 +++++++++++++++--- .../um_s5_aa0.4_um-abs_0.2mm.inst.cfg | 2 +- .../um_s5_aa0.4_um-abs_0.3mm.inst.cfg | 2 +- .../um_s5_aa0.4_um-petg_0.06mm.inst.cfg | 64 +++++++++++++++--- .../um_s5_aa0.4_um-petg_0.15mm.inst.cfg | 2 +- .../um_s5_aa0.4_um-petg_0.1mm.inst.cfg | 64 +++++++++++++++--- .../um_s5_aa0.4_um-petg_0.2mm.inst.cfg | 2 +- .../um_s5_aa0.4_um-petg_0.3mm.inst.cfg | 2 +- .../um_s5_aa0.4_um-pla_0.06mm.inst.cfg | 59 +++++++++++++++-- .../um_s5_aa0.4_um-pla_0.1mm.inst.cfg | 55 +++++++++++++++- .../um_s5_aa0.4_um-tough-pla_0.06mm.inst.cfg | 61 ++++++++++++++--- .../um_s5_aa0.4_um-tough-pla_0.1mm.inst.cfg | 61 ++++++++++++++--- 54 files changed, 1352 insertions(+), 210 deletions(-) diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.4_um-abs_0.06mm_visual.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-abs_0.06mm_visual.inst.cfg index fb88768bb6..62e3254f8b 100644 --- a/resources/intent/ultimaker_s3/um_s3_aa0.4_um-abs_0.06mm_visual.inst.cfg +++ b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-abs_0.06mm_visual.inst.cfg @@ -12,6 +12,14 @@ type = intent variant = AA 0.4 [values] -speed_infill = 50 -top_bottom_thickness = 1.05 +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 0.5 +acceleration_print = 2500 +acceleration_wall_0 = 1000 +inset_direction = inside_out +jerk_wall_0 = 20 +speed_print = 50 +speed_roofing = =math.ceil(speed_wall*(35/50)) +speed_wall_0 = =math.ceil(speed_wall*(20/50)) +speed_wall_x = =math.ceil(speed_wall*(35/50)) +top_bottom_thickness = =max(1.2 , layer_height * 6) diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.4_um-abs_0.1mm_engineering.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-abs_0.1mm_engineering.inst.cfg index 967051c6b6..b61495c66f 100644 --- a/resources/intent/ultimaker_s3/um_s3_aa0.4_um-abs_0.1mm_engineering.inst.cfg +++ b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-abs_0.1mm_engineering.inst.cfg @@ -12,9 +12,13 @@ type = intent variant = AA 0.4 [values] +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 1 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'triangles' +infill_sparse_density = 20 jerk_print = 30 speed_infill = =speed_print -speed_print = 30 +speed_print = 35 +speed_roofing = =speed_topbottom speed_topbottom = =speed_print speed_wall = =speed_print speed_wall_0 = =speed_wall diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.4_um-abs_0.1mm_visual.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-abs_0.1mm_visual.inst.cfg index c08c5e37c1..2b113bb10c 100644 --- a/resources/intent/ultimaker_s3/um_s3_aa0.4_um-abs_0.1mm_visual.inst.cfg +++ b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-abs_0.1mm_visual.inst.cfg @@ -12,6 +12,14 @@ type = intent variant = AA 0.4 [values] -speed_infill = 50 -top_bottom_thickness = 1.05 +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 0.5 +acceleration_print = 2500 +acceleration_wall_0 = 1000 +inset_direction = inside_out +jerk_wall_0 = 20 +speed_print = 50 +speed_roofing = =math.ceil(speed_wall*(35/50)) +speed_wall_0 = =math.ceil(speed_wall*(20/50)) +speed_wall_x = =math.ceil(speed_wall*(35/50)) +top_bottom_thickness = =max(1.2 , layer_height * 6) diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.4_um-petg_0.1mm_engineering.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-petg_0.1mm_engineering.inst.cfg index 9bf56f69a2..7c1de8fd56 100644 --- a/resources/intent/ultimaker_s3/um_s3_aa0.4_um-petg_0.1mm_engineering.inst.cfg +++ b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-petg_0.1mm_engineering.inst.cfg @@ -12,9 +12,13 @@ type = intent variant = AA 0.4 [values] +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 1 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'triangles' +infill_sparse_density = 20 jerk_print = 30 speed_infill = =speed_print -speed_print = 30 +speed_print = 35 +speed_roofing = =speed_topbottom speed_topbottom = =speed_print speed_wall = =speed_print speed_wall_0 = =speed_wall diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.4_um-pla_0.06mm_visual.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-pla_0.06mm_visual.inst.cfg index 63e20e56bd..7bde0a1a84 100644 --- a/resources/intent/ultimaker_s3/um_s3_aa0.4_um-pla_0.06mm_visual.inst.cfg +++ b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-pla_0.06mm_visual.inst.cfg @@ -12,6 +12,14 @@ type = intent variant = AA 0.4 [values] -speed_infill = 50 -top_bottom_thickness = 1.05 +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 0.5 +acceleration_print = 2500 +acceleration_wall_0 = 1000 +inset_direction = inside_out +jerk_wall_0 = 20 +speed_print = 50 +speed_roofing = =math.ceil(speed_wall*(35/50)) +speed_wall_0 = =math.ceil(speed_wall*(20/50)) +speed_wall_x = =math.ceil(speed_wall*(35/50)) +top_bottom_thickness = =max(1.2 , layer_height * 6) diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.4_um-pla_0.1mm_engineering.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-pla_0.1mm_engineering.inst.cfg index b65a22fbdc..ed573773e1 100644 --- a/resources/intent/ultimaker_s3/um_s3_aa0.4_um-pla_0.1mm_engineering.inst.cfg +++ b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-pla_0.1mm_engineering.inst.cfg @@ -12,9 +12,13 @@ type = intent variant = AA 0.4 [values] +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 1 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'triangles' +infill_sparse_density = 20 jerk_print = 30 speed_infill = =speed_print -speed_print = 30 +speed_print = 35 +speed_roofing = =speed_topbottom speed_topbottom = =speed_print speed_wall = =speed_print speed_wall_0 = =speed_wall diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.4_um-pla_0.1mm_visual.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-pla_0.1mm_visual.inst.cfg index a90a1b971d..b5e414e2a7 100644 --- a/resources/intent/ultimaker_s3/um_s3_aa0.4_um-pla_0.1mm_visual.inst.cfg +++ b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-pla_0.1mm_visual.inst.cfg @@ -12,6 +12,14 @@ type = intent variant = AA 0.4 [values] -speed_infill = 50 -top_bottom_thickness = 1.05 +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 0.5 +acceleration_print = 2500 +acceleration_wall_0 = 1000 +inset_direction = inside_out +jerk_wall_0 = 20 +speed_print = 50 +speed_roofing = =math.ceil(speed_wall*(35/50)) +speed_wall_0 = =math.ceil(speed_wall*(20/50)) +speed_wall_x = =math.ceil(speed_wall*(35/50)) +top_bottom_thickness = =max(1.2 , layer_height * 6) diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.06mm_visual.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.06mm_visual.inst.cfg index e2997ae696..f1a72ac90b 100644 --- a/resources/intent/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.06mm_visual.inst.cfg +++ b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.06mm_visual.inst.cfg @@ -12,6 +12,14 @@ type = intent variant = AA 0.4 [values] -speed_infill = 50 -top_bottom_thickness = 1.05 +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 0.5 +acceleration_print = 2500 +acceleration_wall_0 = 1000 +inset_direction = inside_out +jerk_wall_0 = 20 +speed_print = 50 +speed_roofing = =math.ceil(speed_wall*(35/50)) +speed_wall_0 = =math.ceil(speed_wall*(20/50)) +speed_wall_x = =math.ceil(speed_wall*(35/50)) +top_bottom_thickness = =max(1.2 , layer_height * 6) diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.1mm_engineering.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.1mm_engineering.inst.cfg index a57cbf0af0..61916c3da7 100644 --- a/resources/intent/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.1mm_engineering.inst.cfg +++ b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.1mm_engineering.inst.cfg @@ -12,9 +12,13 @@ type = intent variant = AA 0.4 [values] +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 1 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'triangles' +infill_sparse_density = 20 jerk_print = 30 speed_infill = =speed_print -speed_print = 30 +speed_print = 35 +speed_roofing = =speed_topbottom speed_topbottom = =speed_print speed_wall = =speed_print speed_wall_0 = =speed_wall diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.1mm_visual.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.1mm_visual.inst.cfg index 48ce65c800..75345728fb 100644 --- a/resources/intent/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.1mm_visual.inst.cfg +++ b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.1mm_visual.inst.cfg @@ -12,6 +12,14 @@ type = intent variant = AA 0.4 [values] -speed_infill = 50 -top_bottom_thickness = 1.05 +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 0.5 +acceleration_print = 2500 +acceleration_wall_0 = 1000 +inset_direction = inside_out +jerk_wall_0 = 20 +speed_print = 50 +speed_roofing = =math.ceil(speed_wall*(35/50)) +speed_wall_0 = =math.ceil(speed_wall*(20/50)) +speed_wall_x = =math.ceil(speed_wall*(35/50)) +top_bottom_thickness = =max(1.2 , layer_height * 6) diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.4_um-abs_0.06mm_visual.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-abs_0.06mm_visual.inst.cfg index 3866a4593a..7b919a96f5 100644 --- a/resources/intent/ultimaker_s5/um_s5_aa0.4_um-abs_0.06mm_visual.inst.cfg +++ b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-abs_0.06mm_visual.inst.cfg @@ -12,6 +12,14 @@ type = intent variant = AA 0.4 [values] -speed_infill = 50 -top_bottom_thickness = 1.05 +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 0.5 +acceleration_print = 2500 +acceleration_wall_0 = 1000 +inset_direction = inside_out +jerk_wall_0 = 20 +speed_print = 50 +speed_roofing = =math.ceil(speed_wall*(35/50)) +speed_wall_0 = =math.ceil(speed_wall*(20/50)) +speed_wall_x = =math.ceil(speed_wall*(35/50)) +top_bottom_thickness = =max(1.2 , layer_height * 6) diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.4_um-abs_0.1mm_engineering.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-abs_0.1mm_engineering.inst.cfg index b5834b5757..43edfa3548 100644 --- a/resources/intent/ultimaker_s5/um_s5_aa0.4_um-abs_0.1mm_engineering.inst.cfg +++ b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-abs_0.1mm_engineering.inst.cfg @@ -12,9 +12,13 @@ type = intent variant = AA 0.4 [values] +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 1 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'triangles' +infill_sparse_density = 20 jerk_print = 30 speed_infill = =speed_print -speed_print = 30 +speed_print = 35 +speed_roofing = =speed_topbottom speed_topbottom = =speed_print speed_wall = =speed_print speed_wall_0 = =speed_wall diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.4_um-abs_0.1mm_visual.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-abs_0.1mm_visual.inst.cfg index 63b0273ba5..62a6fb4fdf 100644 --- a/resources/intent/ultimaker_s5/um_s5_aa0.4_um-abs_0.1mm_visual.inst.cfg +++ b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-abs_0.1mm_visual.inst.cfg @@ -12,6 +12,14 @@ type = intent variant = AA 0.4 [values] -speed_infill = 50 -top_bottom_thickness = 1.05 +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 0.5 +acceleration_print = 2500 +acceleration_wall_0 = 1000 +inset_direction = inside_out +jerk_wall_0 = 20 +speed_print = 50 +speed_roofing = =math.ceil(speed_wall*(35/50)) +speed_wall_0 = =math.ceil(speed_wall*(20/50)) +speed_wall_x = =math.ceil(speed_wall*(35/50)) +top_bottom_thickness = =max(1.2 , layer_height * 6) diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.4_um-petg_0.1mm_engineering.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-petg_0.1mm_engineering.inst.cfg index 00c264aa32..a251a24a6e 100644 --- a/resources/intent/ultimaker_s5/um_s5_aa0.4_um-petg_0.1mm_engineering.inst.cfg +++ b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-petg_0.1mm_engineering.inst.cfg @@ -12,9 +12,13 @@ type = intent variant = AA 0.4 [values] +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 1 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'triangles' +infill_sparse_density = 20 jerk_print = 30 speed_infill = =speed_print -speed_print = 30 +speed_print = 35 +speed_roofing = =speed_topbottom speed_topbottom = =speed_print speed_wall = =speed_print speed_wall_0 = =speed_wall diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.4_um-pla_0.06mm_visual.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-pla_0.06mm_visual.inst.cfg index 0bb1797b46..464c17a430 100644 --- a/resources/intent/ultimaker_s5/um_s5_aa0.4_um-pla_0.06mm_visual.inst.cfg +++ b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-pla_0.06mm_visual.inst.cfg @@ -12,6 +12,14 @@ type = intent variant = AA 0.4 [values] -speed_infill = 50 -top_bottom_thickness = 1.05 +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 0.5 +acceleration_print = 2500 +acceleration_wall_0 = 1000 +inset_direction = inside_out +jerk_wall_0 = 20 +speed_print = 50 +speed_roofing = =math.ceil(speed_wall*(35/50)) +speed_wall_0 = =math.ceil(speed_wall*(20/50)) +speed_wall_x = =math.ceil(speed_wall*(35/50)) +top_bottom_thickness = =max(1.2 , layer_height * 6) diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.4_um-pla_0.1mm_engineering.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-pla_0.1mm_engineering.inst.cfg index 0ab18817e0..5f6d7ee67b 100644 --- a/resources/intent/ultimaker_s5/um_s5_aa0.4_um-pla_0.1mm_engineering.inst.cfg +++ b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-pla_0.1mm_engineering.inst.cfg @@ -12,9 +12,13 @@ type = intent variant = AA 0.4 [values] +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 1 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'triangles' +infill_sparse_density = 20 jerk_print = 30 speed_infill = =speed_print -speed_print = 30 +speed_print = 35 +speed_roofing = =speed_topbottom speed_topbottom = =speed_print speed_wall = =speed_print speed_wall_0 = =speed_wall diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.4_um-pla_0.1mm_visual.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-pla_0.1mm_visual.inst.cfg index f6b7800386..2dcc5e1850 100644 --- a/resources/intent/ultimaker_s5/um_s5_aa0.4_um-pla_0.1mm_visual.inst.cfg +++ b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-pla_0.1mm_visual.inst.cfg @@ -12,6 +12,14 @@ type = intent variant = AA 0.4 [values] -speed_infill = 50 -top_bottom_thickness = 1.05 +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 0.5 +acceleration_print = 2500 +acceleration_wall_0 = 1000 +inset_direction = inside_out +jerk_wall_0 = 20 +speed_print = 50 +speed_roofing = =math.ceil(speed_wall*(35/50)) +speed_wall_0 = =math.ceil(speed_wall*(20/50)) +speed_wall_x = =math.ceil(speed_wall*(35/50)) +top_bottom_thickness = =max(1.2 , layer_height * 6) diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.06mm_visual.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.06mm_visual.inst.cfg index b4516e44dd..c0c3ccc383 100644 --- a/resources/intent/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.06mm_visual.inst.cfg +++ b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.06mm_visual.inst.cfg @@ -12,6 +12,14 @@ type = intent variant = AA 0.4 [values] -speed_infill = 50 -top_bottom_thickness = 1.05 +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 0.5 +acceleration_print = 2500 +acceleration_wall_0 = 1000 +inset_direction = inside_out +jerk_wall_0 = 20 +speed_print = 50 +speed_roofing = =math.ceil(speed_wall*(35/50)) +speed_wall_0 = =math.ceil(speed_wall*(20/50)) +speed_wall_x = =math.ceil(speed_wall*(35/50)) +top_bottom_thickness = =max(1.2 , layer_height * 6) diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.1mm_engineering.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.1mm_engineering.inst.cfg index 5c78ea044d..411d22b0ab 100644 --- a/resources/intent/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.1mm_engineering.inst.cfg +++ b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.1mm_engineering.inst.cfg @@ -12,9 +12,13 @@ type = intent variant = AA 0.4 [values] +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 1 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'triangles' +infill_sparse_density = 20 jerk_print = 30 speed_infill = =speed_print -speed_print = 30 +speed_print = 35 +speed_roofing = =speed_topbottom speed_topbottom = =speed_print speed_wall = =speed_print speed_wall_0 = =speed_wall diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.1mm_visual.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.1mm_visual.inst.cfg index 5f73432e1c..9a3c677fe9 100644 --- a/resources/intent/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.1mm_visual.inst.cfg +++ b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.1mm_visual.inst.cfg @@ -12,6 +12,14 @@ type = intent variant = AA 0.4 [values] -speed_infill = 50 -top_bottom_thickness = 1.05 +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 0.5 +acceleration_print = 2500 +acceleration_wall_0 = 1000 +inset_direction = inside_out +jerk_wall_0 = 20 +speed_print = 50 +speed_roofing = =math.ceil(speed_wall*(35/50)) +speed_wall_0 = =math.ceil(speed_wall*(20/50)) +speed_wall_x = =math.ceil(speed_wall*(35/50)) +top_bottom_thickness = =max(1.2 , layer_height * 6) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.25_um-abs_0.1mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.25_um-abs_0.1mm.inst.cfg index 40058561ac..24c5a1d9e6 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.25_um-abs_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.25_um-abs_0.1mm.inst.cfg @@ -12,11 +12,62 @@ variant = AA 0.25 weight = 0 [values] -cool_fan_speed_0 = 0 -material_print_temperature = =default_material_print_temperature - 20 -speed_topbottom = =math.ceil(speed_print * 30 / 55) +_plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0.2 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 1 +acceleration_infill = =acceleration_print +acceleration_ironing = 1000 +acceleration_layer_0 = =acceleration_wall_0 +acceleration_print = 3500 +acceleration_roofing = =acceleration_wall_0 +acceleration_topbottom = =acceleration_wall +acceleration_wall = =acceleration_infill +acceleration_wall_0 = 1500 +acceleration_wall_x = =acceleration_wall +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_speed = 30 +cool_min_layer_time = 4 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' +infill_sparse_density = 15 +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_wall_0 +jerk_print = =max(30, speed_print/2) +jerk_roofing = =jerk_wall_0 +jerk_topbottom = =jerk_wall +jerk_wall = =jerk_infill +jerk_wall_0 = =max(30, speed_wall_0/2) +machine_nozzle_cool_down_speed = 1.3 +machine_nozzle_heat_up_speed = 1.9 +material_extrusion_cool_down_speed = 0.8 +optimize_wall_printing_order = False +prime_tower_enable = False +raft_airgap = 0.15 +retraction_amount = 6.5 +retraction_prime_speed = 15 +retraction_speed = 45 +small_skin_on_surface = False +small_skin_width = 4 +speed_infill = =speed_print +speed_ironing = 20 +speed_layer_0 = 30 +speed_prime_tower = =speed_wall_0 +speed_print = 100 +speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_support_interface = =speed_wall_0 +speed_topbottom = =speed_print +speed_wall = =speed_infill +speed_wall_0 = =math.ceil(speed_wall*(20/100)) +speed_wall_x = =speed_wall +speed_wall_x_roofing = =speed_roofing support_bottom_distance = =support_z_distance support_interface_enable = True +support_structure = tree support_top_distance = =support_z_distance -support_z_distance = =math.ceil(0.3/layer_height)*layer_height +support_z_distance = 0.3 +top_bottom_thickness = =max(1.2 , layer_height * 6) +wall_0_wipe_dist = 0.8 +z_seam_relative = True +z_seam_type = back +zig_zaggify_infill = True diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.25_um-petg_0.1mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.25_um-petg_0.1mm.inst.cfg index fe8efb08d8..e3965d9c5c 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.25_um-petg_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.25_um-petg_0.1mm.inst.cfg @@ -12,12 +12,61 @@ variant = AA 0.25 weight = 0 [values] -material_print_temperature = =default_material_print_temperature - 15 -speed_infill = =math.ceil(speed_print * 40 / 55) -speed_topbottom = =math.ceil(speed_print * 30 / 55) +_plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0.2 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 1 +acceleration_infill = =acceleration_print +acceleration_ironing = 1000 +acceleration_layer_0 = =acceleration_wall_0 +acceleration_print = 3500 +acceleration_roofing = =acceleration_wall_0 +acceleration_topbottom = =acceleration_wall +acceleration_wall = =acceleration_infill +acceleration_wall_0 = 1500 +acceleration_wall_x = =acceleration_wall +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_speed = 30 +cool_min_layer_time = 4 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' +infill_sparse_density = 15 +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_wall_0 +jerk_print = =max(30, speed_print/2) +jerk_roofing = =jerk_wall_0 +jerk_topbottom = =jerk_wall +jerk_wall = =jerk_infill +jerk_wall_0 = =max(30, speed_wall_0/2) +machine_nozzle_cool_down_speed = 1.4 +machine_nozzle_heat_up_speed = 1.7 +material_extrusion_cool_down_speed = 0.7 +optimize_wall_printing_order = False +prime_tower_enable = False +retraction_amount = 8 +retraction_prime_speed = 15 +retraction_speed = 45 +small_skin_on_surface = False +small_skin_width = 4 +speed_infill = =speed_print +speed_ironing = 20 +speed_layer_0 = 30 +speed_prime_tower = =speed_wall_0 +speed_print = 100 +speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_support_interface = =speed_wall_0 +speed_topbottom = =speed_print +speed_wall = =speed_infill +speed_wall_0 = =math.ceil(speed_wall*(20/100)) +speed_wall_x = =speed_wall +speed_wall_x_roofing = =speed_roofing support_bottom_distance = =support_z_distance support_interface_enable = True +support_structure = tree support_top_distance = =support_z_distance -support_z_distance = =math.ceil(0.3/layer_height)*layer_height -top_bottom_thickness = 0.8 +support_z_distance = 0.3 +top_bottom_thickness = =max(1.2 , layer_height * 6) +wall_0_wipe_dist = 0.8 +z_seam_relative = True +z_seam_type = back +zig_zaggify_infill = True diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.25_um-pla_0.1mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.25_um-pla_0.1mm.inst.cfg index b9ec617a19..3343f7627a 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.25_um-pla_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.25_um-pla_0.1mm.inst.cfg @@ -12,21 +12,62 @@ variant = AA 0.25 weight = 0 [values] -brim_width = 8 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0.2 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 +acceleration_infill = =acceleration_print +acceleration_ironing = 1000 +acceleration_layer_0 = =acceleration_wall_0 +acceleration_print = 3500 +acceleration_roofing = =acceleration_wall_0 +acceleration_topbottom = =acceleration_wall +acceleration_wall = =acceleration_infill +acceleration_wall_0 = 1500 +acceleration_wall_x = =acceleration_wall +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_speed = 30 +cool_min_layer_time = 6 infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' -machine_nozzle_cool_down_speed = 0.9 -machine_nozzle_heat_up_speed = 1.4 -material_print_temperature = =default_material_print_temperature - 10 -retraction_hop = 0.2 -speed_print = 30 -speed_wall = =math.ceil(speed_print * 25 / 30) -speed_wall_0 = =math.ceil(speed_print * 20 / 30) +infill_sparse_density = 15 +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_wall_0 +jerk_print = =max(30, speed_print/2) +jerk_roofing = =jerk_wall_0 +jerk_topbottom = =jerk_wall +jerk_wall = =jerk_infill +jerk_wall_0 = =max(30, speed_wall_0/2) +machine_nozzle_cool_down_speed = 1.3 +machine_nozzle_heat_up_speed = 1.9 +material_extrusion_cool_down_speed = 0.7 +optimize_wall_printing_order = False +prime_tower_enable = False +raft_airgap = 0.25 +retraction_amount = 6.5 +retraction_prime_speed = =retraction_speed +retraction_speed = 45 +small_skin_on_surface = False +small_skin_width = 4 +speed_infill = =speed_print +speed_ironing = 20 +speed_layer_0 = 30 +speed_prime_tower = =speed_wall_0 +speed_print = 100 +speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_support_interface = =speed_wall_0 +speed_topbottom = =speed_print +speed_wall = =speed_infill +speed_wall_0 = =math.ceil(speed_wall*(20/100)) +speed_wall_x = =speed_wall +speed_wall_x_roofing = =speed_roofing support_bottom_distance = =support_z_distance support_interface_enable = True +support_structure = tree support_top_distance = =support_z_distance support_z_distance = =math.ceil(0.3/layer_height)*layer_height -top_bottom_thickness = 0.72 -travel_avoid_distance = 0.4 -wall_0_inset = 0.015 -wall_0_wipe_dist = 0.25 +top_bottom_thickness = =max(1 , layer_height * 5) +wall_0_wipe_dist = 0.8 +z_seam_relative = True +z_seam_type = back +zig_zaggify_infill = True diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.06mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.06mm.inst.cfg index 312afa0421..de5e0faf2e 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.06mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.06mm.inst.cfg @@ -12,18 +12,63 @@ variant = AA 0.4 weight = 1 [values] -machine_nozzle_cool_down_speed = 0.8 -machine_nozzle_heat_up_speed = 1.5 -material_final_print_temperature = =material_print_temperature - 20 -material_print_temperature = =default_material_print_temperature - 10 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0.2 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 1 +acceleration_infill = =acceleration_print +acceleration_ironing = 1000 +acceleration_layer_0 = =acceleration_wall_0 +acceleration_print = 3500 +acceleration_roofing = =acceleration_wall_0 +acceleration_topbottom = =acceleration_wall +acceleration_wall = =acceleration_infill +acceleration_wall_0 = 1500 +acceleration_wall_x = =acceleration_wall +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_speed = 30 +cool_min_layer_time = 4 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' +infill_sparse_density = 15 +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_wall_0 +jerk_print = =max(30, speed_print/2) +jerk_roofing = =jerk_wall_0 +jerk_topbottom = =jerk_wall +jerk_wall = =jerk_infill +jerk_wall_0 = =max(30, speed_wall_0/2) +machine_nozzle_cool_down_speed = 1.3 +machine_nozzle_heat_up_speed = 1.9 +material_extrusion_cool_down_speed = 0.8 +material_max_flowrate = 20 +optimize_wall_printing_order = False prime_tower_enable = False raft_airgap = 0.15 -speed_infill = =math.ceil(speed_print * 40 / 50) -speed_print = 50 -speed_topbottom = =math.ceil(speed_print * 30 / 50) -speed_wall = =math.ceil(speed_print * 30 / 50) +retraction_amount = 6.5 +retraction_prime_speed = 15 +retraction_speed = 45 +small_skin_on_surface = False +small_skin_width = 4 +speed_infill = =speed_print +speed_ironing = 20 +speed_layer_0 = 30 +speed_prime_tower = =speed_wall_0 +speed_print = 100 +speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_support_interface = =speed_wall_0 +speed_topbottom = =speed_print +speed_wall = =speed_infill +speed_wall_0 = =math.ceil(speed_wall*(20/100)) +speed_wall_x = =speed_wall +speed_wall_x_roofing = =speed_roofing support_bottom_distance = =support_z_distance support_interface_enable = True +support_structure = tree support_top_distance = =support_z_distance -support_z_distance = =math.ceil(0.3/layer_height)*layer_height +support_z_distance = 0.3 +top_bottom_thickness = =max(1.2 , layer_height * 6) +wall_0_wipe_dist = 0.8 +z_seam_relative = True +z_seam_type = back +zig_zaggify_infill = True diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.15mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.15mm.inst.cfg index ee0525c13e..c39c6d42c8 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.15mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.15mm.inst.cfg @@ -66,7 +66,7 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = =math.ceil(0.3/layer_height)*layer_height +support_z_distance = 0.3 top_bottom_thickness = =max(1.2 , layer_height * 6) wall_0_wipe_dist = 0.8 z_seam_relative = True diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.1mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.1mm.inst.cfg index b53e8275a2..08bb2befdf 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.1mm.inst.cfg @@ -12,18 +12,63 @@ variant = AA 0.4 weight = 0 [values] -machine_nozzle_cool_down_speed = 0.85 -machine_nozzle_heat_up_speed = 1.5 -material_final_print_temperature = =material_print_temperature - 20 -material_print_temperature = =default_material_print_temperature - 5 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0.2 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 1 +acceleration_infill = =acceleration_print +acceleration_ironing = 1000 +acceleration_layer_0 = =acceleration_wall_0 +acceleration_print = 3500 +acceleration_roofing = =acceleration_wall_0 +acceleration_topbottom = =acceleration_wall +acceleration_wall = =acceleration_infill +acceleration_wall_0 = 1500 +acceleration_wall_x = =acceleration_wall +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_speed = 30 +cool_min_layer_time = 4 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' +infill_sparse_density = 15 +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_wall_0 +jerk_print = =max(30, speed_print/2) +jerk_roofing = =jerk_wall_0 +jerk_topbottom = =jerk_wall +jerk_wall = =jerk_infill +jerk_wall_0 = =max(30, speed_wall_0/2) +machine_nozzle_cool_down_speed = 1.3 +machine_nozzle_heat_up_speed = 1.9 +material_extrusion_cool_down_speed = 0.8 +material_max_flowrate = 20 +optimize_wall_printing_order = False prime_tower_enable = False raft_airgap = 0.15 -speed_infill = =math.ceil(speed_print * 40 / 55) -speed_print = 55 -speed_topbottom = =math.ceil(speed_print * 30 / 55) -speed_wall = =math.ceil(speed_print * 30 / 55) +retraction_amount = 6.5 +retraction_prime_speed = 15 +retraction_speed = 45 +small_skin_on_surface = False +small_skin_width = 4 +speed_infill = =speed_print +speed_ironing = 20 +speed_layer_0 = 30 +speed_prime_tower = =speed_wall_0 +speed_print = 100 +speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_support_interface = =speed_wall_0 +speed_topbottom = =speed_print +speed_wall = =speed_infill +speed_wall_0 = =math.ceil(speed_wall*(20/100)) +speed_wall_x = =speed_wall +speed_wall_x_roofing = =speed_roofing support_bottom_distance = =support_z_distance support_interface_enable = True +support_structure = tree support_top_distance = =support_z_distance -support_z_distance = =math.ceil(0.3/layer_height)*layer_height +support_z_distance = 0.3 +top_bottom_thickness = =max(1.2 , layer_height * 6) +wall_0_wipe_dist = 0.8 +z_seam_relative = True +z_seam_type = back +zig_zaggify_infill = True diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.2mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.2mm.inst.cfg index 57413c4b30..9d67113da0 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.2mm.inst.cfg @@ -67,7 +67,7 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = =math.ceil(0.3/layer_height)*layer_height +support_z_distance = 0.3 top_bottom_thickness = =max(1.2 , layer_height * 6) wall_0_wipe_dist = 0.8 z_seam_relative = True diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.3mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.3mm.inst.cfg index 0052ce90cd..fc6aa8c5fa 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.3mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.3mm.inst.cfg @@ -67,7 +67,7 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = =math.ceil(0.3/layer_height)*layer_height +support_z_distance = 0.3 top_bottom_thickness = =max(1.2 , layer_height * 6) wall_0_wipe_dist = 0.8 wall_line_width_0 = =line_width * (1 + magic_spiralize * 0.25) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.06mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.06mm.inst.cfg index 1b7919bd02..7eb5de8b64 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.06mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.06mm.inst.cfg @@ -12,16 +12,62 @@ variant = AA 0.4 weight = 1 [values] -infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'triangles' -machine_nozzle_cool_down_speed = 0.85 -machine_nozzle_heat_up_speed = 1.5 -material_print_temperature = =default_material_print_temperature - 10 -speed_infill = =math.ceil(speed_print * 40 / 50) -speed_print = 50 -speed_topbottom = =math.ceil(speed_print * 30 / 50) -speed_wall = =math.ceil(speed_print * 30 / 50) +_plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0.2 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 1 +acceleration_infill = =acceleration_print +acceleration_ironing = 1000 +acceleration_layer_0 = =acceleration_wall_0 +acceleration_print = 3500 +acceleration_roofing = =acceleration_wall_0 +acceleration_topbottom = =acceleration_wall +acceleration_wall = =acceleration_infill +acceleration_wall_0 = 1500 +acceleration_wall_x = =acceleration_wall +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_speed = 30 +cool_min_layer_time = 4 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' +infill_sparse_density = 15 +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_wall_0 +jerk_print = =max(30, speed_print/2) +jerk_roofing = =jerk_wall_0 +jerk_topbottom = =jerk_wall +jerk_wall = =jerk_infill +jerk_wall_0 = =max(30, speed_wall_0/2) +machine_nozzle_cool_down_speed = 1.4 +machine_nozzle_heat_up_speed = 1.7 +material_extrusion_cool_down_speed = 0.7 +material_max_flowrate = 20 +optimize_wall_printing_order = False +prime_tower_enable = False +retraction_amount = 8 +retraction_prime_speed = 15 +retraction_speed = 45 +small_skin_on_surface = False +small_skin_width = 4 +speed_infill = =speed_print +speed_ironing = 20 +speed_layer_0 = 30 +speed_prime_tower = =speed_wall_0 +speed_print = 100 +speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_support_interface = =speed_wall_0 +speed_topbottom = =speed_print +speed_wall = =speed_infill +speed_wall_0 = =math.ceil(speed_wall*(20/100)) +speed_wall_x = =speed_wall +speed_wall_x_roofing = =speed_roofing support_bottom_distance = =support_z_distance support_interface_enable = True +support_structure = tree support_top_distance = =support_z_distance -support_z_distance = =math.ceil(0.3/layer_height)*layer_height +support_z_distance = 0.3 +top_bottom_thickness = =max(1.2 , layer_height * 6) +wall_0_wipe_dist = 0.8 +z_seam_relative = True +z_seam_type = back +zig_zaggify_infill = True diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.15mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.15mm.inst.cfg index 8732c3ad63..d4431382dd 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.15mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.15mm.inst.cfg @@ -65,7 +65,7 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = =math.ceil(0.3/layer_height)*layer_height +support_z_distance = 0.3 top_bottom_thickness = =max(1.2 , layer_height * 6) wall_0_wipe_dist = 0.8 z_seam_relative = True diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.1mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.1mm.inst.cfg index afa05aa2cf..bb7de56356 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.1mm.inst.cfg @@ -12,16 +12,62 @@ variant = AA 0.4 weight = 0 [values] -infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'triangles' -machine_nozzle_cool_down_speed = 0.85 -machine_nozzle_heat_up_speed = 1.5 -material_print_temperature = =default_material_print_temperature - 5 -speed_infill = =math.ceil(speed_print * 45 / 55) -speed_print = 55 -speed_topbottom = =math.ceil(speed_print * 30 / 55) -speed_wall = =math.ceil(speed_print * 30 / 55) +_plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0.2 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 1 +acceleration_infill = =acceleration_print +acceleration_ironing = 1000 +acceleration_layer_0 = =acceleration_wall_0 +acceleration_print = 3500 +acceleration_roofing = =acceleration_wall_0 +acceleration_topbottom = =acceleration_wall +acceleration_wall = =acceleration_infill +acceleration_wall_0 = 1500 +acceleration_wall_x = =acceleration_wall +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_speed = 30 +cool_min_layer_time = 4 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' +infill_sparse_density = 15 +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_wall_0 +jerk_print = =max(30, speed_print/2) +jerk_roofing = =jerk_wall_0 +jerk_topbottom = =jerk_wall +jerk_wall = =jerk_infill +jerk_wall_0 = =max(30, speed_wall_0/2) +machine_nozzle_cool_down_speed = 1.4 +machine_nozzle_heat_up_speed = 1.7 +material_extrusion_cool_down_speed = 0.7 +material_max_flowrate = 20 +optimize_wall_printing_order = False +prime_tower_enable = False +retraction_amount = 8 +retraction_prime_speed = 15 +retraction_speed = 45 +small_skin_on_surface = False +small_skin_width = 4 +speed_infill = =speed_print +speed_ironing = 20 +speed_layer_0 = 30 +speed_prime_tower = =speed_wall_0 +speed_print = 100 +speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_support_interface = =speed_wall_0 +speed_topbottom = =speed_print +speed_wall = =speed_infill +speed_wall_0 = =math.ceil(speed_wall*(20/100)) +speed_wall_x = =speed_wall +speed_wall_x_roofing = =speed_roofing support_bottom_distance = =support_z_distance support_interface_enable = True +support_structure = tree support_top_distance = =support_z_distance -support_z_distance = =math.ceil(0.3/layer_height)*layer_height +support_z_distance = 0.3 +top_bottom_thickness = =max(1.2 , layer_height * 6) +wall_0_wipe_dist = 0.8 +z_seam_relative = True +z_seam_type = back +zig_zaggify_infill = True diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.2mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.2mm.inst.cfg index e7e50350c0..6b333e2f13 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.2mm.inst.cfg @@ -66,7 +66,7 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = =math.ceil(0.3/layer_height)*layer_height +support_z_distance = 0.3 top_bottom_thickness = =max(1.2 , layer_height * 6) wall_0_wipe_dist = 0.8 z_seam_relative = True diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.3mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.3mm.inst.cfg index 5ecaa739db..d95b6de92f 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.3mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.3mm.inst.cfg @@ -66,7 +66,7 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = =math.ceil(0.3/layer_height)*layer_height +support_z_distance = 0.3 top_bottom_thickness = =max(1.2 , layer_height * 6) wall_0_wipe_dist = 0.8 wall_line_width_0 = =line_width * (1 + magic_spiralize * 0.25) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.06mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.06mm.inst.cfg index 2939389a3c..25887f19d7 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.06mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.06mm.inst.cfg @@ -12,18 +12,63 @@ variant = AA 0.4 weight = 1 [values] -machine_nozzle_cool_down_speed = 0.75 -machine_nozzle_heat_up_speed = 1.6 -material_print_temperature = =default_material_print_temperature - 5 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0.2 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 +acceleration_infill = =acceleration_print +acceleration_ironing = 1000 +acceleration_layer_0 = =acceleration_wall_0 +acceleration_print = 3500 +acceleration_roofing = =acceleration_wall_0 +acceleration_topbottom = =acceleration_wall +acceleration_wall = =acceleration_infill +acceleration_wall_0 = 1500 +acceleration_wall_x = =acceleration_wall +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_speed = 30 +cool_min_layer_time = 6 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' +infill_sparse_density = 15 +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_wall_0 +jerk_print = =max(30, speed_print/2) +jerk_roofing = =jerk_wall_0 +jerk_topbottom = =jerk_wall +jerk_wall = =jerk_infill +jerk_wall_0 = =max(30, speed_wall_0/2) +machine_nozzle_cool_down_speed = 1.3 +machine_nozzle_heat_up_speed = 1.9 +material_extrusion_cool_down_speed = 0.7 +material_max_flowrate = 12 +optimize_wall_printing_order = False prime_tower_enable = False raft_airgap = 0.25 +retraction_amount = 6.5 retraction_prime_speed = =retraction_speed -speed_print = 50 -speed_topbottom = =math.ceil(speed_print * 35 / 50) -speed_wall = =math.ceil(speed_print * 35 / 50) +retraction_speed = 45 +small_skin_on_surface = False +small_skin_width = 4 +speed_infill = =speed_print +speed_ironing = 20 +speed_layer_0 = 30 +speed_prime_tower = =speed_wall_0 +speed_print = 100 +speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_support_interface = =speed_wall_0 +speed_topbottom = =speed_print +speed_wall = =speed_infill +speed_wall_0 = =math.ceil(speed_wall*(20/100)) +speed_wall_x = =speed_wall +speed_wall_x_roofing = =speed_roofing support_bottom_distance = =support_z_distance support_interface_enable = True +support_structure = tree support_top_distance = =support_z_distance support_z_distance = =math.ceil(0.3/layer_height)*layer_height -top_bottom_thickness = 1 +top_bottom_thickness = =max(1 , layer_height * 5) +wall_0_wipe_dist = 0.8 +z_seam_relative = True +z_seam_type = back +zig_zaggify_infill = True diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.1mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.1mm.inst.cfg index 2b430c1afb..e8820673ea 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.1mm.inst.cfg @@ -12,14 +12,63 @@ variant = AA 0.4 weight = 0 [values] -machine_nozzle_cool_down_speed = 0.75 -machine_nozzle_heat_up_speed = 1.6 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0.2 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 +acceleration_infill = =acceleration_print +acceleration_ironing = 1000 +acceleration_layer_0 = =acceleration_wall_0 +acceleration_print = 3500 +acceleration_roofing = =acceleration_wall_0 +acceleration_topbottom = =acceleration_wall +acceleration_wall = =acceleration_infill +acceleration_wall_0 = 1500 +acceleration_wall_x = =acceleration_wall +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_speed = 30 +cool_min_layer_time = 6 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' +infill_sparse_density = 15 +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_wall_0 +jerk_print = =max(30, speed_print/2) +jerk_roofing = =jerk_wall_0 +jerk_topbottom = =jerk_wall +jerk_wall = =jerk_infill +jerk_wall_0 = =max(30, speed_wall_0/2) +machine_nozzle_cool_down_speed = 1.3 +machine_nozzle_heat_up_speed = 1.9 +material_extrusion_cool_down_speed = 0.7 +material_max_flowrate = 12 +optimize_wall_printing_order = False prime_tower_enable = False raft_airgap = 0.25 +retraction_amount = 6.5 retraction_prime_speed = =retraction_speed +retraction_speed = 45 +small_skin_on_surface = False +small_skin_width = 4 +speed_infill = =speed_print +speed_ironing = 20 +speed_layer_0 = 30 +speed_prime_tower = =speed_wall_0 +speed_print = 100 +speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_support_interface = =speed_wall_0 +speed_topbottom = =speed_print +speed_wall = =speed_infill +speed_wall_0 = =math.ceil(speed_wall*(20/100)) +speed_wall_x = =speed_wall +speed_wall_x_roofing = =speed_roofing support_bottom_distance = =support_z_distance support_interface_enable = True +support_structure = tree support_top_distance = =support_z_distance support_z_distance = =math.ceil(0.3/layer_height)*layer_height -top_bottom_thickness = 1 +top_bottom_thickness = =max(1 , layer_height * 5) +wall_0_wipe_dist = 0.8 +z_seam_relative = True +z_seam_type = back +zig_zaggify_infill = True diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.06mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.06mm.inst.cfg index c84c2fb66e..73f25eae0f 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.06mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.06mm.inst.cfg @@ -12,18 +12,63 @@ variant = AA 0.4 weight = 1 [values] -machine_nozzle_cool_down_speed = 0.75 -machine_nozzle_heat_up_speed = 1.6 -material_print_temperature = =default_material_print_temperature - 5 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0.2 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 +acceleration_infill = =acceleration_print +acceleration_ironing = 1000 +acceleration_layer_0 = =acceleration_wall_0 +acceleration_print = 3500 +acceleration_roofing = =acceleration_wall_0 +acceleration_topbottom = =acceleration_wall +acceleration_wall = =acceleration_infill +acceleration_wall_0 = 1500 +acceleration_wall_x = =acceleration_wall +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_speed = 30 +cool_min_layer_time = 6 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' +infill_sparse_density = 15 +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_wall_0 +jerk_print = =max(30, speed_print/2) +jerk_roofing = =jerk_wall_0 +jerk_topbottom = =jerk_wall +jerk_wall = =jerk_infill +jerk_wall_0 = =max(30, speed_wall_0/2) +machine_nozzle_cool_down_speed = 1.3 +machine_nozzle_heat_up_speed = 1.9 +material_extrusion_cool_down_speed = 0.7 +material_max_flowrate = 14 +optimize_wall_printing_order = False prime_tower_enable = False +raft_airgap = 0.25 +retraction_amount = 6.5 retraction_prime_speed = =retraction_speed -speed_print = 45 -speed_topbottom = =math.ceil(speed_print * 35 / 45) -speed_wall = =math.ceil(speed_print * 40 / 45) -speed_wall_0 = =math.ceil(speed_wall * 35 / 45) +retraction_speed = 45 +small_skin_on_surface = False +small_skin_width = 4 +speed_infill = =speed_print +speed_ironing = 20 +speed_layer_0 = 26 +speed_prime_tower = =speed_wall_0 +speed_print = 100 +speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_support_interface = =speed_wall_0 +speed_topbottom = =speed_print +speed_wall = =speed_infill +speed_wall_0 = =math.ceil(speed_wall*(20/100)) +speed_wall_x = =speed_wall +speed_wall_x_roofing = =speed_roofing support_bottom_distance = =support_z_distance support_interface_enable = True +support_structure = tree support_top_distance = =support_z_distance support_z_distance = =math.ceil(0.3/layer_height)*layer_height -top_bottom_thickness = 1.2 +top_bottom_thickness = =max(1 , layer_height * 5) +wall_0_wipe_dist = 0.8 +z_seam_relative = True +z_seam_type = back +zig_zaggify_infill = True diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.1mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.1mm.inst.cfg index 47687fb5be..e51d440c31 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.1mm.inst.cfg @@ -12,18 +12,63 @@ variant = AA 0.4 weight = 0 [values] -machine_nozzle_cool_down_speed = 0.75 -machine_nozzle_heat_up_speed = 1.6 -material_print_temperature = =default_material_print_temperature - 5 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0.2 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 +acceleration_infill = =acceleration_print +acceleration_ironing = 1000 +acceleration_layer_0 = =acceleration_wall_0 +acceleration_print = 3500 +acceleration_roofing = =acceleration_wall_0 +acceleration_topbottom = =acceleration_wall +acceleration_wall = =acceleration_infill +acceleration_wall_0 = 1500 +acceleration_wall_x = =acceleration_wall +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_speed = 30 +cool_min_layer_time = 6 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' +infill_sparse_density = 15 +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_wall_0 +jerk_print = =max(30, speed_print/2) +jerk_roofing = =jerk_wall_0 +jerk_topbottom = =jerk_wall +jerk_wall = =jerk_infill +jerk_wall_0 = =max(30, speed_wall_0/2) +machine_nozzle_cool_down_speed = 1.3 +machine_nozzle_heat_up_speed = 1.9 +material_extrusion_cool_down_speed = 0.7 +material_max_flowrate = 14 +optimize_wall_printing_order = False prime_tower_enable = False +raft_airgap = 0.25 +retraction_amount = 6.5 retraction_prime_speed = =retraction_speed -speed_print = 45 -speed_topbottom = =math.ceil(speed_print * 35 / 45) -speed_wall = =math.ceil(speed_print * 40 / 45) -speed_wall_0 = =math.ceil(speed_wall * 35 / 45) +retraction_speed = 45 +small_skin_on_surface = False +small_skin_width = 4 +speed_infill = =speed_print +speed_ironing = 20 +speed_layer_0 = 26 +speed_prime_tower = =speed_wall_0 +speed_print = 100 +speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_support_interface = =speed_wall_0 +speed_topbottom = =speed_print +speed_wall = =speed_infill +speed_wall_0 = =math.ceil(speed_wall*(20/100)) +speed_wall_x = =speed_wall +speed_wall_x_roofing = =speed_roofing support_bottom_distance = =support_z_distance support_interface_enable = True +support_structure = tree support_top_distance = =support_z_distance support_z_distance = =math.ceil(0.3/layer_height)*layer_height -top_bottom_thickness = 1.2 +top_bottom_thickness = =max(1 , layer_height * 5) +wall_0_wipe_dist = 0.8 +z_seam_relative = True +z_seam_type = back +zig_zaggify_infill = True diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.25_um-abs_0.1mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.25_um-abs_0.1mm.inst.cfg index 0dc15571d7..7b14730a66 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.25_um-abs_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.25_um-abs_0.1mm.inst.cfg @@ -12,11 +12,62 @@ variant = AA 0.25 weight = 0 [values] -cool_fan_speed_0 = 0 -material_print_temperature = =default_material_print_temperature - 20 -speed_topbottom = =math.ceil(speed_print * 30 / 55) +_plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0.2 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 1 +acceleration_infill = =acceleration_print +acceleration_ironing = 1000 +acceleration_layer_0 = =acceleration_wall_0 +acceleration_print = 3500 +acceleration_roofing = =acceleration_wall_0 +acceleration_topbottom = =acceleration_wall +acceleration_wall = =acceleration_infill +acceleration_wall_0 = 1500 +acceleration_wall_x = =acceleration_wall +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_speed = 30 +cool_min_layer_time = 4 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' +infill_sparse_density = 15 +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_wall_0 +jerk_print = =max(30, speed_print/2) +jerk_roofing = =jerk_wall_0 +jerk_topbottom = =jerk_wall +jerk_wall = =jerk_infill +jerk_wall_0 = =max(30, speed_wall_0/2) +machine_nozzle_cool_down_speed = 1.3 +machine_nozzle_heat_up_speed = 1.9 +material_extrusion_cool_down_speed = 0.8 +optimize_wall_printing_order = False +prime_tower_enable = False +raft_airgap = 0.15 +retraction_amount = 6.5 +retraction_prime_speed = 15 +retraction_speed = 45 +small_skin_on_surface = False +small_skin_width = 4 +speed_infill = =speed_print +speed_ironing = 20 +speed_layer_0 = 30 +speed_prime_tower = =speed_wall_0 +speed_print = 100 +speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_support_interface = =speed_wall_0 +speed_topbottom = =speed_print +speed_wall = =speed_infill +speed_wall_0 = =math.ceil(speed_wall*(20/100)) +speed_wall_x = =speed_wall +speed_wall_x_roofing = =speed_roofing support_bottom_distance = =support_z_distance support_interface_enable = True +support_structure = tree support_top_distance = =support_z_distance -support_z_distance = =math.ceil(0.3/layer_height)*layer_height +support_z_distance = 0.3 +top_bottom_thickness = =max(1.2 , layer_height * 6) +wall_0_wipe_dist = 0.8 +z_seam_relative = True +z_seam_type = back +zig_zaggify_infill = True diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.25_um-petg_0.1mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.25_um-petg_0.1mm.inst.cfg index c5cadca4bd..a2233703d4 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.25_um-petg_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.25_um-petg_0.1mm.inst.cfg @@ -12,12 +12,61 @@ variant = AA 0.25 weight = 0 [values] -material_print_temperature = =default_material_print_temperature - 15 -speed_infill = =math.ceil(speed_print * 40 / 55) -speed_topbottom = =math.ceil(speed_print * 30 / 55) +_plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0.2 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 1 +acceleration_infill = =acceleration_print +acceleration_ironing = 1000 +acceleration_layer_0 = =acceleration_wall_0 +acceleration_print = 3500 +acceleration_roofing = =acceleration_wall_0 +acceleration_topbottom = =acceleration_wall +acceleration_wall = =acceleration_infill +acceleration_wall_0 = 1500 +acceleration_wall_x = =acceleration_wall +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_speed = 30 +cool_min_layer_time = 4 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' +infill_sparse_density = 15 +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_wall_0 +jerk_print = =max(30, speed_print/2) +jerk_roofing = =jerk_wall_0 +jerk_topbottom = =jerk_wall +jerk_wall = =jerk_infill +jerk_wall_0 = =max(30, speed_wall_0/2) +machine_nozzle_cool_down_speed = 1.4 +machine_nozzle_heat_up_speed = 1.7 +material_extrusion_cool_down_speed = 0.7 +optimize_wall_printing_order = False +prime_tower_enable = False +retraction_amount = 8 +retraction_prime_speed = 15 +retraction_speed = 45 +small_skin_on_surface = False +small_skin_width = 4 +speed_infill = =speed_print +speed_ironing = 20 +speed_layer_0 = 30 +speed_prime_tower = =speed_wall_0 +speed_print = 100 +speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_support_interface = =speed_wall_0 +speed_topbottom = =speed_print +speed_wall = =speed_infill +speed_wall_0 = =math.ceil(speed_wall*(20/100)) +speed_wall_x = =speed_wall +speed_wall_x_roofing = =speed_roofing support_bottom_distance = =support_z_distance support_interface_enable = True +support_structure = tree support_top_distance = =support_z_distance -support_z_distance = =math.ceil(0.3/layer_height)*layer_height -top_bottom_thickness = 0.8 +support_z_distance = 0.3 +top_bottom_thickness = =max(1.2 , layer_height * 6) +wall_0_wipe_dist = 0.8 +z_seam_relative = True +z_seam_type = back +zig_zaggify_infill = True diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.25_um-pla_0.1mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.25_um-pla_0.1mm.inst.cfg index c6d2afaf03..789d186f77 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.25_um-pla_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.25_um-pla_0.1mm.inst.cfg @@ -12,21 +12,62 @@ variant = AA 0.25 weight = 0 [values] -brim_width = 8 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0.2 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 +acceleration_infill = =acceleration_print +acceleration_ironing = 1000 +acceleration_layer_0 = =acceleration_wall_0 +acceleration_print = 3500 +acceleration_roofing = =acceleration_wall_0 +acceleration_topbottom = =acceleration_wall +acceleration_wall = =acceleration_infill +acceleration_wall_0 = 1500 +acceleration_wall_x = =acceleration_wall +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_speed = 30 +cool_min_layer_time = 6 infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' -machine_nozzle_cool_down_speed = 0.9 -machine_nozzle_heat_up_speed = 1.4 -material_print_temperature = =default_material_print_temperature - 10 -retraction_hop = 0.2 -speed_print = 30 -speed_wall = =math.ceil(speed_print * 25 / 30) -speed_wall_0 = =math.ceil(speed_print * 20 / 30) +infill_sparse_density = 15 +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_wall_0 +jerk_print = =max(30, speed_print/2) +jerk_roofing = =jerk_wall_0 +jerk_topbottom = =jerk_wall +jerk_wall = =jerk_infill +jerk_wall_0 = =max(30, speed_wall_0/2) +machine_nozzle_cool_down_speed = 1.3 +machine_nozzle_heat_up_speed = 1.9 +material_extrusion_cool_down_speed = 0.7 +optimize_wall_printing_order = False +prime_tower_enable = False +raft_airgap = 0.25 +retraction_amount = 6.5 +retraction_prime_speed = =retraction_speed +retraction_speed = 45 +small_skin_on_surface = False +small_skin_width = 4 +speed_infill = =speed_print +speed_ironing = 20 +speed_layer_0 = 30 +speed_prime_tower = =speed_wall_0 +speed_print = 100 +speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_support_interface = =speed_wall_0 +speed_topbottom = =speed_print +speed_wall = =speed_infill +speed_wall_0 = =math.ceil(speed_wall*(20/100)) +speed_wall_x = =speed_wall +speed_wall_x_roofing = =speed_roofing support_bottom_distance = =support_z_distance support_interface_enable = True +support_structure = tree support_top_distance = =support_z_distance support_z_distance = =math.ceil(0.3/layer_height)*layer_height -top_bottom_thickness = 0.72 -travel_avoid_distance = 0.4 -wall_0_inset = 0.015 -wall_0_wipe_dist = 0.25 +top_bottom_thickness = =max(1 , layer_height * 5) +wall_0_wipe_dist = 0.8 +z_seam_relative = True +z_seam_type = back +zig_zaggify_infill = True diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.06mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.06mm.inst.cfg index a69ff33f76..c0b4799ca9 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.06mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.06mm.inst.cfg @@ -12,18 +12,63 @@ variant = AA 0.4 weight = 1 [values] -machine_nozzle_cool_down_speed = 0.8 -machine_nozzle_heat_up_speed = 1.5 -material_final_print_temperature = =material_print_temperature - 20 -material_print_temperature = =default_material_print_temperature - 10 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0.2 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 1 +acceleration_infill = =acceleration_print +acceleration_ironing = 1000 +acceleration_layer_0 = =acceleration_wall_0 +acceleration_print = 3500 +acceleration_roofing = =acceleration_wall_0 +acceleration_topbottom = =acceleration_wall +acceleration_wall = =acceleration_infill +acceleration_wall_0 = 1500 +acceleration_wall_x = =acceleration_wall +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_speed = 30 +cool_min_layer_time = 4 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' +infill_sparse_density = 15 +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_wall_0 +jerk_print = =max(30, speed_print/2) +jerk_roofing = =jerk_wall_0 +jerk_topbottom = =jerk_wall +jerk_wall = =jerk_infill +jerk_wall_0 = =max(30, speed_wall_0/2) +machine_nozzle_cool_down_speed = 1.3 +machine_nozzle_heat_up_speed = 1.9 +material_extrusion_cool_down_speed = 0.8 +material_max_flowrate = 20 +optimize_wall_printing_order = False prime_tower_enable = False raft_airgap = 0.15 -speed_infill = =math.ceil(speed_print * 40 / 50) -speed_print = 50 -speed_topbottom = =math.ceil(speed_print * 30 / 50) -speed_wall = =math.ceil(speed_print * 30 / 50) +retraction_amount = 6.5 +retraction_prime_speed = 15 +retraction_speed = 45 +small_skin_on_surface = False +small_skin_width = 4 +speed_infill = =speed_print +speed_ironing = 20 +speed_layer_0 = 30 +speed_prime_tower = =speed_wall_0 +speed_print = 100 +speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_support_interface = =speed_wall_0 +speed_topbottom = =speed_print +speed_wall = =speed_infill +speed_wall_0 = =math.ceil(speed_wall*(20/100)) +speed_wall_x = =speed_wall +speed_wall_x_roofing = =speed_roofing support_bottom_distance = =support_z_distance support_interface_enable = True +support_structure = tree support_top_distance = =support_z_distance -support_z_distance = =math.ceil(0.3/layer_height)*layer_height +support_z_distance = 0.3 +top_bottom_thickness = =max(1.2 , layer_height * 6) +wall_0_wipe_dist = 0.8 +z_seam_relative = True +z_seam_type = back +zig_zaggify_infill = True diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.15mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.15mm.inst.cfg index 9c7ceca13b..d430f867d8 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.15mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.15mm.inst.cfg @@ -66,7 +66,7 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = =math.ceil(0.3/layer_height)*layer_height +support_z_distance = 0.3 top_bottom_thickness = =max(1.2 , layer_height * 6) wall_0_wipe_dist = 0.8 z_seam_relative = True diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.1mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.1mm.inst.cfg index ca659622cb..b2c25e26c7 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.1mm.inst.cfg @@ -12,18 +12,63 @@ variant = AA 0.4 weight = 0 [values] -machine_nozzle_cool_down_speed = 0.85 -machine_nozzle_heat_up_speed = 1.5 -material_final_print_temperature = =material_print_temperature - 20 -material_print_temperature = =default_material_print_temperature - 5 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0.2 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 1 +acceleration_infill = =acceleration_print +acceleration_ironing = 1000 +acceleration_layer_0 = =acceleration_wall_0 +acceleration_print = 3500 +acceleration_roofing = =acceleration_wall_0 +acceleration_topbottom = =acceleration_wall +acceleration_wall = =acceleration_infill +acceleration_wall_0 = 1500 +acceleration_wall_x = =acceleration_wall +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_speed = 30 +cool_min_layer_time = 4 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' +infill_sparse_density = 15 +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_wall_0 +jerk_print = =max(30, speed_print/2) +jerk_roofing = =jerk_wall_0 +jerk_topbottom = =jerk_wall +jerk_wall = =jerk_infill +jerk_wall_0 = =max(30, speed_wall_0/2) +machine_nozzle_cool_down_speed = 1.3 +machine_nozzle_heat_up_speed = 1.9 +material_extrusion_cool_down_speed = 0.8 +material_max_flowrate = 20 +optimize_wall_printing_order = False prime_tower_enable = False raft_airgap = 0.15 -speed_infill = =math.ceil(speed_print * 40 / 55) -speed_print = 55 -speed_topbottom = =math.ceil(speed_print * 30 / 55) -speed_wall = =math.ceil(speed_print * 30 / 55) +retraction_amount = 6.5 +retraction_prime_speed = 15 +retraction_speed = 45 +small_skin_on_surface = False +small_skin_width = 4 +speed_infill = =speed_print +speed_ironing = 20 +speed_layer_0 = 30 +speed_prime_tower = =speed_wall_0 +speed_print = 100 +speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_support_interface = =speed_wall_0 +speed_topbottom = =speed_print +speed_wall = =speed_infill +speed_wall_0 = =math.ceil(speed_wall*(20/100)) +speed_wall_x = =speed_wall +speed_wall_x_roofing = =speed_roofing support_bottom_distance = =support_z_distance support_interface_enable = True +support_structure = tree support_top_distance = =support_z_distance -support_z_distance = =math.ceil(0.3/layer_height)*layer_height +support_z_distance = 0.3 +top_bottom_thickness = =max(1.2 , layer_height * 6) +wall_0_wipe_dist = 0.8 +z_seam_relative = True +z_seam_type = back +zig_zaggify_infill = True diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.2mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.2mm.inst.cfg index f430e6bc16..8a02dfe38c 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.2mm.inst.cfg @@ -67,7 +67,7 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = =math.ceil(0.3/layer_height)*layer_height +support_z_distance = 0.3 top_bottom_thickness = =max(1.2 , layer_height * 6) wall_0_wipe_dist = 0.8 z_seam_relative = True diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.3mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.3mm.inst.cfg index 98ca8927b6..d1feed0b46 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.3mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.3mm.inst.cfg @@ -67,7 +67,7 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = =math.ceil(0.3/layer_height)*layer_height +support_z_distance = 0.3 top_bottom_thickness = =max(1.2 , layer_height * 6) wall_0_wipe_dist = 0.8 wall_line_width_0 = =line_width * (1 + magic_spiralize * 0.25) diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.06mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.06mm.inst.cfg index 9545d34977..ef58c14663 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.06mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.06mm.inst.cfg @@ -12,16 +12,62 @@ variant = AA 0.4 weight = 1 [values] -infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'triangles' -machine_nozzle_cool_down_speed = 0.85 -machine_nozzle_heat_up_speed = 1.5 -material_print_temperature = =default_material_print_temperature - 10 -speed_infill = =math.ceil(speed_print * 40 / 50) -speed_print = 50 -speed_topbottom = =math.ceil(speed_print * 30 / 50) -speed_wall = =math.ceil(speed_print * 30 / 50) +_plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0.2 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 1 +acceleration_infill = =acceleration_print +acceleration_ironing = 1000 +acceleration_layer_0 = =acceleration_wall_0 +acceleration_print = 3500 +acceleration_roofing = =acceleration_wall_0 +acceleration_topbottom = =acceleration_wall +acceleration_wall = =acceleration_infill +acceleration_wall_0 = 1500 +acceleration_wall_x = =acceleration_wall +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_speed = 30 +cool_min_layer_time = 4 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' +infill_sparse_density = 15 +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_wall_0 +jerk_print = =max(30, speed_print/2) +jerk_roofing = =jerk_wall_0 +jerk_topbottom = =jerk_wall +jerk_wall = =jerk_infill +jerk_wall_0 = =max(30, speed_wall_0/2) +machine_nozzle_cool_down_speed = 1.4 +machine_nozzle_heat_up_speed = 1.7 +material_extrusion_cool_down_speed = 0.7 +material_max_flowrate = 20 +optimize_wall_printing_order = False +prime_tower_enable = False +retraction_amount = 8 +retraction_prime_speed = 15 +retraction_speed = 45 +small_skin_on_surface = False +small_skin_width = 4 +speed_infill = =speed_print +speed_ironing = 20 +speed_layer_0 = 30 +speed_prime_tower = =speed_wall_0 +speed_print = 100 +speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_support_interface = =speed_wall_0 +speed_topbottom = =speed_print +speed_wall = =speed_infill +speed_wall_0 = =math.ceil(speed_wall*(20/100)) +speed_wall_x = =speed_wall +speed_wall_x_roofing = =speed_roofing support_bottom_distance = =support_z_distance support_interface_enable = True +support_structure = tree support_top_distance = =support_z_distance -support_z_distance = =math.ceil(0.3/layer_height)*layer_height +support_z_distance = 0.3 +top_bottom_thickness = =max(1.2 , layer_height * 6) +wall_0_wipe_dist = 0.8 +z_seam_relative = True +z_seam_type = back +zig_zaggify_infill = True diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.15mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.15mm.inst.cfg index 201c663d5c..5d14f014b9 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.15mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.15mm.inst.cfg @@ -65,7 +65,7 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = =math.ceil(0.3/layer_height)*layer_height +support_z_distance = 0.3 top_bottom_thickness = =max(1.2 , layer_height * 6) wall_0_wipe_dist = 0.8 z_seam_relative = True diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.1mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.1mm.inst.cfg index 4a20bd76b3..d23a7b8cea 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.1mm.inst.cfg @@ -12,16 +12,62 @@ variant = AA 0.4 weight = 0 [values] -infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'triangles' -machine_nozzle_cool_down_speed = 0.85 -machine_nozzle_heat_up_speed = 1.5 -material_print_temperature = =default_material_print_temperature - 5 -speed_infill = =math.ceil(speed_print * 45 / 55) -speed_print = 55 -speed_topbottom = =math.ceil(speed_print * 30 / 55) -speed_wall = =math.ceil(speed_print * 30 / 55) +_plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0.2 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 1 +acceleration_infill = =acceleration_print +acceleration_ironing = 1000 +acceleration_layer_0 = =acceleration_wall_0 +acceleration_print = 3500 +acceleration_roofing = =acceleration_wall_0 +acceleration_topbottom = =acceleration_wall +acceleration_wall = =acceleration_infill +acceleration_wall_0 = 1500 +acceleration_wall_x = =acceleration_wall +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_speed = 30 +cool_min_layer_time = 4 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' +infill_sparse_density = 15 +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_wall_0 +jerk_print = =max(30, speed_print/2) +jerk_roofing = =jerk_wall_0 +jerk_topbottom = =jerk_wall +jerk_wall = =jerk_infill +jerk_wall_0 = =max(30, speed_wall_0/2) +machine_nozzle_cool_down_speed = 1.4 +machine_nozzle_heat_up_speed = 1.7 +material_extrusion_cool_down_speed = 0.7 +material_max_flowrate = 20 +optimize_wall_printing_order = False +prime_tower_enable = False +retraction_amount = 8 +retraction_prime_speed = 15 +retraction_speed = 45 +small_skin_on_surface = False +small_skin_width = 4 +speed_infill = =speed_print +speed_ironing = 20 +speed_layer_0 = 30 +speed_prime_tower = =speed_wall_0 +speed_print = 100 +speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_support_interface = =speed_wall_0 +speed_topbottom = =speed_print +speed_wall = =speed_infill +speed_wall_0 = =math.ceil(speed_wall*(20/100)) +speed_wall_x = =speed_wall +speed_wall_x_roofing = =speed_roofing support_bottom_distance = =support_z_distance support_interface_enable = True +support_structure = tree support_top_distance = =support_z_distance -support_z_distance = =math.ceil(0.3/layer_height)*layer_height +support_z_distance = 0.3 +top_bottom_thickness = =max(1.2 , layer_height * 6) +wall_0_wipe_dist = 0.8 +z_seam_relative = True +z_seam_type = back +zig_zaggify_infill = True diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.2mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.2mm.inst.cfg index 55696eccb4..8bfe117380 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.2mm.inst.cfg @@ -66,7 +66,7 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = =math.ceil(0.3/layer_height)*layer_height +support_z_distance = 0.3 top_bottom_thickness = =max(1.2 , layer_height * 6) wall_0_wipe_dist = 0.8 z_seam_relative = True diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.3mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.3mm.inst.cfg index fe3eeb67ad..83f1a65862 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.3mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.3mm.inst.cfg @@ -66,7 +66,7 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = =math.ceil(0.3/layer_height)*layer_height +support_z_distance = 0.3 top_bottom_thickness = =max(1.2 , layer_height * 6) wall_0_wipe_dist = 0.8 wall_line_width_0 = =line_width * (1 + magic_spiralize * 0.25) diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.06mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.06mm.inst.cfg index c2bb123d04..a9043c7372 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.06mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.06mm.inst.cfg @@ -12,18 +12,63 @@ variant = AA 0.4 weight = 1 [values] -machine_nozzle_cool_down_speed = 0.75 -machine_nozzle_heat_up_speed = 1.6 -material_print_temperature = =default_material_print_temperature - 5 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0.2 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 +acceleration_infill = =acceleration_print +acceleration_ironing = 1000 +acceleration_layer_0 = =acceleration_wall_0 +acceleration_print = 3500 +acceleration_roofing = =acceleration_wall_0 +acceleration_topbottom = =acceleration_wall +acceleration_wall = =acceleration_infill +acceleration_wall_0 = 1500 +acceleration_wall_x = =acceleration_wall +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_speed = 30 +cool_min_layer_time = 6 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' +infill_sparse_density = 15 +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_wall_0 +jerk_print = =max(30, speed_print/2) +jerk_roofing = =jerk_wall_0 +jerk_topbottom = =jerk_wall +jerk_wall = =jerk_infill +jerk_wall_0 = =max(30, speed_wall_0/2) +machine_nozzle_cool_down_speed = 1.3 +machine_nozzle_heat_up_speed = 1.9 +material_extrusion_cool_down_speed = 0.7 +material_max_flowrate = 12 +optimize_wall_printing_order = False prime_tower_enable = False raft_airgap = 0.25 +retraction_amount = 6.5 retraction_prime_speed = =retraction_speed -speed_print = 50 -speed_topbottom = =math.ceil(speed_print * 35 / 50) -speed_wall = =math.ceil(speed_print * 35 / 50) +retraction_speed = 45 +small_skin_on_surface = False +small_skin_width = 4 +speed_infill = =speed_print +speed_ironing = 20 +speed_layer_0 = 30 +speed_prime_tower = =speed_wall_0 +speed_print = 100 +speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_support_interface = =speed_wall_0 +speed_topbottom = =speed_print +speed_wall = =speed_infill +speed_wall_0 = =math.ceil(speed_wall*(20/100)) +speed_wall_x = =speed_wall +speed_wall_x_roofing = =speed_roofing support_bottom_distance = =support_z_distance support_interface_enable = True +support_structure = tree support_top_distance = =support_z_distance support_z_distance = =math.ceil(0.3/layer_height)*layer_height -top_bottom_thickness = 1 +top_bottom_thickness = =max(1 , layer_height * 5) +wall_0_wipe_dist = 0.8 +z_seam_relative = True +z_seam_type = back +zig_zaggify_infill = True diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.1mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.1mm.inst.cfg index 1e2820f565..4e451d4165 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.1mm.inst.cfg @@ -12,14 +12,63 @@ variant = AA 0.4 weight = 0 [values] -machine_nozzle_cool_down_speed = 0.75 -machine_nozzle_heat_up_speed = 1.6 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0.2 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 +acceleration_infill = =acceleration_print +acceleration_ironing = 1000 +acceleration_layer_0 = =acceleration_wall_0 +acceleration_print = 3500 +acceleration_roofing = =acceleration_wall_0 +acceleration_topbottom = =acceleration_wall +acceleration_wall = =acceleration_infill +acceleration_wall_0 = 1500 +acceleration_wall_x = =acceleration_wall +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_speed = 30 +cool_min_layer_time = 6 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' +infill_sparse_density = 15 +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_wall_0 +jerk_print = =max(30, speed_print/2) +jerk_roofing = =jerk_wall_0 +jerk_topbottom = =jerk_wall +jerk_wall = =jerk_infill +jerk_wall_0 = =max(30, speed_wall_0/2) +machine_nozzle_cool_down_speed = 1.3 +machine_nozzle_heat_up_speed = 1.9 +material_extrusion_cool_down_speed = 0.7 +material_max_flowrate = 12 +optimize_wall_printing_order = False prime_tower_enable = False raft_airgap = 0.25 +retraction_amount = 6.5 retraction_prime_speed = =retraction_speed +retraction_speed = 45 +small_skin_on_surface = False +small_skin_width = 4 +speed_infill = =speed_print +speed_ironing = 20 +speed_layer_0 = 30 +speed_prime_tower = =speed_wall_0 +speed_print = 100 +speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_support_interface = =speed_wall_0 +speed_topbottom = =speed_print +speed_wall = =speed_infill +speed_wall_0 = =math.ceil(speed_wall*(20/100)) +speed_wall_x = =speed_wall +speed_wall_x_roofing = =speed_roofing support_bottom_distance = =support_z_distance support_interface_enable = True +support_structure = tree support_top_distance = =support_z_distance support_z_distance = =math.ceil(0.3/layer_height)*layer_height -top_bottom_thickness = 1 +top_bottom_thickness = =max(1 , layer_height * 5) +wall_0_wipe_dist = 0.8 +z_seam_relative = True +z_seam_type = back +zig_zaggify_infill = True diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.06mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.06mm.inst.cfg index 595de835ba..641c1279e4 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.06mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.06mm.inst.cfg @@ -12,18 +12,63 @@ variant = AA 0.4 weight = 1 [values] -machine_nozzle_cool_down_speed = 0.75 -machine_nozzle_heat_up_speed = 1.6 -material_print_temperature = =default_material_print_temperature - 5 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0.2 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 +acceleration_infill = =acceleration_print +acceleration_ironing = 1000 +acceleration_layer_0 = =acceleration_wall_0 +acceleration_print = 3500 +acceleration_roofing = =acceleration_wall_0 +acceleration_topbottom = =acceleration_wall +acceleration_wall = =acceleration_infill +acceleration_wall_0 = 1500 +acceleration_wall_x = =acceleration_wall +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_speed = 30 +cool_min_layer_time = 6 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' +infill_sparse_density = 15 +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_wall_0 +jerk_print = =max(30, speed_print/2) +jerk_roofing = =jerk_wall_0 +jerk_topbottom = =jerk_wall +jerk_wall = =jerk_infill +jerk_wall_0 = =max(30, speed_wall_0/2) +machine_nozzle_cool_down_speed = 1.3 +machine_nozzle_heat_up_speed = 1.9 +material_extrusion_cool_down_speed = 0.7 +material_max_flowrate = 14 +optimize_wall_printing_order = False prime_tower_enable = False +raft_airgap = 0.25 +retraction_amount = 6.5 retraction_prime_speed = =retraction_speed -speed_print = 45 -speed_topbottom = =math.ceil(speed_print * 35 / 45) -speed_wall = =math.ceil(speed_print * 40 / 45) -speed_wall_0 = =math.ceil(speed_wall * 35 / 45) +retraction_speed = 45 +small_skin_on_surface = False +small_skin_width = 4 +speed_infill = =speed_print +speed_ironing = 20 +speed_layer_0 = 26 +speed_prime_tower = =speed_wall_0 +speed_print = 100 +speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_support_interface = =speed_wall_0 +speed_topbottom = =speed_print +speed_wall = =speed_infill +speed_wall_0 = =math.ceil(speed_wall*(20/100)) +speed_wall_x = =speed_wall +speed_wall_x_roofing = =speed_roofing support_bottom_distance = =support_z_distance support_interface_enable = True +support_structure = tree support_top_distance = =support_z_distance support_z_distance = =math.ceil(0.3/layer_height)*layer_height -top_bottom_thickness = 1.2 +top_bottom_thickness = =max(1 , layer_height * 5) +wall_0_wipe_dist = 0.8 +z_seam_relative = True +z_seam_type = back +zig_zaggify_infill = True diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.1mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.1mm.inst.cfg index 07c97a632f..35e8c0903c 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.1mm.inst.cfg @@ -12,18 +12,63 @@ variant = AA 0.4 weight = 0 [values] -machine_nozzle_cool_down_speed = 0.75 -machine_nozzle_heat_up_speed = 1.6 -material_print_temperature = =default_material_print_temperature - 5 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0.2 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 +acceleration_infill = =acceleration_print +acceleration_ironing = 1000 +acceleration_layer_0 = =acceleration_wall_0 +acceleration_print = 3500 +acceleration_roofing = =acceleration_wall_0 +acceleration_topbottom = =acceleration_wall +acceleration_wall = =acceleration_infill +acceleration_wall_0 = 1500 +acceleration_wall_x = =acceleration_wall +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_speed = 30 +cool_min_layer_time = 6 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' +infill_sparse_density = 15 +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_wall_0 +jerk_print = =max(30, speed_print/2) +jerk_roofing = =jerk_wall_0 +jerk_topbottom = =jerk_wall +jerk_wall = =jerk_infill +jerk_wall_0 = =max(30, speed_wall_0/2) +machine_nozzle_cool_down_speed = 1.3 +machine_nozzle_heat_up_speed = 1.9 +material_extrusion_cool_down_speed = 0.7 +material_max_flowrate = 14 +optimize_wall_printing_order = False prime_tower_enable = False +raft_airgap = 0.25 +retraction_amount = 6.5 retraction_prime_speed = =retraction_speed -speed_print = 45 -speed_topbottom = =math.ceil(speed_print * 35 / 45) -speed_wall = =math.ceil(speed_print * 40 / 45) -speed_wall_0 = =math.ceil(speed_wall * 35 / 45) +retraction_speed = 45 +small_skin_on_surface = False +small_skin_width = 4 +speed_infill = =speed_print +speed_ironing = 20 +speed_layer_0 = 26 +speed_prime_tower = =speed_wall_0 +speed_print = 100 +speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_support_interface = =speed_wall_0 +speed_topbottom = =speed_print +speed_wall = =speed_infill +speed_wall_0 = =math.ceil(speed_wall*(20/100)) +speed_wall_x = =speed_wall +speed_wall_x_roofing = =speed_roofing support_bottom_distance = =support_z_distance support_interface_enable = True +support_structure = tree support_top_distance = =support_z_distance support_z_distance = =math.ceil(0.3/layer_height)*layer_height -top_bottom_thickness = 1.2 +top_bottom_thickness = =max(1 , layer_height * 5) +wall_0_wipe_dist = 0.8 +z_seam_relative = True +z_seam_type = back +zig_zaggify_infill = True From 5f3e49bdbf4e54f74db0c3d780839c2b4b0b38de Mon Sep 17 00:00:00 2001 From: Paul Kuiper <46715907+pkuiper-ultimaker@users.noreply.github.com> Date: Thu, 18 Jan 2024 13:48:14 +0100 Subject: [PATCH 165/182] Restore old z support formula. PP-391 --- .../quality/ultimaker_s3/um_s3_aa0.25_um-abs_0.1mm.inst.cfg | 2 +- .../quality/ultimaker_s3/um_s3_aa0.25_um-petg_0.1mm.inst.cfg | 2 +- .../quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.06mm.inst.cfg | 2 +- .../quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.15mm.inst.cfg | 2 +- .../quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.1mm.inst.cfg | 2 +- .../quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.2mm.inst.cfg | 2 +- .../quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.3mm.inst.cfg | 2 +- .../quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.06mm.inst.cfg | 2 +- .../quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.15mm.inst.cfg | 2 +- .../quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.1mm.inst.cfg | 2 +- .../quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.2mm.inst.cfg | 2 +- .../quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.3mm.inst.cfg | 2 +- .../quality/ultimaker_s5/um_s5_aa0.25_um-abs_0.1mm.inst.cfg | 2 +- .../quality/ultimaker_s5/um_s5_aa0.25_um-petg_0.1mm.inst.cfg | 2 +- .../quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.06mm.inst.cfg | 2 +- .../quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.15mm.inst.cfg | 2 +- .../quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.1mm.inst.cfg | 2 +- .../quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.2mm.inst.cfg | 2 +- .../quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.3mm.inst.cfg | 2 +- .../quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.06mm.inst.cfg | 2 +- .../quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.15mm.inst.cfg | 2 +- .../quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.1mm.inst.cfg | 2 +- .../quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.2mm.inst.cfg | 2 +- .../quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.3mm.inst.cfg | 2 +- 24 files changed, 24 insertions(+), 24 deletions(-) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.25_um-abs_0.1mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.25_um-abs_0.1mm.inst.cfg index 24c5a1d9e6..3fc09bbc49 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.25_um-abs_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.25_um-abs_0.1mm.inst.cfg @@ -64,7 +64,7 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = 0.3 +support_z_distance = =math.ceil(0.3/layer_height)*layer_height top_bottom_thickness = =max(1.2 , layer_height * 6) wall_0_wipe_dist = 0.8 z_seam_relative = True diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.25_um-petg_0.1mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.25_um-petg_0.1mm.inst.cfg index e3965d9c5c..1aa26ebcfc 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.25_um-petg_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.25_um-petg_0.1mm.inst.cfg @@ -63,7 +63,7 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = 0.3 +support_z_distance = =math.ceil(0.3/layer_height)*layer_height top_bottom_thickness = =max(1.2 , layer_height * 6) wall_0_wipe_dist = 0.8 z_seam_relative = True diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.06mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.06mm.inst.cfg index de5e0faf2e..85dc32801e 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.06mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.06mm.inst.cfg @@ -65,7 +65,7 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = 0.3 +support_z_distance = =math.ceil(0.3/layer_height)*layer_height top_bottom_thickness = =max(1.2 , layer_height * 6) wall_0_wipe_dist = 0.8 z_seam_relative = True diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.15mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.15mm.inst.cfg index c39c6d42c8..ee0525c13e 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.15mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.15mm.inst.cfg @@ -66,7 +66,7 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = 0.3 +support_z_distance = =math.ceil(0.3/layer_height)*layer_height top_bottom_thickness = =max(1.2 , layer_height * 6) wall_0_wipe_dist = 0.8 z_seam_relative = True diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.1mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.1mm.inst.cfg index 08bb2befdf..ca1d9d7afc 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.1mm.inst.cfg @@ -65,7 +65,7 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = 0.3 +support_z_distance = =math.ceil(0.3/layer_height)*layer_height top_bottom_thickness = =max(1.2 , layer_height * 6) wall_0_wipe_dist = 0.8 z_seam_relative = True diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.2mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.2mm.inst.cfg index 9d67113da0..57413c4b30 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.2mm.inst.cfg @@ -67,7 +67,7 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = 0.3 +support_z_distance = =math.ceil(0.3/layer_height)*layer_height top_bottom_thickness = =max(1.2 , layer_height * 6) wall_0_wipe_dist = 0.8 z_seam_relative = True diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.3mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.3mm.inst.cfg index fc6aa8c5fa..0052ce90cd 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.3mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.3mm.inst.cfg @@ -67,7 +67,7 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = 0.3 +support_z_distance = =math.ceil(0.3/layer_height)*layer_height top_bottom_thickness = =max(1.2 , layer_height * 6) wall_0_wipe_dist = 0.8 wall_line_width_0 = =line_width * (1 + magic_spiralize * 0.25) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.06mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.06mm.inst.cfg index 7eb5de8b64..0e9ceaf9e3 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.06mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.06mm.inst.cfg @@ -64,7 +64,7 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = 0.3 +support_z_distance = =math.ceil(0.3/layer_height)*layer_height top_bottom_thickness = =max(1.2 , layer_height * 6) wall_0_wipe_dist = 0.8 z_seam_relative = True diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.15mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.15mm.inst.cfg index d4431382dd..8732c3ad63 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.15mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.15mm.inst.cfg @@ -65,7 +65,7 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = 0.3 +support_z_distance = =math.ceil(0.3/layer_height)*layer_height top_bottom_thickness = =max(1.2 , layer_height * 6) wall_0_wipe_dist = 0.8 z_seam_relative = True diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.1mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.1mm.inst.cfg index bb7de56356..6f8db11141 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.1mm.inst.cfg @@ -64,7 +64,7 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = 0.3 +support_z_distance = =math.ceil(0.3/layer_height)*layer_height top_bottom_thickness = =max(1.2 , layer_height * 6) wall_0_wipe_dist = 0.8 z_seam_relative = True diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.2mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.2mm.inst.cfg index 6b333e2f13..e7e50350c0 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.2mm.inst.cfg @@ -66,7 +66,7 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = 0.3 +support_z_distance = =math.ceil(0.3/layer_height)*layer_height top_bottom_thickness = =max(1.2 , layer_height * 6) wall_0_wipe_dist = 0.8 z_seam_relative = True diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.3mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.3mm.inst.cfg index d95b6de92f..5ecaa739db 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.3mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.3mm.inst.cfg @@ -66,7 +66,7 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = 0.3 +support_z_distance = =math.ceil(0.3/layer_height)*layer_height top_bottom_thickness = =max(1.2 , layer_height * 6) wall_0_wipe_dist = 0.8 wall_line_width_0 = =line_width * (1 + magic_spiralize * 0.25) diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.25_um-abs_0.1mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.25_um-abs_0.1mm.inst.cfg index 7b14730a66..39ceb39dce 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.25_um-abs_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.25_um-abs_0.1mm.inst.cfg @@ -64,7 +64,7 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = 0.3 +support_z_distance = =math.ceil(0.3/layer_height)*layer_height top_bottom_thickness = =max(1.2 , layer_height * 6) wall_0_wipe_dist = 0.8 z_seam_relative = True diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.25_um-petg_0.1mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.25_um-petg_0.1mm.inst.cfg index a2233703d4..82e07b6fdf 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.25_um-petg_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.25_um-petg_0.1mm.inst.cfg @@ -63,7 +63,7 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = 0.3 +support_z_distance = =math.ceil(0.3/layer_height)*layer_height top_bottom_thickness = =max(1.2 , layer_height * 6) wall_0_wipe_dist = 0.8 z_seam_relative = True diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.06mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.06mm.inst.cfg index c0b4799ca9..fbe230fb2e 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.06mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.06mm.inst.cfg @@ -65,7 +65,7 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = 0.3 +support_z_distance = =math.ceil(0.3/layer_height)*layer_height top_bottom_thickness = =max(1.2 , layer_height * 6) wall_0_wipe_dist = 0.8 z_seam_relative = True diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.15mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.15mm.inst.cfg index d430f867d8..9c7ceca13b 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.15mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.15mm.inst.cfg @@ -66,7 +66,7 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = 0.3 +support_z_distance = =math.ceil(0.3/layer_height)*layer_height top_bottom_thickness = =max(1.2 , layer_height * 6) wall_0_wipe_dist = 0.8 z_seam_relative = True diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.1mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.1mm.inst.cfg index b2c25e26c7..8ef78a6fb5 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.1mm.inst.cfg @@ -65,7 +65,7 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = 0.3 +support_z_distance = =math.ceil(0.3/layer_height)*layer_height top_bottom_thickness = =max(1.2 , layer_height * 6) wall_0_wipe_dist = 0.8 z_seam_relative = True diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.2mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.2mm.inst.cfg index 8a02dfe38c..f430e6bc16 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.2mm.inst.cfg @@ -67,7 +67,7 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = 0.3 +support_z_distance = =math.ceil(0.3/layer_height)*layer_height top_bottom_thickness = =max(1.2 , layer_height * 6) wall_0_wipe_dist = 0.8 z_seam_relative = True diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.3mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.3mm.inst.cfg index d1feed0b46..98ca8927b6 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.3mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.3mm.inst.cfg @@ -67,7 +67,7 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = 0.3 +support_z_distance = =math.ceil(0.3/layer_height)*layer_height top_bottom_thickness = =max(1.2 , layer_height * 6) wall_0_wipe_dist = 0.8 wall_line_width_0 = =line_width * (1 + magic_spiralize * 0.25) diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.06mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.06mm.inst.cfg index ef58c14663..aea8906877 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.06mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.06mm.inst.cfg @@ -64,7 +64,7 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = 0.3 +support_z_distance = =math.ceil(0.3/layer_height)*layer_height top_bottom_thickness = =max(1.2 , layer_height * 6) wall_0_wipe_dist = 0.8 z_seam_relative = True diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.15mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.15mm.inst.cfg index 5d14f014b9..201c663d5c 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.15mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.15mm.inst.cfg @@ -65,7 +65,7 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = 0.3 +support_z_distance = =math.ceil(0.3/layer_height)*layer_height top_bottom_thickness = =max(1.2 , layer_height * 6) wall_0_wipe_dist = 0.8 z_seam_relative = True diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.1mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.1mm.inst.cfg index d23a7b8cea..a9d239bf3a 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.1mm.inst.cfg @@ -64,7 +64,7 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = 0.3 +support_z_distance = =math.ceil(0.3/layer_height)*layer_height top_bottom_thickness = =max(1.2 , layer_height * 6) wall_0_wipe_dist = 0.8 z_seam_relative = True diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.2mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.2mm.inst.cfg index 8bfe117380..55696eccb4 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.2mm.inst.cfg @@ -66,7 +66,7 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = 0.3 +support_z_distance = =math.ceil(0.3/layer_height)*layer_height top_bottom_thickness = =max(1.2 , layer_height * 6) wall_0_wipe_dist = 0.8 z_seam_relative = True diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.3mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.3mm.inst.cfg index 83f1a65862..fe3eeb67ad 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.3mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.3mm.inst.cfg @@ -66,7 +66,7 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = 0.3 +support_z_distance = =math.ceil(0.3/layer_height)*layer_height top_bottom_thickness = =max(1.2 , layer_height * 6) wall_0_wipe_dist = 0.8 wall_line_width_0 = =line_width * (1 + magic_spiralize * 0.25) From 6b4ec29b41535b777f9934e1ce592aea74490aca Mon Sep 17 00:00:00 2001 From: Erwan MATHIEU Date: Thu, 18 Jan 2024 15:51:26 +0100 Subject: [PATCH 166/182] Add setting to activate monotonic raft top layer CURA-11438 --- resources/definitions/fdmprinter.def.json | 11 +++++++++++ resources/setting_visibility/expert.cfg | 1 + 2 files changed, 12 insertions(+) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 31a67d0122..be44eb7bb2 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -6453,6 +6453,17 @@ "settable_per_extruder": true, "limit_to_extruder": "raft_surface_extruder_nr" }, + "raft_surface_monotonic": + { + "label": "Monotonic Raft Top Surface Order", + "description": "Print raft top surface lines in an ordering that causes them to always overlap with adjacent lines in a single direction. This takes slightly more time to print, but makes the surface look more consistent, which is also visible on the model bottom surface.", + "type": "bool", + "default_value": false, + "enabled": "resolveOrValue('adhesion_type') == 'raft' and raft_surface_layers > 0", + "settable_per_mesh": false, + "settable_per_extruder": true, + "limit_to_extruder": "raft_surface_extruder_nr" + }, "raft_wall_count": { "label": "Raft Wall Count", diff --git a/resources/setting_visibility/expert.cfg b/resources/setting_visibility/expert.cfg index 2a71993998..52c08f70ba 100644 --- a/resources/setting_visibility/expert.cfg +++ b/resources/setting_visibility/expert.cfg @@ -340,6 +340,7 @@ raft_surface_layers raft_surface_thickness raft_surface_line_width raft_surface_line_spacing +raft_surface_monotonic raft_interface_layers raft_interface_thickness raft_interface_line_width From b8d1c885c7b3e642e44ba47476bb4f5962111f13 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Fri, 19 Jan 2024 08:31:49 +0100 Subject: [PATCH 167/182] Remove comment Mostly to force a build from a push action --- conanfile.py | 1 - 1 file changed, 1 deletion(-) diff --git a/conanfile.py b/conanfile.py index ca8427ad70..87e3377687 100644 --- a/conanfile.py +++ b/conanfile.py @@ -420,7 +420,6 @@ class CuraConan(ConanFile): ) if self.options.get_safe("enable_i18n", False) and self._i18n_options["extract"]: - # Update the po and pot files vb = VirtualBuildEnv(self) vb.generate() From 68aad33b5ddd664d364e02b2423f61a77d93afc2 Mon Sep 17 00:00:00 2001 From: "c.lamboo" Date: Fri, 19 Jan 2024 11:10:24 +0100 Subject: [PATCH 168/182] Bump version --- conandata.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conandata.yml b/conandata.yml index 9b0e2e337b..29976c0764 100644 --- a/conandata.yml +++ b/conandata.yml @@ -1,4 +1,4 @@ -version: "5.7.0-alpha.0" +version: "5.7.0-alpha.1" requirements: - "uranium/(latest)@ultimaker/testing" - "curaengine/(latest)@ultimaker/testing" From 54be46821dd27ddde593f06033ca5e1bb56f142b Mon Sep 17 00:00:00 2001 From: "c.lamboo" Date: Fri, 19 Jan 2024 13:12:02 +0100 Subject: [PATCH 169/182] Fix profile dropdown CURA-11559 --- resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml | 1 - 1 file changed, 1 deletion(-) diff --git a/resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml b/resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml index 4cc1e3034a..94e7a93442 100644 --- a/resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml +++ b/resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml @@ -160,7 +160,6 @@ Item ProfileWarningReset { id: profileWarningReset - width: parent.width anchors.right: parent.right anchors.verticalCenter: parent.verticalCenter fullWarning: false From 7afa2fc94a2d97a9d27ddc4d5c6c3dd5958e978f Mon Sep 17 00:00:00 2001 From: Sophist <3001893+Sophist-UK@users.noreply.github.com> Date: Fri, 19 Jan 2024 13:27:30 +0000 Subject: [PATCH 170/182] Stop Esc key from exiting full screen mode --- resources/qml/Actions.qml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/resources/qml/Actions.qml b/resources/qml/Actions.qml index 3717e778d3..a788c443af 100644 --- a/resources/qml/Actions.qml +++ b/resources/qml/Actions.qml @@ -109,7 +109,8 @@ Item Action { id: exitFullScreenAction - shortcut: StandardKey.Cancel + // Stop Esc key from exiting full screen mode + // shortcut: StandardKey.Cancel text: catalog.i18nc("@action:inmenu", "Exit Full Screen") icon.name: "view-fullscreen" } From d9a641faa3261417d645cd33f0787b187249ae2e Mon Sep 17 00:00:00 2001 From: Mariska <40423138+MariMakes@users.noreply.github.com> Date: Fri, 19 Jan 2024 15:18:20 +0100 Subject: [PATCH 171/182] Update Slicing Crash Template It now refers to the 5.7 Alpha that has Sentry to analyze slicing crashes --- .github/ISSUE_TEMPLATE/SlicingCrash.yaml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/SlicingCrash.yaml b/.github/ISSUE_TEMPLATE/SlicingCrash.yaml index 2fe0a2f63b..37a70354c6 100644 --- a/.github/ISSUE_TEMPLATE/SlicingCrash.yaml +++ b/.github/ISSUE_TEMPLATE/SlicingCrash.yaml @@ -5,6 +5,13 @@ body: - type: markdown attributes: value: | + ### 💥 Slicing Crash Analysis Tool 💥 + We are taking steps to analyze an increase in reported crashes more systematically. We'll need some help with that. 😇 + Before filling out the report below, we want you to try a special Cura 5.7 Alpha. + This version of Cura has an updated slicing engine that will automatically send a report to the Cura Team for analysis. + #### [You can find the downloads here](https://github.com/Ultimaker/Cura/discussions/18080) #### + If you still encounter a crash you are still welcome to report the issue so we can use your model as a test case, you can find instructions on how to do that below. + ### Project File **⚠️ Before you continue, we need your project file to troubleshoot a slicing crash.** It contains the printer and settings we need for troubleshooting. @@ -68,4 +75,3 @@ body: description: You can add the zip file and additional information that is relevant to the issue in the comments below. validations: required: true - From dc7e8998b43599208fa86c4432caef2eddd3aef0 Mon Sep 17 00:00:00 2001 From: Sophist <3001893+Sophist-UK@users.noreply.github.com> Date: Sat, 20 Jan 2024 09:53:39 +0000 Subject: [PATCH 172/182] Delete line rather than commenting --- resources/qml/Actions.qml | 2 -- 1 file changed, 2 deletions(-) diff --git a/resources/qml/Actions.qml b/resources/qml/Actions.qml index a788c443af..1be715164c 100644 --- a/resources/qml/Actions.qml +++ b/resources/qml/Actions.qml @@ -109,8 +109,6 @@ Item Action { id: exitFullScreenAction - // Stop Esc key from exiting full screen mode - // shortcut: StandardKey.Cancel text: catalog.i18nc("@action:inmenu", "Exit Full Screen") icon.name: "view-fullscreen" } From 86d5c945d0b2271f8c826ff9693833cfef189a39 Mon Sep 17 00:00:00 2001 From: Paul Kuiper <46715907+pkuiper-ultimaker@users.noreply.github.com> Date: Mon, 22 Jan 2024 11:42:30 +0100 Subject: [PATCH 173/182] Add cool fan speed = 0 to the initial layer of Ultimaker ABS. Fix high speed profile T-PLA (was still generic profile). Mistake in PP-391, but taken along in this PR. PP-422 --- .../um_s3_aa0.25_um-abs_0.1mm.inst.cfg | 1 + .../um_s3_aa0.25_um-tough-pla_0.1mm.inst.cfg | 64 +++++++++++++++---- .../um_s5_aa0.25_um-abs_0.1mm.inst.cfg | 1 + .../um_s5_aa0.25_um-tough-pla_0.1mm.inst.cfg | 64 +++++++++++++++---- 4 files changed, 108 insertions(+), 22 deletions(-) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.25_um-abs_0.1mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.25_um-abs_0.1mm.inst.cfg index 3fc09bbc49..8557b08b1b 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.25_um-abs_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.25_um-abs_0.1mm.inst.cfg @@ -27,6 +27,7 @@ acceleration_wall_x = =acceleration_wall bridge_skin_speed = =bridge_wall_speed bridge_sparse_infill_max_density = 50 bridge_wall_speed = 30 +cool_fan_speed_0 = 0 cool_min_layer_time = 4 infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' infill_sparse_density = 15 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.25_um-tough-pla_0.1mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.25_um-tough-pla_0.1mm.inst.cfg index 4ffc038ac5..d0d532f410 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.25_um-tough-pla_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.25_um-tough-pla_0.1mm.inst.cfg @@ -12,20 +12,62 @@ variant = AA 0.25 weight = 0 [values] -brim_width = 8 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0.2 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 +acceleration_infill = =acceleration_print +acceleration_ironing = 1000 +acceleration_layer_0 = =acceleration_wall_0 +acceleration_print = 3500 +acceleration_roofing = =acceleration_wall_0 +acceleration_topbottom = =acceleration_wall +acceleration_wall = =acceleration_infill +acceleration_wall_0 = 1500 +acceleration_wall_x = =acceleration_wall +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_speed = 30 +cool_min_layer_time = 6 infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' -machine_nozzle_cool_down_speed = 0.9 -machine_nozzle_heat_up_speed = 1.4 -material_print_temperature = =default_material_print_temperature - 5 -speed_print = 30 -speed_topbottom = =math.ceil(speed_print * 20 / 30) -speed_wall = =math.ceil(speed_print * 25 / 30) -speed_wall_0 = =math.ceil(speed_print * 20 / 30) +infill_sparse_density = 15 +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_wall_0 +jerk_print = =max(30, speed_print/2) +jerk_roofing = =jerk_wall_0 +jerk_topbottom = =jerk_wall +jerk_wall = =jerk_infill +jerk_wall_0 = =max(30, speed_wall_0/2) +machine_nozzle_cool_down_speed = 1.3 +machine_nozzle_heat_up_speed = 1.9 +material_extrusion_cool_down_speed = 0.7 +optimize_wall_printing_order = False +prime_tower_enable = False +raft_airgap = 0.25 +retraction_amount = 6.5 +retraction_prime_speed = =retraction_speed +retraction_speed = 45 +small_skin_on_surface = False +small_skin_width = 4 +speed_infill = =speed_print +speed_ironing = 20 +speed_layer_0 = 26 +speed_prime_tower = =speed_wall_0 +speed_print = 100 +speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_support_interface = =speed_wall_0 +speed_topbottom = =speed_print +speed_wall = =speed_infill +speed_wall_0 = =math.ceil(speed_wall*(20/100)) +speed_wall_x = =speed_wall +speed_wall_x_roofing = =speed_roofing support_bottom_distance = =support_z_distance support_interface_enable = True +support_structure = tree support_top_distance = =support_z_distance support_z_distance = =math.ceil(0.3/layer_height)*layer_height -top_bottom_thickness = 0.72 -wall_0_inset = 0.015 -wall_0_wipe_dist = 0.25 +top_bottom_thickness = =max(1 , layer_height * 5) +wall_0_wipe_dist = 0.8 +z_seam_relative = True +z_seam_type = back +zig_zaggify_infill = True diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.25_um-abs_0.1mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.25_um-abs_0.1mm.inst.cfg index 39ceb39dce..d725b5aa15 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.25_um-abs_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.25_um-abs_0.1mm.inst.cfg @@ -27,6 +27,7 @@ acceleration_wall_x = =acceleration_wall bridge_skin_speed = =bridge_wall_speed bridge_sparse_infill_max_density = 50 bridge_wall_speed = 30 +cool_fan_speed_0 = 0 cool_min_layer_time = 4 infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' infill_sparse_density = 15 diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.25_um-tough-pla_0.1mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.25_um-tough-pla_0.1mm.inst.cfg index a28e41553f..307869d494 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.25_um-tough-pla_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.25_um-tough-pla_0.1mm.inst.cfg @@ -12,20 +12,62 @@ variant = AA 0.25 weight = 0 [values] -brim_width = 8 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0.2 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 +acceleration_infill = =acceleration_print +acceleration_ironing = 1000 +acceleration_layer_0 = =acceleration_wall_0 +acceleration_print = 3500 +acceleration_roofing = =acceleration_wall_0 +acceleration_topbottom = =acceleration_wall +acceleration_wall = =acceleration_infill +acceleration_wall_0 = 1500 +acceleration_wall_x = =acceleration_wall +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_speed = 30 +cool_min_layer_time = 6 infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' -machine_nozzle_cool_down_speed = 0.9 -machine_nozzle_heat_up_speed = 1.4 -material_print_temperature = =default_material_print_temperature - 5 -speed_print = 30 -speed_topbottom = =math.ceil(speed_print * 20 / 30) -speed_wall = =math.ceil(speed_print * 25 / 30) -speed_wall_0 = =math.ceil(speed_print * 20 / 30) +infill_sparse_density = 15 +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_wall_0 +jerk_print = =max(30, speed_print/2) +jerk_roofing = =jerk_wall_0 +jerk_topbottom = =jerk_wall +jerk_wall = =jerk_infill +jerk_wall_0 = =max(30, speed_wall_0/2) +machine_nozzle_cool_down_speed = 1.3 +machine_nozzle_heat_up_speed = 1.9 +material_extrusion_cool_down_speed = 0.7 +optimize_wall_printing_order = False +prime_tower_enable = False +raft_airgap = 0.25 +retraction_amount = 6.5 +retraction_prime_speed = =retraction_speed +retraction_speed = 45 +small_skin_on_surface = False +small_skin_width = 4 +speed_infill = =speed_print +speed_ironing = 20 +speed_layer_0 = 26 +speed_prime_tower = =speed_wall_0 +speed_print = 100 +speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_support_interface = =speed_wall_0 +speed_topbottom = =speed_print +speed_wall = =speed_infill +speed_wall_0 = =math.ceil(speed_wall*(20/100)) +speed_wall_x = =speed_wall +speed_wall_x_roofing = =speed_roofing support_bottom_distance = =support_z_distance support_interface_enable = True +support_structure = tree support_top_distance = =support_z_distance support_z_distance = =math.ceil(0.3/layer_height)*layer_height -top_bottom_thickness = 0.72 -wall_0_inset = 0.015 -wall_0_wipe_dist = 0.25 +top_bottom_thickness = =max(1 , layer_height * 5) +wall_0_wipe_dist = 0.8 +z_seam_relative = True +z_seam_type = back +zig_zaggify_infill = True From 3f21bec38cac6b07ac2db17aba5bdc2f2cecbbfc Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Mon, 22 Jan 2024 13:35:58 +0100 Subject: [PATCH 174/182] pin gradual flow plugin --- conandata.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conandata.yml b/conandata.yml index 29976c0764..486a64c26e 100644 --- a/conandata.yml +++ b/conandata.yml @@ -4,7 +4,7 @@ requirements: - "curaengine/(latest)@ultimaker/testing" - "cura_binary_data/(latest)@ultimaker/testing" - "fdm_materials/(latest)@ultimaker/testing" - - "curaengine_plugin_gradual_flow/(latest)@ultimaker/stable" + - "curaengine_plugin_gradual_flow/0.1.0-beta.2" - "dulcificum/latest@ultimaker/testing" - "pysavitar/5.3.0" - "pynest2d/5.3.0" From 09a34f5155a9f5a6e71090ba5e33df3c16232313 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Mon, 22 Jan 2024 14:21:35 +0100 Subject: [PATCH 175/182] Fixed Unnecessary default_values Contributes to CURA-11575 --- resources/definitions/elegoo_neptune_4.def.json | 1 - resources/definitions/elegoo_neptune_4max.def.json | 1 - resources/definitions/elegoo_neptune_4plus.def.json | 1 - 3 files changed, 3 deletions(-) diff --git a/resources/definitions/elegoo_neptune_4.def.json b/resources/definitions/elegoo_neptune_4.def.json index ed4856f540..4484133bdb 100644 --- a/resources/definitions/elegoo_neptune_4.def.json +++ b/resources/definitions/elegoo_neptune_4.def.json @@ -11,7 +11,6 @@ { "acceleration_print": { - "default_value": 10000, "maximum_value_warning": "20000", "value": 10000 }, diff --git a/resources/definitions/elegoo_neptune_4max.def.json b/resources/definitions/elegoo_neptune_4max.def.json index c2f6aa708c..c12953959b 100644 --- a/resources/definitions/elegoo_neptune_4max.def.json +++ b/resources/definitions/elegoo_neptune_4max.def.json @@ -18,7 +18,6 @@ { "acceleration_print": { - "default_value": 2500, "maximum_value_warning": "15000", "value": 2500 }, diff --git a/resources/definitions/elegoo_neptune_4plus.def.json b/resources/definitions/elegoo_neptune_4plus.def.json index 0038e49641..7be4d1de97 100644 --- a/resources/definitions/elegoo_neptune_4plus.def.json +++ b/resources/definitions/elegoo_neptune_4plus.def.json @@ -18,7 +18,6 @@ { "acceleration_print": { - "default_value": 4000, "value": 4000 }, "machine_acceleration": { "value": 4000 }, From a41d8aae7f45683db2e8ac105ccfce7fa9bf32be Mon Sep 17 00:00:00 2001 From: jellespijker Date: Mon, 22 Jan 2024 13:22:32 +0000 Subject: [PATCH 176/182] Applied printer-linter format --- resources/definitions/elegoo_neptune_4plus.def.json | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/resources/definitions/elegoo_neptune_4plus.def.json b/resources/definitions/elegoo_neptune_4plus.def.json index 7be4d1de97..c11b99956f 100644 --- a/resources/definitions/elegoo_neptune_4plus.def.json +++ b/resources/definitions/elegoo_neptune_4plus.def.json @@ -16,10 +16,7 @@ }, "overrides": { - "acceleration_print": - { - "value": 4000 - }, + "acceleration_print": { "value": 4000 }, "machine_acceleration": { "value": 4000 }, "machine_depth": { "default_value": 330 }, "machine_height": { "default_value": 387 }, From 8af3de2178cee6dc7fb547c75d82b1c4de0bac85 Mon Sep 17 00:00:00 2001 From: "c.lamboo" Date: Tue, 23 Jan 2024 20:48:02 +0100 Subject: [PATCH 177/182] Fix `getInitialExtruder` code For the `skirt_brim_extruder_nr` setting it is possible for the setting to be -1; this means that we have no preference for extruder. This allowed us to implement the "multi-material brim". When we were requesting the initial extruder, and this value was set to -1 we were default to the 0-th extruder. However, this was incorrect in the situation where the first extruder is not used. Fixes #17501 --- cura/Settings/ExtruderManager.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/cura/Settings/ExtruderManager.py b/cura/Settings/ExtruderManager.py index 6a152ab51b..3ce83d27e3 100755 --- a/cura/Settings/ExtruderManager.py +++ b/cura/Settings/ExtruderManager.py @@ -316,7 +316,13 @@ class ExtruderManager(QObject): # Starts with the adhesion extruder. adhesion_type = global_stack.getProperty("adhesion_type", "value") if adhesion_type in {"skirt", "brim"}: - return max(0, int(global_stack.getProperty("skirt_brim_extruder_nr", "value"))) # optional skirt/brim extruder defaults to zero + skirt_brim_extruder_nr = global_stack.getProperty("skirt_brim_extruder_nr", "value") + # if the skirt_brim_extruder_nr is -1, then we use the first used extruder + if skirt_brim_extruder_nr == -1: + used_extruders = self.getUsedExtruderStacks() + return used_extruders[0].position + else: + return skirt_brim_extruder_nr if adhesion_type == "raft": return global_stack.getProperty("raft_base_extruder_nr", "value") From 6bafd13eaf8f688b9358eb7f155cdf4c673cb51e Mon Sep 17 00:00:00 2001 From: Erwan MATHIEU Date: Wed, 24 Jan 2024 12:46:25 +0100 Subject: [PATCH 178/182] Set proper value for raft monotonic surface CURA-11438 --- resources/definitions/fdmprinter.def.json | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index be44eb7bb2..03850a7344 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -6459,6 +6459,7 @@ "description": "Print raft top surface lines in an ordering that causes them to always overlap with adjacent lines in a single direction. This takes slightly more time to print, but makes the surface look more consistent, which is also visible on the model bottom surface.", "type": "bool", "default_value": false, + "value": "skin_monotonic", "enabled": "resolveOrValue('adhesion_type') == 'raft' and raft_surface_layers > 0", "settable_per_mesh": false, "settable_per_extruder": true, From c9449030290073aa80409cb1e9d33f8fe3db9429 Mon Sep 17 00:00:00 2001 From: Erwan MATHIEU Date: Wed, 24 Jan 2024 12:49:17 +0100 Subject: [PATCH 179/182] Fix crash after re-slicing CURA-11438 --- plugins/SimulationView/SimulationView.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/plugins/SimulationView/SimulationView.py b/plugins/SimulationView/SimulationView.py index c070c69939..2573c84cb9 100644 --- a/plugins/SimulationView/SimulationView.py +++ b/plugins/SimulationView/SimulationView.py @@ -372,7 +372,10 @@ class SimulationView(CuraView): self._minimum_path_num = min(self._minimum_path_num, self._current_path_num) # update _current time when the path is changed by user if self._current_path_num < self._max_paths and round(self._current_path_num)== self._current_path_num: - self._current_time = self.cumulativeLineDuration()[int(self._current_path_num)] + actual_path_num = int(self._current_path_num) + cumulative_line_duration = self.cumulativeLineDuration() + if actual_path_num < len(cumulative_line_duration): + self._current_time = cumulative_line_duration[actual_path_num] self._startUpdateTopLayers() self.currentPathNumChanged.emit() From 20becc170057b7ee1c972a218805e00c6ff8bd78 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Fri, 26 Jan 2024 12:49:37 +0100 Subject: [PATCH 180/182] Fix Python Installs about dialog It will now use the Python Virtual env --- conanfile.py | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/conanfile.py b/conanfile.py index 87e3377687..3b48442fa0 100644 --- a/conanfile.py +++ b/conanfile.py @@ -1,4 +1,5 @@ import os +from io import StringIO from pathlib import Path from jinja2 import Template @@ -150,6 +151,7 @@ class CuraConan(ConanFile): return "None" def _conan_installs(self): + self.output.info("Collecting conan installs") conan_installs = {} # list of conan installs @@ -161,13 +163,22 @@ class CuraConan(ConanFile): return conan_installs def _python_installs(self): + self.output.info("Collecting python installs") python_installs = {} # list of python installs - python_ins_cmd = f"python -c \"import pkg_resources; print(';'.join([(s.key+','+ s.version) for s in pkg_resources.working_set]))\"" - from six import StringIO + run_env = VirtualRunEnv(self) + env = run_env.environment() + env.prepend_path("PYTHONPATH", str(self._site_packages.as_posix())) + venv_vars = env.vars(self, scope = "run") + + outer = '"' if self.settings.os == "Windows" else "'" + inner = "'" if self.settings.os == "Windows" else '"' buffer = StringIO() - self.run(python_ins_cmd, run_environment= True, env = "conanrun", output=buffer) + with venv_vars.apply(): + self.run(f"""python -c {outer}import pkg_resources; print({inner};{inner}.join([(s.key+{inner},{inner}+ s.version) for s in pkg_resources.working_set])){outer}""", + env = "conanrun", + output = buffer) packages = str(buffer.getvalue()).split("-----------------\n") packages = packages[1].strip('\r\n').split(";") @@ -504,10 +515,14 @@ echo "CURA_APP_NAME={{ cura_app_name }}" >> ${{ env_prefix }}GITHUB_ENV if self.in_local_cache: self.runenv_info.append_path("PYTHONPATH", os.path.join(self.package_folder, "site-packages")) + self.env_info.PYTHONPATH.append(os.path.join(self.package_folder, "site-packages")) self.runenv_info.append_path("PYTHONPATH", os.path.join(self.package_folder, "plugins")) + self.env_info.PYTHONPATH.append(os.path.join(self.package_folder, "plugins")) else: self.runenv_info.append_path("PYTHONPATH", self.source_folder) + self.env_info.PYTHONPATH.append(self.source_folder) self.runenv_info.append_path("PYTHONPATH", os.path.join(self.source_folder, "plugins")) + self.env_info.PYTHONPATH.append(os.path.join(self.source_folder, "plugins")) def package_id(self): self.info.clear() From 3793d4acbef4b901d7c2c7b877016b0775192b28 Mon Sep 17 00:00:00 2001 From: nallath Date: Wed, 31 Jan 2024 12:38:21 +0000 Subject: [PATCH 181/182] Applied printer-linter format --- .../flashforge_adventurer3.def.json | 28 ++++---- .../flashforge_adventurer3c.def.json | 55 +++++++++------- .../flashforge_adventurer4.def.json | 56 +++++++++------- .../flashforge_adventurer4lite.def.json | 26 ++++---- .../flashforge_adventurer_base.def.json | 66 +++++++++---------- .../flashforge_adventurer_extruder_0.def.json | 30 ++++----- ...ashforge_adventurer3_abs_0.3_fine.inst.cfg | 33 +++++----- ...shforge_adventurer3_abs_0.3_vfine.inst.cfg | 33 +++++----- ...shforge_adventurer3_abs_0.4_draft.inst.cfg | 33 +++++----- ...ashforge_adventurer3_abs_0.4_fast.inst.cfg | 33 +++++----- ...ashforge_adventurer3_abs_0.4_fine.inst.cfg | 33 +++++----- ...hforge_adventurer3_abs_0.4_normal.inst.cfg | 33 +++++----- ...shforge_adventurer3_abs_0.4_vfast.inst.cfg | 33 +++++----- ...shforge_adventurer3_abs_0.4_vfine.inst.cfg | 33 +++++----- ...shforge_adventurer3_abs_0.6_draft.inst.cfg | 33 +++++----- ...ashforge_adventurer3_abs_0.6_fast.inst.cfg | 33 +++++----- ...shforge_adventurer3_abs_0.6_vfast.inst.cfg | 33 +++++----- ...ashforge_adventurer4_abs_0.3_fine.inst.cfg | 37 ++++++----- ...shforge_adventurer4_abs_0.3_vfine.inst.cfg | 37 ++++++----- ...shforge_adventurer4_abs_0.4_draft.inst.cfg | 37 ++++++----- ...ashforge_adventurer4_abs_0.4_fast.inst.cfg | 37 ++++++----- ...ashforge_adventurer4_abs_0.4_fine.inst.cfg | 37 ++++++----- ...hforge_adventurer4_abs_0.4_normal.inst.cfg | 37 ++++++----- ...shforge_adventurer4_abs_0.4_vfast.inst.cfg | 37 ++++++----- ...shforge_adventurer4_abs_0.4_vfine.inst.cfg | 37 ++++++----- ...shforge_adventurer4_abs_0.6_draft.inst.cfg | 37 ++++++----- ...ashforge_adventurer4_abs_0.6_fast.inst.cfg | 37 ++++++----- ...shforge_adventurer4_abs_0.6_vfast.inst.cfg | 37 ++++++----- ...ashforge_adventurer4_asa_0.4_fast.inst.cfg | 37 ++++++----- ...ashforge_adventurer4_asa_0.4_fine.inst.cfg | 37 ++++++----- ...hforge_adventurer4_asa_0.4_normal.inst.cfg | 37 ++++++----- .../flashforge_adventurer3_draft.inst.cfg | 41 ++++++------ .../flashforge_adventurer3_fast.inst.cfg | 41 ++++++------ .../flashforge_adventurer3_fine.inst.cfg | 41 ++++++------ .../flashforge_adventurer3_normal.inst.cfg | 41 ++++++------ .../flashforge_adventurer3_vfast.inst.cfg | 41 ++++++------ .../flashforge_adventurer3_vfine.inst.cfg | 41 ++++++------ .../flashforge_adventurer4_draft.inst.cfg | 37 ++++++----- .../flashforge_adventurer4_fast.inst.cfg | 37 ++++++----- .../flashforge_adventurer4_fine.inst.cfg | 37 ++++++----- .../flashforge_adventurer4_normal.inst.cfg | 37 ++++++----- .../flashforge_adventurer4_vfast.inst.cfg | 37 ++++++----- .../flashforge_adventurer4_vfine.inst.cfg | 37 ++++++----- ...ashforge_adventurer3_pc_0.4_draft.inst.cfg | 33 +++++----- ...lashforge_adventurer3_pc_0.4_fast.inst.cfg | 33 +++++----- ...shforge_adventurer3_pc_0.4_normal.inst.cfg | 33 +++++----- ...ashforge_adventurer3_pc_0.4_vfast.inst.cfg | 33 +++++----- ...ashforge_adventurer3_pc_0.6_draft.inst.cfg | 33 +++++----- ...lashforge_adventurer3_pc_0.6_fast.inst.cfg | 33 +++++----- ...ashforge_adventurer3_pc_0.6_vfast.inst.cfg | 33 +++++----- ...ashforge_adventurer4_pc_0.4_draft.inst.cfg | 37 ++++++----- ...lashforge_adventurer4_pc_0.4_fast.inst.cfg | 37 ++++++----- ...shforge_adventurer4_pc_0.4_normal.inst.cfg | 37 ++++++----- ...ashforge_adventurer4_pc_0.4_vfast.inst.cfg | 37 ++++++----- ...ashforge_adventurer4_pc_0.6_draft.inst.cfg | 37 ++++++----- ...lashforge_adventurer4_pc_0.6_fast.inst.cfg | 37 ++++++----- ...ashforge_adventurer4_pc_0.6_vfast.inst.cfg | 37 ++++++----- ...shforge_adventurer3_petg_0.3_fine.inst.cfg | 33 +++++----- ...hforge_adventurer3_petg_0.3_vfine.inst.cfg | 33 +++++----- ...hforge_adventurer3_petg_0.4_draft.inst.cfg | 33 +++++----- ...shforge_adventurer3_petg_0.4_fast.inst.cfg | 33 +++++----- ...shforge_adventurer3_petg_0.4_fine.inst.cfg | 33 +++++----- ...forge_adventurer3_petg_0.4_normal.inst.cfg | 33 +++++----- ...hforge_adventurer3_petg_0.4_vfast.inst.cfg | 33 +++++----- ...hforge_adventurer3_petg_0.4_vfine.inst.cfg | 33 +++++----- ...hforge_adventurer3_petg_0.6_draft.inst.cfg | 33 +++++----- ...shforge_adventurer3_petg_0.6_fast.inst.cfg | 33 +++++----- ...hforge_adventurer3_petg_0.6_vfast.inst.cfg | 33 +++++----- ...shforge_adventurer4_petg_0.3_fine.inst.cfg | 37 ++++++----- ...hforge_adventurer4_petg_0.3_vfine.inst.cfg | 37 ++++++----- ...hforge_adventurer4_petg_0.4_draft.inst.cfg | 37 ++++++----- ...shforge_adventurer4_petg_0.4_fast.inst.cfg | 37 ++++++----- ...shforge_adventurer4_petg_0.4_fine.inst.cfg | 37 ++++++----- ...forge_adventurer4_petg_0.4_normal.inst.cfg | 37 ++++++----- ...hforge_adventurer4_petg_0.4_vfast.inst.cfg | 37 ++++++----- ...hforge_adventurer4_petg_0.4_vfine.inst.cfg | 37 ++++++----- ...hforge_adventurer4_petg_0.6_draft.inst.cfg | 37 ++++++----- ...shforge_adventurer4_petg_0.6_fast.inst.cfg | 37 ++++++----- ...hforge_adventurer4_petg_0.6_vfast.inst.cfg | 37 ++++++----- ...ashforge_adventurer3_pla_0.3_fine.inst.cfg | 33 +++++----- ...shforge_adventurer3_pla_0.3_vfine.inst.cfg | 33 +++++----- ...shforge_adventurer3_pla_0.4_draft.inst.cfg | 33 +++++----- ...ashforge_adventurer3_pla_0.4_fast.inst.cfg | 33 +++++----- ...ashforge_adventurer3_pla_0.4_fine.inst.cfg | 33 +++++----- ...hforge_adventurer3_pla_0.4_normal.inst.cfg | 33 +++++----- ...shforge_adventurer3_pla_0.4_vfast.inst.cfg | 33 +++++----- ...shforge_adventurer3_pla_0.4_vfine.inst.cfg | 33 +++++----- ...shforge_adventurer3_pla_0.6_draft.inst.cfg | 33 +++++----- ...ashforge_adventurer3_pla_0.6_fast.inst.cfg | 33 +++++----- ...shforge_adventurer3_pla_0.6_vfast.inst.cfg | 33 +++++----- ...ashforge_adventurer4_pla_0.3_fine.inst.cfg | 37 ++++++----- ...shforge_adventurer4_pla_0.3_vfine.inst.cfg | 37 ++++++----- ...shforge_adventurer4_pla_0.4_draft.inst.cfg | 37 ++++++----- ...ashforge_adventurer4_pla_0.4_fast.inst.cfg | 37 ++++++----- ...ashforge_adventurer4_pla_0.4_fine.inst.cfg | 37 ++++++----- ...hforge_adventurer4_pla_0.4_normal.inst.cfg | 37 ++++++----- ...shforge_adventurer4_pla_0.4_vfast.inst.cfg | 37 ++++++----- ...shforge_adventurer4_pla_0.4_vfine.inst.cfg | 37 ++++++----- ...shforge_adventurer4_pla_0.6_draft.inst.cfg | 37 ++++++----- ...ashforge_adventurer4_pla_0.6_fast.inst.cfg | 37 ++++++----- ...shforge_adventurer4_pla_0.6_vfast.inst.cfg | 37 ++++++----- .../flashforge_adventurer3_0.3.inst.cfg | 25 +++---- .../flashforge_adventurer3_0.4.inst.cfg | 25 +++---- .../flashforge_adventurer3_0.6.inst.cfg | 25 +++---- .../flashforge_adventurer3c_0.3.inst.cfg | 25 +++---- .../flashforge_adventurer3c_0.4.inst.cfg | 25 +++---- .../flashforge_adventurer3c_0.6.inst.cfg | 25 +++---- .../flashforge_adventurer4_0.3.inst.cfg | 25 +++---- .../flashforge_adventurer4_0.4.inst.cfg | 25 +++---- .../flashforge_adventurer4_0.6.inst.cfg | 25 +++---- .../flashforge_adventurer4lite_0.3.inst.cfg | 25 +++---- .../flashforge_adventurer4lite_0.4.inst.cfg | 25 +++---- .../flashforge_adventurer4lite_0.6.inst.cfg | 25 +++---- 113 files changed, 2032 insertions(+), 1908 deletions(-) diff --git a/resources/definitions/flashforge_adventurer3.def.json b/resources/definitions/flashforge_adventurer3.def.json index 5787958401..a05a7d5b8f 100644 --- a/resources/definitions/flashforge_adventurer3.def.json +++ b/resources/definitions/flashforge_adventurer3.def.json @@ -1,15 +1,15 @@ -{ - "version": 2, - "name": "Adventurer 3", - "inherits": "flashforge_adventurer3c", - "metadata": - { - "author": "Jeremie-C", - "visible": true, - "supports_network_connection": true - }, - "overrides": - { - "machine_name": {"default_value": "Adventurer 3"} - } +{ + "version": 2, + "name": "Adventurer 3", + "inherits": "flashforge_adventurer3c", + "metadata": + { + "visible": true, + "author": "Jeremie-C", + "supports_network_connection": true + }, + "overrides": + { + "machine_name": { "default_value": "Adventurer 3" } + } } \ No newline at end of file diff --git a/resources/definitions/flashforge_adventurer3c.def.json b/resources/definitions/flashforge_adventurer3c.def.json index 9321c2ca40..f66e542591 100644 --- a/resources/definitions/flashforge_adventurer3c.def.json +++ b/resources/definitions/flashforge_adventurer3c.def.json @@ -1,24 +1,33 @@ -{ - "version": 2, - "name": "Adventurer 3C", - "inherits": "flashforge_adventurer_base", - "metadata": { - "author": "Jeremie-C", - "visible": true, - "quality_definition": "flashforge_adventurer3" - }, - "overrides": - { - "default_material_bed_temperature": {"maximum_value_warning": "100"}, - "gantry_height": {"value": "150"}, - "machine_center_is_zero": {"default_value": true}, - "machine_depth": {"default_value": 150}, - "machine_end_gcode": {"default_value": ";end gcode\nM104 S0 T0\nM140 S0 T0\nG162 Z F1800\nG28 X Y\nM132 X Y A B\nM652\nG91\nM18"}, - "machine_head_with_fans_polygon": {"default_value": [[-20, 10], [-20, -10], [10, 10], [10, -10]]}, - "machine_height": {"default_value": 150}, - "machine_name": {"default_value": "Adventurer 3C"}, - "machine_start_gcode": {"default_value": ";Start Gcode\nG28\nM132 X Y Z A B\nG1 Z50.000 F420\nG161 X Y F3300\nM7 T0\nM6 T0\nM651 S255\n;End Start"}, - "machine_width": {"default_value": 150}, - "speed_print": {"maximum_value_warning": 100} - } +{ + "version": 2, + "name": "Adventurer 3C", + "inherits": "flashforge_adventurer_base", + "metadata": + { + "visible": true, + "author": "Jeremie-C", + "quality_definition": "flashforge_adventurer3" + }, + "overrides": + { + "default_material_bed_temperature": { "maximum_value_warning": "100" }, + "gantry_height": { "value": "150" }, + "machine_center_is_zero": { "default_value": true }, + "machine_depth": { "default_value": 150 }, + "machine_end_gcode": { "default_value": ";end gcode\nM104 S0 T0\nM140 S0 T0\nG162 Z F1800\nG28 X Y\nM132 X Y A B\nM652\nG91\nM18" }, + "machine_head_with_fans_polygon": + { + "default_value": [ + [-20, 10], + [-20, -10], + [10, 10], + [10, -10] + ] + }, + "machine_height": { "default_value": 150 }, + "machine_name": { "default_value": "Adventurer 3C" }, + "machine_start_gcode": { "default_value": ";Start Gcode\nG28\nM132 X Y Z A B\nG1 Z50.000 F420\nG161 X Y F3300\nM7 T0\nM6 T0\nM651 S255\n;End Start" }, + "machine_width": { "default_value": 150 }, + "speed_print": { "maximum_value_warning": 100 } + } } \ No newline at end of file diff --git a/resources/definitions/flashforge_adventurer4.def.json b/resources/definitions/flashforge_adventurer4.def.json index d3b29c4f4a..2460051a9d 100644 --- a/resources/definitions/flashforge_adventurer4.def.json +++ b/resources/definitions/flashforge_adventurer4.def.json @@ -1,25 +1,33 @@ -{ - "version": 2, - "name": "Adventurer 4", - "inherits": "flashforge_adventurer_base", - "metadata": - { - "author": "Jeremie-C", - "visible": true, - "quality_definition": "flashforge_adventurer4", - "supports_network_connection": true - }, - "overrides": - { - "default_material_bed_temperature": {"maximum_value_warning": "110"}, - "gantry_height": {"value": "250"}, - "machine_depth": {"default_value": 200}, - "machine_end_gcode": {"default_value": ";End Gcode\nM104 S0 T0\nM140 S0 T0\nG162 Z F1800\nG28 X Y\nM132 X Y A B\nM652\nG91\nM18"}, - "machine_head_with_fans_polygon": {"default_value": [[-20, 10], [-20, -10], [10, 10], [10, -10]]}, - "machine_height": {"default_value": 250}, - "machine_name": {"default_value": "Adventurer 4"}, - "machine_start_gcode": {"default_value": ";Start Gcode\nG28\nM132 X Y Z A B\nG1 Z50.000 F420\nG161 X Y F3300\nM7 T0\nM6 T0\nM651 S255\n;End Start"}, - "machine_use_extruder_offset_to_offset_coords": {"default_value": false}, - "machine_width": {"default_value": 220} - } +{ + "version": 2, + "name": "Adventurer 4", + "inherits": "flashforge_adventurer_base", + "metadata": + { + "visible": true, + "author": "Jeremie-C", + "quality_definition": "flashforge_adventurer4", + "supports_network_connection": true + }, + "overrides": + { + "default_material_bed_temperature": { "maximum_value_warning": "110" }, + "gantry_height": { "value": "250" }, + "machine_depth": { "default_value": 200 }, + "machine_end_gcode": { "default_value": ";End Gcode\nM104 S0 T0\nM140 S0 T0\nG162 Z F1800\nG28 X Y\nM132 X Y A B\nM652\nG91\nM18" }, + "machine_head_with_fans_polygon": + { + "default_value": [ + [-20, 10], + [-20, -10], + [10, 10], + [10, -10] + ] + }, + "machine_height": { "default_value": 250 }, + "machine_name": { "default_value": "Adventurer 4" }, + "machine_start_gcode": { "default_value": ";Start Gcode\nG28\nM132 X Y Z A B\nG1 Z50.000 F420\nG161 X Y F3300\nM7 T0\nM6 T0\nM651 S255\n;End Start" }, + "machine_use_extruder_offset_to_offset_coords": { "default_value": false }, + "machine_width": { "default_value": 220 } + } } \ No newline at end of file diff --git a/resources/definitions/flashforge_adventurer4lite.def.json b/resources/definitions/flashforge_adventurer4lite.def.json index 05534793d8..f5b1975601 100644 --- a/resources/definitions/flashforge_adventurer4lite.def.json +++ b/resources/definitions/flashforge_adventurer4lite.def.json @@ -1,14 +1,14 @@ -{ - "version": 2, - "name": "Adventurer 4 Lite", - "inherits": "flashforge_adventurer4", - "metadata": - { - "author": "Jeremie-C", - "visible": true - }, - "overrides": - { - "machine_name": { "default_value": "Adventurer 4 Lite" } - } +{ + "version": 2, + "name": "Adventurer 4 Lite", + "inherits": "flashforge_adventurer4", + "metadata": + { + "visible": true, + "author": "Jeremie-C" + }, + "overrides": + { + "machine_name": { "default_value": "Adventurer 4 Lite" } + } } \ No newline at end of file diff --git a/resources/definitions/flashforge_adventurer_base.def.json b/resources/definitions/flashforge_adventurer_base.def.json index 7a31d6400f..c077a4584c 100644 --- a/resources/definitions/flashforge_adventurer_base.def.json +++ b/resources/definitions/flashforge_adventurer_base.def.json @@ -1,34 +1,34 @@ -{ - "version": 2, - "name": "Flashforge Adventurer Base", - "inherits": "fdmprinter", - "metadata": - { - "author": "Jeremie-C", - "manufacturer": "Flashforge", - "visible": false, - "file_formats": "application/gx;text/x-gcode", - "first_start_actions": ["MachineSettingsAction"], - "has_machine_quality": true, - "has_materials": true, - "has_variants": true, - "machine_extruder_trains": {"0": "flashforge_adventurer_extruder_0"}, - "preferred_material": "generic_pla", - "preferred_quality_type": "normal", - "preferred_variant_name": "0.4mm Nozzle", - "variants_name": "Nozzle Size" - }, - "overrides": - { - "adhesion_type": {"default_value": "skirt"}, - "default_material_print_temperature": {"maximum_value_warning": "265"}, - "layer_height": - { - "minimum_value_warning": "0.1", - "maximum_value_warning": "0.4" - }, - "machine_center_is_zero": {"default_value": true}, - "machine_gcode_flavor": {"default_value": "RepRap (Marlin/Sprinter)"}, - "machine_heated_bed": {"default_value": true} - } +{ + "version": 2, + "name": "Flashforge Adventurer Base", + "inherits": "fdmprinter", + "metadata": + { + "visible": false, + "author": "Jeremie-C", + "manufacturer": "Flashforge", + "file_formats": "application/gx;text/x-gcode", + "first_start_actions": [ "MachineSettingsAction" ], + "has_machine_quality": true, + "has_materials": true, + "has_variants": true, + "machine_extruder_trains": { "0": "flashforge_adventurer_extruder_0" }, + "preferred_material": "generic_pla", + "preferred_quality_type": "normal", + "preferred_variant_name": "0.4mm Nozzle", + "variants_name": "Nozzle Size" + }, + "overrides": + { + "adhesion_type": { "default_value": "skirt" }, + "default_material_print_temperature": { "maximum_value_warning": "265" }, + "layer_height": + { + "maximum_value_warning": "0.4", + "minimum_value_warning": "0.1" + }, + "machine_center_is_zero": { "default_value": true }, + "machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" }, + "machine_heated_bed": { "default_value": true } + } } \ No newline at end of file diff --git a/resources/extruders/flashforge_adventurer_extruder_0.def.json b/resources/extruders/flashforge_adventurer_extruder_0.def.json index d8b902a97b..232cf3f901 100644 --- a/resources/extruders/flashforge_adventurer_extruder_0.def.json +++ b/resources/extruders/flashforge_adventurer_extruder_0.def.json @@ -1,16 +1,16 @@ -{ - "version": 2, - "name": "Extruder", - "inherits": "fdmextruder", - "metadata": - { - "machine": "flashforge_adventurer_base", - "position": "0" - }, - "overrides": - { - "extruder_nr": { "default_value": 0 }, - "machine_nozzle_size": { "default_value": 0.4 }, - "material_diameter": { "default_value": 1.75 } - } +{ + "version": 2, + "name": "Extruder", + "inherits": "fdmextruder", + "metadata": + { + "machine": "flashforge_adventurer_base", + "position": "0" + }, + "overrides": + { + "extruder_nr": { "default_value": 0 }, + "machine_nozzle_size": { "default_value": 0.4 }, + "material_diameter": { "default_value": 1.75 } + } } \ No newline at end of file diff --git a/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.3_fine.inst.cfg b/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.3_fine.inst.cfg index 63488b25cf..a5a800486f 100644 --- a/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.3_fine.inst.cfg +++ b/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.3_fine.inst.cfg @@ -1,16 +1,17 @@ -[general] -definition = flashforge_adventurer3 -name = Fine -version = 4 - -[metadata] -material = generic_abs -quality_type = fine -setting_version = 22 -type = quality -variant = 0.3mm Nozzle -weight = 1 - -[values] -speed_print = 50 -speed_travel = 100 +[general] +definition = flashforge_adventurer3 +name = Fine +version = 4 + +[metadata] +material = generic_abs +quality_type = fine +setting_version = 22 +type = quality +variant = 0.3mm Nozzle +weight = 1 + +[values] +speed_print = 50 +speed_travel = 100 + diff --git a/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.3_vfine.inst.cfg b/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.3_vfine.inst.cfg index 466e76686a..316f5872a7 100644 --- a/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.3_vfine.inst.cfg +++ b/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.3_vfine.inst.cfg @@ -1,16 +1,17 @@ -[general] -definition = flashforge_adventurer3 -name = Very Fine -version = 4 - -[metadata] -material = generic_abs -quality_type = veryfine -setting_version = 22 -type = quality -variant = 0.3mm Nozzle -weight = 2 - -[values] -speed_print = 45 -speed_travel = 100 +[general] +definition = flashforge_adventurer3 +name = Very Fine +version = 4 + +[metadata] +material = generic_abs +quality_type = veryfine +setting_version = 22 +type = quality +variant = 0.3mm Nozzle +weight = 2 + +[values] +speed_print = 45 +speed_travel = 100 + diff --git a/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.4_draft.inst.cfg b/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.4_draft.inst.cfg index 678ab9d371..b322c2784a 100644 --- a/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.4_draft.inst.cfg +++ b/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.4_draft.inst.cfg @@ -1,16 +1,17 @@ -[general] -definition = flashforge_adventurer3 -name = Draft -version = 4 - -[metadata] -material = generic_abs -quality_type = draft -setting_version = 22 -type = quality -variant = 0.4mm Nozzle -weight = -3 - -[values] -speed_print = 70 -speed_travel = 90 +[general] +definition = flashforge_adventurer3 +name = Draft +version = 4 + +[metadata] +material = generic_abs +quality_type = draft +setting_version = 22 +type = quality +variant = 0.4mm Nozzle +weight = -3 + +[values] +speed_print = 70 +speed_travel = 90 + diff --git a/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.4_fast.inst.cfg b/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.4_fast.inst.cfg index 0b2e235d92..d329ebb4d9 100644 --- a/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.4_fast.inst.cfg +++ b/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.4_fast.inst.cfg @@ -1,16 +1,17 @@ -[general] -definition = flashforge_adventurer3 -name = Fast -version = 4 - -[metadata] -material = generic_abs -quality_type = fast -setting_version = 22 -type = quality -variant = 0.4mm Nozzle -weight = -1 - -[values] -speed_print = 60 -speed_travel = 80 +[general] +definition = flashforge_adventurer3 +name = Fast +version = 4 + +[metadata] +material = generic_abs +quality_type = fast +setting_version = 22 +type = quality +variant = 0.4mm Nozzle +weight = -1 + +[values] +speed_print = 60 +speed_travel = 80 + diff --git a/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.4_fine.inst.cfg b/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.4_fine.inst.cfg index b71dc27d96..0aacffffcc 100644 --- a/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.4_fine.inst.cfg +++ b/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.4_fine.inst.cfg @@ -1,16 +1,17 @@ -[general] -definition = flashforge_adventurer3 -name = Fine -version = 4 - -[metadata] -material = generic_abs -quality_type = fine -setting_version = 22 -type = quality -variant = 0.4mm Nozzle -weight = 1 - -[values] -speed_print = 40 -speed_travel = 70 +[general] +definition = flashforge_adventurer3 +name = Fine +version = 4 + +[metadata] +material = generic_abs +quality_type = fine +setting_version = 22 +type = quality +variant = 0.4mm Nozzle +weight = 1 + +[values] +speed_print = 40 +speed_travel = 70 + diff --git a/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.4_normal.inst.cfg b/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.4_normal.inst.cfg index 9641fb7bef..0a62fdc664 100644 --- a/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.4_normal.inst.cfg +++ b/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.4_normal.inst.cfg @@ -1,16 +1,17 @@ -[general] -definition = flashforge_adventurer3 -name = Standard -version = 4 - -[metadata] -material = generic_abs -quality_type = normal -setting_version = 22 -type = quality -variant = 0.4mm Nozzle -weight = 0 - -[values] -speed_print = 60 -speed_travel = 80 +[general] +definition = flashforge_adventurer3 +name = Standard +version = 4 + +[metadata] +material = generic_abs +quality_type = normal +setting_version = 22 +type = quality +variant = 0.4mm Nozzle +weight = 0 + +[values] +speed_print = 60 +speed_travel = 80 + diff --git a/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.4_vfast.inst.cfg b/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.4_vfast.inst.cfg index 5c1c0138e8..9ea811006d 100644 --- a/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.4_vfast.inst.cfg +++ b/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.4_vfast.inst.cfg @@ -1,16 +1,17 @@ -[general] -definition = flashforge_adventurer3 -name = Very Fast -version = 4 - -[metadata] -material = generic_abs -quality_type = veryfast -setting_version = 22 -type = quality -variant = 0.4mm Nozzle -weight = -2 - -[values] -speed_print = 60 -speed_travel = 90 +[general] +definition = flashforge_adventurer3 +name = Very Fast +version = 4 + +[metadata] +material = generic_abs +quality_type = veryfast +setting_version = 22 +type = quality +variant = 0.4mm Nozzle +weight = -2 + +[values] +speed_print = 60 +speed_travel = 90 + diff --git a/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.4_vfine.inst.cfg b/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.4_vfine.inst.cfg index 465ee99c88..9d0d042d37 100644 --- a/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.4_vfine.inst.cfg +++ b/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.4_vfine.inst.cfg @@ -1,16 +1,17 @@ -[general] -definition = flashforge_adventurer3 -name = Very Fine -version = 4 - -[metadata] -material = generic_abs -quality_type = veryfine -setting_version = 22 -type = quality -variant = 0.4mm Nozzle -weight = 2 - -[values] -speed_print = 35 -speed_travel = 70 +[general] +definition = flashforge_adventurer3 +name = Very Fine +version = 4 + +[metadata] +material = generic_abs +quality_type = veryfine +setting_version = 22 +type = quality +variant = 0.4mm Nozzle +weight = 2 + +[values] +speed_print = 35 +speed_travel = 70 + diff --git a/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.6_draft.inst.cfg b/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.6_draft.inst.cfg index 7fae92a487..469930cd21 100644 --- a/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.6_draft.inst.cfg +++ b/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.6_draft.inst.cfg @@ -1,16 +1,17 @@ -[general] -definition = flashforge_adventurer3 -name = Draft -version = 4 - -[metadata] -material = generic_abs -quality_type = draft -setting_version = 22 -type = quality -variant = 0.6mm Nozzle -weight = -3 - -[values] -speed_print = 55 -speed_travel = 100 +[general] +definition = flashforge_adventurer3 +name = Draft +version = 4 + +[metadata] +material = generic_abs +quality_type = draft +setting_version = 22 +type = quality +variant = 0.6mm Nozzle +weight = -3 + +[values] +speed_print = 55 +speed_travel = 100 + diff --git a/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.6_fast.inst.cfg b/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.6_fast.inst.cfg index 7f99640845..bd25742c2a 100644 --- a/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.6_fast.inst.cfg +++ b/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.6_fast.inst.cfg @@ -1,16 +1,17 @@ -[general] -definition = flashforge_adventurer3 -name = Fast -version = 4 - -[metadata] -material = generic_abs -quality_type = fast -setting_version = 22 -type = quality -variant = 0.6mm Nozzle -weight = -1 - -[values] -speed_print = 50 -speed_travel = 100 +[general] +definition = flashforge_adventurer3 +name = Fast +version = 4 + +[metadata] +material = generic_abs +quality_type = fast +setting_version = 22 +type = quality +variant = 0.6mm Nozzle +weight = -1 + +[values] +speed_print = 50 +speed_travel = 100 + diff --git a/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.6_vfast.inst.cfg b/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.6_vfast.inst.cfg index c0212259a1..691770bca3 100644 --- a/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.6_vfast.inst.cfg +++ b/resources/quality/flashforge/abs/flashforge_adventurer3_abs_0.6_vfast.inst.cfg @@ -1,16 +1,17 @@ -[general] -definition = flashforge_adventurer3 -name = Very Fast -version = 4 - -[metadata] -material = generic_abs -quality_type = veryfast -setting_version = 22 -type = quality -variant = 0.6mm Nozzle -weight = -2 - -[values] -speed_print = 50 -speed_travel = 100 +[general] +definition = flashforge_adventurer3 +name = Very Fast +version = 4 + +[metadata] +material = generic_abs +quality_type = veryfast +setting_version = 22 +type = quality +variant = 0.6mm Nozzle +weight = -2 + +[values] +speed_print = 50 +speed_travel = 100 + diff --git a/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.3_fine.inst.cfg b/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.3_fine.inst.cfg index ac6dfe5a33..9ad2fc4d39 100644 --- a/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.3_fine.inst.cfg +++ b/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.3_fine.inst.cfg @@ -1,18 +1,19 @@ -[general] -definition = flashforge_adventurer4 -name = Fine -version = 4 - -[metadata] -material = generic_abs -quality_type = fine -setting_version = 22 -type = quality -variant = 0.3mm Nozzle -weight = 1 - -[values] -speed_print = 50 -speed_travel = 100 -retraction_amount = 5 -retraction_speed = 30 +[general] +definition = flashforge_adventurer4 +name = Fine +version = 4 + +[metadata] +material = generic_abs +quality_type = fine +setting_version = 22 +type = quality +variant = 0.3mm Nozzle +weight = 1 + +[values] +retraction_amount = 5 +retraction_speed = 30 +speed_print = 50 +speed_travel = 100 + diff --git a/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.3_vfine.inst.cfg b/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.3_vfine.inst.cfg index 4c4a0873d3..69c626d03f 100644 --- a/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.3_vfine.inst.cfg +++ b/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.3_vfine.inst.cfg @@ -1,18 +1,19 @@ -[general] -definition = flashforge_adventurer4 -name = Very Fine -version = 4 - -[metadata] -material = generic_abs -quality_type = veryfine -setting_version = 22 -type = quality -variant = 0.3mm Nozzle -weight = 2 - -[values] -speed_print = 45 -speed_travel = 100 -retraction_amount = 5 -retraction_speed = 30 +[general] +definition = flashforge_adventurer4 +name = Very Fine +version = 4 + +[metadata] +material = generic_abs +quality_type = veryfine +setting_version = 22 +type = quality +variant = 0.3mm Nozzle +weight = 2 + +[values] +retraction_amount = 5 +retraction_speed = 30 +speed_print = 45 +speed_travel = 100 + diff --git a/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.4_draft.inst.cfg b/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.4_draft.inst.cfg index 62ad84398c..8d7a92f553 100644 --- a/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.4_draft.inst.cfg +++ b/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.4_draft.inst.cfg @@ -1,18 +1,19 @@ -[general] -definition = flashforge_adventurer4 -name = Draft -version = 4 - -[metadata] -material = generic_abs -quality_type = draft -setting_version = 22 -type = quality -variant = 0.4mm Nozzle -weight = -3 - -[values] -speed_print = 70 -speed_travel = 90 -retraction_amount = 5 -retraction_speed = 30 +[general] +definition = flashforge_adventurer4 +name = Draft +version = 4 + +[metadata] +material = generic_abs +quality_type = draft +setting_version = 22 +type = quality +variant = 0.4mm Nozzle +weight = -3 + +[values] +retraction_amount = 5 +retraction_speed = 30 +speed_print = 70 +speed_travel = 90 + diff --git a/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.4_fast.inst.cfg b/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.4_fast.inst.cfg index b15ad40f22..115387a815 100644 --- a/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.4_fast.inst.cfg +++ b/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.4_fast.inst.cfg @@ -1,18 +1,19 @@ -[general] -definition = flashforge_adventurer4 -name = Fast -version = 4 - -[metadata] -material = generic_abs -quality_type = fast -setting_version = 22 -type = quality -variant = 0.4mm Nozzle -weight = -1 - -[values] -speed_print = 60 -speed_travel = 80 -retraction_amount = 5 -retraction_speed = 30 +[general] +definition = flashforge_adventurer4 +name = Fast +version = 4 + +[metadata] +material = generic_abs +quality_type = fast +setting_version = 22 +type = quality +variant = 0.4mm Nozzle +weight = -1 + +[values] +retraction_amount = 5 +retraction_speed = 30 +speed_print = 60 +speed_travel = 80 + diff --git a/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.4_fine.inst.cfg b/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.4_fine.inst.cfg index 1d325765ff..46f3f2673b 100644 --- a/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.4_fine.inst.cfg +++ b/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.4_fine.inst.cfg @@ -1,18 +1,19 @@ -[general] -definition = flashforge_adventurer3 -name = Fine -version = 4 - -[metadata] -material = generic_abs -quality_type = fine -setting_version = 22 -type = quality -variant = 0.4mm Nozzle -weight = 1 - -[values] -speed_print = 40 -speed_travel = 70 -retraction_amount = 5 -retraction_speed = 30 +[general] +definition = flashforge_adventurer3 +name = Fine +version = 4 + +[metadata] +material = generic_abs +quality_type = fine +setting_version = 22 +type = quality +variant = 0.4mm Nozzle +weight = 1 + +[values] +retraction_amount = 5 +retraction_speed = 30 +speed_print = 40 +speed_travel = 70 + diff --git a/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.4_normal.inst.cfg b/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.4_normal.inst.cfg index c4e43d5eac..c0bc64550d 100644 --- a/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.4_normal.inst.cfg +++ b/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.4_normal.inst.cfg @@ -1,18 +1,19 @@ -[general] -definition = flashforge_adventurer4 -name = Standard -version = 4 - -[metadata] -material = generic_abs -quality_type = normal -setting_version = 22 -type = quality -variant = 0.4mm Nozzle -weight = 0 - -[values] -speed_print = 60 -speed_travel = 80 -retraction_amount = 5 -retraction_speed = 30 +[general] +definition = flashforge_adventurer4 +name = Standard +version = 4 + +[metadata] +material = generic_abs +quality_type = normal +setting_version = 22 +type = quality +variant = 0.4mm Nozzle +weight = 0 + +[values] +retraction_amount = 5 +retraction_speed = 30 +speed_print = 60 +speed_travel = 80 + diff --git a/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.4_vfast.inst.cfg b/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.4_vfast.inst.cfg index f3f8ada9d9..14ce91d9f3 100644 --- a/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.4_vfast.inst.cfg +++ b/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.4_vfast.inst.cfg @@ -1,18 +1,19 @@ -[general] -definition = flashforge_adventurer4 -name = Very Fast -version = 4 - -[metadata] -material = generic_abs -quality_type = veryfast -setting_version = 22 -type = quality -variant = 0.4mm Nozzle -weight = -2 - -[values] -speed_print = 60 -speed_travel = 90 -retraction_amount = 5 -retraction_speed = 30 +[general] +definition = flashforge_adventurer4 +name = Very Fast +version = 4 + +[metadata] +material = generic_abs +quality_type = veryfast +setting_version = 22 +type = quality +variant = 0.4mm Nozzle +weight = -2 + +[values] +retraction_amount = 5 +retraction_speed = 30 +speed_print = 60 +speed_travel = 90 + diff --git a/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.4_vfine.inst.cfg b/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.4_vfine.inst.cfg index 5eefe21407..cdb13c71d1 100644 --- a/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.4_vfine.inst.cfg +++ b/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.4_vfine.inst.cfg @@ -1,18 +1,19 @@ -[general] -definition = flashforge_adventurer4 -name = Very Fine -version = 4 - -[metadata] -material = generic_abs -quality_type = veryfine -setting_version = 22 -type = quality -variant = 0.4mm Nozzle -weight = 2 - -[values] -speed_print = 35 -speed_travel = 70 -retraction_amount = 5 -retraction_speed = 30 +[general] +definition = flashforge_adventurer4 +name = Very Fine +version = 4 + +[metadata] +material = generic_abs +quality_type = veryfine +setting_version = 22 +type = quality +variant = 0.4mm Nozzle +weight = 2 + +[values] +retraction_amount = 5 +retraction_speed = 30 +speed_print = 35 +speed_travel = 70 + diff --git a/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.6_draft.inst.cfg b/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.6_draft.inst.cfg index bf7f894937..77e222ddcd 100644 --- a/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.6_draft.inst.cfg +++ b/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.6_draft.inst.cfg @@ -1,18 +1,19 @@ -[general] -definition = flashforge_adventurer4 -name = Draft -version = 4 - -[metadata] -material = generic_abs -quality_type = draft -setting_version = 22 -type = quality -variant = 0.6mm Nozzle -weight = -3 - -[values] -speed_print = 55 -speed_travel = 100 -retraction_amount = 6 -retraction_speed = 30 +[general] +definition = flashforge_adventurer4 +name = Draft +version = 4 + +[metadata] +material = generic_abs +quality_type = draft +setting_version = 22 +type = quality +variant = 0.6mm Nozzle +weight = -3 + +[values] +retraction_amount = 6 +retraction_speed = 30 +speed_print = 55 +speed_travel = 100 + diff --git a/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.6_fast.inst.cfg b/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.6_fast.inst.cfg index e97b00157b..cb0dd441c2 100644 --- a/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.6_fast.inst.cfg +++ b/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.6_fast.inst.cfg @@ -1,18 +1,19 @@ -[general] -definition = flashforge_adventurer4 -name = Fast -version = 4 - -[metadata] -material = generic_abs -quality_type = fast -setting_version = 22 -type = quality -variant = 0.6mm Nozzle -weight = -1 - -[values] -speed_print = 50 -speed_travel = 100 -retraction_amount = 6 -retraction_speed = 30 +[general] +definition = flashforge_adventurer4 +name = Fast +version = 4 + +[metadata] +material = generic_abs +quality_type = fast +setting_version = 22 +type = quality +variant = 0.6mm Nozzle +weight = -1 + +[values] +retraction_amount = 6 +retraction_speed = 30 +speed_print = 50 +speed_travel = 100 + diff --git a/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.6_vfast.inst.cfg b/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.6_vfast.inst.cfg index 4ccdd81053..10055e2fa0 100644 --- a/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.6_vfast.inst.cfg +++ b/resources/quality/flashforge/abs/flashforge_adventurer4_abs_0.6_vfast.inst.cfg @@ -1,18 +1,19 @@ -[general] -definition = flashforge_adventurer3 -name = Very Fast -version = 4 - -[metadata] -material = generic_abs -quality_type = veryfast -setting_version = 22 -type = quality -variant = 0.6mm Nozzle -weight = -2 - -[values] -speed_print = 50 -speed_travel = 100 -retraction_amount = 6 -retraction_speed = 30 +[general] +definition = flashforge_adventurer3 +name = Very Fast +version = 4 + +[metadata] +material = generic_abs +quality_type = veryfast +setting_version = 22 +type = quality +variant = 0.6mm Nozzle +weight = -2 + +[values] +retraction_amount = 6 +retraction_speed = 30 +speed_print = 50 +speed_travel = 100 + diff --git a/resources/quality/flashforge/asa/flashforge_adventurer4_asa_0.4_fast.inst.cfg b/resources/quality/flashforge/asa/flashforge_adventurer4_asa_0.4_fast.inst.cfg index 5677c663f1..b85163b595 100644 --- a/resources/quality/flashforge/asa/flashforge_adventurer4_asa_0.4_fast.inst.cfg +++ b/resources/quality/flashforge/asa/flashforge_adventurer4_asa_0.4_fast.inst.cfg @@ -1,18 +1,19 @@ -[general] -definition = flashforge_adventurer4 -name = Fast -version = 4 - -[metadata] -material = generic_asa -quality_type = fast -setting_version = 22 -type = quality -variant = 0.4mm Nozzle -weight = -1 - -[values] -speed_print = 45 -speed_travel = 100 -retraction_amount = 4.5 -retraction_speed = 30 +[general] +definition = flashforge_adventurer4 +name = Fast +version = 4 + +[metadata] +material = generic_asa +quality_type = fast +setting_version = 22 +type = quality +variant = 0.4mm Nozzle +weight = -1 + +[values] +retraction_amount = 4.5 +retraction_speed = 30 +speed_print = 45 +speed_travel = 100 + diff --git a/resources/quality/flashforge/asa/flashforge_adventurer4_asa_0.4_fine.inst.cfg b/resources/quality/flashforge/asa/flashforge_adventurer4_asa_0.4_fine.inst.cfg index f9f6c6287d..a584b97724 100644 --- a/resources/quality/flashforge/asa/flashforge_adventurer4_asa_0.4_fine.inst.cfg +++ b/resources/quality/flashforge/asa/flashforge_adventurer4_asa_0.4_fine.inst.cfg @@ -1,18 +1,19 @@ -[general] -definition = flashforge_adventurer4 -name = Fine -version = 4 - -[metadata] -material = generic_asa -quality_type = fine -setting_version = 22 -type = quality -variant = 0.4mm Nozzle -weight = -1 - -[values] -speed_print = 35 -speed_travel = 100 -retraction_amount = 4.5 -retraction_speed = 30 +[general] +definition = flashforge_adventurer4 +name = Fine +version = 4 + +[metadata] +material = generic_asa +quality_type = fine +setting_version = 22 +type = quality +variant = 0.4mm Nozzle +weight = -1 + +[values] +retraction_amount = 4.5 +retraction_speed = 30 +speed_print = 35 +speed_travel = 100 + diff --git a/resources/quality/flashforge/asa/flashforge_adventurer4_asa_0.4_normal.inst.cfg b/resources/quality/flashforge/asa/flashforge_adventurer4_asa_0.4_normal.inst.cfg index ba9bb86f37..e976f9f7b4 100644 --- a/resources/quality/flashforge/asa/flashforge_adventurer4_asa_0.4_normal.inst.cfg +++ b/resources/quality/flashforge/asa/flashforge_adventurer4_asa_0.4_normal.inst.cfg @@ -1,18 +1,19 @@ -[general] -definition = flashforge_adventurer4 -name = Standard -version = 4 - -[metadata] -material = generic_asa -quality_type = normal -setting_version = 22 -type = quality -variant = 0.4mm Nozzle -weight = 0 - -[values] -speed_print = 40 -speed_travel = 100 -retraction_amount = 4.5 -retraction_speed = 30 +[general] +definition = flashforge_adventurer4 +name = Standard +version = 4 + +[metadata] +material = generic_asa +quality_type = normal +setting_version = 22 +type = quality +variant = 0.4mm Nozzle +weight = 0 + +[values] +retraction_amount = 4.5 +retraction_speed = 30 +speed_print = 40 +speed_travel = 100 + diff --git a/resources/quality/flashforge/flashforge_adventurer3_draft.inst.cfg b/resources/quality/flashforge/flashforge_adventurer3_draft.inst.cfg index 61123554fb..f1dd467a2b 100644 --- a/resources/quality/flashforge/flashforge_adventurer3_draft.inst.cfg +++ b/resources/quality/flashforge/flashforge_adventurer3_draft.inst.cfg @@ -1,20 +1,21 @@ -[general] -definition = flashforge_adventurer3 -name = Draft -version = 4 - -[metadata] -global_quality = True -quality_type = draft -setting_version = 22 -type = quality -weight = -3 - -[values] -layer_height = 0.4 -layer_height_0 = 0.4 -retraction_amount = 5 -retraction_speed = 25 -speed_infill = =speed_print -speed_layer_0 = 10 -speed_support = =math.ceil(speed_print * 0.6) +[general] +definition = flashforge_adventurer3 +name = Draft +version = 4 + +[metadata] +global_quality = True +quality_type = draft +setting_version = 22 +type = quality +weight = -3 + +[values] +layer_height = 0.4 +layer_height_0 = 0.4 +retraction_amount = 5 +retraction_speed = 25 +speed_infill = =speed_print +speed_layer_0 = 10 +speed_support = =math.ceil(speed_print * 0.6) + diff --git a/resources/quality/flashforge/flashforge_adventurer3_fast.inst.cfg b/resources/quality/flashforge/flashforge_adventurer3_fast.inst.cfg index f9d1cda998..300481cd3d 100644 --- a/resources/quality/flashforge/flashforge_adventurer3_fast.inst.cfg +++ b/resources/quality/flashforge/flashforge_adventurer3_fast.inst.cfg @@ -1,20 +1,21 @@ -[general] -definition = flashforge_adventurer3 -name = Fast -version = 4 - -[metadata] -global_quality = True -quality_type = fast -setting_version = 22 -type = quality -weight = -1 - -[values] -layer_height = 0.25 -layer_height_0 = 0.3 -retraction_amount = 5 -retraction_speed = 25 -speed_infill = =speed_print -speed_layer_0 = 10 -speed_support = =math.ceil(speed_print * 0.6) +[general] +definition = flashforge_adventurer3 +name = Fast +version = 4 + +[metadata] +global_quality = True +quality_type = fast +setting_version = 22 +type = quality +weight = -1 + +[values] +layer_height = 0.25 +layer_height_0 = 0.3 +retraction_amount = 5 +retraction_speed = 25 +speed_infill = =speed_print +speed_layer_0 = 10 +speed_support = =math.ceil(speed_print * 0.6) + diff --git a/resources/quality/flashforge/flashforge_adventurer3_fine.inst.cfg b/resources/quality/flashforge/flashforge_adventurer3_fine.inst.cfg index 2d0d2d5b81..553091b10a 100644 --- a/resources/quality/flashforge/flashforge_adventurer3_fine.inst.cfg +++ b/resources/quality/flashforge/flashforge_adventurer3_fine.inst.cfg @@ -1,20 +1,21 @@ -[general] -definition = flashforge_adventurer3 -name = Fine -version = 4 - -[metadata] -global_quality = True -quality_type = fine -setting_version = 22 -type = quality -weight = 1 - -[values] -layer_height = 0.15 -layer_height_0 = 0.23 -retraction_amount = 5 -retraction_speed = 25 -speed_infill = =speed_print -speed_layer_0 = 10 -speed_support = =math.ceil(speed_print * 0.6) +[general] +definition = flashforge_adventurer3 +name = Fine +version = 4 + +[metadata] +global_quality = True +quality_type = fine +setting_version = 22 +type = quality +weight = 1 + +[values] +layer_height = 0.15 +layer_height_0 = 0.23 +retraction_amount = 5 +retraction_speed = 25 +speed_infill = =speed_print +speed_layer_0 = 10 +speed_support = =math.ceil(speed_print * 0.6) + diff --git a/resources/quality/flashforge/flashforge_adventurer3_normal.inst.cfg b/resources/quality/flashforge/flashforge_adventurer3_normal.inst.cfg index b70f28c86f..438b2cc9fa 100644 --- a/resources/quality/flashforge/flashforge_adventurer3_normal.inst.cfg +++ b/resources/quality/flashforge/flashforge_adventurer3_normal.inst.cfg @@ -1,20 +1,21 @@ -[general] -definition = flashforge_adventurer3 -name = Standard -version = 4 - -[metadata] -global_quality = True -quality_type = normal -setting_version = 22 -type = quality -weight = 0 - -[values] -layer_height = 0.2 -layer_height_0 = 0.3 -retraction_amount = 5 -retraction_speed = 25 -speed_infill = =speed_print -speed_layer_0 = 10 -speed_support = =math.ceil(speed_print * 0.6) +[general] +definition = flashforge_adventurer3 +name = Standard +version = 4 + +[metadata] +global_quality = True +quality_type = normal +setting_version = 22 +type = quality +weight = 0 + +[values] +layer_height = 0.2 +layer_height_0 = 0.3 +retraction_amount = 5 +retraction_speed = 25 +speed_infill = =speed_print +speed_layer_0 = 10 +speed_support = =math.ceil(speed_print * 0.6) + diff --git a/resources/quality/flashforge/flashforge_adventurer3_vfast.inst.cfg b/resources/quality/flashforge/flashforge_adventurer3_vfast.inst.cfg index 3f6379a6f5..fba4eb1091 100644 --- a/resources/quality/flashforge/flashforge_adventurer3_vfast.inst.cfg +++ b/resources/quality/flashforge/flashforge_adventurer3_vfast.inst.cfg @@ -1,20 +1,21 @@ -[general] -definition = flashforge_adventurer3 -name = Very Fast -version = 4 - -[metadata] -global_quality = True -quality_type = veryfast -setting_version = 22 -type = quality -weight = -2 - -[values] -layer_height = 0.3 -layer_height_0 = 0.3 -retraction_amount = 5 -retraction_speed = 25 -speed_infill = =speed_print -speed_layer_0 = 10 -speed_support = =math.ceil(speed_print * 0.6) +[general] +definition = flashforge_adventurer3 +name = Very Fast +version = 4 + +[metadata] +global_quality = True +quality_type = veryfast +setting_version = 22 +type = quality +weight = -2 + +[values] +layer_height = 0.3 +layer_height_0 = 0.3 +retraction_amount = 5 +retraction_speed = 25 +speed_infill = =speed_print +speed_layer_0 = 10 +speed_support = =math.ceil(speed_print * 0.6) + diff --git a/resources/quality/flashforge/flashforge_adventurer3_vfine.inst.cfg b/resources/quality/flashforge/flashforge_adventurer3_vfine.inst.cfg index b2015d40ea..6ea52128be 100644 --- a/resources/quality/flashforge/flashforge_adventurer3_vfine.inst.cfg +++ b/resources/quality/flashforge/flashforge_adventurer3_vfine.inst.cfg @@ -1,20 +1,21 @@ -[general] -definition = flashforge_adventurer3 -name = Very Fine -version = 4 - -[metadata] -global_quality = True -quality_type = veryfine -setting_version = 22 -type = quality -weight = 2 - -[values] -layer_height = 0.1 -layer_height_0 = 0.18 -retraction_amount = 5 -retraction_speed = 25 -speed_infill = =speed_print -speed_layer_0 = 10 -speed_support = =math.ceil(speed_print * 0.6) +[general] +definition = flashforge_adventurer3 +name = Very Fine +version = 4 + +[metadata] +global_quality = True +quality_type = veryfine +setting_version = 22 +type = quality +weight = 2 + +[values] +layer_height = 0.1 +layer_height_0 = 0.18 +retraction_amount = 5 +retraction_speed = 25 +speed_infill = =speed_print +speed_layer_0 = 10 +speed_support = =math.ceil(speed_print * 0.6) + diff --git a/resources/quality/flashforge/flashforge_adventurer4_draft.inst.cfg b/resources/quality/flashforge/flashforge_adventurer4_draft.inst.cfg index b2f6dc976c..7ee52ca8a3 100644 --- a/resources/quality/flashforge/flashforge_adventurer4_draft.inst.cfg +++ b/resources/quality/flashforge/flashforge_adventurer4_draft.inst.cfg @@ -1,18 +1,19 @@ -[general] -definition = flashforge_adventurer4 -name = Draft -version = 4 - -[metadata] -global_quality = True -quality_type = draft -setting_version = 22 -type = quality -weight = -3 - -[values] -layer_height = 0.4 -layer_height_0 = 0.4 -speed_infill = =speed_print -speed_layer_0 = 10 -speed_support = =math.ceil(speed_print * 0.6) +[general] +definition = flashforge_adventurer4 +name = Draft +version = 4 + +[metadata] +global_quality = True +quality_type = draft +setting_version = 22 +type = quality +weight = -3 + +[values] +layer_height = 0.4 +layer_height_0 = 0.4 +speed_infill = =speed_print +speed_layer_0 = 10 +speed_support = =math.ceil(speed_print * 0.6) + diff --git a/resources/quality/flashforge/flashforge_adventurer4_fast.inst.cfg b/resources/quality/flashforge/flashforge_adventurer4_fast.inst.cfg index a0a38c3655..8be5e02e72 100644 --- a/resources/quality/flashforge/flashforge_adventurer4_fast.inst.cfg +++ b/resources/quality/flashforge/flashforge_adventurer4_fast.inst.cfg @@ -1,18 +1,19 @@ -[general] -definition = flashforge_adventurer4 -name = Fast -version = 4 - -[metadata] -global_quality = True -quality_type = fast -setting_version = 22 -type = quality -weight = -1 - -[values] -layer_height = 0.25 -layer_height_0 = 0.3 -speed_infill = =speed_print -speed_layer_0 = 10 -speed_support = =math.ceil(speed_print * 0.6) +[general] +definition = flashforge_adventurer4 +name = Fast +version = 4 + +[metadata] +global_quality = True +quality_type = fast +setting_version = 22 +type = quality +weight = -1 + +[values] +layer_height = 0.25 +layer_height_0 = 0.3 +speed_infill = =speed_print +speed_layer_0 = 10 +speed_support = =math.ceil(speed_print * 0.6) + diff --git a/resources/quality/flashforge/flashforge_adventurer4_fine.inst.cfg b/resources/quality/flashforge/flashforge_adventurer4_fine.inst.cfg index 8a5615287b..272e5bc69d 100644 --- a/resources/quality/flashforge/flashforge_adventurer4_fine.inst.cfg +++ b/resources/quality/flashforge/flashforge_adventurer4_fine.inst.cfg @@ -1,18 +1,19 @@ -[general] -definition = flashforge_adventurer4 -name = Fine -version = 4 - -[metadata] -global_quality = True -quality_type = fine -setting_version = 22 -type = quality -weight = 1 - -[values] -layer_height = 0.15 -layer_height_0 = 0.23 -speed_infill = =speed_print -speed_layer_0 = 10 -speed_support = =math.ceil(speed_print * 0.6) +[general] +definition = flashforge_adventurer4 +name = Fine +version = 4 + +[metadata] +global_quality = True +quality_type = fine +setting_version = 22 +type = quality +weight = 1 + +[values] +layer_height = 0.15 +layer_height_0 = 0.23 +speed_infill = =speed_print +speed_layer_0 = 10 +speed_support = =math.ceil(speed_print * 0.6) + diff --git a/resources/quality/flashforge/flashforge_adventurer4_normal.inst.cfg b/resources/quality/flashforge/flashforge_adventurer4_normal.inst.cfg index 64d0df68fc..4eb11924fe 100644 --- a/resources/quality/flashforge/flashforge_adventurer4_normal.inst.cfg +++ b/resources/quality/flashforge/flashforge_adventurer4_normal.inst.cfg @@ -1,18 +1,19 @@ -[general] -definition = flashforge_adventurer4 -name = Standard -version = 4 - -[metadata] -global_quality = True -quality_type = normal -setting_version = 22 -type = quality -weight = 0 - -[values] -layer_height = 0.2 -layer_height_0 = 0.3 -speed_infill = =speed_print -speed_layer_0 = 10 -speed_support = =math.ceil(speed_print * 0.6) +[general] +definition = flashforge_adventurer4 +name = Standard +version = 4 + +[metadata] +global_quality = True +quality_type = normal +setting_version = 22 +type = quality +weight = 0 + +[values] +layer_height = 0.2 +layer_height_0 = 0.3 +speed_infill = =speed_print +speed_layer_0 = 10 +speed_support = =math.ceil(speed_print * 0.6) + diff --git a/resources/quality/flashforge/flashforge_adventurer4_vfast.inst.cfg b/resources/quality/flashforge/flashforge_adventurer4_vfast.inst.cfg index 0b78e0e23e..a2e3718bd2 100644 --- a/resources/quality/flashforge/flashforge_adventurer4_vfast.inst.cfg +++ b/resources/quality/flashforge/flashforge_adventurer4_vfast.inst.cfg @@ -1,18 +1,19 @@ -[general] -definition = flashforge_adventurer4 -name = Very Fast -version = 4 - -[metadata] -global_quality = True -quality_type = veryfast -setting_version = 22 -type = quality -weight = -2 - -[values] -layer_height = 0.3 -layer_height_0 = 0.3 -speed_infill = =speed_print -speed_layer_0 = 10 -speed_support = =math.ceil(speed_print * 0.6) +[general] +definition = flashforge_adventurer4 +name = Very Fast +version = 4 + +[metadata] +global_quality = True +quality_type = veryfast +setting_version = 22 +type = quality +weight = -2 + +[values] +layer_height = 0.3 +layer_height_0 = 0.3 +speed_infill = =speed_print +speed_layer_0 = 10 +speed_support = =math.ceil(speed_print * 0.6) + diff --git a/resources/quality/flashforge/flashforge_adventurer4_vfine.inst.cfg b/resources/quality/flashforge/flashforge_adventurer4_vfine.inst.cfg index d3012d5975..f7eda2f194 100644 --- a/resources/quality/flashforge/flashforge_adventurer4_vfine.inst.cfg +++ b/resources/quality/flashforge/flashforge_adventurer4_vfine.inst.cfg @@ -1,18 +1,19 @@ -[general] -definition = flashforge_adventurer4 -name = Very Fine -version = 4 - -[metadata] -global_quality = True -quality_type = veryfine -setting_version = 22 -type = quality -weight = 2 - -[values] -layer_height = 0.1 -layer_height_0 = 0.18 -speed_infill = =speed_print -speed_layer_0 = 10 -speed_support = =math.ceil(speed_print * 0.6) +[general] +definition = flashforge_adventurer4 +name = Very Fine +version = 4 + +[metadata] +global_quality = True +quality_type = veryfine +setting_version = 22 +type = quality +weight = 2 + +[values] +layer_height = 0.1 +layer_height_0 = 0.18 +speed_infill = =speed_print +speed_layer_0 = 10 +speed_support = =math.ceil(speed_print * 0.6) + diff --git a/resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.4_draft.inst.cfg b/resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.4_draft.inst.cfg index 92467d9d57..03b8d5f74e 100644 --- a/resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.4_draft.inst.cfg +++ b/resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.4_draft.inst.cfg @@ -1,16 +1,17 @@ -[general] -definition = flashforge_adventurer3 -name = Draft -version = 4 - -[metadata] -material = generic_pc -quality_type = draft -setting_version = 22 -type = quality -variant = 0.4mm Nozzle -weight = -3 - -[values] -speed_print = 50 -speed_travel = 90 +[general] +definition = flashforge_adventurer3 +name = Draft +version = 4 + +[metadata] +material = generic_pc +quality_type = draft +setting_version = 22 +type = quality +variant = 0.4mm Nozzle +weight = -3 + +[values] +speed_print = 50 +speed_travel = 90 + diff --git a/resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.4_fast.inst.cfg b/resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.4_fast.inst.cfg index 85811430f4..0c4322dfee 100644 --- a/resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.4_fast.inst.cfg +++ b/resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.4_fast.inst.cfg @@ -1,16 +1,17 @@ -[general] -definition = flashforge_adventurer3 -name = Fast -version = 4 - -[metadata] -material = generic_pc -quality_type = fast -setting_version = 22 -type = quality -variant = 0.4mm Nozzle -weight = -1 - -[values] -speed_print = 40 -speed_travel = 80 +[general] +definition = flashforge_adventurer3 +name = Fast +version = 4 + +[metadata] +material = generic_pc +quality_type = fast +setting_version = 22 +type = quality +variant = 0.4mm Nozzle +weight = -1 + +[values] +speed_print = 40 +speed_travel = 80 + diff --git a/resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.4_normal.inst.cfg b/resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.4_normal.inst.cfg index 53431e511b..1047360ee7 100644 --- a/resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.4_normal.inst.cfg +++ b/resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.4_normal.inst.cfg @@ -1,16 +1,17 @@ -[general] -definition = flashforge_adventurer3 -name = Standard -version = 4 - -[metadata] -material = generic_pc -quality_type = normal -setting_version = 22 -type = quality -variant = 0.4mm Nozzle -weight = 0 - -[values] -speed_print = 40 -speed_travel = 80 +[general] +definition = flashforge_adventurer3 +name = Standard +version = 4 + +[metadata] +material = generic_pc +quality_type = normal +setting_version = 22 +type = quality +variant = 0.4mm Nozzle +weight = 0 + +[values] +speed_print = 40 +speed_travel = 80 + diff --git a/resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.4_vfast.inst.cfg b/resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.4_vfast.inst.cfg index 6d35450f90..cddd593db6 100644 --- a/resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.4_vfast.inst.cfg +++ b/resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.4_vfast.inst.cfg @@ -1,16 +1,17 @@ -[general] -definition = flashforge_adventurer3 -name = Very Fast -version = 4 - -[metadata] -material = generic_pc -quality_type = veryfast -setting_version = 22 -type = quality -variant = 0.4mm Nozzle -weight = -2 - -[values] -speed_print = 50 -speed_travel = 90 +[general] +definition = flashforge_adventurer3 +name = Very Fast +version = 4 + +[metadata] +material = generic_pc +quality_type = veryfast +setting_version = 22 +type = quality +variant = 0.4mm Nozzle +weight = -2 + +[values] +speed_print = 50 +speed_travel = 90 + diff --git a/resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.6_draft.inst.cfg b/resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.6_draft.inst.cfg index bf0c0cce2d..1742dbd9c3 100644 --- a/resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.6_draft.inst.cfg +++ b/resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.6_draft.inst.cfg @@ -1,16 +1,17 @@ -[general] -definition = flashforge_adventurer3 -name = Draft -version = 4 - -[metadata] -material = generic_pc -quality_type = draft -setting_version = 22 -type = quality -variant = 0.6mm Nozzle -weight = -3 - -[values] -speed_print = 60 -speed_travel = 100 +[general] +definition = flashforge_adventurer3 +name = Draft +version = 4 + +[metadata] +material = generic_pc +quality_type = draft +setting_version = 22 +type = quality +variant = 0.6mm Nozzle +weight = -3 + +[values] +speed_print = 60 +speed_travel = 100 + diff --git a/resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.6_fast.inst.cfg b/resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.6_fast.inst.cfg index c7599784fa..7e67c9f178 100644 --- a/resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.6_fast.inst.cfg +++ b/resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.6_fast.inst.cfg @@ -1,16 +1,17 @@ -[general] -definition = flashforge_adventurer3 -name = Fast -version = 4 - -[metadata] -material = generic_pc -quality_type = fast -setting_version = 22 -type = quality -variant = 0.6mm Nozzle -weight = -2 - -[values] -speed_print = 50 -speed_travel = 100 +[general] +definition = flashforge_adventurer3 +name = Fast +version = 4 + +[metadata] +material = generic_pc +quality_type = fast +setting_version = 22 +type = quality +variant = 0.6mm Nozzle +weight = -2 + +[values] +speed_print = 50 +speed_travel = 100 + diff --git a/resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.6_vfast.inst.cfg b/resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.6_vfast.inst.cfg index 7efde414c2..c3aecf6625 100644 --- a/resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.6_vfast.inst.cfg +++ b/resources/quality/flashforge/pc/flashforge_adventurer3_pc_0.6_vfast.inst.cfg @@ -1,16 +1,17 @@ -[general] -definition = flashforge_adventurer3 -name = Very Fast -version = 4 - -[metadata] -material = generic_pc -quality_type = veryfast -setting_version = 22 -type = quality -variant = 0.6mm Nozzle -weight = -2 - -[values] -speed_print = 50 -speed_travel = 100 +[general] +definition = flashforge_adventurer3 +name = Very Fast +version = 4 + +[metadata] +material = generic_pc +quality_type = veryfast +setting_version = 22 +type = quality +variant = 0.6mm Nozzle +weight = -2 + +[values] +speed_print = 50 +speed_travel = 100 + diff --git a/resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.4_draft.inst.cfg b/resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.4_draft.inst.cfg index a593db1ef2..c60aab1383 100644 --- a/resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.4_draft.inst.cfg +++ b/resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.4_draft.inst.cfg @@ -1,18 +1,19 @@ -[general] -definition = flashforge_adventurer4 -name = Draft -version = 4 - -[metadata] -material = generic_pc -quality_type = draft -setting_version = 22 -type = quality -variant = 0.4mm Nozzle -weight = -3 - -[values] -speed_print = 50 -speed_travel = 90 -retraction_amount = 6 -retraction_speed = 30 +[general] +definition = flashforge_adventurer4 +name = Draft +version = 4 + +[metadata] +material = generic_pc +quality_type = draft +setting_version = 22 +type = quality +variant = 0.4mm Nozzle +weight = -3 + +[values] +retraction_amount = 6 +retraction_speed = 30 +speed_print = 50 +speed_travel = 90 + diff --git a/resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.4_fast.inst.cfg b/resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.4_fast.inst.cfg index 7d7e937726..4a532fe98b 100644 --- a/resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.4_fast.inst.cfg +++ b/resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.4_fast.inst.cfg @@ -1,18 +1,19 @@ -[general] -definition = flashforge_adventurer4 -name = Fast -version = 4 - -[metadata] -material = generic_pc -quality_type = fast -setting_version = 22 -type = quality -variant = 0.4mm Nozzle -weight = -1 - -[values] -speed_print = 40 -speed_travel = 80 -retraction_amount = 6 -retraction_speed = 30 +[general] +definition = flashforge_adventurer4 +name = Fast +version = 4 + +[metadata] +material = generic_pc +quality_type = fast +setting_version = 22 +type = quality +variant = 0.4mm Nozzle +weight = -1 + +[values] +retraction_amount = 6 +retraction_speed = 30 +speed_print = 40 +speed_travel = 80 + diff --git a/resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.4_normal.inst.cfg b/resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.4_normal.inst.cfg index 0806db424e..b44810bae8 100644 --- a/resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.4_normal.inst.cfg +++ b/resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.4_normal.inst.cfg @@ -1,18 +1,19 @@ -[general] -definition = flashforge_adventurer4 -name = Standard -version = 4 - -[metadata] -material = generic_pc -quality_type = normal -setting_version = 22 -type = quality -variant = 0.4mm Nozzle -weight = 0 - -[values] -speed_print = 40 -speed_travel = 80 -retraction_amount = 6 -retraction_speed = 30 +[general] +definition = flashforge_adventurer4 +name = Standard +version = 4 + +[metadata] +material = generic_pc +quality_type = normal +setting_version = 22 +type = quality +variant = 0.4mm Nozzle +weight = 0 + +[values] +retraction_amount = 6 +retraction_speed = 30 +speed_print = 40 +speed_travel = 80 + diff --git a/resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.4_vfast.inst.cfg b/resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.4_vfast.inst.cfg index 3556c8bf06..042d303522 100644 --- a/resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.4_vfast.inst.cfg +++ b/resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.4_vfast.inst.cfg @@ -1,18 +1,19 @@ -[general] -definition = flashforge_adventurer4 -name = Very Fast -version = 4 - -[metadata] -material = generic_pc -quality_type = veryfast -setting_version = 22 -type = quality -variant = 0.4mm Nozzle -weight = -2 - -[values] -speed_print = 50 -speed_travel = 90 -retraction_amount = 6 -retraction_speed = 30 +[general] +definition = flashforge_adventurer4 +name = Very Fast +version = 4 + +[metadata] +material = generic_pc +quality_type = veryfast +setting_version = 22 +type = quality +variant = 0.4mm Nozzle +weight = -2 + +[values] +retraction_amount = 6 +retraction_speed = 30 +speed_print = 50 +speed_travel = 90 + diff --git a/resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.6_draft.inst.cfg b/resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.6_draft.inst.cfg index 4cd2861cbe..cb40e63d8c 100644 --- a/resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.6_draft.inst.cfg +++ b/resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.6_draft.inst.cfg @@ -1,18 +1,19 @@ -[general] -definition = flashforge_adventurer4 -name = Draft -version = 4 - -[metadata] -material = generic_pc -quality_type = draft -setting_version = 22 -type = quality -variant = 0.6mm Nozzle -weight = -3 - -[values] -speed_print = 60 -speed_travel = 100 -retraction_amount = 6 -retraction_speed = 30 +[general] +definition = flashforge_adventurer4 +name = Draft +version = 4 + +[metadata] +material = generic_pc +quality_type = draft +setting_version = 22 +type = quality +variant = 0.6mm Nozzle +weight = -3 + +[values] +retraction_amount = 6 +retraction_speed = 30 +speed_print = 60 +speed_travel = 100 + diff --git a/resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.6_fast.inst.cfg b/resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.6_fast.inst.cfg index 14e162a1fc..e66be5bc7e 100644 --- a/resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.6_fast.inst.cfg +++ b/resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.6_fast.inst.cfg @@ -1,18 +1,19 @@ -[general] -definition = flashforge_adventurer4 -name = Fast -version = 4 - -[metadata] -material = generic_pc -quality_type = fast -setting_version = 22 -type = quality -variant = 0.6mm Nozzle -weight = -2 - -[values] -speed_print = 50 -speed_travel = 100 -retraction_amount = 6 -retraction_speed = 30 +[general] +definition = flashforge_adventurer4 +name = Fast +version = 4 + +[metadata] +material = generic_pc +quality_type = fast +setting_version = 22 +type = quality +variant = 0.6mm Nozzle +weight = -2 + +[values] +retraction_amount = 6 +retraction_speed = 30 +speed_print = 50 +speed_travel = 100 + diff --git a/resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.6_vfast.inst.cfg b/resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.6_vfast.inst.cfg index f5a918d859..2d2d8bdbdc 100644 --- a/resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.6_vfast.inst.cfg +++ b/resources/quality/flashforge/pc/flashforge_adventurer4_pc_0.6_vfast.inst.cfg @@ -1,18 +1,19 @@ -[general] -definition = flashforge_adventurer4 -name = Very Fast -version = 4 - -[metadata] -material = generic_pc -quality_type = veryfast -setting_version = 22 -type = quality -variant = 0.6mm Nozzle -weight = -2 - -[values] -speed_print = 50 -speed_travel = 100 -retraction_amount = 6 -retraction_speed = 30 +[general] +definition = flashforge_adventurer4 +name = Very Fast +version = 4 + +[metadata] +material = generic_pc +quality_type = veryfast +setting_version = 22 +type = quality +variant = 0.6mm Nozzle +weight = -2 + +[values] +retraction_amount = 6 +retraction_speed = 30 +speed_print = 50 +speed_travel = 100 + diff --git a/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.3_fine.inst.cfg b/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.3_fine.inst.cfg index e640d316fe..3405adaae5 100644 --- a/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.3_fine.inst.cfg +++ b/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.3_fine.inst.cfg @@ -1,16 +1,17 @@ -[general] -definition = flashforge_adventurer3 -name = Fine -version = 4 - -[metadata] -material = generic_petg -quality_type = fine -setting_version = 22 -type = quality -variant = 0.3mm Nozzle -weight = 1 - -[values] -speed_print = 50 -speed_travel = 80 +[general] +definition = flashforge_adventurer3 +name = Fine +version = 4 + +[metadata] +material = generic_petg +quality_type = fine +setting_version = 22 +type = quality +variant = 0.3mm Nozzle +weight = 1 + +[values] +speed_print = 50 +speed_travel = 80 + diff --git a/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.3_vfine.inst.cfg b/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.3_vfine.inst.cfg index 7ef3d79fe8..20e2ba9ce5 100644 --- a/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.3_vfine.inst.cfg +++ b/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.3_vfine.inst.cfg @@ -1,16 +1,17 @@ -[general] -definition = flashforge_adventurer3 -name = Very Fine -version = 4 - -[metadata] -material = generic_petg -quality_type = veryfine -setting_version = 22 -type = quality -variant = 0.3mm Nozzle -weight = 2 - -[values] -speed_print = 50 -speed_travel = 80 +[general] +definition = flashforge_adventurer3 +name = Very Fine +version = 4 + +[metadata] +material = generic_petg +quality_type = veryfine +setting_version = 22 +type = quality +variant = 0.3mm Nozzle +weight = 2 + +[values] +speed_print = 50 +speed_travel = 80 + diff --git a/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.4_draft.inst.cfg b/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.4_draft.inst.cfg index c51711ca2d..45aebad245 100644 --- a/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.4_draft.inst.cfg +++ b/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.4_draft.inst.cfg @@ -1,16 +1,17 @@ -[general] -definition = flashforge_adventurer3 -name = Draft -version = 4 - -[metadata] -material = generic_petg -quality_type = draft -setting_version = 22 -type = quality -variant = 0.4mm Nozzle -weight = -3 - -[values] -speed_print = 65 -speed_travel = 100 +[general] +definition = flashforge_adventurer3 +name = Draft +version = 4 + +[metadata] +material = generic_petg +quality_type = draft +setting_version = 22 +type = quality +variant = 0.4mm Nozzle +weight = -3 + +[values] +speed_print = 65 +speed_travel = 100 + diff --git a/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.4_fast.inst.cfg b/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.4_fast.inst.cfg index abc16dfcb7..85ef922ea7 100644 --- a/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.4_fast.inst.cfg +++ b/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.4_fast.inst.cfg @@ -1,16 +1,17 @@ -[general] -definition = flashforge_adventurer3 -name = Fast -version = 4 - -[metadata] -material = generic_petg -quality_type = fast -setting_version = 22 -type = quality -variant = 0.4mm Nozzle -weight = -1 - -[values] -speed_print = 55 -speed_travel = 85 +[general] +definition = flashforge_adventurer3 +name = Fast +version = 4 + +[metadata] +material = generic_petg +quality_type = fast +setting_version = 22 +type = quality +variant = 0.4mm Nozzle +weight = -1 + +[values] +speed_print = 55 +speed_travel = 85 + diff --git a/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.4_fine.inst.cfg b/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.4_fine.inst.cfg index 6c39de897c..ec8d0e4d04 100644 --- a/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.4_fine.inst.cfg +++ b/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.4_fine.inst.cfg @@ -1,16 +1,17 @@ -[general] -definition = flashforge_adventurer3 -name = Fine -version = 4 - -[metadata] -material = generic_petg -quality_type = fine -setting_version = 22 -type = quality -variant = 0.4mm Nozzle -weight = 1 - -[values] -speed_print = 40 -speed_travel = 80 +[general] +definition = flashforge_adventurer3 +name = Fine +version = 4 + +[metadata] +material = generic_petg +quality_type = fine +setting_version = 22 +type = quality +variant = 0.4mm Nozzle +weight = 1 + +[values] +speed_print = 40 +speed_travel = 80 + diff --git a/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.4_normal.inst.cfg b/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.4_normal.inst.cfg index be51926c7a..074d4864ce 100644 --- a/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.4_normal.inst.cfg +++ b/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.4_normal.inst.cfg @@ -1,16 +1,17 @@ -[general] -definition = flashforge_adventurer3 -name = Standard -version = 4 - -[metadata] -material = generic_petg -quality_type = normal -setting_version = 22 -type = quality -variant = 0.4mm Nozzle -weight = 0 - -[values] -speed_print = 50 -speed_travel = 80 +[general] +definition = flashforge_adventurer3 +name = Standard +version = 4 + +[metadata] +material = generic_petg +quality_type = normal +setting_version = 22 +type = quality +variant = 0.4mm Nozzle +weight = 0 + +[values] +speed_print = 50 +speed_travel = 80 + diff --git a/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.4_vfast.inst.cfg b/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.4_vfast.inst.cfg index 1d8286d204..66d2184562 100644 --- a/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.4_vfast.inst.cfg +++ b/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.4_vfast.inst.cfg @@ -1,16 +1,17 @@ -[general] -definition = flashforge_adventurer3 -name = Very Fast -version = 4 - -[metadata] -material = generic_petg -quality_type = veryfast -setting_version = 22 -type = quality -variant = 0.4mm Nozzle -weight = -2 - -[values] -speed_print = 60 -speed_travel = 90 +[general] +definition = flashforge_adventurer3 +name = Very Fast +version = 4 + +[metadata] +material = generic_petg +quality_type = veryfast +setting_version = 22 +type = quality +variant = 0.4mm Nozzle +weight = -2 + +[values] +speed_print = 60 +speed_travel = 90 + diff --git a/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.4_vfine.inst.cfg b/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.4_vfine.inst.cfg index d06baed13c..4f7d0da1c2 100644 --- a/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.4_vfine.inst.cfg +++ b/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.4_vfine.inst.cfg @@ -1,16 +1,17 @@ -[general] -definition = flashforge_adventurer3 -name = Very Fine -version = 4 - -[metadata] -material = generic_petg -quality_type = veryfine -setting_version = 22 -type = quality -variant = 0.4mm Nozzle -weight = 2 - -[values] -speed_print = 40 -speed_travel = 80 +[general] +definition = flashforge_adventurer3 +name = Very Fine +version = 4 + +[metadata] +material = generic_petg +quality_type = veryfine +setting_version = 22 +type = quality +variant = 0.4mm Nozzle +weight = 2 + +[values] +speed_print = 40 +speed_travel = 80 + diff --git a/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.6_draft.inst.cfg b/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.6_draft.inst.cfg index 2f54c96ea4..2f486d4d5d 100644 --- a/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.6_draft.inst.cfg +++ b/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.6_draft.inst.cfg @@ -1,16 +1,17 @@ -[general] -definition = flashforge_adventurer3 -name = Draft -version = 4 - -[metadata] -material = generic_petg -quality_type = draft -setting_version = 22 -type = quality -variant = 0.6mm Nozzle -weight = -3 - -[values] -speed_print = 65 -speed_travel = 100 +[general] +definition = flashforge_adventurer3 +name = Draft +version = 4 + +[metadata] +material = generic_petg +quality_type = draft +setting_version = 22 +type = quality +variant = 0.6mm Nozzle +weight = -3 + +[values] +speed_print = 65 +speed_travel = 100 + diff --git a/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.6_fast.inst.cfg b/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.6_fast.inst.cfg index aa55c43ad7..9ac7372049 100644 --- a/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.6_fast.inst.cfg +++ b/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.6_fast.inst.cfg @@ -1,16 +1,17 @@ -[general] -definition = flashforge_adventurer3 -name = Fast -version = 4 - -[metadata] -material = generic_petg -quality_type = fast -setting_version = 22 -type = quality -variant = 0.6mm Nozzle -weight = -1 - -[values] -speed_print = 50 -speed_travel = 100 +[general] +definition = flashforge_adventurer3 +name = Fast +version = 4 + +[metadata] +material = generic_petg +quality_type = fast +setting_version = 22 +type = quality +variant = 0.6mm Nozzle +weight = -1 + +[values] +speed_print = 50 +speed_travel = 100 + diff --git a/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.6_vfast.inst.cfg b/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.6_vfast.inst.cfg index cb226be3c4..744527c139 100644 --- a/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.6_vfast.inst.cfg +++ b/resources/quality/flashforge/petg/flashforge_adventurer3_petg_0.6_vfast.inst.cfg @@ -1,16 +1,17 @@ -[general] -definition = flashforge_adventurer3 -name = Very Fast -version = 4 - -[metadata] -material = generic_petg -quality_type = veryfast -setting_version = 22 -type = quality -variant = 0.6mm Nozzle -weight = -2 - -[values] -speed_print = 50 -speed_travel = 100 +[general] +definition = flashforge_adventurer3 +name = Very Fast +version = 4 + +[metadata] +material = generic_petg +quality_type = veryfast +setting_version = 22 +type = quality +variant = 0.6mm Nozzle +weight = -2 + +[values] +speed_print = 50 +speed_travel = 100 + diff --git a/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.3_fine.inst.cfg b/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.3_fine.inst.cfg index a17c8d9648..aeb666c82d 100644 --- a/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.3_fine.inst.cfg +++ b/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.3_fine.inst.cfg @@ -1,18 +1,19 @@ -[general] -definition = flashforge_adventurer4 -name = Fine -version = 4 - -[metadata] -material = generic_petg -quality_type = fine -setting_version = 22 -type = quality -variant = 0.3mm Nozzle -weight = 1 - -[values] -speed_print = 50 -speed_travel = 80 -retraction_amount = 5 -retraction_speed = 25 +[general] +definition = flashforge_adventurer4 +name = Fine +version = 4 + +[metadata] +material = generic_petg +quality_type = fine +setting_version = 22 +type = quality +variant = 0.3mm Nozzle +weight = 1 + +[values] +retraction_amount = 5 +retraction_speed = 25 +speed_print = 50 +speed_travel = 80 + diff --git a/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.3_vfine.inst.cfg b/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.3_vfine.inst.cfg index 5091364e72..cb0b7fba37 100644 --- a/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.3_vfine.inst.cfg +++ b/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.3_vfine.inst.cfg @@ -1,18 +1,19 @@ -[general] -definition = flashforge_adventurer4 -name = Very Fine -version = 4 - -[metadata] -material = generic_petg -quality_type = veryfine -setting_version = 22 -type = quality -variant = 0.3mm Nozzle -weight = 2 - -[values] -speed_print = 50 -speed_travel = 80 -retraction_amount = 5 -retraction_speed = 25 +[general] +definition = flashforge_adventurer4 +name = Very Fine +version = 4 + +[metadata] +material = generic_petg +quality_type = veryfine +setting_version = 22 +type = quality +variant = 0.3mm Nozzle +weight = 2 + +[values] +retraction_amount = 5 +retraction_speed = 25 +speed_print = 50 +speed_travel = 80 + diff --git a/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.4_draft.inst.cfg b/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.4_draft.inst.cfg index 3a14489559..ec08773052 100644 --- a/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.4_draft.inst.cfg +++ b/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.4_draft.inst.cfg @@ -1,18 +1,19 @@ -[general] -definition = flashforge_adventurer4 -name = Draft -version = 4 - -[metadata] -material = generic_petg -quality_type = draft -setting_version = 22 -type = quality -variant = 0.4mm Nozzle -weight = -3 - -[values] -speed_print = 65 -speed_travel = 100 -retraction_amount = 5 -retraction_speed = 25 +[general] +definition = flashforge_adventurer4 +name = Draft +version = 4 + +[metadata] +material = generic_petg +quality_type = draft +setting_version = 22 +type = quality +variant = 0.4mm Nozzle +weight = -3 + +[values] +retraction_amount = 5 +retraction_speed = 25 +speed_print = 65 +speed_travel = 100 + diff --git a/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.4_fast.inst.cfg b/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.4_fast.inst.cfg index b573bf5ea6..84be0afa3b 100644 --- a/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.4_fast.inst.cfg +++ b/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.4_fast.inst.cfg @@ -1,18 +1,19 @@ -[general] -definition = flashforge_adventurer4 -name = Fast -version = 4 - -[metadata] -material = generic_petg -quality_type = fast -setting_version = 22 -type = quality -variant = 0.4mm Nozzle -weight = -1 - -[values] -speed_print = 55 -speed_travel = 85 -retraction_amount = 5 -retraction_speed = 25 +[general] +definition = flashforge_adventurer4 +name = Fast +version = 4 + +[metadata] +material = generic_petg +quality_type = fast +setting_version = 22 +type = quality +variant = 0.4mm Nozzle +weight = -1 + +[values] +retraction_amount = 5 +retraction_speed = 25 +speed_print = 55 +speed_travel = 85 + diff --git a/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.4_fine.inst.cfg b/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.4_fine.inst.cfg index e00ff6968a..75bde3cd43 100644 --- a/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.4_fine.inst.cfg +++ b/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.4_fine.inst.cfg @@ -1,18 +1,19 @@ -[general] -definition = flashforge_adventurer4 -name = Fine -version = 4 - -[metadata] -material = generic_petg -quality_type = fine -setting_version = 22 -type = quality -variant = 0.4mm Nozzle -weight = 1 - -[values] -speed_print = 40 -speed_travel = 80 -retraction_amount = 5 -retraction_speed = 25 +[general] +definition = flashforge_adventurer4 +name = Fine +version = 4 + +[metadata] +material = generic_petg +quality_type = fine +setting_version = 22 +type = quality +variant = 0.4mm Nozzle +weight = 1 + +[values] +retraction_amount = 5 +retraction_speed = 25 +speed_print = 40 +speed_travel = 80 + diff --git a/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.4_normal.inst.cfg b/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.4_normal.inst.cfg index 56df96187f..5f37b1e812 100644 --- a/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.4_normal.inst.cfg +++ b/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.4_normal.inst.cfg @@ -1,18 +1,19 @@ -[general] -definition = flashforge_adventurer4 -name = Standard -version = 4 - -[metadata] -material = generic_petg -quality_type = normal -setting_version = 22 -type = quality -variant = 0.4mm Nozzle -weight = 0 - -[values] -speed_print = 50 -speed_travel = 80 -retraction_amount = 5 -retraction_speed = 25 +[general] +definition = flashforge_adventurer4 +name = Standard +version = 4 + +[metadata] +material = generic_petg +quality_type = normal +setting_version = 22 +type = quality +variant = 0.4mm Nozzle +weight = 0 + +[values] +retraction_amount = 5 +retraction_speed = 25 +speed_print = 50 +speed_travel = 80 + diff --git a/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.4_vfast.inst.cfg b/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.4_vfast.inst.cfg index 7001124129..844195d2df 100644 --- a/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.4_vfast.inst.cfg +++ b/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.4_vfast.inst.cfg @@ -1,18 +1,19 @@ -[general] -definition = flashforge_adventurer4 -name = Very Fast -version = 4 - -[metadata] -material = generic_petg -quality_type = veryfast -setting_version = 22 -type = quality -variant = 0.4mm Nozzle -weight = -2 - -[values] -speed_print = 60 -speed_travel = 90 -retraction_amount = 5 -retraction_speed = 25 +[general] +definition = flashforge_adventurer4 +name = Very Fast +version = 4 + +[metadata] +material = generic_petg +quality_type = veryfast +setting_version = 22 +type = quality +variant = 0.4mm Nozzle +weight = -2 + +[values] +retraction_amount = 5 +retraction_speed = 25 +speed_print = 60 +speed_travel = 90 + diff --git a/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.4_vfine.inst.cfg b/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.4_vfine.inst.cfg index a624956934..2eb93f1216 100644 --- a/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.4_vfine.inst.cfg +++ b/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.4_vfine.inst.cfg @@ -1,18 +1,19 @@ -[general] -definition = flashforge_adventurer4 -name = Very Fine -version = 4 - -[metadata] -material = generic_petg -quality_type = veryfine -setting_version = 22 -type = quality -variant = 0.4mm Nozzle -weight = 2 - -[values] -speed_print = 40 -speed_travel = 80 -retraction_amount = 5 -retraction_speed = 25 +[general] +definition = flashforge_adventurer4 +name = Very Fine +version = 4 + +[metadata] +material = generic_petg +quality_type = veryfine +setting_version = 22 +type = quality +variant = 0.4mm Nozzle +weight = 2 + +[values] +retraction_amount = 5 +retraction_speed = 25 +speed_print = 40 +speed_travel = 80 + diff --git a/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.6_draft.inst.cfg b/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.6_draft.inst.cfg index 5976fdf225..ff190b0e23 100644 --- a/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.6_draft.inst.cfg +++ b/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.6_draft.inst.cfg @@ -1,18 +1,19 @@ -[general] -definition = flashforge_adventurer4 -name = Draft -version = 4 - -[metadata] -material = generic_petg -quality_type = draft -setting_version = 22 -type = quality -variant = 0.6mm Nozzle -weight = -3 - -[values] -speed_print = 65 -speed_travel = 100 -retraction_amount = 5 -retraction_speed = 20 +[general] +definition = flashforge_adventurer4 +name = Draft +version = 4 + +[metadata] +material = generic_petg +quality_type = draft +setting_version = 22 +type = quality +variant = 0.6mm Nozzle +weight = -3 + +[values] +retraction_amount = 5 +retraction_speed = 20 +speed_print = 65 +speed_travel = 100 + diff --git a/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.6_fast.inst.cfg b/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.6_fast.inst.cfg index 39d500ea83..91d617d234 100644 --- a/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.6_fast.inst.cfg +++ b/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.6_fast.inst.cfg @@ -1,18 +1,19 @@ -[general] -definition = flashforge_adventurer4 -name = Fast -version = 4 - -[metadata] -material = generic_petg -quality_type = fast -setting_version = 22 -type = quality -variant = 0.6mm Nozzle -weight = -1 - -[values] -speed_print = 50 -speed_travel = 100 -retraction_amount = 5 -retraction_speed = 20 +[general] +definition = flashforge_adventurer4 +name = Fast +version = 4 + +[metadata] +material = generic_petg +quality_type = fast +setting_version = 22 +type = quality +variant = 0.6mm Nozzle +weight = -1 + +[values] +retraction_amount = 5 +retraction_speed = 20 +speed_print = 50 +speed_travel = 100 + diff --git a/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.6_vfast.inst.cfg b/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.6_vfast.inst.cfg index 0d7f397d7e..22647877b8 100644 --- a/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.6_vfast.inst.cfg +++ b/resources/quality/flashforge/petg/flashforge_adventurer4_petg_0.6_vfast.inst.cfg @@ -1,18 +1,19 @@ -[general] -definition = flashforge_adventurer4 -name = Very Fast -version = 4 - -[metadata] -material = generic_petg -quality_type = veryfast -setting_version = 22 -type = quality -variant = 0.6mm Nozzle -weight = -2 - -[values] -speed_print = 50 -speed_travel = 100 -retraction_amount = 5 -retraction_speed = 20 +[general] +definition = flashforge_adventurer4 +name = Very Fast +version = 4 + +[metadata] +material = generic_petg +quality_type = veryfast +setting_version = 22 +type = quality +variant = 0.6mm Nozzle +weight = -2 + +[values] +retraction_amount = 5 +retraction_speed = 20 +speed_print = 50 +speed_travel = 100 + diff --git a/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.3_fine.inst.cfg b/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.3_fine.inst.cfg index ee221f5814..6dbc8c55db 100644 --- a/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.3_fine.inst.cfg +++ b/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.3_fine.inst.cfg @@ -1,16 +1,17 @@ -[general] -definition = flashforge_adventurer3 -name = Fine -version = 4 - -[metadata] -material = generic_pla -quality_type = fine -setting_version = 22 -type = quality -variant = 0.3mm Nozzle -weight = 1 - -[values] -speed_print = 50 -speed_travel = 100 +[general] +definition = flashforge_adventurer3 +name = Fine +version = 4 + +[metadata] +material = generic_pla +quality_type = fine +setting_version = 22 +type = quality +variant = 0.3mm Nozzle +weight = 1 + +[values] +speed_print = 50 +speed_travel = 100 + diff --git a/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.3_vfine.inst.cfg b/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.3_vfine.inst.cfg index 10861d3ac8..690c3e6b84 100644 --- a/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.3_vfine.inst.cfg +++ b/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.3_vfine.inst.cfg @@ -1,16 +1,17 @@ -[general] -definition = flashforge_adventurer3 -name = Very Fine -version = 4 - -[metadata] -material = generic_pla -quality_type = veryfine -setting_version = 22 -type = quality -variant = 0.3mm Nozzle -weight = 2 - -[values] -speed_print = 45 -speed_travel = 100 +[general] +definition = flashforge_adventurer3 +name = Very Fine +version = 4 + +[metadata] +material = generic_pla +quality_type = veryfine +setting_version = 22 +type = quality +variant = 0.3mm Nozzle +weight = 2 + +[values] +speed_print = 45 +speed_travel = 100 + diff --git a/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.4_draft.inst.cfg b/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.4_draft.inst.cfg index b31667ce5f..6a4342197e 100644 --- a/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.4_draft.inst.cfg +++ b/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.4_draft.inst.cfg @@ -1,16 +1,17 @@ -[general] -definition = flashforge_adventurer3 -name = Draft -version = 4 - -[metadata] -material = generic_pla -quality_type = draft -setting_version = 22 -type = quality -variant = 0.4mm Nozzle -weight = -3 - -[values] -speed_print = 75 -speed_travel = 100 +[general] +definition = flashforge_adventurer3 +name = Draft +version = 4 + +[metadata] +material = generic_pla +quality_type = draft +setting_version = 22 +type = quality +variant = 0.4mm Nozzle +weight = -3 + +[values] +speed_print = 75 +speed_travel = 100 + diff --git a/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.4_fast.inst.cfg b/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.4_fast.inst.cfg index 1517fb9086..180e648dfd 100644 --- a/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.4_fast.inst.cfg +++ b/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.4_fast.inst.cfg @@ -1,16 +1,17 @@ -[general] -definition = flashforge_adventurer3 -name = Fast -version = 4 - -[metadata] -material = generic_pla -quality_type = fast -setting_version = 22 -type = quality -variant = 0.4mm Nozzle -weight = -1 - -[values] -speed_print = 65 -speed_travel = 100 +[general] +definition = flashforge_adventurer3 +name = Fast +version = 4 + +[metadata] +material = generic_pla +quality_type = fast +setting_version = 22 +type = quality +variant = 0.4mm Nozzle +weight = -1 + +[values] +speed_print = 65 +speed_travel = 100 + diff --git a/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.4_fine.inst.cfg b/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.4_fine.inst.cfg index b92f15246c..7e6dee0b1e 100644 --- a/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.4_fine.inst.cfg +++ b/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.4_fine.inst.cfg @@ -1,16 +1,17 @@ -[general] -definition = flashforge_adventurer3 -name = Fine -version = 4 - -[metadata] -material = generic_pla -quality_type = fine -setting_version = 22 -type = quality -variant = 0.4mm Nozzle -weight = 1 - -[values] -speed_print = 50 -speed_travel = 80 +[general] +definition = flashforge_adventurer3 +name = Fine +version = 4 + +[metadata] +material = generic_pla +quality_type = fine +setting_version = 22 +type = quality +variant = 0.4mm Nozzle +weight = 1 + +[values] +speed_print = 50 +speed_travel = 80 + diff --git a/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.4_normal.inst.cfg b/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.4_normal.inst.cfg index cb7476638b..06e24e078d 100644 --- a/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.4_normal.inst.cfg +++ b/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.4_normal.inst.cfg @@ -1,16 +1,17 @@ -[general] -definition = flashforge_adventurer3 -name = Standard -version = 4 - -[metadata] -material = generic_pla -quality_type = normal -setting_version = 22 -type = quality -variant = 0.4mm Nozzle -weight = 0 - -[values] -speed_print = 60 -speed_travel = 80 +[general] +definition = flashforge_adventurer3 +name = Standard +version = 4 + +[metadata] +material = generic_pla +quality_type = normal +setting_version = 22 +type = quality +variant = 0.4mm Nozzle +weight = 0 + +[values] +speed_print = 60 +speed_travel = 80 + diff --git a/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.4_vfast.inst.cfg b/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.4_vfast.inst.cfg index 970670b211..d82fb0cdad 100644 --- a/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.4_vfast.inst.cfg +++ b/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.4_vfast.inst.cfg @@ -1,16 +1,17 @@ -[general] -definition = flashforge_adventurer3 -name = Very Fast -version = 4 - -[metadata] -material = generic_pla -quality_type = veryfast -setting_version = 22 -type = quality -variant = 0.4mm Nozzle -weight = -2 - -[values] -speed_print = 70 -speed_travel = 100 +[general] +definition = flashforge_adventurer3 +name = Very Fast +version = 4 + +[metadata] +material = generic_pla +quality_type = veryfast +setting_version = 22 +type = quality +variant = 0.4mm Nozzle +weight = -2 + +[values] +speed_print = 70 +speed_travel = 100 + diff --git a/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.4_vfine.inst.cfg b/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.4_vfine.inst.cfg index a38658883b..dfd442d63c 100644 --- a/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.4_vfine.inst.cfg +++ b/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.4_vfine.inst.cfg @@ -1,16 +1,17 @@ -[general] -definition = flashforge_adventurer3 -name = Very Fine -version = 4 - -[metadata] -material = generic_pla -quality_type = veryfine -setting_version = 22 -type = quality -variant = 0.4mm Nozzle -weight = 2 - -[values] -speed_print = 40 -speed_travel = 70 +[general] +definition = flashforge_adventurer3 +name = Very Fine +version = 4 + +[metadata] +material = generic_pla +quality_type = veryfine +setting_version = 22 +type = quality +variant = 0.4mm Nozzle +weight = 2 + +[values] +speed_print = 40 +speed_travel = 70 + diff --git a/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.6_draft.inst.cfg b/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.6_draft.inst.cfg index 620302a481..4508444055 100644 --- a/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.6_draft.inst.cfg +++ b/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.6_draft.inst.cfg @@ -1,16 +1,17 @@ -[general] -definition = flashforge_adventurer3 -name = Draft -version = 4 - -[metadata] -material = generic_pla -quality_type = draft -setting_version = 22 -type = quality -variant = 0.6mm Nozzle -weight = -2 - -[values] -speed_print = 60 -speed_travel = 100 +[general] +definition = flashforge_adventurer3 +name = Draft +version = 4 + +[metadata] +material = generic_pla +quality_type = draft +setting_version = 22 +type = quality +variant = 0.6mm Nozzle +weight = -2 + +[values] +speed_print = 60 +speed_travel = 100 + diff --git a/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.6_fast.inst.cfg b/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.6_fast.inst.cfg index e2f91de812..782b74a7dc 100644 --- a/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.6_fast.inst.cfg +++ b/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.6_fast.inst.cfg @@ -1,16 +1,17 @@ -[general] -definition = flashforge_adventurer3 -name = Fast -version = 4 - -[metadata] -material = generic_pla -quality_type = fast -setting_version = 22 -type = quality -variant = 0.6mm Nozzle -weight = -1 - -[values] -speed_print = 50 -speed_travel = 100 +[general] +definition = flashforge_adventurer3 +name = Fast +version = 4 + +[metadata] +material = generic_pla +quality_type = fast +setting_version = 22 +type = quality +variant = 0.6mm Nozzle +weight = -1 + +[values] +speed_print = 50 +speed_travel = 100 + diff --git a/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.6_vfast.inst.cfg b/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.6_vfast.inst.cfg index b9f6ae4e88..22b74b6a25 100644 --- a/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.6_vfast.inst.cfg +++ b/resources/quality/flashforge/pla/flashforge_adventurer3_pla_0.6_vfast.inst.cfg @@ -1,16 +1,17 @@ -[general] -definition = flashforge_adventurer3 -name = Very Fast -version = 4 - -[metadata] -material = generic_pla -quality_type = veryfast -setting_version = 22 -type = quality -variant = 0.6mm Nozzle -weight = -2 - -[values] -speed_print = 55 -speed_travel = 100 +[general] +definition = flashforge_adventurer3 +name = Very Fast +version = 4 + +[metadata] +material = generic_pla +quality_type = veryfast +setting_version = 22 +type = quality +variant = 0.6mm Nozzle +weight = -2 + +[values] +speed_print = 55 +speed_travel = 100 + diff --git a/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.3_fine.inst.cfg b/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.3_fine.inst.cfg index 3ef15e1736..747f8a0076 100644 --- a/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.3_fine.inst.cfg +++ b/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.3_fine.inst.cfg @@ -1,18 +1,19 @@ -[general] -definition = flashforge_adventurer4 -name = Fine -version = 4 - -[metadata] -material = generic_pla -quality_type = fine -setting_version = 22 -type = quality -variant = 0.3mm Nozzle -weight = 1 - -[values] -speed_print = 50 -speed_travel = 100 -retraction_amount = 5 -retraction_speed = 30 +[general] +definition = flashforge_adventurer4 +name = Fine +version = 4 + +[metadata] +material = generic_pla +quality_type = fine +setting_version = 22 +type = quality +variant = 0.3mm Nozzle +weight = 1 + +[values] +retraction_amount = 5 +retraction_speed = 30 +speed_print = 50 +speed_travel = 100 + diff --git a/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.3_vfine.inst.cfg b/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.3_vfine.inst.cfg index cdd22c946f..e7a6ef72cd 100644 --- a/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.3_vfine.inst.cfg +++ b/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.3_vfine.inst.cfg @@ -1,18 +1,19 @@ -[general] -definition = flashforge_adventurer4 -name = Very Fine -version = 4 - -[metadata] -material = generic_pla -quality_type = veryfine -setting_version = 22 -type = quality -variant = 0.3mm Nozzle -weight = 2 - -[values] -speed_print = 45 -speed_travel = 100 -retraction_amount = 5 -retraction_speed = 30 +[general] +definition = flashforge_adventurer4 +name = Very Fine +version = 4 + +[metadata] +material = generic_pla +quality_type = veryfine +setting_version = 22 +type = quality +variant = 0.3mm Nozzle +weight = 2 + +[values] +retraction_amount = 5 +retraction_speed = 30 +speed_print = 45 +speed_travel = 100 + diff --git a/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.4_draft.inst.cfg b/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.4_draft.inst.cfg index 993064a6df..18bd03e2fa 100644 --- a/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.4_draft.inst.cfg +++ b/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.4_draft.inst.cfg @@ -1,18 +1,19 @@ -[general] -definition = flashforge_adventurer4 -name = Draft -version = 4 - -[metadata] -material = generic_pla -quality_type = draft -setting_version = 22 -type = quality -variant = 0.4mm Nozzle -weight = -2 - -[values] -speed_print = 65 -speed_travel = 100 -retraction_amount = 5.5 -retraction_speed = 25 +[general] +definition = flashforge_adventurer4 +name = Draft +version = 4 + +[metadata] +material = generic_pla +quality_type = draft +setting_version = 22 +type = quality +variant = 0.4mm Nozzle +weight = -2 + +[values] +retraction_amount = 5.5 +retraction_speed = 25 +speed_print = 65 +speed_travel = 100 + diff --git a/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.4_fast.inst.cfg b/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.4_fast.inst.cfg index 2d4aff0fe6..a40571318d 100644 --- a/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.4_fast.inst.cfg +++ b/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.4_fast.inst.cfg @@ -1,18 +1,19 @@ -[general] -definition = flashforge_adventurer4 -name = Fine -version = 4 - -[metadata] -material = generic_pla -quality_type = fine -setting_version = 22 -type = quality -variant = 0.4mm Nozzle -weight = -1 - -[values] -speed_print = 55 -speed_travel = 100 -retraction_amount = 5.5 -retraction_speed = 25 +[general] +definition = flashforge_adventurer4 +name = Fine +version = 4 + +[metadata] +material = generic_pla +quality_type = fine +setting_version = 22 +type = quality +variant = 0.4mm Nozzle +weight = -1 + +[values] +retraction_amount = 5.5 +retraction_speed = 25 +speed_print = 55 +speed_travel = 100 + diff --git a/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.4_fine.inst.cfg b/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.4_fine.inst.cfg index 37e0731f50..b81f729ed7 100644 --- a/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.4_fine.inst.cfg +++ b/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.4_fine.inst.cfg @@ -1,18 +1,19 @@ -[general] -definition = flashforge_adventurer4 -name = Fine -version = 4 - -[metadata] -material = generic_pla -quality_type = fine -setting_version = 22 -type = quality -variant = 0.4mm Nozzle -weight = 1 - -[values] -speed_print = 45 -speed_travel = 90 -retraction_amount = 5.5 -retraction_speed = 25 +[general] +definition = flashforge_adventurer4 +name = Fine +version = 4 + +[metadata] +material = generic_pla +quality_type = fine +setting_version = 22 +type = quality +variant = 0.4mm Nozzle +weight = 1 + +[values] +retraction_amount = 5.5 +retraction_speed = 25 +speed_print = 45 +speed_travel = 90 + diff --git a/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.4_normal.inst.cfg b/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.4_normal.inst.cfg index 8e2fe1b043..6e3486a031 100644 --- a/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.4_normal.inst.cfg +++ b/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.4_normal.inst.cfg @@ -1,18 +1,19 @@ -[general] -definition = flashforge_adventurer4 -name = Standard -version = 4 - -[metadata] -material = generic_pla -quality_type = normal -setting_version = 22 -type = quality -variant = 0.4mm Nozzle -weight = 0 - -[values] -speed_print = 50 -speed_travel = 100 -retraction_amount = 5.5 -retraction_speed = 25 +[general] +definition = flashforge_adventurer4 +name = Standard +version = 4 + +[metadata] +material = generic_pla +quality_type = normal +setting_version = 22 +type = quality +variant = 0.4mm Nozzle +weight = 0 + +[values] +retraction_amount = 5.5 +retraction_speed = 25 +speed_print = 50 +speed_travel = 100 + diff --git a/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.4_vfast.inst.cfg b/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.4_vfast.inst.cfg index dc887117c0..7635f68944 100644 --- a/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.4_vfast.inst.cfg +++ b/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.4_vfast.inst.cfg @@ -1,18 +1,19 @@ -[general] -definition = flashforge_adventurer4 -name = Very Fast -version = 4 - -[metadata] -material = generic_pla -quality_type = veryfast -setting_version = 22 -type = quality -variant = 0.4mm Nozzle -weight = -2 - -[values] -speed_print = 60 -speed_travel = 100 -retraction_amount = 5.5 -retraction_speed = 25 +[general] +definition = flashforge_adventurer4 +name = Very Fast +version = 4 + +[metadata] +material = generic_pla +quality_type = veryfast +setting_version = 22 +type = quality +variant = 0.4mm Nozzle +weight = -2 + +[values] +retraction_amount = 5.5 +retraction_speed = 25 +speed_print = 60 +speed_travel = 100 + diff --git a/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.4_vfine.inst.cfg b/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.4_vfine.inst.cfg index cdd5aae558..718dd4d4c7 100644 --- a/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.4_vfine.inst.cfg +++ b/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.4_vfine.inst.cfg @@ -1,18 +1,19 @@ -[general] -definition = flashforge_adventurer4 -name = Very Fine -version = 4 - -[metadata] -material = generic_pla -quality_type = veryfine -setting_version = 22 -type = quality -variant = 0.4mm Nozzle -weight = 2 - -[values] -speed_print = 40 -speed_travel = 80 -retraction_amount = 5.5 -retraction_speed = 25 +[general] +definition = flashforge_adventurer4 +name = Very Fine +version = 4 + +[metadata] +material = generic_pla +quality_type = veryfine +setting_version = 22 +type = quality +variant = 0.4mm Nozzle +weight = 2 + +[values] +retraction_amount = 5.5 +retraction_speed = 25 +speed_print = 40 +speed_travel = 80 + diff --git a/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.6_draft.inst.cfg b/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.6_draft.inst.cfg index ac4966df73..50e5223045 100644 --- a/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.6_draft.inst.cfg +++ b/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.6_draft.inst.cfg @@ -1,18 +1,19 @@ -[general] -definition = flashforge_adventurer4 -name = Draft -version = 4 - -[metadata] -material = generic_pla -quality_type = draft -setting_version = 22 -type = quality -variant = 0.6mm Nozzle -weight = -2 - -[values] -speed_print = 65 -speed_travel = 100 -retraction_amount = 6 -retraction_speed = 30 +[general] +definition = flashforge_adventurer4 +name = Draft +version = 4 + +[metadata] +material = generic_pla +quality_type = draft +setting_version = 22 +type = quality +variant = 0.6mm Nozzle +weight = -2 + +[values] +retraction_amount = 6 +retraction_speed = 30 +speed_print = 65 +speed_travel = 100 + diff --git a/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.6_fast.inst.cfg b/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.6_fast.inst.cfg index 77538fb95e..f81ed66155 100644 --- a/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.6_fast.inst.cfg +++ b/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.6_fast.inst.cfg @@ -1,18 +1,19 @@ -[general] -definition = flashforge_adventurer4 -name = Fast -version = 4 - -[metadata] -material = generic_pla -quality_type = fast -setting_version = 22 -type = quality -variant = 0.6mm Nozzle -weight = -1 - -[values] -speed_print = 60 -speed_travel = 100 -retraction_amount = 6 -retraction_speed = 30 +[general] +definition = flashforge_adventurer4 +name = Fast +version = 4 + +[metadata] +material = generic_pla +quality_type = fast +setting_version = 22 +type = quality +variant = 0.6mm Nozzle +weight = -1 + +[values] +retraction_amount = 6 +retraction_speed = 30 +speed_print = 60 +speed_travel = 100 + diff --git a/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.6_vfast.inst.cfg b/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.6_vfast.inst.cfg index 923d526e69..aa065e31f0 100644 --- a/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.6_vfast.inst.cfg +++ b/resources/quality/flashforge/pla/flashforge_adventurer4_pla_0.6_vfast.inst.cfg @@ -1,18 +1,19 @@ -[general] -definition = flashforge_adventurer4 -name = Very Fast -version = 4 - -[metadata] -material = generic_pla -quality_type = veryfast -setting_version = 22 -type = quality -variant = 0.6mm Nozzle -weight = -2 - -[values] -speed_print = 60 -speed_travel = 100 -retraction_amount = 6 -retraction_speed = 30 +[general] +definition = flashforge_adventurer4 +name = Very Fast +version = 4 + +[metadata] +material = generic_pla +quality_type = veryfast +setting_version = 22 +type = quality +variant = 0.6mm Nozzle +weight = -2 + +[values] +retraction_amount = 6 +retraction_speed = 30 +speed_print = 60 +speed_travel = 100 + diff --git a/resources/variants/flashforge/flashforge_adventurer3_0.3.inst.cfg b/resources/variants/flashforge/flashforge_adventurer3_0.3.inst.cfg index 9233d066d2..fdaea7e9f0 100644 --- a/resources/variants/flashforge/flashforge_adventurer3_0.3.inst.cfg +++ b/resources/variants/flashforge/flashforge_adventurer3_0.3.inst.cfg @@ -1,12 +1,13 @@ -[general] -definition = flashforge_adventurer3 -name = 0.3mm Nozzle -version = 4 - -[metadata] -hardware_type = nozzle -setting_version = 22 -type = variant - -[values] -machine_nozzle_size = 0.3 +[general] +definition = flashforge_adventurer3 +name = 0.3mm Nozzle +version = 4 + +[metadata] +hardware_type = nozzle +setting_version = 22 +type = variant + +[values] +machine_nozzle_size = 0.3 + diff --git a/resources/variants/flashforge/flashforge_adventurer3_0.4.inst.cfg b/resources/variants/flashforge/flashforge_adventurer3_0.4.inst.cfg index 9217a0a518..5a7a2520ad 100644 --- a/resources/variants/flashforge/flashforge_adventurer3_0.4.inst.cfg +++ b/resources/variants/flashforge/flashforge_adventurer3_0.4.inst.cfg @@ -1,12 +1,13 @@ -[general] -definition = flashforge_adventurer3 -name = 0.4mm Nozzle -version = 4 - -[metadata] -hardware_type = nozzle -setting_version = 22 -type = variant - -[values] -machine_nozzle_size = 0.4 +[general] +definition = flashforge_adventurer3 +name = 0.4mm Nozzle +version = 4 + +[metadata] +hardware_type = nozzle +setting_version = 22 +type = variant + +[values] +machine_nozzle_size = 0.4 + diff --git a/resources/variants/flashforge/flashforge_adventurer3_0.6.inst.cfg b/resources/variants/flashforge/flashforge_adventurer3_0.6.inst.cfg index 5e712bb0f5..bee4393cc9 100644 --- a/resources/variants/flashforge/flashforge_adventurer3_0.6.inst.cfg +++ b/resources/variants/flashforge/flashforge_adventurer3_0.6.inst.cfg @@ -1,12 +1,13 @@ -[general] -definition = flashforge_adventurer3 -name = 0.6mm Nozzle -version = 4 - -[metadata] -hardware_type = nozzle -setting_version = 22 -type = variant - -[values] -machine_nozzle_size = 0.6 +[general] +definition = flashforge_adventurer3 +name = 0.6mm Nozzle +version = 4 + +[metadata] +hardware_type = nozzle +setting_version = 22 +type = variant + +[values] +machine_nozzle_size = 0.6 + diff --git a/resources/variants/flashforge/flashforge_adventurer3c_0.3.inst.cfg b/resources/variants/flashforge/flashforge_adventurer3c_0.3.inst.cfg index c7162ed63b..404c0efb06 100644 --- a/resources/variants/flashforge/flashforge_adventurer3c_0.3.inst.cfg +++ b/resources/variants/flashforge/flashforge_adventurer3c_0.3.inst.cfg @@ -1,12 +1,13 @@ -[general] -definition = flashforge_adventurer3c -name = 0.3mm Nozzle -version = 4 - -[metadata] -hardware_type = nozzle -setting_version = 22 -type = variant - -[values] -machine_nozzle_size = 0.3 +[general] +definition = flashforge_adventurer3c +name = 0.3mm Nozzle +version = 4 + +[metadata] +hardware_type = nozzle +setting_version = 22 +type = variant + +[values] +machine_nozzle_size = 0.3 + diff --git a/resources/variants/flashforge/flashforge_adventurer3c_0.4.inst.cfg b/resources/variants/flashforge/flashforge_adventurer3c_0.4.inst.cfg index 75b8cf227d..20cb91c62e 100644 --- a/resources/variants/flashforge/flashforge_adventurer3c_0.4.inst.cfg +++ b/resources/variants/flashforge/flashforge_adventurer3c_0.4.inst.cfg @@ -1,12 +1,13 @@ -[general] -definition = flashforge_adventurer3c -name = 0.4mm Nozzle -version = 4 - -[metadata] -hardware_type = nozzle -setting_version = 22 -type = variant - -[values] -machine_nozzle_size = 0.4 +[general] +definition = flashforge_adventurer3c +name = 0.4mm Nozzle +version = 4 + +[metadata] +hardware_type = nozzle +setting_version = 22 +type = variant + +[values] +machine_nozzle_size = 0.4 + diff --git a/resources/variants/flashforge/flashforge_adventurer3c_0.6.inst.cfg b/resources/variants/flashforge/flashforge_adventurer3c_0.6.inst.cfg index 07898deed7..531763721a 100644 --- a/resources/variants/flashforge/flashforge_adventurer3c_0.6.inst.cfg +++ b/resources/variants/flashforge/flashforge_adventurer3c_0.6.inst.cfg @@ -1,12 +1,13 @@ -[general] -definition = flashforge_adventurer3c -name = 0.6mm Nozzle -version = 4 - -[metadata] -hardware_type = nozzle -setting_version = 22 -type = variant - -[values] -machine_nozzle_size = 0.6 +[general] +definition = flashforge_adventurer3c +name = 0.6mm Nozzle +version = 4 + +[metadata] +hardware_type = nozzle +setting_version = 22 +type = variant + +[values] +machine_nozzle_size = 0.6 + diff --git a/resources/variants/flashforge/flashforge_adventurer4_0.3.inst.cfg b/resources/variants/flashforge/flashforge_adventurer4_0.3.inst.cfg index 36902259f1..661de9a802 100644 --- a/resources/variants/flashforge/flashforge_adventurer4_0.3.inst.cfg +++ b/resources/variants/flashforge/flashforge_adventurer4_0.3.inst.cfg @@ -1,12 +1,13 @@ -[general] -definition = flashforge_adventurer4 -name = 0.3mm Nozzle -version = 4 - -[metadata] -hardware_type = nozzle -setting_version = 22 -type = variant - -[values] -machine_nozzle_size = 0.3 +[general] +definition = flashforge_adventurer4 +name = 0.3mm Nozzle +version = 4 + +[metadata] +hardware_type = nozzle +setting_version = 22 +type = variant + +[values] +machine_nozzle_size = 0.3 + diff --git a/resources/variants/flashforge/flashforge_adventurer4_0.4.inst.cfg b/resources/variants/flashforge/flashforge_adventurer4_0.4.inst.cfg index 8433cc42d8..7944ab4d6a 100644 --- a/resources/variants/flashforge/flashforge_adventurer4_0.4.inst.cfg +++ b/resources/variants/flashforge/flashforge_adventurer4_0.4.inst.cfg @@ -1,12 +1,13 @@ -[general] -definition = flashforge_adventurer4 -name = 0.4mm Nozzle -version = 4 - -[metadata] -hardware_type = nozzle -setting_version = 22 -type = variant - -[values] -machine_nozzle_size = 0.4 +[general] +definition = flashforge_adventurer4 +name = 0.4mm Nozzle +version = 4 + +[metadata] +hardware_type = nozzle +setting_version = 22 +type = variant + +[values] +machine_nozzle_size = 0.4 + diff --git a/resources/variants/flashforge/flashforge_adventurer4_0.6.inst.cfg b/resources/variants/flashforge/flashforge_adventurer4_0.6.inst.cfg index 39604fef55..2e0bb4d36a 100644 --- a/resources/variants/flashforge/flashforge_adventurer4_0.6.inst.cfg +++ b/resources/variants/flashforge/flashforge_adventurer4_0.6.inst.cfg @@ -1,12 +1,13 @@ -[general] -definition = flashforge_adventurer4 -name = 0.6mm Nozzle -version = 4 - -[metadata] -hardware_type = nozzle -setting_version = 22 -type = variant - -[values] -machine_nozzle_size = 0.6 +[general] +definition = flashforge_adventurer4 +name = 0.6mm Nozzle +version = 4 + +[metadata] +hardware_type = nozzle +setting_version = 22 +type = variant + +[values] +machine_nozzle_size = 0.6 + diff --git a/resources/variants/flashforge/flashforge_adventurer4lite_0.3.inst.cfg b/resources/variants/flashforge/flashforge_adventurer4lite_0.3.inst.cfg index 8c1a1d6e2f..25f6eba9bf 100644 --- a/resources/variants/flashforge/flashforge_adventurer4lite_0.3.inst.cfg +++ b/resources/variants/flashforge/flashforge_adventurer4lite_0.3.inst.cfg @@ -1,12 +1,13 @@ -[general] -definition = flashforge_adventurer4lite -name = 0.3mm Nozzle -version = 4 - -[metadata] -hardware_type = nozzle -setting_version = 22 -type = variant - -[values] -machine_nozzle_size = 0.3 +[general] +definition = flashforge_adventurer4lite +name = 0.3mm Nozzle +version = 4 + +[metadata] +hardware_type = nozzle +setting_version = 22 +type = variant + +[values] +machine_nozzle_size = 0.3 + diff --git a/resources/variants/flashforge/flashforge_adventurer4lite_0.4.inst.cfg b/resources/variants/flashforge/flashforge_adventurer4lite_0.4.inst.cfg index 16d8876485..c073e05831 100644 --- a/resources/variants/flashforge/flashforge_adventurer4lite_0.4.inst.cfg +++ b/resources/variants/flashforge/flashforge_adventurer4lite_0.4.inst.cfg @@ -1,12 +1,13 @@ -[general] -definition = flashforge_adventurer4lite -name = 0.4mm Nozzle -version = 4 - -[metadata] -hardware_type = nozzle -setting_version = 22 -type = variant - -[values] -machine_nozzle_size = 0.4 +[general] +definition = flashforge_adventurer4lite +name = 0.4mm Nozzle +version = 4 + +[metadata] +hardware_type = nozzle +setting_version = 22 +type = variant + +[values] +machine_nozzle_size = 0.4 + diff --git a/resources/variants/flashforge/flashforge_adventurer4lite_0.6.inst.cfg b/resources/variants/flashforge/flashforge_adventurer4lite_0.6.inst.cfg index b9832c7d84..5801637f40 100644 --- a/resources/variants/flashforge/flashforge_adventurer4lite_0.6.inst.cfg +++ b/resources/variants/flashforge/flashforge_adventurer4lite_0.6.inst.cfg @@ -1,12 +1,13 @@ -[general] -definition = flashforge_adventurer4lite -name = 0.6mm Nozzle -version = 4 - -[metadata] -hardware_type = nozzle -setting_version = 22 -type = variant - -[values] -machine_nozzle_size = 0.6 +[general] +definition = flashforge_adventurer4lite +name = 0.6mm Nozzle +version = 4 + +[metadata] +hardware_type = nozzle +setting_version = 22 +type = variant + +[values] +machine_nozzle_size = 0.6 + From d490effcbd2062424a485198c38e0a90a22963b9 Mon Sep 17 00:00:00 2001 From: nallath Date: Wed, 31 Jan 2024 12:46:58 +0000 Subject: [PATCH 182/182] Applied printer-linter format --- resources/definitions/ratrig_base.def.json | 2 +- resources/definitions/ratrig_vcore3_200.def.json | 2 +- resources/definitions/ratrig_vcore3_300.def.json | 2 +- resources/definitions/ratrig_vcore3_400.def.json | 2 +- resources/definitions/ratrig_vcore3_500.def.json | 2 +- resources/definitions/ratrig_vcore3_base.def.json | 2 +- resources/definitions/ratrig_vminion.def.json | 2 +- .../extruders/ratrig_base_extruder_0.def.json | 9 +++++---- .../nylon/ratrig_base_0.2_Nylon_super.inst.cfg | 9 +++++---- .../nylon/ratrig_base_0.2_Nylon_ultra.inst.cfg | 9 +++++---- .../nylon/ratrig_base_0.3_Nylon_adaptive.inst.cfg | 9 +++++---- .../nylon/ratrig_base_0.3_Nylon_low.inst.cfg | 9 +++++---- .../nylon/ratrig_base_0.3_Nylon_standard.inst.cfg | 9 +++++---- .../nylon/ratrig_base_0.3_Nylon_super.inst.cfg | 9 +++++---- .../nylon/ratrig_base_0.4_Nylon_adaptive.inst.cfg | 15 ++++++++------- .../nylon/ratrig_base_0.4_Nylon_low.inst.cfg | 15 ++++++++------- .../nylon/ratrig_base_0.4_Nylon_standard.inst.cfg | 15 ++++++++------- .../nylon/ratrig_base_0.4_Nylon_super.inst.cfg | 15 ++++++++------- .../nylon/ratrig_base_0.5_Nylon_adaptive.inst.cfg | 9 +++++---- .../nylon/ratrig_base_0.5_Nylon_low.inst.cfg | 9 +++++---- .../nylon/ratrig_base_0.5_Nylon_standard.inst.cfg | 9 +++++---- .../nylon/ratrig_base_0.5_Nylon_super.inst.cfg | 9 +++++---- .../nylon/ratrig_base_0.6_Nylon_standard.inst.cfg | 9 +++++---- .../nylon/ratrig_base_0.8_Nylon_draft.inst.cfg | 11 ++++++----- .../nylon/ratrig_base_1.0_Nylon_draft.inst.cfg | 9 +++++---- .../petg/ratrig_base_0.2_PETG_super.inst.cfg | 9 +++++---- .../petg/ratrig_base_0.2_PETG_ultra.inst.cfg | 9 +++++---- .../petg/ratrig_base_0.3_PETG_adaptive.inst.cfg | 9 +++++---- .../petg/ratrig_base_0.3_PETG_low.inst.cfg | 9 +++++---- .../petg/ratrig_base_0.3_PETG_standard.inst.cfg | 9 +++++---- .../petg/ratrig_base_0.3_PETG_super.inst.cfg | 9 +++++---- .../petg/ratrig_base_0.4_PETG_adaptive.inst.cfg | 15 ++++++++------- .../petg/ratrig_base_0.4_PETG_low.inst.cfg | 15 ++++++++------- .../petg/ratrig_base_0.4_PETG_standard.inst.cfg | 15 ++++++++------- .../petg/ratrig_base_0.4_PETG_super.inst.cfg | 15 ++++++++------- .../petg/ratrig_base_0.5_PETG_adaptive.inst.cfg | 9 +++++---- .../petg/ratrig_base_0.5_PETG_low.inst.cfg | 9 +++++---- .../petg/ratrig_base_0.5_PETG_standard.inst.cfg | 9 +++++---- .../petg/ratrig_base_0.5_PETG_super.inst.cfg | 9 +++++---- .../petg/ratrig_base_0.6_PETG_standard.inst.cfg | 9 +++++---- .../petg/ratrig_base_0.8_PETG_draft.inst.cfg | 11 ++++++----- .../petg/ratrig_base_1.0_PETG_draft.inst.cfg | 9 +++++---- .../pla/ratrig_base_0.2_PLA_super.inst.cfg | 9 +++++---- .../pla/ratrig_base_0.2_PLA_ultra.inst.cfg | 9 +++++---- .../pla/ratrig_base_0.3_PLA_adaptive.inst.cfg | 9 +++++---- .../pla/ratrig_base_0.3_PLA_low.inst.cfg | 9 +++++---- .../pla/ratrig_base_0.3_PLA_standard.inst.cfg | 9 +++++---- .../pla/ratrig_base_0.3_PLA_super.inst.cfg | 9 +++++---- .../pla/ratrig_base_0.4_PLA_adaptive.inst.cfg | 9 +++++---- .../pla/ratrig_base_0.4_PLA_low.inst.cfg | 9 +++++---- .../pla/ratrig_base_0.4_PLA_standard.inst.cfg | 9 +++++---- .../pla/ratrig_base_0.4_PLA_super.inst.cfg | 9 +++++---- .../pla/ratrig_base_0.5_PLA_adaptive.inst.cfg | 9 +++++---- .../pla/ratrig_base_0.5_PLA_low.inst.cfg | 9 +++++---- .../pla/ratrig_base_0.5_PLA_standard.inst.cfg | 9 +++++---- .../pla/ratrig_base_0.5_PLA_super.inst.cfg | 9 +++++---- .../pla/ratrig_base_0.6_PLA_draft.inst.cfg | 9 +++++---- .../pla/ratrig_base_0.6_PLA_low.inst.cfg | 9 +++++---- .../pla/ratrig_base_0.6_PLA_standard.inst.cfg | 9 +++++---- .../pla/ratrig_base_0.8_PLA_draft.inst.cfg | 9 +++++---- .../pla/ratrig_base_1.0_PLA_draft.inst.cfg | 9 +++++---- .../ratrig_base_global_adaptive.inst.cfg | 13 +++++++------ .../ratrig_base/ratrig_base_global_draft.inst.cfg | 11 ++++++----- .../ratrig_base/ratrig_base_global_low.inst.cfg | 11 ++++++----- .../ratrig_base_global_standard.inst.cfg | 11 ++++++----- .../ratrig_base/ratrig_base_global_super.inst.cfg | 11 ++++++----- .../ratrig_base/ratrig_base_global_ultra.inst.cfg | 11 ++++++----- .../tpu/ratrig_base_0.3_TPU_adaptive.inst.cfg | 9 +++++---- .../tpu/ratrig_base_0.3_TPU_standard.inst.cfg | 9 +++++---- .../tpu/ratrig_base_0.3_TPU_super.inst.cfg | 9 +++++---- .../tpu/ratrig_base_0.4_TPU_adaptive.inst.cfg | 9 +++++---- .../tpu/ratrig_base_0.4_TPU_standard.inst.cfg | 9 +++++---- .../tpu/ratrig_base_0.4_TPU_super.inst.cfg | 9 +++++---- .../tpu/ratrig_base_0.5_TPU_adaptive.inst.cfg | 9 +++++---- .../tpu/ratrig_base_0.5_TPU_standard.inst.cfg | 9 +++++---- .../tpu/ratrig_base_0.5_TPU_super.inst.cfg | 9 +++++---- .../tpu/ratrig_base_0.6_TPU_standard.inst.cfg | 9 +++++---- .../tpu/ratrig_base_0.8_TPU_draft.inst.cfg | 9 +++++---- .../tpu/ratrig_base_1.0_TPU_draft.inst.cfg | 9 +++++---- .../variants/ratrig/ratrig_base_0.2.inst.cfg | 5 +++-- .../variants/ratrig/ratrig_base_0.3.inst.cfg | 5 +++-- .../variants/ratrig/ratrig_base_0.4.inst.cfg | 5 +++-- .../variants/ratrig/ratrig_base_0.6.inst.cfg | 5 +++-- .../variants/ratrig/ratrig_base_0.8.inst.cfg | 5 +++-- .../variants/ratrig/ratrig_base_1.0.inst.cfg | 5 +++-- .../ratrig/ratrig_vcore3_200_0.2.inst.cfg | 5 +++-- .../ratrig/ratrig_vcore3_200_0.3.inst.cfg | 5 +++-- .../ratrig/ratrig_vcore3_200_0.4.inst.cfg | 5 +++-- .../ratrig/ratrig_vcore3_200_0.6.inst.cfg | 5 +++-- .../ratrig/ratrig_vcore3_200_0.8.inst.cfg | 5 +++-- .../ratrig/ratrig_vcore3_200_1.0.inst.cfg | 5 +++-- .../ratrig/ratrig_vcore3_300_0.2.inst.cfg | 5 +++-- .../ratrig/ratrig_vcore3_300_0.3.inst.cfg | 5 +++-- .../ratrig/ratrig_vcore3_300_0.4.inst.cfg | 5 +++-- .../ratrig/ratrig_vcore3_300_0.6.inst.cfg | 5 +++-- .../ratrig/ratrig_vcore3_300_0.8.inst.cfg | 5 +++-- .../ratrig/ratrig_vcore3_300_1.0.inst.cfg | 5 +++-- .../ratrig/ratrig_vcore3_400_0.2.inst.cfg | 5 +++-- .../ratrig/ratrig_vcore3_400_0.3.inst.cfg | 5 +++-- .../ratrig/ratrig_vcore3_400_0.4.inst.cfg | 5 +++-- .../ratrig/ratrig_vcore3_400_0.6.inst.cfg | 5 +++-- .../ratrig/ratrig_vcore3_400_0.8.inst.cfg | 5 +++-- .../ratrig/ratrig_vcore3_400_1.0.inst.cfg | 5 +++-- .../ratrig/ratrig_vcore3_500_0.2.inst.cfg | 5 +++-- .../ratrig/ratrig_vcore3_500_0.3.inst.cfg | 5 +++-- .../ratrig/ratrig_vcore3_500_0.4.inst.cfg | 5 +++-- .../ratrig/ratrig_vcore3_500_0.6.inst.cfg | 5 +++-- .../ratrig/ratrig_vcore3_500_0.8.inst.cfg | 5 +++-- .../ratrig/ratrig_vcore3_500_1.0.inst.cfg | 5 +++-- .../variants/ratrig/ratrig_vminion_0.2.inst.cfg | 5 +++-- .../variants/ratrig/ratrig_vminion_0.3.inst.cfg | 5 +++-- .../variants/ratrig/ratrig_vminion_0.4.inst.cfg | 5 +++-- .../variants/ratrig/ratrig_vminion_0.6.inst.cfg | 5 +++-- .../variants/ratrig/ratrig_vminion_0.8.inst.cfg | 5 +++-- .../variants/ratrig/ratrig_vminion_1.0.inst.cfg | 5 +++-- 115 files changed, 508 insertions(+), 400 deletions(-) diff --git a/resources/definitions/ratrig_base.def.json b/resources/definitions/ratrig_base.def.json index 22c01c8bc3..ab8f4dccf4 100644 --- a/resources/definitions/ratrig_base.def.json +++ b/resources/definitions/ratrig_base.def.json @@ -16,4 +16,4 @@ "quality_definition": "ratrig_base", "supported_actions": [ "MachineSettingsAction" ] } -} +} \ No newline at end of file diff --git a/resources/definitions/ratrig_vcore3_200.def.json b/resources/definitions/ratrig_vcore3_200.def.json index 22738f6ce1..d16f15b476 100644 --- a/resources/definitions/ratrig_vcore3_200.def.json +++ b/resources/definitions/ratrig_vcore3_200.def.json @@ -20,4 +20,4 @@ "machine_name": { "default_value": "RatRig V-Core 3 200mm" }, "machine_width": { "default_value": 200 } } -} +} \ No newline at end of file diff --git a/resources/definitions/ratrig_vcore3_300.def.json b/resources/definitions/ratrig_vcore3_300.def.json index b139f3b105..c96860e90b 100644 --- a/resources/definitions/ratrig_vcore3_300.def.json +++ b/resources/definitions/ratrig_vcore3_300.def.json @@ -20,4 +20,4 @@ "machine_name": { "default_value": "RatRig V-Core 3 300mm" }, "machine_width": { "default_value": 300 } } -} +} \ No newline at end of file diff --git a/resources/definitions/ratrig_vcore3_400.def.json b/resources/definitions/ratrig_vcore3_400.def.json index a61e4570bc..fcd51686e8 100644 --- a/resources/definitions/ratrig_vcore3_400.def.json +++ b/resources/definitions/ratrig_vcore3_400.def.json @@ -20,4 +20,4 @@ "machine_name": { "default_value": "RatRig V-Core 3 400mm" }, "machine_width": { "default_value": 400 } } -} +} \ No newline at end of file diff --git a/resources/definitions/ratrig_vcore3_500.def.json b/resources/definitions/ratrig_vcore3_500.def.json index 93483af33a..97798bc4ce 100644 --- a/resources/definitions/ratrig_vcore3_500.def.json +++ b/resources/definitions/ratrig_vcore3_500.def.json @@ -20,4 +20,4 @@ "machine_name": { "default_value": "RatRig V-Core 3 500mm" }, "machine_width": { "default_value": 500 } } -} +} \ No newline at end of file diff --git a/resources/definitions/ratrig_vcore3_base.def.json b/resources/definitions/ratrig_vcore3_base.def.json index a736da4506..f52f6b9b1a 100644 --- a/resources/definitions/ratrig_vcore3_base.def.json +++ b/resources/definitions/ratrig_vcore3_base.def.json @@ -114,4 +114,4 @@ "z_seam_corner": { "value": "'z_seam_corner_weighted'" }, "z_seam_type": { "value": "'back'" } } -} +} \ No newline at end of file diff --git a/resources/definitions/ratrig_vminion.def.json b/resources/definitions/ratrig_vminion.def.json index 3cfb3baad6..8c20c3c49f 100644 --- a/resources/definitions/ratrig_vminion.def.json +++ b/resources/definitions/ratrig_vminion.def.json @@ -125,4 +125,4 @@ "z_seam_corner": { "value": "'z_seam_corner_weighted'" }, "z_seam_type": { "value": "'back'" } } -} +} \ No newline at end of file diff --git a/resources/extruders/ratrig_base_extruder_0.def.json b/resources/extruders/ratrig_base_extruder_0.def.json index 0c621c9a06..e5afcbdb54 100644 --- a/resources/extruders/ratrig_base_extruder_0.def.json +++ b/resources/extruders/ratrig_base_extruder_0.def.json @@ -2,14 +2,15 @@ "version": 2, "name": "Extruder 1", "inherits": "fdmextruder", - "metadata": { + "metadata": + { "machine": "ratrig_base", "position": "0" }, - - "overrides": { + "overrides": + { "extruder_nr": { "default_value": 0 }, "machine_nozzle_size": { "default_value": 0.4 }, "material_diameter": { "default_value": 1.75 } } -} +} \ No newline at end of file diff --git a/resources/quality/ratrig_base/nylon/ratrig_base_0.2_Nylon_super.inst.cfg b/resources/quality/ratrig_base/nylon/ratrig_base_0.2_Nylon_super.inst.cfg index 986c594aa8..adfe0e26a5 100644 --- a/resources/quality/ratrig_base/nylon/ratrig_base_0.2_Nylon_super.inst.cfg +++ b/resources/quality/ratrig_base/nylon/ratrig_base_0.2_Nylon_super.inst.cfg @@ -1,15 +1,16 @@ [general] -version = 4 -name = Super Quality definition = ratrig_base +name = Super Quality +version = 4 [metadata] +material = generic_nylon +quality_type = super setting_version = 22 type = quality -quality_type = super -material = generic_nylon variant = 0.2mm Nozzle [values] speed_layer_0 = 15 wall_thickness = =line_width*8 + diff --git a/resources/quality/ratrig_base/nylon/ratrig_base_0.2_Nylon_ultra.inst.cfg b/resources/quality/ratrig_base/nylon/ratrig_base_0.2_Nylon_ultra.inst.cfg index 8e857ee97c..d0ed1bfc29 100644 --- a/resources/quality/ratrig_base/nylon/ratrig_base_0.2_Nylon_ultra.inst.cfg +++ b/resources/quality/ratrig_base/nylon/ratrig_base_0.2_Nylon_ultra.inst.cfg @@ -1,15 +1,16 @@ [general] -version = 4 -name = Ultra Quality definition = ratrig_base +name = Ultra Quality +version = 4 [metadata] +material = generic_nylon +quality_type = ultra setting_version = 22 type = quality -quality_type = ultra -material = generic_nylon variant = 0.2mm Nozzle [values] speed_layer_0 = 15 wall_thickness = =line_width*8 + diff --git a/resources/quality/ratrig_base/nylon/ratrig_base_0.3_Nylon_adaptive.inst.cfg b/resources/quality/ratrig_base/nylon/ratrig_base_0.3_Nylon_adaptive.inst.cfg index a63a0ecc02..98bf867ce5 100644 --- a/resources/quality/ratrig_base/nylon/ratrig_base_0.3_Nylon_adaptive.inst.cfg +++ b/resources/quality/ratrig_base/nylon/ratrig_base_0.3_Nylon_adaptive.inst.cfg @@ -1,15 +1,16 @@ [general] -version = 4 -name = Dynamic Quality definition = ratrig_base +name = Dynamic Quality +version = 4 [metadata] +material = generic_nylon +quality_type = adaptive setting_version = 22 type = quality -quality_type = adaptive -material = generic_nylon variant = 0.3mm Nozzle [values] speed_layer_0 = 15 wall_thickness = =line_width*4 + diff --git a/resources/quality/ratrig_base/nylon/ratrig_base_0.3_Nylon_low.inst.cfg b/resources/quality/ratrig_base/nylon/ratrig_base_0.3_Nylon_low.inst.cfg index 968ad34432..8af3672269 100644 --- a/resources/quality/ratrig_base/nylon/ratrig_base_0.3_Nylon_low.inst.cfg +++ b/resources/quality/ratrig_base/nylon/ratrig_base_0.3_Nylon_low.inst.cfg @@ -1,15 +1,16 @@ [general] -version = 4 -name = Low Quality definition = ratrig_base +name = Low Quality +version = 4 [metadata] +material = generic_nylon +quality_type = low setting_version = 22 type = quality -quality_type = low -material = generic_nylon variant = 0.3mm Nozzle [values] speed_layer_0 = 15 wall_thickness = =line_width*4 + diff --git a/resources/quality/ratrig_base/nylon/ratrig_base_0.3_Nylon_standard.inst.cfg b/resources/quality/ratrig_base/nylon/ratrig_base_0.3_Nylon_standard.inst.cfg index f139cc0aa7..5c70c697a6 100644 --- a/resources/quality/ratrig_base/nylon/ratrig_base_0.3_Nylon_standard.inst.cfg +++ b/resources/quality/ratrig_base/nylon/ratrig_base_0.3_Nylon_standard.inst.cfg @@ -1,15 +1,16 @@ [general] -version = 4 -name = Standard Quality definition = ratrig_base +name = Standard Quality +version = 4 [metadata] +material = generic_nylon +quality_type = standard setting_version = 22 type = quality -quality_type = standard -material = generic_nylon variant = 0.3mm Nozzle [values] speed_layer_0 = 15 wall_thickness = =line_width*4 + diff --git a/resources/quality/ratrig_base/nylon/ratrig_base_0.3_Nylon_super.inst.cfg b/resources/quality/ratrig_base/nylon/ratrig_base_0.3_Nylon_super.inst.cfg index b09d167aa3..af8ea00735 100644 --- a/resources/quality/ratrig_base/nylon/ratrig_base_0.3_Nylon_super.inst.cfg +++ b/resources/quality/ratrig_base/nylon/ratrig_base_0.3_Nylon_super.inst.cfg @@ -1,15 +1,16 @@ [general] -version = 4 -name = Super Quality definition = ratrig_base +name = Super Quality +version = 4 [metadata] +material = generic_nylon +quality_type = super setting_version = 22 type = quality -quality_type = super -material = generic_nylon variant = 0.3mm Nozzle [values] speed_layer_0 = 15 wall_thickness = =line_width*4 + diff --git a/resources/quality/ratrig_base/nylon/ratrig_base_0.4_Nylon_adaptive.inst.cfg b/resources/quality/ratrig_base/nylon/ratrig_base_0.4_Nylon_adaptive.inst.cfg index c686218598..3b4589bd78 100644 --- a/resources/quality/ratrig_base/nylon/ratrig_base_0.4_Nylon_adaptive.inst.cfg +++ b/resources/quality/ratrig_base/nylon/ratrig_base_0.4_Nylon_adaptive.inst.cfg @@ -1,18 +1,19 @@ [general] -version = 4 -name = Dynamic Quality definition = ratrig_base +name = Dynamic Quality +version = 4 [metadata] +material = generic_nylon +quality_type = adaptive setting_version = 22 type = quality -quality_type = adaptive -material = generic_nylon variant = 0.4mm Nozzle [values] -wall_thickness = =line_width*4 cool_fan_speed = 40 -retraction_speed = 20 -retraction_amount = 1.6 material_flow = 94.0 +retraction_amount = 1.6 +retraction_speed = 20 +wall_thickness = =line_width*4 + diff --git a/resources/quality/ratrig_base/nylon/ratrig_base_0.4_Nylon_low.inst.cfg b/resources/quality/ratrig_base/nylon/ratrig_base_0.4_Nylon_low.inst.cfg index 7daca8bac7..addc6f2c1c 100644 --- a/resources/quality/ratrig_base/nylon/ratrig_base_0.4_Nylon_low.inst.cfg +++ b/resources/quality/ratrig_base/nylon/ratrig_base_0.4_Nylon_low.inst.cfg @@ -1,18 +1,19 @@ [general] -version = 4 -name = Low Quality definition = ratrig_base +name = Low Quality +version = 4 [metadata] +material = generic_nylon +quality_type = low setting_version = 22 type = quality -quality_type = low -material = generic_nylon variant = 0.4mm Nozzle [values] -wall_thickness = =line_width*4 cool_fan_speed = 40 -retraction_speed = 20 -retraction_amount = 1.6 material_flow = 94.0 +retraction_amount = 1.6 +retraction_speed = 20 +wall_thickness = =line_width*4 + diff --git a/resources/quality/ratrig_base/nylon/ratrig_base_0.4_Nylon_standard.inst.cfg b/resources/quality/ratrig_base/nylon/ratrig_base_0.4_Nylon_standard.inst.cfg index 9f414288e9..e74e3c9015 100644 --- a/resources/quality/ratrig_base/nylon/ratrig_base_0.4_Nylon_standard.inst.cfg +++ b/resources/quality/ratrig_base/nylon/ratrig_base_0.4_Nylon_standard.inst.cfg @@ -1,18 +1,19 @@ [general] -version = 4 -name = Standard Quality definition = ratrig_base +name = Standard Quality +version = 4 [metadata] +material = generic_nylon +quality_type = standard setting_version = 22 type = quality -quality_type = standard -material = generic_nylon variant = 0.4mm Nozzle [values] -wall_thickness = =line_width*4 cool_fan_speed = 40 -retraction_speed = 20 -retraction_amount = 1.6 material_flow = 94.0 +retraction_amount = 1.6 +retraction_speed = 20 +wall_thickness = =line_width*4 + diff --git a/resources/quality/ratrig_base/nylon/ratrig_base_0.4_Nylon_super.inst.cfg b/resources/quality/ratrig_base/nylon/ratrig_base_0.4_Nylon_super.inst.cfg index ef3b84f810..957d89d2bf 100644 --- a/resources/quality/ratrig_base/nylon/ratrig_base_0.4_Nylon_super.inst.cfg +++ b/resources/quality/ratrig_base/nylon/ratrig_base_0.4_Nylon_super.inst.cfg @@ -1,18 +1,19 @@ [general] -version = 4 -name = Super Quality definition = ratrig_base +name = Super Quality +version = 4 [metadata] +material = generic_nylon +quality_type = super setting_version = 22 type = quality -quality_type = super -material = generic_nylon variant = 0.4mm Nozzle [values] -wall_thickness = =line_width*4 cool_fan_speed = 40 -retraction_speed = 20 -retraction_amount = 1.6 material_flow = 94.0 +retraction_amount = 1.6 +retraction_speed = 20 +wall_thickness = =line_width*4 + diff --git a/resources/quality/ratrig_base/nylon/ratrig_base_0.5_Nylon_adaptive.inst.cfg b/resources/quality/ratrig_base/nylon/ratrig_base_0.5_Nylon_adaptive.inst.cfg index e3d64001f0..46766b94c2 100644 --- a/resources/quality/ratrig_base/nylon/ratrig_base_0.5_Nylon_adaptive.inst.cfg +++ b/resources/quality/ratrig_base/nylon/ratrig_base_0.5_Nylon_adaptive.inst.cfg @@ -1,15 +1,16 @@ [general] -version = 4 -name = Dynamic Quality definition = ratrig_base +name = Dynamic Quality +version = 4 [metadata] +material = generic_nylon +quality_type = adaptive setting_version = 22 type = quality -quality_type = adaptive -material = generic_nylon variant = 0.5mm Nozzle [values] speed_layer_0 = 15 wall_thickness = =line_width*4 + diff --git a/resources/quality/ratrig_base/nylon/ratrig_base_0.5_Nylon_low.inst.cfg b/resources/quality/ratrig_base/nylon/ratrig_base_0.5_Nylon_low.inst.cfg index 7468690a7e..22e93d8876 100644 --- a/resources/quality/ratrig_base/nylon/ratrig_base_0.5_Nylon_low.inst.cfg +++ b/resources/quality/ratrig_base/nylon/ratrig_base_0.5_Nylon_low.inst.cfg @@ -1,15 +1,16 @@ [general] -version = 4 -name = Low Quality definition = ratrig_base +name = Low Quality +version = 4 [metadata] +material = generic_nylon +quality_type = low setting_version = 22 type = quality -quality_type = low -material = generic_nylon variant = 0.5mm Nozzle [values] speed_layer_0 = 15 wall_thickness = =line_width*4 + diff --git a/resources/quality/ratrig_base/nylon/ratrig_base_0.5_Nylon_standard.inst.cfg b/resources/quality/ratrig_base/nylon/ratrig_base_0.5_Nylon_standard.inst.cfg index 0a7c369edd..0d9b6ae5c1 100644 --- a/resources/quality/ratrig_base/nylon/ratrig_base_0.5_Nylon_standard.inst.cfg +++ b/resources/quality/ratrig_base/nylon/ratrig_base_0.5_Nylon_standard.inst.cfg @@ -1,15 +1,16 @@ [general] -version = 4 -name = Standard Quality definition = ratrig_base +name = Standard Quality +version = 4 [metadata] +material = generic_nylon +quality_type = standard setting_version = 22 type = quality -quality_type = standard -material = generic_nylon variant = 0.5mm Nozzle [values] speed_layer_0 = 15 wall_thickness = =line_width*4 + diff --git a/resources/quality/ratrig_base/nylon/ratrig_base_0.5_Nylon_super.inst.cfg b/resources/quality/ratrig_base/nylon/ratrig_base_0.5_Nylon_super.inst.cfg index d7cc617a74..372d066d4c 100644 --- a/resources/quality/ratrig_base/nylon/ratrig_base_0.5_Nylon_super.inst.cfg +++ b/resources/quality/ratrig_base/nylon/ratrig_base_0.5_Nylon_super.inst.cfg @@ -1,15 +1,16 @@ [general] -version = 4 -name = Super Quality definition = ratrig_base +name = Super Quality +version = 4 [metadata] +material = generic_nylon +quality_type = super setting_version = 22 type = quality -quality_type = super -material = generic_nylon variant = 0.5mm Nozzle [values] speed_layer_0 = 15 wall_thickness = =line_width*4 + diff --git a/resources/quality/ratrig_base/nylon/ratrig_base_0.6_Nylon_standard.inst.cfg b/resources/quality/ratrig_base/nylon/ratrig_base_0.6_Nylon_standard.inst.cfg index bf34041d96..a57d8e22ca 100644 --- a/resources/quality/ratrig_base/nylon/ratrig_base_0.6_Nylon_standard.inst.cfg +++ b/resources/quality/ratrig_base/nylon/ratrig_base_0.6_Nylon_standard.inst.cfg @@ -1,15 +1,16 @@ [general] -version = 4 -name = Standard Quality definition = ratrig_base +name = Standard Quality +version = 4 [metadata] +material = generic_nylon +quality_type = standard setting_version = 22 type = quality -quality_type = standard -material = generic_nylon variant = 0.6mm Nozzle [values] speed_layer_0 = 15 wall_thickness = =line_width*3 + diff --git a/resources/quality/ratrig_base/nylon/ratrig_base_0.8_Nylon_draft.inst.cfg b/resources/quality/ratrig_base/nylon/ratrig_base_0.8_Nylon_draft.inst.cfg index 92bc80ceb3..1fc2e48eed 100644 --- a/resources/quality/ratrig_base/nylon/ratrig_base_0.8_Nylon_draft.inst.cfg +++ b/resources/quality/ratrig_base/nylon/ratrig_base_0.8_Nylon_draft.inst.cfg @@ -1,16 +1,17 @@ [general] -version = 4 -name = Draft Quality definition = ratrig_base +name = Draft Quality +version = 4 [metadata] +material = generic_nylon +quality_type = draft setting_version = 22 type = quality -quality_type = draft -material = generic_nylon variant = 0.8mm Nozzle [values] +cool_fan_speed = 40 speed_layer_0 = 30 wall_thickness = =line_width*2 -cool_fan_speed = 40 + diff --git a/resources/quality/ratrig_base/nylon/ratrig_base_1.0_Nylon_draft.inst.cfg b/resources/quality/ratrig_base/nylon/ratrig_base_1.0_Nylon_draft.inst.cfg index 860980c0a1..bcc88a598c 100644 --- a/resources/quality/ratrig_base/nylon/ratrig_base_1.0_Nylon_draft.inst.cfg +++ b/resources/quality/ratrig_base/nylon/ratrig_base_1.0_Nylon_draft.inst.cfg @@ -1,15 +1,16 @@ [general] -version = 4 -name = Draft Quality definition = ratrig_base +name = Draft Quality +version = 4 [metadata] +material = generic_nylon +quality_type = draft setting_version = 22 type = quality -quality_type = draft -material = generic_nylon variant = 1.0mm Nozzle [values] speed_layer_0 = 15 wall_thickness = =line_width*3 + diff --git a/resources/quality/ratrig_base/petg/ratrig_base_0.2_PETG_super.inst.cfg b/resources/quality/ratrig_base/petg/ratrig_base_0.2_PETG_super.inst.cfg index 6b0d6caff2..24419b5302 100644 --- a/resources/quality/ratrig_base/petg/ratrig_base_0.2_PETG_super.inst.cfg +++ b/resources/quality/ratrig_base/petg/ratrig_base_0.2_PETG_super.inst.cfg @@ -1,15 +1,16 @@ [general] -version = 4 -name = Super Quality definition = ratrig_base +name = Super Quality +version = 4 [metadata] +material = generic_petg +quality_type = super setting_version = 22 type = quality -quality_type = super -material = generic_petg variant = 0.2mm Nozzle [values] speed_layer_0 = 15 wall_thickness = =line_width*8 + diff --git a/resources/quality/ratrig_base/petg/ratrig_base_0.2_PETG_ultra.inst.cfg b/resources/quality/ratrig_base/petg/ratrig_base_0.2_PETG_ultra.inst.cfg index 784001a294..a55a6ad76a 100644 --- a/resources/quality/ratrig_base/petg/ratrig_base_0.2_PETG_ultra.inst.cfg +++ b/resources/quality/ratrig_base/petg/ratrig_base_0.2_PETG_ultra.inst.cfg @@ -1,15 +1,16 @@ [general] -version = 4 -name = Ultra Quality definition = ratrig_base +name = Ultra Quality +version = 4 [metadata] +material = generic_petg +quality_type = ultra setting_version = 22 type = quality -quality_type = ultra -material = generic_petg variant = 0.2mm Nozzle [values] speed_layer_0 = 15 wall_thickness = =line_width*8 + diff --git a/resources/quality/ratrig_base/petg/ratrig_base_0.3_PETG_adaptive.inst.cfg b/resources/quality/ratrig_base/petg/ratrig_base_0.3_PETG_adaptive.inst.cfg index 4033896592..890652591b 100644 --- a/resources/quality/ratrig_base/petg/ratrig_base_0.3_PETG_adaptive.inst.cfg +++ b/resources/quality/ratrig_base/petg/ratrig_base_0.3_PETG_adaptive.inst.cfg @@ -1,15 +1,16 @@ [general] -version = 4 -name = Dynamic Quality definition = ratrig_base +name = Dynamic Quality +version = 4 [metadata] +material = generic_petg +quality_type = adaptive setting_version = 22 type = quality -quality_type = adaptive -material = generic_petg variant = 0.3mm Nozzle [values] speed_layer_0 = 15 wall_thickness = =line_width*4 + diff --git a/resources/quality/ratrig_base/petg/ratrig_base_0.3_PETG_low.inst.cfg b/resources/quality/ratrig_base/petg/ratrig_base_0.3_PETG_low.inst.cfg index aaab545e84..aa3787c278 100644 --- a/resources/quality/ratrig_base/petg/ratrig_base_0.3_PETG_low.inst.cfg +++ b/resources/quality/ratrig_base/petg/ratrig_base_0.3_PETG_low.inst.cfg @@ -1,15 +1,16 @@ [general] -version = 4 -name = Low Quality definition = ratrig_base +name = Low Quality +version = 4 [metadata] +material = generic_petg +quality_type = low setting_version = 22 type = quality -quality_type = low -material = generic_petg variant = 0.3mm Nozzle [values] speed_layer_0 = 15 wall_thickness = =line_width*4 + diff --git a/resources/quality/ratrig_base/petg/ratrig_base_0.3_PETG_standard.inst.cfg b/resources/quality/ratrig_base/petg/ratrig_base_0.3_PETG_standard.inst.cfg index 6c56665241..a2afefe69c 100644 --- a/resources/quality/ratrig_base/petg/ratrig_base_0.3_PETG_standard.inst.cfg +++ b/resources/quality/ratrig_base/petg/ratrig_base_0.3_PETG_standard.inst.cfg @@ -1,15 +1,16 @@ [general] -version = 4 -name = Standard Quality definition = ratrig_base +name = Standard Quality +version = 4 [metadata] +material = generic_petg +quality_type = standard setting_version = 22 type = quality -quality_type = standard -material = generic_petg variant = 0.3mm Nozzle [values] speed_layer_0 = 15 wall_thickness = =line_width*4 + diff --git a/resources/quality/ratrig_base/petg/ratrig_base_0.3_PETG_super.inst.cfg b/resources/quality/ratrig_base/petg/ratrig_base_0.3_PETG_super.inst.cfg index 5b838bbcb7..a90915b50c 100644 --- a/resources/quality/ratrig_base/petg/ratrig_base_0.3_PETG_super.inst.cfg +++ b/resources/quality/ratrig_base/petg/ratrig_base_0.3_PETG_super.inst.cfg @@ -1,15 +1,16 @@ [general] -version = 4 -name = Super Quality definition = ratrig_base +name = Super Quality +version = 4 [metadata] +material = generic_petg +quality_type = super setting_version = 22 type = quality -quality_type = super -material = generic_petg variant = 0.3mm Nozzle [values] speed_layer_0 = 15 wall_thickness = =line_width*4 + diff --git a/resources/quality/ratrig_base/petg/ratrig_base_0.4_PETG_adaptive.inst.cfg b/resources/quality/ratrig_base/petg/ratrig_base_0.4_PETG_adaptive.inst.cfg index 5e941ca011..765547d692 100644 --- a/resources/quality/ratrig_base/petg/ratrig_base_0.4_PETG_adaptive.inst.cfg +++ b/resources/quality/ratrig_base/petg/ratrig_base_0.4_PETG_adaptive.inst.cfg @@ -1,18 +1,19 @@ [general] -version = 4 -name = Dynamic Quality definition = ratrig_base +name = Dynamic Quality +version = 4 [metadata] +material = generic_petg +quality_type = adaptive setting_version = 22 type = quality -quality_type = adaptive -material = generic_petg variant = 0.4mm Nozzle [values] -wall_thickness = =line_width*4 cool_fan_speed = 40 -retraction_speed = 20 -retraction_amount = 1.6 material_flow = 94.0 +retraction_amount = 1.6 +retraction_speed = 20 +wall_thickness = =line_width*4 + diff --git a/resources/quality/ratrig_base/petg/ratrig_base_0.4_PETG_low.inst.cfg b/resources/quality/ratrig_base/petg/ratrig_base_0.4_PETG_low.inst.cfg index 4052b22d10..d5afe46994 100644 --- a/resources/quality/ratrig_base/petg/ratrig_base_0.4_PETG_low.inst.cfg +++ b/resources/quality/ratrig_base/petg/ratrig_base_0.4_PETG_low.inst.cfg @@ -1,18 +1,19 @@ [general] -version = 4 -name = Low Quality definition = ratrig_base +name = Low Quality +version = 4 [metadata] +material = generic_petg +quality_type = low setting_version = 22 type = quality -quality_type = low -material = generic_petg variant = 0.4mm Nozzle [values] -wall_thickness = =line_width*4 cool_fan_speed = 40 -retraction_speed = 20 -retraction_amount = 1.6 material_flow = 94.0 +retraction_amount = 1.6 +retraction_speed = 20 +wall_thickness = =line_width*4 + diff --git a/resources/quality/ratrig_base/petg/ratrig_base_0.4_PETG_standard.inst.cfg b/resources/quality/ratrig_base/petg/ratrig_base_0.4_PETG_standard.inst.cfg index eff9ddabf2..ea0ff5ab6b 100644 --- a/resources/quality/ratrig_base/petg/ratrig_base_0.4_PETG_standard.inst.cfg +++ b/resources/quality/ratrig_base/petg/ratrig_base_0.4_PETG_standard.inst.cfg @@ -1,18 +1,19 @@ [general] -version = 4 -name = Standard Quality definition = ratrig_base +name = Standard Quality +version = 4 [metadata] +material = generic_petg +quality_type = standard setting_version = 22 type = quality -quality_type = standard -material = generic_petg variant = 0.4mm Nozzle [values] -wall_thickness = =line_width*4 cool_fan_speed = 40 -retraction_speed = 20 -retraction_amount = 1.6 material_flow = 94.0 +retraction_amount = 1.6 +retraction_speed = 20 +wall_thickness = =line_width*4 + diff --git a/resources/quality/ratrig_base/petg/ratrig_base_0.4_PETG_super.inst.cfg b/resources/quality/ratrig_base/petg/ratrig_base_0.4_PETG_super.inst.cfg index 53cd3e7041..49245f85b2 100644 --- a/resources/quality/ratrig_base/petg/ratrig_base_0.4_PETG_super.inst.cfg +++ b/resources/quality/ratrig_base/petg/ratrig_base_0.4_PETG_super.inst.cfg @@ -1,18 +1,19 @@ [general] -version = 4 -name = Super Quality definition = ratrig_base +name = Super Quality +version = 4 [metadata] +material = generic_petg +quality_type = super setting_version = 22 type = quality -quality_type = super -material = generic_petg variant = 0.4mm Nozzle [values] -wall_thickness = =line_width*4 cool_fan_speed = 40 -retraction_speed = 20 -retraction_amount = 1.6 material_flow = 94.0 +retraction_amount = 1.6 +retraction_speed = 20 +wall_thickness = =line_width*4 + diff --git a/resources/quality/ratrig_base/petg/ratrig_base_0.5_PETG_adaptive.inst.cfg b/resources/quality/ratrig_base/petg/ratrig_base_0.5_PETG_adaptive.inst.cfg index 58c3531f80..7147deb58f 100644 --- a/resources/quality/ratrig_base/petg/ratrig_base_0.5_PETG_adaptive.inst.cfg +++ b/resources/quality/ratrig_base/petg/ratrig_base_0.5_PETG_adaptive.inst.cfg @@ -1,15 +1,16 @@ [general] -version = 4 -name = Dynamic Quality definition = ratrig_base +name = Dynamic Quality +version = 4 [metadata] +material = generic_petg +quality_type = adaptive setting_version = 22 type = quality -quality_type = adaptive -material = generic_petg variant = 0.5mm Nozzle [values] speed_layer_0 = 15 wall_thickness = =line_width*4 + diff --git a/resources/quality/ratrig_base/petg/ratrig_base_0.5_PETG_low.inst.cfg b/resources/quality/ratrig_base/petg/ratrig_base_0.5_PETG_low.inst.cfg index e2c1328fb2..e930a9415e 100644 --- a/resources/quality/ratrig_base/petg/ratrig_base_0.5_PETG_low.inst.cfg +++ b/resources/quality/ratrig_base/petg/ratrig_base_0.5_PETG_low.inst.cfg @@ -1,15 +1,16 @@ [general] -version = 4 -name = Low Quality definition = ratrig_base +name = Low Quality +version = 4 [metadata] +material = generic_petg +quality_type = low setting_version = 22 type = quality -quality_type = low -material = generic_petg variant = 0.5mm Nozzle [values] speed_layer_0 = 15 wall_thickness = =line_width*4 + diff --git a/resources/quality/ratrig_base/petg/ratrig_base_0.5_PETG_standard.inst.cfg b/resources/quality/ratrig_base/petg/ratrig_base_0.5_PETG_standard.inst.cfg index 35f4a1a08f..92611f4b71 100644 --- a/resources/quality/ratrig_base/petg/ratrig_base_0.5_PETG_standard.inst.cfg +++ b/resources/quality/ratrig_base/petg/ratrig_base_0.5_PETG_standard.inst.cfg @@ -1,15 +1,16 @@ [general] -version = 4 -name = Standard Quality definition = ratrig_base +name = Standard Quality +version = 4 [metadata] +material = generic_petg +quality_type = standard setting_version = 22 type = quality -quality_type = standard -material = generic_petg variant = 0.5mm Nozzle [values] speed_layer_0 = 15 wall_thickness = =line_width*4 + diff --git a/resources/quality/ratrig_base/petg/ratrig_base_0.5_PETG_super.inst.cfg b/resources/quality/ratrig_base/petg/ratrig_base_0.5_PETG_super.inst.cfg index 6b7995b239..d147d87728 100644 --- a/resources/quality/ratrig_base/petg/ratrig_base_0.5_PETG_super.inst.cfg +++ b/resources/quality/ratrig_base/petg/ratrig_base_0.5_PETG_super.inst.cfg @@ -1,15 +1,16 @@ [general] -version = 4 -name = Super Quality definition = ratrig_base +name = Super Quality +version = 4 [metadata] +material = generic_petg +quality_type = super setting_version = 22 type = quality -quality_type = super -material = generic_petg variant = 0.5mm Nozzle [values] speed_layer_0 = 15 wall_thickness = =line_width*4 + diff --git a/resources/quality/ratrig_base/petg/ratrig_base_0.6_PETG_standard.inst.cfg b/resources/quality/ratrig_base/petg/ratrig_base_0.6_PETG_standard.inst.cfg index 895fdcacb9..80dcecfe21 100644 --- a/resources/quality/ratrig_base/petg/ratrig_base_0.6_PETG_standard.inst.cfg +++ b/resources/quality/ratrig_base/petg/ratrig_base_0.6_PETG_standard.inst.cfg @@ -1,15 +1,16 @@ [general] -version = 4 -name = Standard Quality definition = ratrig_base +name = Standard Quality +version = 4 [metadata] +material = generic_petg +quality_type = standard setting_version = 22 type = quality -quality_type = standard -material = generic_petg variant = 0.6mm Nozzle [values] speed_layer_0 = 15 wall_thickness = =line_width*3 + diff --git a/resources/quality/ratrig_base/petg/ratrig_base_0.8_PETG_draft.inst.cfg b/resources/quality/ratrig_base/petg/ratrig_base_0.8_PETG_draft.inst.cfg index a7d04cb10b..4d6a9a5671 100644 --- a/resources/quality/ratrig_base/petg/ratrig_base_0.8_PETG_draft.inst.cfg +++ b/resources/quality/ratrig_base/petg/ratrig_base_0.8_PETG_draft.inst.cfg @@ -1,16 +1,17 @@ [general] -version = 4 -name = Draft Quality definition = ratrig_base +name = Draft Quality +version = 4 [metadata] +material = generic_petg +quality_type = draft setting_version = 22 type = quality -quality_type = draft -material = generic_petg variant = 0.8mm Nozzle [values] +cool_fan_speed = 40 speed_layer_0 = 30 wall_thickness = =line_width*2 -cool_fan_speed = 40 + diff --git a/resources/quality/ratrig_base/petg/ratrig_base_1.0_PETG_draft.inst.cfg b/resources/quality/ratrig_base/petg/ratrig_base_1.0_PETG_draft.inst.cfg index 8ce4a9fef6..bce8d9ccba 100644 --- a/resources/quality/ratrig_base/petg/ratrig_base_1.0_PETG_draft.inst.cfg +++ b/resources/quality/ratrig_base/petg/ratrig_base_1.0_PETG_draft.inst.cfg @@ -1,15 +1,16 @@ [general] -version = 4 -name = Draft Quality definition = ratrig_base +name = Draft Quality +version = 4 [metadata] +material = generic_petg +quality_type = draft setting_version = 22 type = quality -quality_type = draft -material = generic_petg variant = 1.0mm Nozzle [values] speed_layer_0 = 15 wall_thickness = =line_width*3 + diff --git a/resources/quality/ratrig_base/pla/ratrig_base_0.2_PLA_super.inst.cfg b/resources/quality/ratrig_base/pla/ratrig_base_0.2_PLA_super.inst.cfg index 7b009267e3..ff81d0d74e 100644 --- a/resources/quality/ratrig_base/pla/ratrig_base_0.2_PLA_super.inst.cfg +++ b/resources/quality/ratrig_base/pla/ratrig_base_0.2_PLA_super.inst.cfg @@ -1,13 +1,14 @@ [general] -version = 4 -name = Super Quality definition = ratrig_base +name = Super Quality +version = 4 [metadata] +material = generic_pla +quality_type = super setting_version = 22 type = quality -quality_type = super -material = generic_pla variant = 0.2mm Nozzle [values] + diff --git a/resources/quality/ratrig_base/pla/ratrig_base_0.2_PLA_ultra.inst.cfg b/resources/quality/ratrig_base/pla/ratrig_base_0.2_PLA_ultra.inst.cfg index 1a401148d5..10465057cf 100644 --- a/resources/quality/ratrig_base/pla/ratrig_base_0.2_PLA_ultra.inst.cfg +++ b/resources/quality/ratrig_base/pla/ratrig_base_0.2_PLA_ultra.inst.cfg @@ -1,13 +1,14 @@ [general] -version = 4 -name = Ultra Quality definition = ratrig_base +name = Ultra Quality +version = 4 [metadata] +material = generic_pla +quality_type = ultra setting_version = 22 type = quality -quality_type = ultra -material = generic_pla variant = 0.2mm Nozzle [values] + diff --git a/resources/quality/ratrig_base/pla/ratrig_base_0.3_PLA_adaptive.inst.cfg b/resources/quality/ratrig_base/pla/ratrig_base_0.3_PLA_adaptive.inst.cfg index de0067706e..58b51ebf4a 100644 --- a/resources/quality/ratrig_base/pla/ratrig_base_0.3_PLA_adaptive.inst.cfg +++ b/resources/quality/ratrig_base/pla/ratrig_base_0.3_PLA_adaptive.inst.cfg @@ -1,13 +1,14 @@ [general] -version = 4 -name = Dynamic Quality definition = ratrig_base +name = Dynamic Quality +version = 4 [metadata] +material = generic_pla +quality_type = adaptive setting_version = 22 type = quality -quality_type = adaptive -material = generic_pla variant = 0.3mm Nozzle [values] + diff --git a/resources/quality/ratrig_base/pla/ratrig_base_0.3_PLA_low.inst.cfg b/resources/quality/ratrig_base/pla/ratrig_base_0.3_PLA_low.inst.cfg index 31747bda1c..3622a5927b 100644 --- a/resources/quality/ratrig_base/pla/ratrig_base_0.3_PLA_low.inst.cfg +++ b/resources/quality/ratrig_base/pla/ratrig_base_0.3_PLA_low.inst.cfg @@ -1,13 +1,14 @@ [general] -version = 4 -name = Low Quality definition = ratrig_base +name = Low Quality +version = 4 [metadata] +material = generic_pla +quality_type = low setting_version = 22 type = quality -quality_type = low -material = generic_pla variant = 0.3mm Nozzle [values] + diff --git a/resources/quality/ratrig_base/pla/ratrig_base_0.3_PLA_standard.inst.cfg b/resources/quality/ratrig_base/pla/ratrig_base_0.3_PLA_standard.inst.cfg index 06000474af..39c3d77674 100644 --- a/resources/quality/ratrig_base/pla/ratrig_base_0.3_PLA_standard.inst.cfg +++ b/resources/quality/ratrig_base/pla/ratrig_base_0.3_PLA_standard.inst.cfg @@ -1,13 +1,14 @@ [general] -version = 4 -name = Standard Quality definition = ratrig_base +name = Standard Quality +version = 4 [metadata] +material = generic_pla +quality_type = standard setting_version = 22 type = quality -quality_type = standard -material = generic_pla variant = 0.3mm Nozzle [values] + diff --git a/resources/quality/ratrig_base/pla/ratrig_base_0.3_PLA_super.inst.cfg b/resources/quality/ratrig_base/pla/ratrig_base_0.3_PLA_super.inst.cfg index 24efb55980..5a6b3bd348 100644 --- a/resources/quality/ratrig_base/pla/ratrig_base_0.3_PLA_super.inst.cfg +++ b/resources/quality/ratrig_base/pla/ratrig_base_0.3_PLA_super.inst.cfg @@ -1,13 +1,14 @@ [general] -version = 4 -name = Super Quality definition = ratrig_base +name = Super Quality +version = 4 [metadata] +material = generic_pla +quality_type = super setting_version = 22 type = quality -quality_type = super -material = generic_pla variant = 0.3mm Nozzle [values] + diff --git a/resources/quality/ratrig_base/pla/ratrig_base_0.4_PLA_adaptive.inst.cfg b/resources/quality/ratrig_base/pla/ratrig_base_0.4_PLA_adaptive.inst.cfg index de96e7d5fb..4ca7bf94d4 100644 --- a/resources/quality/ratrig_base/pla/ratrig_base_0.4_PLA_adaptive.inst.cfg +++ b/resources/quality/ratrig_base/pla/ratrig_base_0.4_PLA_adaptive.inst.cfg @@ -1,13 +1,14 @@ [general] -version = 4 -name = Dynamic Quality definition = ratrig_base +name = Dynamic Quality +version = 4 [metadata] +material = generic_pla +quality_type = adaptive setting_version = 22 type = quality -quality_type = adaptive -material = generic_pla variant = 0.4mm Nozzle [values] + diff --git a/resources/quality/ratrig_base/pla/ratrig_base_0.4_PLA_low.inst.cfg b/resources/quality/ratrig_base/pla/ratrig_base_0.4_PLA_low.inst.cfg index 2e608f8d5c..0c29c77bde 100644 --- a/resources/quality/ratrig_base/pla/ratrig_base_0.4_PLA_low.inst.cfg +++ b/resources/quality/ratrig_base/pla/ratrig_base_0.4_PLA_low.inst.cfg @@ -1,13 +1,14 @@ [general] -version = 4 -name = Low Quality definition = ratrig_base +name = Low Quality +version = 4 [metadata] +material = generic_pla +quality_type = low setting_version = 22 type = quality -quality_type = low -material = generic_pla variant = 0.4mm Nozzle [values] + diff --git a/resources/quality/ratrig_base/pla/ratrig_base_0.4_PLA_standard.inst.cfg b/resources/quality/ratrig_base/pla/ratrig_base_0.4_PLA_standard.inst.cfg index 5f18e1281b..3211f4be86 100644 --- a/resources/quality/ratrig_base/pla/ratrig_base_0.4_PLA_standard.inst.cfg +++ b/resources/quality/ratrig_base/pla/ratrig_base_0.4_PLA_standard.inst.cfg @@ -1,13 +1,14 @@ [general] -version = 4 -name = Standard Quality definition = ratrig_base +name = Standard Quality +version = 4 [metadata] +material = generic_pla +quality_type = standard setting_version = 22 type = quality -quality_type = standard -material = generic_pla variant = 0.4mm Nozzle [values] + diff --git a/resources/quality/ratrig_base/pla/ratrig_base_0.4_PLA_super.inst.cfg b/resources/quality/ratrig_base/pla/ratrig_base_0.4_PLA_super.inst.cfg index 121be5d3cf..da6ea197b2 100644 --- a/resources/quality/ratrig_base/pla/ratrig_base_0.4_PLA_super.inst.cfg +++ b/resources/quality/ratrig_base/pla/ratrig_base_0.4_PLA_super.inst.cfg @@ -1,13 +1,14 @@ [general] -version = 4 -name = Super Quality definition = ratrig_base +name = Super Quality +version = 4 [metadata] +material = generic_pla +quality_type = super setting_version = 22 type = quality -quality_type = super -material = generic_pla variant = 0.4mm Nozzle [values] + diff --git a/resources/quality/ratrig_base/pla/ratrig_base_0.5_PLA_adaptive.inst.cfg b/resources/quality/ratrig_base/pla/ratrig_base_0.5_PLA_adaptive.inst.cfg index 07dadf89dd..f9d0649016 100644 --- a/resources/quality/ratrig_base/pla/ratrig_base_0.5_PLA_adaptive.inst.cfg +++ b/resources/quality/ratrig_base/pla/ratrig_base_0.5_PLA_adaptive.inst.cfg @@ -1,13 +1,14 @@ [general] -version = 4 -name = Dynamic Quality definition = ratrig_base +name = Dynamic Quality +version = 4 [metadata] +material = generic_pla +quality_type = adaptive setting_version = 22 type = quality -quality_type = adaptive -material = generic_pla variant = 0.5mm Nozzle [values] + diff --git a/resources/quality/ratrig_base/pla/ratrig_base_0.5_PLA_low.inst.cfg b/resources/quality/ratrig_base/pla/ratrig_base_0.5_PLA_low.inst.cfg index 7d92038aee..8f55fe30a4 100644 --- a/resources/quality/ratrig_base/pla/ratrig_base_0.5_PLA_low.inst.cfg +++ b/resources/quality/ratrig_base/pla/ratrig_base_0.5_PLA_low.inst.cfg @@ -1,13 +1,14 @@ [general] -version = 4 -name = Low Quality definition = ratrig_base +name = Low Quality +version = 4 [metadata] +material = generic_pla +quality_type = low setting_version = 22 type = quality -quality_type = low -material = generic_pla variant = 0.5mm Nozzle [values] + diff --git a/resources/quality/ratrig_base/pla/ratrig_base_0.5_PLA_standard.inst.cfg b/resources/quality/ratrig_base/pla/ratrig_base_0.5_PLA_standard.inst.cfg index ed786fb574..f6c42831e3 100644 --- a/resources/quality/ratrig_base/pla/ratrig_base_0.5_PLA_standard.inst.cfg +++ b/resources/quality/ratrig_base/pla/ratrig_base_0.5_PLA_standard.inst.cfg @@ -1,13 +1,14 @@ [general] -version = 4 -name = Standard Quality definition = ratrig_base +name = Standard Quality +version = 4 [metadata] +material = generic_pla +quality_type = standard setting_version = 22 type = quality -quality_type = standard -material = generic_pla variant = 0.5mm Nozzle [values] + diff --git a/resources/quality/ratrig_base/pla/ratrig_base_0.5_PLA_super.inst.cfg b/resources/quality/ratrig_base/pla/ratrig_base_0.5_PLA_super.inst.cfg index ec1c18b046..67637bcfea 100644 --- a/resources/quality/ratrig_base/pla/ratrig_base_0.5_PLA_super.inst.cfg +++ b/resources/quality/ratrig_base/pla/ratrig_base_0.5_PLA_super.inst.cfg @@ -1,13 +1,14 @@ [general] -version = 4 -name = Super Quality definition = ratrig_base +name = Super Quality +version = 4 [metadata] +material = generic_pla +quality_type = super setting_version = 22 type = quality -quality_type = super -material = generic_pla variant = 0.5mm Nozzle [values] + diff --git a/resources/quality/ratrig_base/pla/ratrig_base_0.6_PLA_draft.inst.cfg b/resources/quality/ratrig_base/pla/ratrig_base_0.6_PLA_draft.inst.cfg index 816eaa0e0b..bbafe934fe 100644 --- a/resources/quality/ratrig_base/pla/ratrig_base_0.6_PLA_draft.inst.cfg +++ b/resources/quality/ratrig_base/pla/ratrig_base_0.6_PLA_draft.inst.cfg @@ -1,13 +1,14 @@ [general] -version = 4 -name = Draft Quality definition = ratrig_base +name = Draft Quality +version = 4 [metadata] +material = generic_pla +quality_type = draft setting_version = 22 type = quality -quality_type = draft -material = generic_pla variant = 0.6mm Nozzle [values] + diff --git a/resources/quality/ratrig_base/pla/ratrig_base_0.6_PLA_low.inst.cfg b/resources/quality/ratrig_base/pla/ratrig_base_0.6_PLA_low.inst.cfg index 0b92dbf172..115341b00d 100644 --- a/resources/quality/ratrig_base/pla/ratrig_base_0.6_PLA_low.inst.cfg +++ b/resources/quality/ratrig_base/pla/ratrig_base_0.6_PLA_low.inst.cfg @@ -1,13 +1,14 @@ [general] -version = 4 -name = Low Quality definition = ratrig_base +name = Low Quality +version = 4 [metadata] +material = generic_pla +quality_type = low setting_version = 22 type = quality -quality_type = low -material = generic_pla variant = 0.6mm Nozzle [values] + diff --git a/resources/quality/ratrig_base/pla/ratrig_base_0.6_PLA_standard.inst.cfg b/resources/quality/ratrig_base/pla/ratrig_base_0.6_PLA_standard.inst.cfg index ddd87bec72..f365b98c5a 100644 --- a/resources/quality/ratrig_base/pla/ratrig_base_0.6_PLA_standard.inst.cfg +++ b/resources/quality/ratrig_base/pla/ratrig_base_0.6_PLA_standard.inst.cfg @@ -1,13 +1,14 @@ [general] -version = 4 -name = Standard Quality definition = ratrig_base +name = Standard Quality +version = 4 [metadata] +material = generic_pla +quality_type = standard setting_version = 22 type = quality -quality_type = standard -material = generic_pla variant = 0.6mm Nozzle [values] + diff --git a/resources/quality/ratrig_base/pla/ratrig_base_0.8_PLA_draft.inst.cfg b/resources/quality/ratrig_base/pla/ratrig_base_0.8_PLA_draft.inst.cfg index e1ab1dcab7..eba25456a9 100644 --- a/resources/quality/ratrig_base/pla/ratrig_base_0.8_PLA_draft.inst.cfg +++ b/resources/quality/ratrig_base/pla/ratrig_base_0.8_PLA_draft.inst.cfg @@ -1,13 +1,14 @@ [general] -version = 4 -name = Draft Quality definition = ratrig_base +name = Draft Quality +version = 4 [metadata] +material = generic_pla +quality_type = draft setting_version = 22 type = quality -quality_type = draft -material = generic_pla variant = 0.8mm Nozzle [values] + diff --git a/resources/quality/ratrig_base/pla/ratrig_base_1.0_PLA_draft.inst.cfg b/resources/quality/ratrig_base/pla/ratrig_base_1.0_PLA_draft.inst.cfg index 3dbb26c6ec..ffe30e68ec 100644 --- a/resources/quality/ratrig_base/pla/ratrig_base_1.0_PLA_draft.inst.cfg +++ b/resources/quality/ratrig_base/pla/ratrig_base_1.0_PLA_draft.inst.cfg @@ -1,13 +1,14 @@ [general] -version = 4 -name = Draft Quality definition = ratrig_base +name = Draft Quality +version = 4 [metadata] +material = generic_pla +quality_type = draft setting_version = 22 type = quality -quality_type = draft -material = generic_pla variant = 1.0mm Nozzle [values] + diff --git a/resources/quality/ratrig_base/ratrig_base_global_adaptive.inst.cfg b/resources/quality/ratrig_base/ratrig_base_global_adaptive.inst.cfg index 29786dcdbe..7dc5adffbc 100644 --- a/resources/quality/ratrig_base/ratrig_base_global_adaptive.inst.cfg +++ b/resources/quality/ratrig_base/ratrig_base_global_adaptive.inst.cfg @@ -1,19 +1,20 @@ [general] -version = 4 -name = Dynamic Quality definition = ratrig_base +name = Dynamic Quality +version = 4 [metadata] +global_quality = True +quality_type = adaptive setting_version = 22 type = quality -quality_type = adaptive weight = -2 -global_quality = True [values] +adaptive_layer_height_enabled = true layer_height = 0.16 layer_height_0 = 0.20 +support_interface_height = =layer_height*6 top_bottom_thickness = =layer_height_0+layer_height*4 wall_thickness = =line_width*3 -support_interface_height = =layer_height*6 -adaptive_layer_height_enabled = true + diff --git a/resources/quality/ratrig_base/ratrig_base_global_draft.inst.cfg b/resources/quality/ratrig_base/ratrig_base_global_draft.inst.cfg index f6fcbb8348..6300ade8f6 100644 --- a/resources/quality/ratrig_base/ratrig_base_global_draft.inst.cfg +++ b/resources/quality/ratrig_base/ratrig_base_global_draft.inst.cfg @@ -1,18 +1,19 @@ [general] -version = 4 -name = Draft Quality definition = ratrig_base +name = Draft Quality +version = 4 [metadata] +global_quality = True +quality_type = draft setting_version = 22 type = quality -quality_type = draft weight = -5 -global_quality = True [values] layer_height = 0.32 layer_height_0 = 0.32 +support_interface_height = =layer_height*4 top_bottom_thickness = =layer_height_0+layer_height*3 wall_thickness = =line_width*2 -support_interface_height = =layer_height*4 + diff --git a/resources/quality/ratrig_base/ratrig_base_global_low.inst.cfg b/resources/quality/ratrig_base/ratrig_base_global_low.inst.cfg index ad32dcf779..5cd4519ac2 100644 --- a/resources/quality/ratrig_base/ratrig_base_global_low.inst.cfg +++ b/resources/quality/ratrig_base/ratrig_base_global_low.inst.cfg @@ -1,18 +1,19 @@ [general] -version = 4 -name = Low Quality definition = ratrig_base +name = Low Quality +version = 4 [metadata] +global_quality = True +quality_type = low setting_version = 22 type = quality -quality_type = low weight = -4 -global_quality = True [values] layer_height = 0.28 layer_height_0 = 0.28 +support_interface_height = =layer_height*4 top_bottom_thickness = =layer_height_0+layer_height*3 wall_thickness = =line_width*2 -support_interface_height = =layer_height*4 + diff --git a/resources/quality/ratrig_base/ratrig_base_global_standard.inst.cfg b/resources/quality/ratrig_base/ratrig_base_global_standard.inst.cfg index 5f31222e11..d1bbff61ed 100644 --- a/resources/quality/ratrig_base/ratrig_base_global_standard.inst.cfg +++ b/resources/quality/ratrig_base/ratrig_base_global_standard.inst.cfg @@ -1,18 +1,19 @@ [general] -version = 4 -name = Standard Quality definition = ratrig_base +name = Standard Quality +version = 4 [metadata] +global_quality = True +quality_type = standard setting_version = 22 type = quality -quality_type = standard weight = -3 -global_quality = True [values] layer_height = 0.2 layer_height_0 = 0.2 +support_interface_height = =layer_height*4 top_bottom_thickness = =layer_height_0+layer_height*3 wall_thickness = =line_width*2 -support_interface_height = =layer_height*4 + diff --git a/resources/quality/ratrig_base/ratrig_base_global_super.inst.cfg b/resources/quality/ratrig_base/ratrig_base_global_super.inst.cfg index 3c6460675d..e73f314a27 100644 --- a/resources/quality/ratrig_base/ratrig_base_global_super.inst.cfg +++ b/resources/quality/ratrig_base/ratrig_base_global_super.inst.cfg @@ -1,18 +1,19 @@ [general] -version = 4 -name = Super Quality definition = ratrig_base +name = Super Quality +version = 4 [metadata] +global_quality = True +quality_type = super setting_version = 22 type = quality -quality_type = super weight = -1 -global_quality = True [values] layer_height = 0.12 layer_height_0 = 0.12 +support_interface_height = =layer_height*8 top_bottom_thickness = =layer_height_0+layer_height*6 wall_thickness = =line_width*3 -support_interface_height = =layer_height*8 + diff --git a/resources/quality/ratrig_base/ratrig_base_global_ultra.inst.cfg b/resources/quality/ratrig_base/ratrig_base_global_ultra.inst.cfg index c1257af094..3864f61858 100644 --- a/resources/quality/ratrig_base/ratrig_base_global_ultra.inst.cfg +++ b/resources/quality/ratrig_base/ratrig_base_global_ultra.inst.cfg @@ -1,18 +1,19 @@ [general] -version = 4 -name = Ultra Quality definition = ratrig_base +name = Ultra Quality +version = 4 [metadata] +global_quality = True +quality_type = ultra setting_version = 22 type = quality -quality_type = ultra weight = 0 -global_quality = True [values] layer_height = 0.08 layer_height_0 = 0.12 +support_interface_height = =layer_height*12 top_bottom_thickness = =layer_height_0+layer_height*10 wall_thickness = =line_width*3 -support_interface_height = =layer_height*12 + diff --git a/resources/quality/ratrig_base/tpu/ratrig_base_0.3_TPU_adaptive.inst.cfg b/resources/quality/ratrig_base/tpu/ratrig_base_0.3_TPU_adaptive.inst.cfg index a7feb4f3e0..6425ec7666 100644 --- a/resources/quality/ratrig_base/tpu/ratrig_base_0.3_TPU_adaptive.inst.cfg +++ b/resources/quality/ratrig_base/tpu/ratrig_base_0.3_TPU_adaptive.inst.cfg @@ -1,13 +1,14 @@ [general] -version = 4 -name = Dynamic Quality definition = ratrig_base +name = Dynamic Quality +version = 4 [metadata] +material = generic_tpu +quality_type = adaptive setting_version = 22 type = quality -quality_type = adaptive -material = generic_tpu variant = 0.3mm Nozzle [values] + diff --git a/resources/quality/ratrig_base/tpu/ratrig_base_0.3_TPU_standard.inst.cfg b/resources/quality/ratrig_base/tpu/ratrig_base_0.3_TPU_standard.inst.cfg index de56d84ba8..8f7b5f7cfa 100644 --- a/resources/quality/ratrig_base/tpu/ratrig_base_0.3_TPU_standard.inst.cfg +++ b/resources/quality/ratrig_base/tpu/ratrig_base_0.3_TPU_standard.inst.cfg @@ -1,13 +1,14 @@ [general] -version = 4 -name = Standard Quality definition = ratrig_base +name = Standard Quality +version = 4 [metadata] +material = generic_tpu +quality_type = standard setting_version = 22 type = quality -quality_type = standard -material = generic_tpu variant = 0.3mm Nozzle [values] + diff --git a/resources/quality/ratrig_base/tpu/ratrig_base_0.3_TPU_super.inst.cfg b/resources/quality/ratrig_base/tpu/ratrig_base_0.3_TPU_super.inst.cfg index 2b7b1e711e..4b92df6df6 100644 --- a/resources/quality/ratrig_base/tpu/ratrig_base_0.3_TPU_super.inst.cfg +++ b/resources/quality/ratrig_base/tpu/ratrig_base_0.3_TPU_super.inst.cfg @@ -1,13 +1,14 @@ [general] -version = 4 -name = Super Quality definition = ratrig_base +name = Super Quality +version = 4 [metadata] +material = generic_tpu +quality_type = super setting_version = 22 type = quality -quality_type = super -material = generic_tpu variant = 0.3mm Nozzle [values] + diff --git a/resources/quality/ratrig_base/tpu/ratrig_base_0.4_TPU_adaptive.inst.cfg b/resources/quality/ratrig_base/tpu/ratrig_base_0.4_TPU_adaptive.inst.cfg index dcfc502bae..d89b488ce6 100644 --- a/resources/quality/ratrig_base/tpu/ratrig_base_0.4_TPU_adaptive.inst.cfg +++ b/resources/quality/ratrig_base/tpu/ratrig_base_0.4_TPU_adaptive.inst.cfg @@ -1,13 +1,14 @@ [general] -version = 4 -name = Dynamic Quality definition = ratrig_base +name = Dynamic Quality +version = 4 [metadata] +material = generic_tpu +quality_type = adaptive setting_version = 22 type = quality -quality_type = adaptive -material = generic_tpu variant = 0.4mm Nozzle [values] + diff --git a/resources/quality/ratrig_base/tpu/ratrig_base_0.4_TPU_standard.inst.cfg b/resources/quality/ratrig_base/tpu/ratrig_base_0.4_TPU_standard.inst.cfg index 7ff523b68e..caa88e072a 100644 --- a/resources/quality/ratrig_base/tpu/ratrig_base_0.4_TPU_standard.inst.cfg +++ b/resources/quality/ratrig_base/tpu/ratrig_base_0.4_TPU_standard.inst.cfg @@ -1,13 +1,14 @@ [general] -version = 4 -name = Standard Quality definition = ratrig_base +name = Standard Quality +version = 4 [metadata] +material = generic_tpu +quality_type = standard setting_version = 22 type = quality -quality_type = standard -material = generic_tpu variant = 0.4mm Nozzle [values] + diff --git a/resources/quality/ratrig_base/tpu/ratrig_base_0.4_TPU_super.inst.cfg b/resources/quality/ratrig_base/tpu/ratrig_base_0.4_TPU_super.inst.cfg index a65ad09744..c37bd5df99 100644 --- a/resources/quality/ratrig_base/tpu/ratrig_base_0.4_TPU_super.inst.cfg +++ b/resources/quality/ratrig_base/tpu/ratrig_base_0.4_TPU_super.inst.cfg @@ -1,13 +1,14 @@ [general] -version = 4 -name = Super Quality definition = ratrig_base +name = Super Quality +version = 4 [metadata] +material = generic_tpu +quality_type = super setting_version = 22 type = quality -quality_type = super -material = generic_tpu variant = 0.4mm Nozzle [values] + diff --git a/resources/quality/ratrig_base/tpu/ratrig_base_0.5_TPU_adaptive.inst.cfg b/resources/quality/ratrig_base/tpu/ratrig_base_0.5_TPU_adaptive.inst.cfg index 63e465243d..4622803d56 100644 --- a/resources/quality/ratrig_base/tpu/ratrig_base_0.5_TPU_adaptive.inst.cfg +++ b/resources/quality/ratrig_base/tpu/ratrig_base_0.5_TPU_adaptive.inst.cfg @@ -1,13 +1,14 @@ [general] -version = 4 -name = Dynamic Quality definition = ratrig_base +name = Dynamic Quality +version = 4 [metadata] +material = generic_tpu +quality_type = adaptive setting_version = 22 type = quality -quality_type = adaptive -material = generic_tpu variant = 0.5mm Nozzle [values] + diff --git a/resources/quality/ratrig_base/tpu/ratrig_base_0.5_TPU_standard.inst.cfg b/resources/quality/ratrig_base/tpu/ratrig_base_0.5_TPU_standard.inst.cfg index f568375f4c..11b90f79a1 100644 --- a/resources/quality/ratrig_base/tpu/ratrig_base_0.5_TPU_standard.inst.cfg +++ b/resources/quality/ratrig_base/tpu/ratrig_base_0.5_TPU_standard.inst.cfg @@ -1,13 +1,14 @@ [general] -version = 4 -name = Standard Quality definition = ratrig_base +name = Standard Quality +version = 4 [metadata] +material = generic_tpu +quality_type = standard setting_version = 22 type = quality -quality_type = standard -material = generic_tpu variant = 0.5mm Nozzle [values] + diff --git a/resources/quality/ratrig_base/tpu/ratrig_base_0.5_TPU_super.inst.cfg b/resources/quality/ratrig_base/tpu/ratrig_base_0.5_TPU_super.inst.cfg index 1265c32061..d3762fd839 100644 --- a/resources/quality/ratrig_base/tpu/ratrig_base_0.5_TPU_super.inst.cfg +++ b/resources/quality/ratrig_base/tpu/ratrig_base_0.5_TPU_super.inst.cfg @@ -1,13 +1,14 @@ [general] -version = 4 -name = Super Quality definition = ratrig_base +name = Super Quality +version = 4 [metadata] +material = generic_tpu +quality_type = super setting_version = 22 type = quality -quality_type = super -material = generic_tpu variant = 0.5mm Nozzle [values] + diff --git a/resources/quality/ratrig_base/tpu/ratrig_base_0.6_TPU_standard.inst.cfg b/resources/quality/ratrig_base/tpu/ratrig_base_0.6_TPU_standard.inst.cfg index df3d194177..11a0e7cd4e 100644 --- a/resources/quality/ratrig_base/tpu/ratrig_base_0.6_TPU_standard.inst.cfg +++ b/resources/quality/ratrig_base/tpu/ratrig_base_0.6_TPU_standard.inst.cfg @@ -1,13 +1,14 @@ [general] -version = 4 -name = Standard Quality definition = ratrig_base +name = Standard Quality +version = 4 [metadata] +material = generic_tpu +quality_type = standard setting_version = 22 type = quality -quality_type = standard -material = generic_tpu variant = 0.6mm Nozzle [values] + diff --git a/resources/quality/ratrig_base/tpu/ratrig_base_0.8_TPU_draft.inst.cfg b/resources/quality/ratrig_base/tpu/ratrig_base_0.8_TPU_draft.inst.cfg index 1db288b6b9..fb82909a5d 100644 --- a/resources/quality/ratrig_base/tpu/ratrig_base_0.8_TPU_draft.inst.cfg +++ b/resources/quality/ratrig_base/tpu/ratrig_base_0.8_TPU_draft.inst.cfg @@ -1,13 +1,14 @@ [general] -version = 4 -name = Draft Quality definition = ratrig_base +name = Draft Quality +version = 4 [metadata] +material = generic_tpu +quality_type = draft setting_version = 22 type = quality -quality_type = draft -material = generic_tpu variant = 0.8mm Nozzle [values] + diff --git a/resources/quality/ratrig_base/tpu/ratrig_base_1.0_TPU_draft.inst.cfg b/resources/quality/ratrig_base/tpu/ratrig_base_1.0_TPU_draft.inst.cfg index 3149efda36..013dbfdcbc 100644 --- a/resources/quality/ratrig_base/tpu/ratrig_base_1.0_TPU_draft.inst.cfg +++ b/resources/quality/ratrig_base/tpu/ratrig_base_1.0_TPU_draft.inst.cfg @@ -1,13 +1,14 @@ [general] -version = 4 -name = Draft Quality definition = ratrig_base +name = Draft Quality +version = 4 [metadata] +material = generic_tpu +quality_type = draft setting_version = 22 type = quality -quality_type = draft -material = generic_tpu variant = 1.0mm Nozzle [values] + diff --git a/resources/variants/ratrig/ratrig_base_0.2.inst.cfg b/resources/variants/ratrig/ratrig_base_0.2.inst.cfg index 752f0fc7b3..bb337f309a 100644 --- a/resources/variants/ratrig/ratrig_base_0.2.inst.cfg +++ b/resources/variants/ratrig/ratrig_base_0.2.inst.cfg @@ -1,12 +1,13 @@ [general] +definition = ratrig_base name = 0.2mm Nozzle version = 4 -definition = ratrig_base [metadata] +hardware_type = nozzle setting_version = 22 type = variant -hardware_type = nozzle [values] machine_nozzle_size = 0.2 + diff --git a/resources/variants/ratrig/ratrig_base_0.3.inst.cfg b/resources/variants/ratrig/ratrig_base_0.3.inst.cfg index 2ad677756d..ba4d9f74b9 100644 --- a/resources/variants/ratrig/ratrig_base_0.3.inst.cfg +++ b/resources/variants/ratrig/ratrig_base_0.3.inst.cfg @@ -1,12 +1,13 @@ [general] +definition = ratrig_base name = 0.3mm Nozzle version = 4 -definition = ratrig_base [metadata] +hardware_type = nozzle setting_version = 22 type = variant -hardware_type = nozzle [values] machine_nozzle_size = 0.3 + diff --git a/resources/variants/ratrig/ratrig_base_0.4.inst.cfg b/resources/variants/ratrig/ratrig_base_0.4.inst.cfg index 652ae2b4c7..e784998708 100644 --- a/resources/variants/ratrig/ratrig_base_0.4.inst.cfg +++ b/resources/variants/ratrig/ratrig_base_0.4.inst.cfg @@ -1,12 +1,13 @@ [general] +definition = ratrig_base name = 0.4mm Nozzle version = 4 -definition = ratrig_base [metadata] +hardware_type = nozzle setting_version = 22 type = variant -hardware_type = nozzle [values] machine_nozzle_size = 0.4 + diff --git a/resources/variants/ratrig/ratrig_base_0.6.inst.cfg b/resources/variants/ratrig/ratrig_base_0.6.inst.cfg index 9316e0d850..da6595ad28 100644 --- a/resources/variants/ratrig/ratrig_base_0.6.inst.cfg +++ b/resources/variants/ratrig/ratrig_base_0.6.inst.cfg @@ -1,12 +1,13 @@ [general] +definition = ratrig_base name = 0.6mm Nozzle version = 4 -definition = ratrig_base [metadata] +hardware_type = nozzle setting_version = 22 type = variant -hardware_type = nozzle [values] machine_nozzle_size = 0.6 + diff --git a/resources/variants/ratrig/ratrig_base_0.8.inst.cfg b/resources/variants/ratrig/ratrig_base_0.8.inst.cfg index ce329c7d6d..d710879bd0 100644 --- a/resources/variants/ratrig/ratrig_base_0.8.inst.cfg +++ b/resources/variants/ratrig/ratrig_base_0.8.inst.cfg @@ -1,12 +1,13 @@ [general] +definition = ratrig_base name = 0.8mm Nozzle version = 4 -definition = ratrig_base [metadata] +hardware_type = nozzle setting_version = 22 type = variant -hardware_type = nozzle [values] machine_nozzle_size = 0.8 + diff --git a/resources/variants/ratrig/ratrig_base_1.0.inst.cfg b/resources/variants/ratrig/ratrig_base_1.0.inst.cfg index c1b643b60e..3a8241c15a 100644 --- a/resources/variants/ratrig/ratrig_base_1.0.inst.cfg +++ b/resources/variants/ratrig/ratrig_base_1.0.inst.cfg @@ -1,12 +1,13 @@ [general] +definition = ratrig_base name = 1.0mm Nozzle version = 4 -definition = ratrig_base [metadata] +hardware_type = nozzle setting_version = 22 type = variant -hardware_type = nozzle [values] machine_nozzle_size = 1.0 + diff --git a/resources/variants/ratrig/ratrig_vcore3_200_0.2.inst.cfg b/resources/variants/ratrig/ratrig_vcore3_200_0.2.inst.cfg index d3ae97b4d4..495d2ba3a3 100644 --- a/resources/variants/ratrig/ratrig_vcore3_200_0.2.inst.cfg +++ b/resources/variants/ratrig/ratrig_vcore3_200_0.2.inst.cfg @@ -1,12 +1,13 @@ [general] +definition = ratrig_vcore3_200 name = 0.2mm Nozzle version = 4 -definition = ratrig_vcore3_200 [metadata] +hardware_type = nozzle setting_version = 22 type = variant -hardware_type = nozzle [values] machine_nozzle_size = 0.2 + diff --git a/resources/variants/ratrig/ratrig_vcore3_200_0.3.inst.cfg b/resources/variants/ratrig/ratrig_vcore3_200_0.3.inst.cfg index ad5127866b..890d7bf30f 100644 --- a/resources/variants/ratrig/ratrig_vcore3_200_0.3.inst.cfg +++ b/resources/variants/ratrig/ratrig_vcore3_200_0.3.inst.cfg @@ -1,12 +1,13 @@ [general] +definition = ratrig_vcore3_200 name = 0.3mm Nozzle version = 4 -definition = ratrig_vcore3_200 [metadata] +hardware_type = nozzle setting_version = 22 type = variant -hardware_type = nozzle [values] machine_nozzle_size = 0.3 + diff --git a/resources/variants/ratrig/ratrig_vcore3_200_0.4.inst.cfg b/resources/variants/ratrig/ratrig_vcore3_200_0.4.inst.cfg index dc46c98586..e640ef7adf 100644 --- a/resources/variants/ratrig/ratrig_vcore3_200_0.4.inst.cfg +++ b/resources/variants/ratrig/ratrig_vcore3_200_0.4.inst.cfg @@ -1,12 +1,13 @@ [general] +definition = ratrig_vcore3_200 name = 0.4mm Nozzle version = 4 -definition = ratrig_vcore3_200 [metadata] +hardware_type = nozzle setting_version = 22 type = variant -hardware_type = nozzle [values] machine_nozzle_size = 0.4 + diff --git a/resources/variants/ratrig/ratrig_vcore3_200_0.6.inst.cfg b/resources/variants/ratrig/ratrig_vcore3_200_0.6.inst.cfg index 24bcfdf234..b25e6ee64a 100644 --- a/resources/variants/ratrig/ratrig_vcore3_200_0.6.inst.cfg +++ b/resources/variants/ratrig/ratrig_vcore3_200_0.6.inst.cfg @@ -1,12 +1,13 @@ [general] +definition = ratrig_vcore3_200 name = 0.6mm Nozzle version = 4 -definition = ratrig_vcore3_200 [metadata] +hardware_type = nozzle setting_version = 22 type = variant -hardware_type = nozzle [values] machine_nozzle_size = 0.6 + diff --git a/resources/variants/ratrig/ratrig_vcore3_200_0.8.inst.cfg b/resources/variants/ratrig/ratrig_vcore3_200_0.8.inst.cfg index dc0d5b87e6..9462fa7748 100644 --- a/resources/variants/ratrig/ratrig_vcore3_200_0.8.inst.cfg +++ b/resources/variants/ratrig/ratrig_vcore3_200_0.8.inst.cfg @@ -1,12 +1,13 @@ [general] +definition = ratrig_vcore3_200 name = 0.8mm Nozzle version = 4 -definition = ratrig_vcore3_200 [metadata] +hardware_type = nozzle setting_version = 22 type = variant -hardware_type = nozzle [values] machine_nozzle_size = 0.8 + diff --git a/resources/variants/ratrig/ratrig_vcore3_200_1.0.inst.cfg b/resources/variants/ratrig/ratrig_vcore3_200_1.0.inst.cfg index fa07e194ee..f817ee13a8 100644 --- a/resources/variants/ratrig/ratrig_vcore3_200_1.0.inst.cfg +++ b/resources/variants/ratrig/ratrig_vcore3_200_1.0.inst.cfg @@ -1,12 +1,13 @@ [general] +definition = ratrig_vcore3_200 name = 1.0mm Nozzle version = 4 -definition = ratrig_vcore3_200 [metadata] +hardware_type = nozzle setting_version = 22 type = variant -hardware_type = nozzle [values] machine_nozzle_size = 1.0 + diff --git a/resources/variants/ratrig/ratrig_vcore3_300_0.2.inst.cfg b/resources/variants/ratrig/ratrig_vcore3_300_0.2.inst.cfg index f7e73d584d..a39e02aab2 100644 --- a/resources/variants/ratrig/ratrig_vcore3_300_0.2.inst.cfg +++ b/resources/variants/ratrig/ratrig_vcore3_300_0.2.inst.cfg @@ -1,12 +1,13 @@ [general] +definition = ratrig_vcore3_300 name = 0.2mm Nozzle version = 4 -definition = ratrig_vcore3_300 [metadata] +hardware_type = nozzle setting_version = 22 type = variant -hardware_type = nozzle [values] machine_nozzle_size = 0.2 + diff --git a/resources/variants/ratrig/ratrig_vcore3_300_0.3.inst.cfg b/resources/variants/ratrig/ratrig_vcore3_300_0.3.inst.cfg index a3d8ccc385..a49459aac3 100644 --- a/resources/variants/ratrig/ratrig_vcore3_300_0.3.inst.cfg +++ b/resources/variants/ratrig/ratrig_vcore3_300_0.3.inst.cfg @@ -1,12 +1,13 @@ [general] +definition = ratrig_vcore3_300 name = 0.3mm Nozzle version = 4 -definition = ratrig_vcore3_300 [metadata] +hardware_type = nozzle setting_version = 22 type = variant -hardware_type = nozzle [values] machine_nozzle_size = 0.3 + diff --git a/resources/variants/ratrig/ratrig_vcore3_300_0.4.inst.cfg b/resources/variants/ratrig/ratrig_vcore3_300_0.4.inst.cfg index aa60d45930..e0bf634a2c 100644 --- a/resources/variants/ratrig/ratrig_vcore3_300_0.4.inst.cfg +++ b/resources/variants/ratrig/ratrig_vcore3_300_0.4.inst.cfg @@ -1,12 +1,13 @@ [general] +definition = ratrig_vcore3_300 name = 0.4mm Nozzle version = 4 -definition = ratrig_vcore3_300 [metadata] +hardware_type = nozzle setting_version = 22 type = variant -hardware_type = nozzle [values] machine_nozzle_size = 0.4 + diff --git a/resources/variants/ratrig/ratrig_vcore3_300_0.6.inst.cfg b/resources/variants/ratrig/ratrig_vcore3_300_0.6.inst.cfg index cd036160ee..c2026ce463 100644 --- a/resources/variants/ratrig/ratrig_vcore3_300_0.6.inst.cfg +++ b/resources/variants/ratrig/ratrig_vcore3_300_0.6.inst.cfg @@ -1,12 +1,13 @@ [general] +definition = ratrig_vcore3_300 name = 0.6mm Nozzle version = 4 -definition = ratrig_vcore3_300 [metadata] +hardware_type = nozzle setting_version = 22 type = variant -hardware_type = nozzle [values] machine_nozzle_size = 0.6 + diff --git a/resources/variants/ratrig/ratrig_vcore3_300_0.8.inst.cfg b/resources/variants/ratrig/ratrig_vcore3_300_0.8.inst.cfg index a9c568738f..99d6d7e38b 100644 --- a/resources/variants/ratrig/ratrig_vcore3_300_0.8.inst.cfg +++ b/resources/variants/ratrig/ratrig_vcore3_300_0.8.inst.cfg @@ -1,12 +1,13 @@ [general] +definition = ratrig_vcore3_300 name = 0.8mm Nozzle version = 4 -definition = ratrig_vcore3_300 [metadata] +hardware_type = nozzle setting_version = 22 type = variant -hardware_type = nozzle [values] machine_nozzle_size = 0.8 + diff --git a/resources/variants/ratrig/ratrig_vcore3_300_1.0.inst.cfg b/resources/variants/ratrig/ratrig_vcore3_300_1.0.inst.cfg index 96216c6679..7ad21e8c09 100644 --- a/resources/variants/ratrig/ratrig_vcore3_300_1.0.inst.cfg +++ b/resources/variants/ratrig/ratrig_vcore3_300_1.0.inst.cfg @@ -1,12 +1,13 @@ [general] +definition = ratrig_vcore3_300 name = 1.0mm Nozzle version = 4 -definition = ratrig_vcore3_300 [metadata] +hardware_type = nozzle setting_version = 22 type = variant -hardware_type = nozzle [values] machine_nozzle_size = 1.0 + diff --git a/resources/variants/ratrig/ratrig_vcore3_400_0.2.inst.cfg b/resources/variants/ratrig/ratrig_vcore3_400_0.2.inst.cfg index 73cf813b9e..bd02a12125 100644 --- a/resources/variants/ratrig/ratrig_vcore3_400_0.2.inst.cfg +++ b/resources/variants/ratrig/ratrig_vcore3_400_0.2.inst.cfg @@ -1,12 +1,13 @@ [general] +definition = ratrig_vcore3_400 name = 0.2mm Nozzle version = 4 -definition = ratrig_vcore3_400 [metadata] +hardware_type = nozzle setting_version = 22 type = variant -hardware_type = nozzle [values] machine_nozzle_size = 0.2 + diff --git a/resources/variants/ratrig/ratrig_vcore3_400_0.3.inst.cfg b/resources/variants/ratrig/ratrig_vcore3_400_0.3.inst.cfg index 97a30ccae3..85a585d692 100644 --- a/resources/variants/ratrig/ratrig_vcore3_400_0.3.inst.cfg +++ b/resources/variants/ratrig/ratrig_vcore3_400_0.3.inst.cfg @@ -1,12 +1,13 @@ [general] +definition = ratrig_vcore3_400 name = 0.3mm Nozzle version = 4 -definition = ratrig_vcore3_400 [metadata] +hardware_type = nozzle setting_version = 22 type = variant -hardware_type = nozzle [values] machine_nozzle_size = 0.3 + diff --git a/resources/variants/ratrig/ratrig_vcore3_400_0.4.inst.cfg b/resources/variants/ratrig/ratrig_vcore3_400_0.4.inst.cfg index 3872109417..0bcee4f011 100644 --- a/resources/variants/ratrig/ratrig_vcore3_400_0.4.inst.cfg +++ b/resources/variants/ratrig/ratrig_vcore3_400_0.4.inst.cfg @@ -1,12 +1,13 @@ [general] +definition = ratrig_vcore3_400 name = 0.4mm Nozzle version = 4 -definition = ratrig_vcore3_400 [metadata] +hardware_type = nozzle setting_version = 22 type = variant -hardware_type = nozzle [values] machine_nozzle_size = 0.4 + diff --git a/resources/variants/ratrig/ratrig_vcore3_400_0.6.inst.cfg b/resources/variants/ratrig/ratrig_vcore3_400_0.6.inst.cfg index bacbc75279..0b7ea7fc2e 100644 --- a/resources/variants/ratrig/ratrig_vcore3_400_0.6.inst.cfg +++ b/resources/variants/ratrig/ratrig_vcore3_400_0.6.inst.cfg @@ -1,12 +1,13 @@ [general] +definition = ratrig_vcore3_400 name = 0.6mm Nozzle version = 4 -definition = ratrig_vcore3_400 [metadata] +hardware_type = nozzle setting_version = 22 type = variant -hardware_type = nozzle [values] machine_nozzle_size = 0.6 + diff --git a/resources/variants/ratrig/ratrig_vcore3_400_0.8.inst.cfg b/resources/variants/ratrig/ratrig_vcore3_400_0.8.inst.cfg index 96e1f89d1a..e5baf012f0 100644 --- a/resources/variants/ratrig/ratrig_vcore3_400_0.8.inst.cfg +++ b/resources/variants/ratrig/ratrig_vcore3_400_0.8.inst.cfg @@ -1,12 +1,13 @@ [general] +definition = ratrig_vcore3_400 name = 0.8mm Nozzle version = 4 -definition = ratrig_vcore3_400 [metadata] +hardware_type = nozzle setting_version = 22 type = variant -hardware_type = nozzle [values] machine_nozzle_size = 0.8 + diff --git a/resources/variants/ratrig/ratrig_vcore3_400_1.0.inst.cfg b/resources/variants/ratrig/ratrig_vcore3_400_1.0.inst.cfg index 516ab97275..4b13608cf1 100644 --- a/resources/variants/ratrig/ratrig_vcore3_400_1.0.inst.cfg +++ b/resources/variants/ratrig/ratrig_vcore3_400_1.0.inst.cfg @@ -1,12 +1,13 @@ [general] +definition = ratrig_vcore3_400 name = 1.0mm Nozzle version = 4 -definition = ratrig_vcore3_400 [metadata] +hardware_type = nozzle setting_version = 22 type = variant -hardware_type = nozzle [values] machine_nozzle_size = 1.0 + diff --git a/resources/variants/ratrig/ratrig_vcore3_500_0.2.inst.cfg b/resources/variants/ratrig/ratrig_vcore3_500_0.2.inst.cfg index 5d8f552d62..3866031f65 100644 --- a/resources/variants/ratrig/ratrig_vcore3_500_0.2.inst.cfg +++ b/resources/variants/ratrig/ratrig_vcore3_500_0.2.inst.cfg @@ -1,12 +1,13 @@ [general] +definition = ratrig_vcore3_500 name = 0.2mm Nozzle version = 4 -definition = ratrig_vcore3_500 [metadata] +hardware_type = nozzle setting_version = 22 type = variant -hardware_type = nozzle [values] machine_nozzle_size = 0.2 + diff --git a/resources/variants/ratrig/ratrig_vcore3_500_0.3.inst.cfg b/resources/variants/ratrig/ratrig_vcore3_500_0.3.inst.cfg index 89773c5026..c3dcc2fa25 100644 --- a/resources/variants/ratrig/ratrig_vcore3_500_0.3.inst.cfg +++ b/resources/variants/ratrig/ratrig_vcore3_500_0.3.inst.cfg @@ -1,12 +1,13 @@ [general] +definition = ratrig_vcore3_500 name = 0.3mm Nozzle version = 4 -definition = ratrig_vcore3_500 [metadata] +hardware_type = nozzle setting_version = 22 type = variant -hardware_type = nozzle [values] machine_nozzle_size = 0.3 + diff --git a/resources/variants/ratrig/ratrig_vcore3_500_0.4.inst.cfg b/resources/variants/ratrig/ratrig_vcore3_500_0.4.inst.cfg index 4d97550b3e..8c1911df41 100644 --- a/resources/variants/ratrig/ratrig_vcore3_500_0.4.inst.cfg +++ b/resources/variants/ratrig/ratrig_vcore3_500_0.4.inst.cfg @@ -1,12 +1,13 @@ [general] +definition = ratrig_vcore3_500 name = 0.4mm Nozzle version = 4 -definition = ratrig_vcore3_500 [metadata] +hardware_type = nozzle setting_version = 22 type = variant -hardware_type = nozzle [values] machine_nozzle_size = 0.4 + diff --git a/resources/variants/ratrig/ratrig_vcore3_500_0.6.inst.cfg b/resources/variants/ratrig/ratrig_vcore3_500_0.6.inst.cfg index 2092d5c76a..fa9170ee16 100644 --- a/resources/variants/ratrig/ratrig_vcore3_500_0.6.inst.cfg +++ b/resources/variants/ratrig/ratrig_vcore3_500_0.6.inst.cfg @@ -1,12 +1,13 @@ [general] +definition = ratrig_vcore3_500 name = 0.6mm Nozzle version = 4 -definition = ratrig_vcore3_500 [metadata] +hardware_type = nozzle setting_version = 22 type = variant -hardware_type = nozzle [values] machine_nozzle_size = 0.6 + diff --git a/resources/variants/ratrig/ratrig_vcore3_500_0.8.inst.cfg b/resources/variants/ratrig/ratrig_vcore3_500_0.8.inst.cfg index 9810346ad6..ee71589ca2 100644 --- a/resources/variants/ratrig/ratrig_vcore3_500_0.8.inst.cfg +++ b/resources/variants/ratrig/ratrig_vcore3_500_0.8.inst.cfg @@ -1,12 +1,13 @@ [general] +definition = ratrig_vcore3_500 name = 0.8mm Nozzle version = 4 -definition = ratrig_vcore3_500 [metadata] +hardware_type = nozzle setting_version = 22 type = variant -hardware_type = nozzle [values] machine_nozzle_size = 0.8 + diff --git a/resources/variants/ratrig/ratrig_vcore3_500_1.0.inst.cfg b/resources/variants/ratrig/ratrig_vcore3_500_1.0.inst.cfg index cc790cc53e..6e91017f1e 100644 --- a/resources/variants/ratrig/ratrig_vcore3_500_1.0.inst.cfg +++ b/resources/variants/ratrig/ratrig_vcore3_500_1.0.inst.cfg @@ -1,12 +1,13 @@ [general] +definition = ratrig_vcore3_500 name = 1.0mm Nozzle version = 4 -definition = ratrig_vcore3_500 [metadata] +hardware_type = nozzle setting_version = 22 type = variant -hardware_type = nozzle [values] machine_nozzle_size = 1.0 + diff --git a/resources/variants/ratrig/ratrig_vminion_0.2.inst.cfg b/resources/variants/ratrig/ratrig_vminion_0.2.inst.cfg index 0a90304e94..0f9433e1b2 100644 --- a/resources/variants/ratrig/ratrig_vminion_0.2.inst.cfg +++ b/resources/variants/ratrig/ratrig_vminion_0.2.inst.cfg @@ -1,12 +1,13 @@ [general] +definition = ratrig_vminion name = 0.2mm Nozzle version = 4 -definition = ratrig_vminion [metadata] +hardware_type = nozzle setting_version = 22 type = variant -hardware_type = nozzle [values] machine_nozzle_size = 0.2 + diff --git a/resources/variants/ratrig/ratrig_vminion_0.3.inst.cfg b/resources/variants/ratrig/ratrig_vminion_0.3.inst.cfg index 36c7d9bbca..0faf86e4d0 100644 --- a/resources/variants/ratrig/ratrig_vminion_0.3.inst.cfg +++ b/resources/variants/ratrig/ratrig_vminion_0.3.inst.cfg @@ -1,12 +1,13 @@ [general] +definition = ratrig_vminion name = 0.3mm Nozzle version = 4 -definition = ratrig_vminion [metadata] +hardware_type = nozzle setting_version = 22 type = variant -hardware_type = nozzle [values] machine_nozzle_size = 0.3 + diff --git a/resources/variants/ratrig/ratrig_vminion_0.4.inst.cfg b/resources/variants/ratrig/ratrig_vminion_0.4.inst.cfg index 50bcd8f69b..0d126748d1 100644 --- a/resources/variants/ratrig/ratrig_vminion_0.4.inst.cfg +++ b/resources/variants/ratrig/ratrig_vminion_0.4.inst.cfg @@ -1,12 +1,13 @@ [general] +definition = ratrig_vminion name = 0.4mm Nozzle version = 4 -definition = ratrig_vminion [metadata] +hardware_type = nozzle setting_version = 22 type = variant -hardware_type = nozzle [values] machine_nozzle_size = 0.4 + diff --git a/resources/variants/ratrig/ratrig_vminion_0.6.inst.cfg b/resources/variants/ratrig/ratrig_vminion_0.6.inst.cfg index c4ab87616a..189218b151 100644 --- a/resources/variants/ratrig/ratrig_vminion_0.6.inst.cfg +++ b/resources/variants/ratrig/ratrig_vminion_0.6.inst.cfg @@ -1,12 +1,13 @@ [general] +definition = ratrig_vminion name = 0.6mm Nozzle version = 4 -definition = ratrig_vminion [metadata] +hardware_type = nozzle setting_version = 22 type = variant -hardware_type = nozzle [values] machine_nozzle_size = 0.6 + diff --git a/resources/variants/ratrig/ratrig_vminion_0.8.inst.cfg b/resources/variants/ratrig/ratrig_vminion_0.8.inst.cfg index 8fb2a33b60..e8a6437abd 100644 --- a/resources/variants/ratrig/ratrig_vminion_0.8.inst.cfg +++ b/resources/variants/ratrig/ratrig_vminion_0.8.inst.cfg @@ -1,12 +1,13 @@ [general] +definition = ratrig_vminion name = 0.8mm Nozzle version = 4 -definition = ratrig_vminion [metadata] +hardware_type = nozzle setting_version = 22 type = variant -hardware_type = nozzle [values] machine_nozzle_size = 0.8 + diff --git a/resources/variants/ratrig/ratrig_vminion_1.0.inst.cfg b/resources/variants/ratrig/ratrig_vminion_1.0.inst.cfg index c946cfd5f0..9a55294853 100644 --- a/resources/variants/ratrig/ratrig_vminion_1.0.inst.cfg +++ b/resources/variants/ratrig/ratrig_vminion_1.0.inst.cfg @@ -1,12 +1,13 @@ [general] +definition = ratrig_vminion name = 1.0mm Nozzle version = 4 -definition = ratrig_vminion [metadata] +hardware_type = nozzle setting_version = 22 type = variant -hardware_type = nozzle [values] machine_nozzle_size = 1.0 +