diff --git a/resources/profiles/Blocks.json b/resources/profiles/Blocks.json index f24bcb81da..4c4936ab28 100644 --- a/resources/profiles/Blocks.json +++ b/resources/profiles/Blocks.json @@ -1,6 +1,6 @@ { "name": "Blocks", - "version": "02.04.00.04", + "version": "02.04.00.13", "force_update": "0", "description": "Blocks configurations", "machine_model_list": [ @@ -43,8 +43,8 @@ "sub_path": "process/0.16mm Optimal 0.4 nozzle @Blocks_RF50.json" }, { - "name": "0.20mm Standard 0.4 nozzle @Blocks", - "sub_path": "process/0.20mm Standard 0.4 nozzle @Blocks.json" + "name": "0.20mm Standard 0.4 nozzle @Blocks_Pro_S100", + "sub_path": "process/0.20mm Standard 0.4 nozzle @Blocks_Pro_S100.json" }, { "name": "0.20mm Standard 0.4 nozzle @Blocks_RD50_V2", @@ -55,8 +55,8 @@ "sub_path": "process/0.20mm Standard 0.4 nozzle @Blocks_RF50.json" }, { - "name": "0.24mm Draft 0.4 nozzle @Blocks", - "sub_path": "process/0.24mm Draft 0.4 nozzle @Blocks.json" + "name": "0.24mm Draft 0.4 nozzle @Blocks_Pro_S100", + "sub_path": "process/0.24mm Draft 0.4 nozzle @Blocks_Pro_S100.json" }, { "name": "0.24mm Draft 0.4 nozzle @Blocks_RD50_V2", @@ -75,8 +75,8 @@ "sub_path": "process/0.28mm Extra Draft 0.4 nozzle @Blocks_RF50.json" }, { - "name": "0.30mm Extra Draft 0.4 nozzle @Blocks", - "sub_path": "process/0.30mm Extra Draft 0.4 nozzle @Blocks.json" + "name": "0.30mm Extra Draft 0.4 nozzle @Blocks_Pro_S100", + "sub_path": "process/0.30mm Extra Draft 0.4 nozzle @Blocks_Pro_S100.json" }, { "name": "fdm_process_common 0.6 nozzle", @@ -111,8 +111,8 @@ "sub_path": "process/0.26mm Standard 0.6 nozzle @Blocks_RF50.json" }, { - "name": "0.30mm Standard 0.6 nozzle @Blocks", - "sub_path": "process/0.30mm Standard 0.6 nozzle @Blocks.json" + "name": "0.30mm Standard 0.6 nozzle @Blocks_Pro_S100", + "sub_path": "process/0.30mm Standard 0.6 nozzle @Blocks_Pro_S100.json" }, { "name": "0.32mm Draft 0.6 nozzle @Blocks_RD50_V2", @@ -131,12 +131,12 @@ "sub_path": "process/0.38mm Extra Draft 0.6 nozzle @Blocks_RF50.json" }, { - "name": "0.40mm Draft 0.6 nozzle @Blocks", - "sub_path": "process/0.40mm Draft 0.6 nozzle @Blocks.json" + "name": "0.40mm Draft 0.6 nozzle @Blocks_Pro_S100", + "sub_path": "process/0.40mm Draft 0.6 nozzle @Blocks_Pro_S100.json" }, { - "name": "0.30mm Optimal 0.8 nozzle @Blocks", - "sub_path": "process/0.30mm Optimal 0.8 nozzle @Blocks.json" + "name": "0.30mm Optimal 0.8 nozzle @Blocks_Pro_S100", + "sub_path": "process/0.30mm Optimal 0.8 nozzle @Blocks_Pro_S100.json" }, { "name": "0.30mm Optimal 0.8 nozzle @Blocks_RD50_V2", @@ -155,8 +155,8 @@ "sub_path": "process/0.38mm Standard 0.8 nozzle @Blocks_RF50.json" }, { - "name": "0.40mm Standard 0.8 nozzle @Blocks", - "sub_path": "process/0.40mm Standard 0.8 nozzle @Blocks.json" + "name": "0.40mm Standard 0.8 nozzle @Blocks_Pro_S100", + "sub_path": "process/0.40mm Standard 0.8 nozzle @Blocks_Pro_S100.json" }, { "name": "0.46mm Draft 0.8 nozzle @Blocks_RD50_V2", @@ -167,8 +167,8 @@ "sub_path": "process/0.46mm Draft 0.8 nozzle @Blocks_RF50.json" }, { - "name": "0.50mm Draft 0.8 nozzle @Blocks", - "sub_path": "process/0.50mm Draft 0.8 nozzle @Blocks.json" + "name": "0.50mm Draft 0.8 nozzle @Blocks_Pro_S100", + "sub_path": "process/0.50mm Draft 0.8 nozzle @Blocks_Pro_S100.json" }, { "name": "0.54mm Extra Draft 0.8 nozzle @Blocks_RD50_V2", @@ -179,36 +179,36 @@ "sub_path": "process/0.54mm Extra Draft 0.8 nozzle @Blocks_RF50.json" }, { - "name": "0.30mm Optimal 1.0 nozzle @Blocks", - "sub_path": "process/0.30mm Optimal 1.0 nozzle @Blocks.json" + "name": "0.30mm Optimal 1.0 nozzle @Blocks_Pro_S100", + "sub_path": "process/0.30mm Optimal 1.0 nozzle @Blocks_Pro_S100.json" }, { - "name": "0.50mm Standard 1.0 nozzle @Blocks", - "sub_path": "process/0.50mm Standard 1.0 nozzle @Blocks.json" + "name": "0.50mm Standard 1.0 nozzle @Blocks_Pro_S100", + "sub_path": "process/0.50mm Standard 1.0 nozzle @Blocks_Pro_S100.json" }, { - "name": "0.60mm Draft 1.0 nozzle @Blocks", - "sub_path": "process/0.60mm Draft 1.0 nozzle @Blocks.json" + "name": "0.60mm Draft 1.0 nozzle @Blocks_Pro_S100", + "sub_path": "process/0.60mm Draft 1.0 nozzle @Blocks_Pro_S100.json" }, { - "name": "0.70mm Extra Draft 1.0 nozzle @Blocks", - "sub_path": "process/0.70mm Extra Draft 1.0 nozzle @Blocks.json" + "name": "0.70mm Extra Draft 1.0 nozzle @Blocks_Pro_S100", + "sub_path": "process/0.70mm Extra Draft 1.0 nozzle @Blocks_Pro_S100.json" }, { - "name": "0.50mm Optimal 1.2 nozzle @Blocks", - "sub_path": "process/0.50mm Optimal 1.2 nozzle @Blocks.json" + "name": "0.50mm Optimal 1.2 nozzle @Blocks_Pro_S100", + "sub_path": "process/0.50mm Optimal 1.2 nozzle @Blocks_Pro_S100.json" }, { - "name": "0.60mm Standard 1.2 nozzle @Blocks", - "sub_path": "process/0.60mm Standard 1.2 nozzle @Blocks.json" + "name": "0.60mm Standard 1.2 nozzle @Blocks_Pro_S100", + "sub_path": "process/0.60mm Standard 1.2 nozzle @Blocks_Pro_S100.json" }, { - "name": "0.70mm Draft 1.2 nozzle @Blocks", - "sub_path": "process/0.70mm Draft 1.2 nozzle @Blocks.json" + "name": "0.70mm Draft 1.2 nozzle @Blocks_Pro_S100", + "sub_path": "process/0.70mm Draft 1.2 nozzle @Blocks_Pro_S100.json" }, { - "name": "0.80mm Extra Draft 1.2 nozzle @Blocks", - "sub_path": "process/0.80mm Extra Draft 1.2 nozzle @Blocks.json" + "name": "0.80mm Extra Draft 1.2 nozzle @Blocks_Pro_S100", + "sub_path": "process/0.80mm Extra Draft 1.2 nozzle @Blocks_Pro_S100.json" } ], "filament_list": [ @@ -249,48 +249,148 @@ "sub_path": "filament/fdm_filament_tpu.json" }, { - "name": "Generic ABS @Blocks", - "sub_path": "filament/Generic ABS @Blocks.json" + "name": "Blocks ABS @base", + "sub_path": "filament/Blocks ABS @base.json" }, { - "name": "Generic ASA @Blocks", - "sub_path": "filament/Generic ASA @Blocks.json" + "name": "Blocks ASA @base", + "sub_path": "filament/Blocks ASA @base.json" }, { - "name": "Generic ASA-CF @Blocks", - "sub_path": "filament/Generic ASA-CF @Blocks.json" + "name": "Blocks ASA-CF @base", + "sub_path": "filament/Blocks ASA-CF @base.json" }, { - "name": "Generic PA @Blocks", - "sub_path": "filament/Generic PA @Blocks.json" + "name": "Blocks PA @base", + "sub_path": "filament/Blocks PA @base.json" }, { - "name": "Generic PA-CF @Blocks", - "sub_path": "filament/Generic PA-CF @Blocks.json" + "name": "Blocks PA-CF @base", + "sub_path": "filament/Blocks PA-CF @base.json" }, { - "name": "Generic PC @Blocks", - "sub_path": "filament/Generic PC @Blocks.json" + "name": "Blocks PC @base", + "sub_path": "filament/Blocks PC @base.json" }, { - "name": "Generic PETG @Blocks", - "sub_path": "filament/Generic PETG @Blocks.json" + "name": "Blocks PETG @base", + "sub_path": "filament/Blocks PETG @base.json" }, { - "name": "Generic PLA @Blocks", - "sub_path": "filament/Generic PLA @Blocks.json" + "name": "Blocks PLA @base", + "sub_path": "filament/Blocks PLA @base.json" }, { - "name": "Generic PLA-CF @Blocks", - "sub_path": "filament/Generic PLA-CF @Blocks.json" + "name": "Blocks PLA-CF @base", + "sub_path": "filament/Blocks PLA-CF @base.json" }, { - "name": "Generic PVA @Blocks", - "sub_path": "filament/Generic PVA @Blocks.json" + "name": "Blocks PVA @base", + "sub_path": "filament/Blocks PVA @base.json" }, { - "name": "Generic TPU @Blocks", - "sub_path": "filament/Generic TPU @Blocks.json" + "name": "Blocks TPU @base", + "sub_path": "filament/Blocks TPU @base.json" + }, + { + "name": "Blocks ABS @Blocks_RD50_V2", + "sub_path": "filament/Blocks ABS @Blocks_RD50_V2.json" + }, + { + "name": "Blocks ABS @Blocks_RF50", + "sub_path": "filament/Blocks ABS @Blocks_RF50.json" + }, + { + "name": "Blocks ASA @Blocks_RD50_V2", + "sub_path": "filament/Blocks ASA @Blocks_RD50_V2.json" + }, + { + "name": "Blocks ASA @Blocks_RF50", + "sub_path": "filament/Blocks ASA @Blocks_RF50.json" + }, + { + "name": "Blocks ASA-CF @Blocks_RD50_V2", + "sub_path": "filament/Blocks ASA-CF @Blocks_RD50_V2.json" + }, + { + "name": "Blocks ASA-CF @Blocks_RF50", + "sub_path": "filament/Blocks ASA-CF @Blocks_RF50.json" + }, + { + "name": "Blocks PA @Blocks_RD50_V2", + "sub_path": "filament/Blocks PA @Blocks_RD50_V2.json" + }, + { + "name": "Blocks PA @Blocks_RF50", + "sub_path": "filament/Blocks PA @Blocks_RF50.json" + }, + { + "name": "Blocks PA-CF @Blocks_RD50_V2", + "sub_path": "filament/Blocks PA-CF @Blocks_RD50_V2.json" + }, + { + "name": "Blocks PA-CF @Blocks_RF50", + "sub_path": "filament/Blocks PA-CF @Blocks_RF50.json" + }, + { + "name": "Blocks PC @Blocks_RD50_V2", + "sub_path": "filament/Blocks PC @Blocks_RD50_V2.json" + }, + { + "name": "Blocks PC @Blocks_RF50", + "sub_path": "filament/Blocks PC @Blocks_RF50.json" + }, + { + "name": "Blocks PETG @Blocks_Pro_S100", + "sub_path": "filament/Blocks PETG @Blocks_Pro_S100.json" + }, + { + "name": "Blocks PETG @Blocks_RD50_V2", + "sub_path": "filament/Blocks PETG @Blocks_RD50_V2.json" + }, + { + "name": "Blocks PETG @Blocks_RF50", + "sub_path": "filament/Blocks PETG @Blocks_RF50.json" + }, + { + "name": "Blocks PLA @Blocks_Pro_S100", + "sub_path": "filament/Blocks PLA @Blocks_Pro_S100.json" + }, + { + "name": "Blocks PLA @Blocks_RD50_V2", + "sub_path": "filament/Blocks PLA @Blocks_RD50_V2.json" + }, + { + "name": "Blocks PLA @Blocks_RF50", + "sub_path": "filament/Blocks PLA @Blocks_RF50.json" + }, + { + "name": "Blocks PLA-CF @Blocks_RD50_V2", + "sub_path": "filament/Blocks PLA-CF @Blocks_RD50_V2.json" + }, + { + "name": "Blocks PLA-CF @Blocks_RF50", + "sub_path": "filament/Blocks PLA-CF @Blocks_RF50.json" + }, + { + "name": "Blocks PVA @Blocks_RD50_V2", + "sub_path": "filament/Blocks PVA @Blocks_RD50_V2.json" + }, + { + "name": "Blocks PVA @Blocks_RF50", + "sub_path": "filament/Blocks PVA @Blocks_RF50.json" + }, + { + "name": "Blocks TPU @Blocks_Pro_S100", + "sub_path": "filament/Blocks TPU @Blocks_Pro_S100.json" + }, + { + "name": "Blocks TPU @Blocks_RD50_V2", + "sub_path": "filament/Blocks TPU @Blocks_RD50_V2.json" + }, + { + "name": "Blocks TPU @Blocks_RF50", + "sub_path": "filament/Blocks TPU @Blocks_RF50.json" } ], "machine_list": [ diff --git a/resources/profiles/Blocks/filament/Blocks ABS @Blocks_RD50_V2.json b/resources/profiles/Blocks/filament/Blocks ABS @Blocks_RD50_V2.json new file mode 100644 index 0000000000..7ce4729e96 --- /dev/null +++ b/resources/profiles/Blocks/filament/Blocks ABS @Blocks_RD50_V2.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "name": "Blocks ABS @Blocks_RD50_V2", + "inherits": "Blocks ABS @base", + "from": "system", + "setting_id": "qhQ0qQDGJgsueCAF", + "instantiation": "true", + "compatible_printers": [ + "BLOCKS RD50 V2 0.4 nozzle", + "BLOCKS RD50 V2 0.6 nozzle", + "BLOCKS RD50 V2 0.8 nozzle" + ], + "renamed_from": "Blocks Generic ABS;Generic ABS @Blocks" +} diff --git a/resources/profiles/Blocks/filament/Blocks ABS @Blocks_RF50.json b/resources/profiles/Blocks/filament/Blocks ABS @Blocks_RF50.json new file mode 100644 index 0000000000..3f418a8d6b --- /dev/null +++ b/resources/profiles/Blocks/filament/Blocks ABS @Blocks_RF50.json @@ -0,0 +1,13 @@ +{ + "type": "filament", + "name": "Blocks ABS @Blocks_RF50", + "inherits": "Blocks ABS @base", + "from": "system", + "setting_id": "bGYMFFdKiROKuSiY", + "instantiation": "true", + "compatible_printers": [ + "BLOCKS RF50 0.4 nozzle", + "BLOCKS RF50 0.6 nozzle", + "BLOCKS RF50 0.8 nozzle" + ] +} diff --git a/resources/profiles/Blocks/filament/Generic ABS @Blocks.json b/resources/profiles/Blocks/filament/Blocks ABS @base.json similarity index 75% rename from resources/profiles/Blocks/filament/Generic ABS @Blocks.json rename to resources/profiles/Blocks/filament/Blocks ABS @base.json index c3d09cfd18..e475770f64 100644 --- a/resources/profiles/Blocks/filament/Generic ABS @Blocks.json +++ b/resources/profiles/Blocks/filament/Blocks ABS @base.json @@ -1,12 +1,13 @@ { "type": "filament", - "name": "Generic ABS @Blocks", + "name": "Blocks ABS @base", "inherits": "fdm_filament_abs", - "renamed_from": "Blocks Generic ABS", "from": "system", - "setting_id": "TL1Q1kA4t36GGObG", - "filament_id": "OFY9muEs", - "instantiation": "true", + "filament_id": "OFBBhiX8", + "instantiation": "false", + "filament_vendor": [ + "Blocks" + ], "filament_flow_ratio": [ "0.95" ], @@ -81,13 +82,5 @@ ], "during_print_exhaust_fan_speed": [ "100" - ], - "compatible_printers": [ - "BLOCKS RD50 V2 0.4 nozzle", - "BLOCKS RD50 V2 0.6 nozzle", - "BLOCKS RD50 V2 0.8 nozzle", - "BLOCKS RF50 0.4 nozzle", - "BLOCKS RF50 0.6 nozzle", - "BLOCKS RF50 0.8 nozzle" ] } diff --git a/resources/profiles/Blocks/filament/Blocks ASA @Blocks_RD50_V2.json b/resources/profiles/Blocks/filament/Blocks ASA @Blocks_RD50_V2.json new file mode 100644 index 0000000000..bab020171f --- /dev/null +++ b/resources/profiles/Blocks/filament/Blocks ASA @Blocks_RD50_V2.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "name": "Blocks ASA @Blocks_RD50_V2", + "inherits": "Blocks ASA @base", + "from": "system", + "setting_id": "HW7xDXThvpVFbMq5", + "instantiation": "true", + "compatible_printers": [ + "BLOCKS RD50 V2 0.4 nozzle", + "BLOCKS RD50 V2 0.6 nozzle", + "BLOCKS RD50 V2 0.8 nozzle" + ], + "renamed_from": "Blocks Generic ASA;Generic ASA @Blocks" +} diff --git a/resources/profiles/Blocks/filament/Blocks ASA @Blocks_RF50.json b/resources/profiles/Blocks/filament/Blocks ASA @Blocks_RF50.json new file mode 100644 index 0000000000..603c2d7dfa --- /dev/null +++ b/resources/profiles/Blocks/filament/Blocks ASA @Blocks_RF50.json @@ -0,0 +1,13 @@ +{ + "type": "filament", + "name": "Blocks ASA @Blocks_RF50", + "inherits": "Blocks ASA @base", + "from": "system", + "setting_id": "lBW7SCsvawi4icNU", + "instantiation": "true", + "compatible_printers": [ + "BLOCKS RF50 0.4 nozzle", + "BLOCKS RF50 0.6 nozzle", + "BLOCKS RF50 0.8 nozzle" + ] +} diff --git a/resources/profiles/Blocks/filament/Generic ASA @Blocks.json b/resources/profiles/Blocks/filament/Blocks ASA @base.json similarity index 75% rename from resources/profiles/Blocks/filament/Generic ASA @Blocks.json rename to resources/profiles/Blocks/filament/Blocks ASA @base.json index 0c1ee32085..8fed35b779 100644 --- a/resources/profiles/Blocks/filament/Generic ASA @Blocks.json +++ b/resources/profiles/Blocks/filament/Blocks ASA @base.json @@ -1,12 +1,13 @@ { "type": "filament", - "name": "Generic ASA @Blocks", + "name": "Blocks ASA @base", "inherits": "fdm_filament_asa", - "renamed_from": "Blocks Generic ASA", "from": "system", - "setting_id": "xP7cB4RHgbm4cYDD", - "filament_id": "OFLPAxz3", - "instantiation": "true", + "filament_id": "OFTz2YXa", + "instantiation": "false", + "filament_vendor": [ + "Blocks" + ], "filament_flow_ratio": [ "0.95" ], @@ -81,13 +82,5 @@ ], "during_print_exhaust_fan_speed": [ "100" - ], - "compatible_printers": [ - "BLOCKS RD50 V2 0.4 nozzle", - "BLOCKS RD50 V2 0.6 nozzle", - "BLOCKS RD50 V2 0.8 nozzle", - "BLOCKS RF50 0.4 nozzle", - "BLOCKS RF50 0.6 nozzle", - "BLOCKS RF50 0.8 nozzle" ] } diff --git a/resources/profiles/Blocks/filament/Blocks ASA-CF @Blocks_RD50_V2.json b/resources/profiles/Blocks/filament/Blocks ASA-CF @Blocks_RD50_V2.json new file mode 100644 index 0000000000..bdfb288047 --- /dev/null +++ b/resources/profiles/Blocks/filament/Blocks ASA-CF @Blocks_RD50_V2.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "name": "Blocks ASA-CF @Blocks_RD50_V2", + "inherits": "Blocks ASA-CF @base", + "from": "system", + "setting_id": "x5ksnGLGGy1PgDns", + "instantiation": "true", + "compatible_printers": [ + "BLOCKS RD50 V2 0.4 nozzle", + "BLOCKS RD50 V2 0.6 nozzle", + "BLOCKS RD50 V2 0.8 nozzle" + ], + "renamed_from": "Blocks Generic ASA-CF;Generic ASA-CF @Blocks" +} diff --git a/resources/profiles/Blocks/filament/Blocks ASA-CF @Blocks_RF50.json b/resources/profiles/Blocks/filament/Blocks ASA-CF @Blocks_RF50.json new file mode 100644 index 0000000000..1304f52400 --- /dev/null +++ b/resources/profiles/Blocks/filament/Blocks ASA-CF @Blocks_RF50.json @@ -0,0 +1,13 @@ +{ + "type": "filament", + "name": "Blocks ASA-CF @Blocks_RF50", + "inherits": "Blocks ASA-CF @base", + "from": "system", + "setting_id": "pcbd5qFiMZAvDPg1", + "instantiation": "true", + "compatible_printers": [ + "BLOCKS RF50 0.4 nozzle", + "BLOCKS RF50 0.6 nozzle", + "BLOCKS RF50 0.8 nozzle" + ] +} diff --git a/resources/profiles/Blocks/filament/Generic ASA-CF @Blocks.json b/resources/profiles/Blocks/filament/Blocks ASA-CF @base.json similarity index 75% rename from resources/profiles/Blocks/filament/Generic ASA-CF @Blocks.json rename to resources/profiles/Blocks/filament/Blocks ASA-CF @base.json index 0d9f0aa862..fb1cdeb998 100644 --- a/resources/profiles/Blocks/filament/Generic ASA-CF @Blocks.json +++ b/resources/profiles/Blocks/filament/Blocks ASA-CF @base.json @@ -1,12 +1,13 @@ { "type": "filament", - "name": "Generic ASA-CF @Blocks", + "name": "Blocks ASA-CF @base", "inherits": "fdm_filament_asa", - "renamed_from": "Blocks Generic ASA-CF", "from": "system", - "setting_id": "ju4ue7yJoz3ujny6", - "filament_id": "OF53eLVD", - "instantiation": "true", + "filament_id": "OF8b9I7o", + "instantiation": "false", + "filament_vendor": [ + "Blocks" + ], "filament_type": [ "ASA-CF" ], @@ -84,13 +85,5 @@ ], "during_print_exhaust_fan_speed": [ "100" - ], - "compatible_printers": [ - "BLOCKS RD50 V2 0.4 nozzle", - "BLOCKS RD50 V2 0.6 nozzle", - "BLOCKS RD50 V2 0.8 nozzle", - "BLOCKS RF50 0.4 nozzle", - "BLOCKS RF50 0.6 nozzle", - "BLOCKS RF50 0.8 nozzle" ] } diff --git a/resources/profiles/Blocks/filament/Blocks PA @Blocks_RD50_V2.json b/resources/profiles/Blocks/filament/Blocks PA @Blocks_RD50_V2.json new file mode 100644 index 0000000000..6486ec0ed8 --- /dev/null +++ b/resources/profiles/Blocks/filament/Blocks PA @Blocks_RD50_V2.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "name": "Blocks PA @Blocks_RD50_V2", + "inherits": "Blocks PA @base", + "from": "system", + "setting_id": "gxD81n2jjrReLD29", + "instantiation": "true", + "compatible_printers": [ + "BLOCKS RD50 V2 0.4 nozzle", + "BLOCKS RD50 V2 0.6 nozzle", + "BLOCKS RD50 V2 0.8 nozzle" + ], + "renamed_from": "Blocks Generic PA;Generic PA @Blocks" +} diff --git a/resources/profiles/Blocks/filament/Blocks PA @Blocks_RF50.json b/resources/profiles/Blocks/filament/Blocks PA @Blocks_RF50.json new file mode 100644 index 0000000000..6b11df1a22 --- /dev/null +++ b/resources/profiles/Blocks/filament/Blocks PA @Blocks_RF50.json @@ -0,0 +1,13 @@ +{ + "type": "filament", + "name": "Blocks PA @Blocks_RF50", + "inherits": "Blocks PA @base", + "from": "system", + "setting_id": "PzKxRMDnQUzVWRer", + "instantiation": "true", + "compatible_printers": [ + "BLOCKS RF50 0.4 nozzle", + "BLOCKS RF50 0.6 nozzle", + "BLOCKS RF50 0.8 nozzle" + ] +} diff --git a/resources/profiles/Blocks/filament/Blocks PA @base.json b/resources/profiles/Blocks/filament/Blocks PA @base.json new file mode 100644 index 0000000000..ff6ca4b599 --- /dev/null +++ b/resources/profiles/Blocks/filament/Blocks PA @base.json @@ -0,0 +1,17 @@ +{ + "type": "filament", + "name": "Blocks PA @base", + "inherits": "fdm_filament_pa", + "from": "system", + "filament_id": "OFidOgK4", + "instantiation": "false", + "filament_vendor": [ + "Blocks" + ], + "filament_flow_ratio": [ + "0.98" + ], + "filament_max_volumetric_speed": [ + "10" + ] +} diff --git a/resources/profiles/Blocks/filament/Blocks PA-CF @Blocks_RD50_V2.json b/resources/profiles/Blocks/filament/Blocks PA-CF @Blocks_RD50_V2.json new file mode 100644 index 0000000000..1946ce16b6 --- /dev/null +++ b/resources/profiles/Blocks/filament/Blocks PA-CF @Blocks_RD50_V2.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "name": "Blocks PA-CF @Blocks_RD50_V2", + "inherits": "Blocks PA-CF @base", + "from": "system", + "setting_id": "EtbeKx3rbhUo1TtM", + "instantiation": "true", + "compatible_printers": [ + "BLOCKS RD50 V2 0.4 nozzle", + "BLOCKS RD50 V2 0.6 nozzle", + "BLOCKS RD50 V2 0.8 nozzle" + ], + "renamed_from": "Blocks Generic PA-CF;Generic PA-CF @Blocks" +} diff --git a/resources/profiles/Blocks/filament/Blocks PA-CF @Blocks_RF50.json b/resources/profiles/Blocks/filament/Blocks PA-CF @Blocks_RF50.json new file mode 100644 index 0000000000..1b1e02f58e --- /dev/null +++ b/resources/profiles/Blocks/filament/Blocks PA-CF @Blocks_RF50.json @@ -0,0 +1,13 @@ +{ + "type": "filament", + "name": "Blocks PA-CF @Blocks_RF50", + "inherits": "Blocks PA-CF @base", + "from": "system", + "setting_id": "udI8Q4X7HaPIaPt4", + "instantiation": "true", + "compatible_printers": [ + "BLOCKS RF50 0.4 nozzle", + "BLOCKS RF50 0.6 nozzle", + "BLOCKS RF50 0.8 nozzle" + ] +} diff --git a/resources/profiles/Blocks/filament/Generic PA-CF @Blocks.json b/resources/profiles/Blocks/filament/Blocks PA-CF @base.json similarity index 76% rename from resources/profiles/Blocks/filament/Generic PA-CF @Blocks.json rename to resources/profiles/Blocks/filament/Blocks PA-CF @base.json index 7ec957f6d1..360a090042 100644 --- a/resources/profiles/Blocks/filament/Generic PA-CF @Blocks.json +++ b/resources/profiles/Blocks/filament/Blocks PA-CF @base.json @@ -1,12 +1,13 @@ { "type": "filament", - "name": "Generic PA-CF @Blocks", + "name": "Blocks PA-CF @base", "inherits": "fdm_filament_pa", - "renamed_from": "Blocks Generic PA-CF", "from": "system", - "setting_id": "T6SO0WRdnG6wcyG8", - "filament_id": "OFQLcbps", - "instantiation": "true", + "filament_id": "OFdWrXpL", + "instantiation": "false", + "filament_vendor": [ + "Blocks" + ], "filament_type": [ "PA-CF" ], @@ -87,13 +88,5 @@ ], "during_print_exhaust_fan_speed": [ "80" - ], - "compatible_printers": [ - "BLOCKS RD50 V2 0.4 nozzle", - "BLOCKS RD50 V2 0.6 nozzle", - "BLOCKS RD50 V2 0.8 nozzle", - "BLOCKS RF50 0.4 nozzle", - "BLOCKS RF50 0.6 nozzle", - "BLOCKS RF50 0.8 nozzle" ] } diff --git a/resources/profiles/Blocks/filament/Blocks PC @Blocks_RD50_V2.json b/resources/profiles/Blocks/filament/Blocks PC @Blocks_RD50_V2.json new file mode 100644 index 0000000000..cdeec3a9aa --- /dev/null +++ b/resources/profiles/Blocks/filament/Blocks PC @Blocks_RD50_V2.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "name": "Blocks PC @Blocks_RD50_V2", + "inherits": "Blocks PC @base", + "from": "system", + "setting_id": "HLc0shWnKwJzSFyW", + "instantiation": "true", + "compatible_printers": [ + "BLOCKS RD50 V2 0.4 nozzle", + "BLOCKS RD50 V2 0.6 nozzle", + "BLOCKS RD50 V2 0.8 nozzle" + ], + "renamed_from": "Blocks Generic PC;Generic PC @Blocks" +} diff --git a/resources/profiles/Blocks/filament/Blocks PC @Blocks_RF50.json b/resources/profiles/Blocks/filament/Blocks PC @Blocks_RF50.json new file mode 100644 index 0000000000..ad23b4ba03 --- /dev/null +++ b/resources/profiles/Blocks/filament/Blocks PC @Blocks_RF50.json @@ -0,0 +1,13 @@ +{ + "type": "filament", + "name": "Blocks PC @Blocks_RF50", + "inherits": "Blocks PC @base", + "from": "system", + "setting_id": "9a6bccZopMTeNHYu", + "instantiation": "true", + "compatible_printers": [ + "BLOCKS RF50 0.4 nozzle", + "BLOCKS RF50 0.6 nozzle", + "BLOCKS RF50 0.8 nozzle" + ] +} diff --git a/resources/profiles/Blocks/filament/Blocks PC @base.json b/resources/profiles/Blocks/filament/Blocks PC @base.json new file mode 100644 index 0000000000..83b3d75300 --- /dev/null +++ b/resources/profiles/Blocks/filament/Blocks PC @base.json @@ -0,0 +1,17 @@ +{ + "type": "filament", + "name": "Blocks PC @base", + "inherits": "fdm_filament_pc", + "from": "system", + "filament_id": "OFlGY0MN", + "instantiation": "false", + "filament_vendor": [ + "Blocks" + ], + "filament_flow_ratio": [ + "0.94" + ], + "filament_max_volumetric_speed": [ + "10" + ] +} diff --git a/resources/profiles/Blocks/filament/Blocks PETG @Blocks_Pro_S100.json b/resources/profiles/Blocks/filament/Blocks PETG @Blocks_Pro_S100.json new file mode 100644 index 0000000000..3a6619c8ef --- /dev/null +++ b/resources/profiles/Blocks/filament/Blocks PETG @Blocks_Pro_S100.json @@ -0,0 +1,16 @@ +{ + "type": "filament", + "name": "Blocks PETG @Blocks_Pro_S100", + "inherits": "Blocks PETG @base", + "from": "system", + "setting_id": "AhMR49fcFqtrQ6hI", + "instantiation": "true", + "compatible_printers": [ + "BLOCKS Pro S100 0.4 nozzle", + "BLOCKS Pro S100 0.6 nozzle", + "BLOCKS Pro S100 0.8 nozzle", + "BLOCKS Pro S100 1.0 nozzle", + "BLOCKS Pro S100 1.2 nozzle" + ], + "renamed_from": "Blocks Generic PETG;Generic PETG @Blocks" +} diff --git a/resources/profiles/Blocks/filament/Blocks PETG @Blocks_RD50_V2.json b/resources/profiles/Blocks/filament/Blocks PETG @Blocks_RD50_V2.json new file mode 100644 index 0000000000..e48e2d8145 --- /dev/null +++ b/resources/profiles/Blocks/filament/Blocks PETG @Blocks_RD50_V2.json @@ -0,0 +1,13 @@ +{ + "type": "filament", + "name": "Blocks PETG @Blocks_RD50_V2", + "inherits": "Blocks PETG @base", + "from": "system", + "setting_id": "3v7ah1zVG8MERPSJ", + "instantiation": "true", + "compatible_printers": [ + "BLOCKS RD50 V2 0.4 nozzle", + "BLOCKS RD50 V2 0.6 nozzle", + "BLOCKS RD50 V2 0.8 nozzle" + ] +} diff --git a/resources/profiles/Blocks/filament/Blocks PETG @Blocks_RF50.json b/resources/profiles/Blocks/filament/Blocks PETG @Blocks_RF50.json new file mode 100644 index 0000000000..c810cf0e8f --- /dev/null +++ b/resources/profiles/Blocks/filament/Blocks PETG @Blocks_RF50.json @@ -0,0 +1,13 @@ +{ + "type": "filament", + "name": "Blocks PETG @Blocks_RF50", + "inherits": "Blocks PETG @base", + "from": "system", + "setting_id": "S7weR19wo9meJ6Yz", + "instantiation": "true", + "compatible_printers": [ + "BLOCKS RF50 0.4 nozzle", + "BLOCKS RF50 0.6 nozzle", + "BLOCKS RF50 0.8 nozzle" + ] +} diff --git a/resources/profiles/Blocks/filament/Generic PETG @Blocks.json b/resources/profiles/Blocks/filament/Blocks PETG @base.json similarity index 68% rename from resources/profiles/Blocks/filament/Generic PETG @Blocks.json rename to resources/profiles/Blocks/filament/Blocks PETG @base.json index 45a2a13e9b..f272fa9049 100644 --- a/resources/profiles/Blocks/filament/Generic PETG @Blocks.json +++ b/resources/profiles/Blocks/filament/Blocks PETG @base.json @@ -1,12 +1,13 @@ { "type": "filament", - "name": "Generic PETG @Blocks", + "name": "Blocks PETG @base", "inherits": "fdm_filament_petg", - "renamed_from": "Blocks Generic PETG", "from": "system", - "setting_id": "NgzPlYItKHbmGgv3", - "filament_id": "OFYPdQJh", - "instantiation": "true", + "filament_id": "OF9t1Ga0", + "instantiation": "false", + "filament_vendor": [ + "Blocks" + ], "filament_flow_ratio": [ "0.94" ], @@ -81,18 +82,5 @@ ], "slow_down_layer_time": [ "5" - ], - "compatible_printers": [ - "BLOCKS Pro S100 0.4 nozzle", - "BLOCKS Pro S100 0.6 nozzle", - "BLOCKS Pro S100 0.8 nozzle", - "BLOCKS Pro S100 1.0 nozzle", - "BLOCKS Pro S100 1.2 nozzle", - "BLOCKS RD50 V2 0.4 nozzle", - "BLOCKS RD50 V2 0.6 nozzle", - "BLOCKS RD50 V2 0.8 nozzle", - "BLOCKS RF50 0.4 nozzle", - "BLOCKS RF50 0.6 nozzle", - "BLOCKS RF50 0.8 nozzle" ] } diff --git a/resources/profiles/Blocks/filament/Blocks PLA @Blocks_Pro_S100.json b/resources/profiles/Blocks/filament/Blocks PLA @Blocks_Pro_S100.json new file mode 100644 index 0000000000..64f6bbefa0 --- /dev/null +++ b/resources/profiles/Blocks/filament/Blocks PLA @Blocks_Pro_S100.json @@ -0,0 +1,16 @@ +{ + "type": "filament", + "name": "Blocks PLA @Blocks_Pro_S100", + "inherits": "Blocks PLA @base", + "from": "system", + "setting_id": "vWojuLYIfduLGFLL", + "instantiation": "true", + "compatible_printers": [ + "BLOCKS Pro S100 0.4 nozzle", + "BLOCKS Pro S100 0.6 nozzle", + "BLOCKS Pro S100 0.8 nozzle", + "BLOCKS Pro S100 1.0 nozzle", + "BLOCKS Pro S100 1.2 nozzle" + ], + "renamed_from": "Blocks Generic PLA;Generic PLA @Blocks" +} diff --git a/resources/profiles/Blocks/filament/Blocks PLA @Blocks_RD50_V2.json b/resources/profiles/Blocks/filament/Blocks PLA @Blocks_RD50_V2.json new file mode 100644 index 0000000000..ac283bbe06 --- /dev/null +++ b/resources/profiles/Blocks/filament/Blocks PLA @Blocks_RD50_V2.json @@ -0,0 +1,13 @@ +{ + "type": "filament", + "name": "Blocks PLA @Blocks_RD50_V2", + "inherits": "Blocks PLA @base", + "from": "system", + "setting_id": "y7y8NcXNdp17sJUs", + "instantiation": "true", + "compatible_printers": [ + "BLOCKS RD50 V2 0.4 nozzle", + "BLOCKS RD50 V2 0.6 nozzle", + "BLOCKS RD50 V2 0.8 nozzle" + ] +} diff --git a/resources/profiles/Blocks/filament/Blocks PLA @Blocks_RF50.json b/resources/profiles/Blocks/filament/Blocks PLA @Blocks_RF50.json new file mode 100644 index 0000000000..c59a35df74 --- /dev/null +++ b/resources/profiles/Blocks/filament/Blocks PLA @Blocks_RF50.json @@ -0,0 +1,13 @@ +{ + "type": "filament", + "name": "Blocks PLA @Blocks_RF50", + "inherits": "Blocks PLA @base", + "from": "system", + "setting_id": "jt1MJF4eZzkkscEJ", + "instantiation": "true", + "compatible_printers": [ + "BLOCKS RF50 0.4 nozzle", + "BLOCKS RF50 0.6 nozzle", + "BLOCKS RF50 0.8 nozzle" + ] +} diff --git a/resources/profiles/Blocks/filament/Generic PLA @Blocks.json b/resources/profiles/Blocks/filament/Blocks PLA @base.json similarity index 52% rename from resources/profiles/Blocks/filament/Generic PLA @Blocks.json rename to resources/profiles/Blocks/filament/Blocks PLA @base.json index 3a5c942899..c4051967af 100644 --- a/resources/profiles/Blocks/filament/Generic PLA @Blocks.json +++ b/resources/profiles/Blocks/filament/Blocks PLA @base.json @@ -1,12 +1,13 @@ { "type": "filament", - "name": "Generic PLA @Blocks", + "name": "Blocks PLA @base", "inherits": "fdm_filament_pla", - "renamed_from": "Blocks Generic PLA", "from": "system", - "setting_id": "kjhuttx4T8OtTNmV", - "filament_id": "OFDSrzZ8", - "instantiation": "true", + "filament_id": "OFVGAC8g", + "instantiation": "false", + "filament_vendor": [ + "Blocks" + ], "filament_flow_ratio": [ "0.95" ], @@ -39,18 +40,5 @@ ], "during_print_exhaust_fan_speed": [ "100" - ], - "compatible_printers": [ - "BLOCKS Pro S100 0.4 nozzle", - "BLOCKS Pro S100 0.6 nozzle", - "BLOCKS Pro S100 0.8 nozzle", - "BLOCKS Pro S100 1.0 nozzle", - "BLOCKS Pro S100 1.2 nozzle", - "BLOCKS RD50 V2 0.4 nozzle", - "BLOCKS RD50 V2 0.6 nozzle", - "BLOCKS RD50 V2 0.8 nozzle", - "BLOCKS RF50 0.4 nozzle", - "BLOCKS RF50 0.6 nozzle", - "BLOCKS RF50 0.8 nozzle" ] } diff --git a/resources/profiles/Blocks/filament/Blocks PLA-CF @Blocks_RD50_V2.json b/resources/profiles/Blocks/filament/Blocks PLA-CF @Blocks_RD50_V2.json new file mode 100644 index 0000000000..08050266b7 --- /dev/null +++ b/resources/profiles/Blocks/filament/Blocks PLA-CF @Blocks_RD50_V2.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "name": "Blocks PLA-CF @Blocks_RD50_V2", + "inherits": "Blocks PLA-CF @base", + "from": "system", + "setting_id": "lhBtMKP1DmOB3HOI", + "instantiation": "true", + "compatible_printers": [ + "BLOCKS RD50 V2 0.4 nozzle", + "BLOCKS RD50 V2 0.6 nozzle", + "BLOCKS RD50 V2 0.8 nozzle" + ], + "renamed_from": "Blocks Generic PLA-CF;Generic PLA-CF @Blocks" +} diff --git a/resources/profiles/Blocks/filament/Blocks PLA-CF @Blocks_RF50.json b/resources/profiles/Blocks/filament/Blocks PLA-CF @Blocks_RF50.json new file mode 100644 index 0000000000..1f27f49fdf --- /dev/null +++ b/resources/profiles/Blocks/filament/Blocks PLA-CF @Blocks_RF50.json @@ -0,0 +1,13 @@ +{ + "type": "filament", + "name": "Blocks PLA-CF @Blocks_RF50", + "inherits": "Blocks PLA-CF @base", + "from": "system", + "setting_id": "6CU83mAyhcZ4FCPI", + "instantiation": "true", + "compatible_printers": [ + "BLOCKS RF50 0.4 nozzle", + "BLOCKS RF50 0.6 nozzle", + "BLOCKS RF50 0.8 nozzle" + ] +} diff --git a/resources/profiles/Blocks/filament/Blocks PLA-CF @base.json b/resources/profiles/Blocks/filament/Blocks PLA-CF @base.json new file mode 100644 index 0000000000..989a427df4 --- /dev/null +++ b/resources/profiles/Blocks/filament/Blocks PLA-CF @base.json @@ -0,0 +1,23 @@ +{ + "type": "filament", + "name": "Blocks PLA-CF @base", + "inherits": "fdm_filament_pla", + "from": "system", + "filament_id": "OF6FfwOP", + "instantiation": "false", + "filament_vendor": [ + "Blocks" + ], + "filament_flow_ratio": [ + "0.95" + ], + "filament_max_volumetric_speed": [ + "20" + ], + "filament_type": [ + "PLA-CF" + ], + "slow_down_layer_time": [ + "7" + ] +} diff --git a/resources/profiles/Blocks/filament/Blocks PVA @Blocks_RD50_V2.json b/resources/profiles/Blocks/filament/Blocks PVA @Blocks_RD50_V2.json new file mode 100644 index 0000000000..f1beff3b23 --- /dev/null +++ b/resources/profiles/Blocks/filament/Blocks PVA @Blocks_RD50_V2.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "name": "Blocks PVA @Blocks_RD50_V2", + "inherits": "Blocks PVA @base", + "from": "system", + "setting_id": "hREDqwKF6qyKkakp", + "instantiation": "true", + "compatible_printers": [ + "BLOCKS RD50 V2 0.4 nozzle", + "BLOCKS RD50 V2 0.6 nozzle", + "BLOCKS RD50 V2 0.8 nozzle" + ], + "renamed_from": "Blocks Generic PVA;Generic PVA @Blocks" +} diff --git a/resources/profiles/Blocks/filament/Blocks PVA @Blocks_RF50.json b/resources/profiles/Blocks/filament/Blocks PVA @Blocks_RF50.json new file mode 100644 index 0000000000..91a0a0e5e6 --- /dev/null +++ b/resources/profiles/Blocks/filament/Blocks PVA @Blocks_RF50.json @@ -0,0 +1,13 @@ +{ + "type": "filament", + "name": "Blocks PVA @Blocks_RF50", + "inherits": "Blocks PVA @base", + "from": "system", + "setting_id": "q6pKqHY7Iz4OZaAC", + "instantiation": "true", + "compatible_printers": [ + "BLOCKS RF50 0.4 nozzle", + "BLOCKS RF50 0.6 nozzle", + "BLOCKS RF50 0.8 nozzle" + ] +} diff --git a/resources/profiles/Blocks/filament/Blocks PVA @base.json b/resources/profiles/Blocks/filament/Blocks PVA @base.json new file mode 100644 index 0000000000..326e61b362 --- /dev/null +++ b/resources/profiles/Blocks/filament/Blocks PVA @base.json @@ -0,0 +1,17 @@ +{ + "type": "filament", + "name": "Blocks PVA @base", + "inherits": "fdm_filament_pva", + "from": "system", + "filament_id": "OFqcNuE1", + "instantiation": "false", + "filament_vendor": [ + "Blocks" + ], + "filament_flow_ratio": [ + "0.98" + ], + "filament_max_volumetric_speed": [ + "20" + ] +} diff --git a/resources/profiles/Blocks/filament/Blocks TPU @Blocks_Pro_S100.json b/resources/profiles/Blocks/filament/Blocks TPU @Blocks_Pro_S100.json new file mode 100644 index 0000000000..d186e824ef --- /dev/null +++ b/resources/profiles/Blocks/filament/Blocks TPU @Blocks_Pro_S100.json @@ -0,0 +1,16 @@ +{ + "type": "filament", + "name": "Blocks TPU @Blocks_Pro_S100", + "inherits": "Blocks TPU @base", + "from": "system", + "setting_id": "6Rkz2je91JRTRoTi", + "instantiation": "true", + "compatible_printers": [ + "BLOCKS Pro S100 0.4 nozzle", + "BLOCKS Pro S100 0.6 nozzle", + "BLOCKS Pro S100 0.8 nozzle", + "BLOCKS Pro S100 1.0 nozzle", + "BLOCKS Pro S100 1.2 nozzle" + ], + "renamed_from": "Blocks Generic TPU;Generic TPU @Blocks" +} diff --git a/resources/profiles/Blocks/filament/Blocks TPU @Blocks_RD50_V2.json b/resources/profiles/Blocks/filament/Blocks TPU @Blocks_RD50_V2.json new file mode 100644 index 0000000000..088ad69bbb --- /dev/null +++ b/resources/profiles/Blocks/filament/Blocks TPU @Blocks_RD50_V2.json @@ -0,0 +1,13 @@ +{ + "type": "filament", + "name": "Blocks TPU @Blocks_RD50_V2", + "inherits": "Blocks TPU @base", + "from": "system", + "setting_id": "mkCqRQTtXldzoEUg", + "instantiation": "true", + "compatible_printers": [ + "BLOCKS RD50 V2 0.4 nozzle", + "BLOCKS RD50 V2 0.6 nozzle", + "BLOCKS RD50 V2 0.8 nozzle" + ] +} diff --git a/resources/profiles/Blocks/filament/Blocks TPU @Blocks_RF50.json b/resources/profiles/Blocks/filament/Blocks TPU @Blocks_RF50.json new file mode 100644 index 0000000000..53773dd813 --- /dev/null +++ b/resources/profiles/Blocks/filament/Blocks TPU @Blocks_RF50.json @@ -0,0 +1,13 @@ +{ + "type": "filament", + "name": "Blocks TPU @Blocks_RF50", + "inherits": "Blocks TPU @base", + "from": "system", + "setting_id": "bCCvu5Ow1JkwIrRR", + "instantiation": "true", + "compatible_printers": [ + "BLOCKS RF50 0.4 nozzle", + "BLOCKS RF50 0.6 nozzle", + "BLOCKS RF50 0.8 nozzle" + ] +} diff --git a/resources/profiles/Blocks/filament/Generic TPU @Blocks.json b/resources/profiles/Blocks/filament/Blocks TPU @base.json similarity index 58% rename from resources/profiles/Blocks/filament/Generic TPU @Blocks.json rename to resources/profiles/Blocks/filament/Blocks TPU @base.json index 8b5873a745..9b26d57636 100644 --- a/resources/profiles/Blocks/filament/Generic TPU @Blocks.json +++ b/resources/profiles/Blocks/filament/Blocks TPU @base.json @@ -1,12 +1,13 @@ { "type": "filament", - "name": "Generic TPU @Blocks", + "name": "Blocks TPU @base", "inherits": "fdm_filament_tpu", - "renamed_from": "Blocks Generic TPU", "from": "system", - "setting_id": "6iVYOCZo8ugs4JA0", - "filament_id": "OFgbpcy9", - "instantiation": "true", + "filament_id": "OFYnedOZ", + "instantiation": "false", + "filament_vendor": [ + "Blocks" + ], "filament_max_volumetric_speed": [ "4" ], @@ -54,18 +55,5 @@ ], "during_print_exhaust_fan_speed": [ "80" - ], - "compatible_printers": [ - "BLOCKS Pro S100 0.4 nozzle", - "BLOCKS Pro S100 0.6 nozzle", - "BLOCKS Pro S100 0.8 nozzle", - "BLOCKS Pro S100 1.0 nozzle", - "BLOCKS Pro S100 1.2 nozzle", - "BLOCKS RD50 V2 0.4 nozzle", - "BLOCKS RD50 V2 0.6 nozzle", - "BLOCKS RD50 V2 0.8 nozzle", - "BLOCKS RF50 0.4 nozzle", - "BLOCKS RF50 0.6 nozzle", - "BLOCKS RF50 0.8 nozzle" ] } diff --git a/resources/profiles/Blocks/filament/Generic PA @Blocks.json b/resources/profiles/Blocks/filament/Generic PA @Blocks.json deleted file mode 100644 index e624226ded..0000000000 --- a/resources/profiles/Blocks/filament/Generic PA @Blocks.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "type": "filament", - "name": "Generic PA @Blocks", - "inherits": "fdm_filament_pa", - "renamed_from": "Blocks Generic PA", - "from": "system", - "setting_id": "hL3p8gAeciwDkjNK", - "filament_id": "OFg8ndtj", - "instantiation": "true", - "filament_flow_ratio": [ - "0.98" - ], - "filament_max_volumetric_speed": [ - "10" - ], - "compatible_printers": [ - "BLOCKS RD50 V2 0.4 nozzle", - "BLOCKS RD50 V2 0.6 nozzle", - "BLOCKS RD50 V2 0.8 nozzle", - "BLOCKS RF50 0.4 nozzle", - "BLOCKS RF50 0.6 nozzle", - "BLOCKS RF50 0.8 nozzle" - ] -} diff --git a/resources/profiles/Blocks/filament/Generic PC @Blocks.json b/resources/profiles/Blocks/filament/Generic PC @Blocks.json deleted file mode 100644 index 7b5df77bc5..0000000000 --- a/resources/profiles/Blocks/filament/Generic PC @Blocks.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "type": "filament", - "name": "Generic PC @Blocks", - "inherits": "fdm_filament_pc", - "renamed_from": "Blocks Generic PC", - "from": "system", - "setting_id": "Xhs8PjtmwwVj0ksE", - "filament_id": "OFLakOUI", - "instantiation": "true", - "filament_flow_ratio": [ - "0.94" - ], - "filament_max_volumetric_speed": [ - "10" - ], - "compatible_printers": [ - "BLOCKS RD50 V2 0.4 nozzle", - "BLOCKS RD50 V2 0.6 nozzle", - "BLOCKS RD50 V2 0.8 nozzle", - "BLOCKS RF50 0.4 nozzle", - "BLOCKS RF50 0.6 nozzle", - "BLOCKS RF50 0.8 nozzle" - ] -} diff --git a/resources/profiles/Blocks/filament/Generic PLA-CF @Blocks.json b/resources/profiles/Blocks/filament/Generic PLA-CF @Blocks.json deleted file mode 100644 index 3a3ac5daba..0000000000 --- a/resources/profiles/Blocks/filament/Generic PLA-CF @Blocks.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "type": "filament", - "name": "Generic PLA-CF @Blocks", - "inherits": "fdm_filament_pla", - "renamed_from": "Blocks Generic PLA-CF", - "from": "system", - "setting_id": "oKUqzwAWMrpiyGLf", - "filament_id": "OFWbdGsC", - "instantiation": "true", - "filament_flow_ratio": [ - "0.95" - ], - "filament_max_volumetric_speed": [ - "20" - ], - "filament_type": [ - "PLA-CF" - ], - "slow_down_layer_time": [ - "7" - ], - "compatible_printers": [ - "BLOCKS RD50 V2 0.4 nozzle", - "BLOCKS RD50 V2 0.6 nozzle", - "BLOCKS RD50 V2 0.8 nozzle", - "BLOCKS RF50 0.4 nozzle", - "BLOCKS RF50 0.6 nozzle", - "BLOCKS RF50 0.8 nozzle" - ] -} diff --git a/resources/profiles/Blocks/filament/Generic PVA @Blocks.json b/resources/profiles/Blocks/filament/Generic PVA @Blocks.json deleted file mode 100644 index 5b6a3ad368..0000000000 --- a/resources/profiles/Blocks/filament/Generic PVA @Blocks.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "type": "filament", - "name": "Generic PVA @Blocks", - "inherits": "fdm_filament_pva", - "renamed_from": "Blocks Generic PVA", - "from": "system", - "setting_id": "tNw3oe7VovLkgUbB", - "filament_id": "OFDvXujf", - "instantiation": "true", - "filament_flow_ratio": [ - "0.98" - ], - "filament_max_volumetric_speed": [ - "20" - ], - "compatible_printers": [ - "BLOCKS RD50 V2 0.4 nozzle", - "BLOCKS RD50 V2 0.6 nozzle", - "BLOCKS RD50 V2 0.8 nozzle", - "BLOCKS RF50 0.4 nozzle", - "BLOCKS RF50 0.6 nozzle", - "BLOCKS RF50 0.8 nozzle" - ] -} diff --git a/resources/profiles/Blocks/machine/BLOCKS Pro S100 0.4 nozzle.json b/resources/profiles/Blocks/machine/BLOCKS Pro S100 0.4 nozzle.json index e8cc1893c7..43951cf9c5 100644 --- a/resources/profiles/Blocks/machine/BLOCKS Pro S100 0.4 nozzle.json +++ b/resources/profiles/Blocks/machine/BLOCKS Pro S100 0.4 nozzle.json @@ -6,7 +6,7 @@ "setting_id": "G7HQgaspHXduDM8O", "instantiation": "true", "printer_model": "BLOCKS Pro S100", - "default_print_profile": "0.20mm Standard 0.4 nozzle @Blocks", + "default_print_profile": "0.20mm Standard 0.4 nozzle @Blocks_Pro_S100", "max_layer_height": [ "0.30" ], @@ -25,5 +25,8 @@ "printable_height": "900", "upward_compatible_machine": [ "BLOCKS Pro S100" + ], + "default_filament_profile": [ + "Blocks PLA @Blocks_Pro_S100" ] } diff --git a/resources/profiles/Blocks/machine/BLOCKS Pro S100 0.6 nozzle.json b/resources/profiles/Blocks/machine/BLOCKS Pro S100 0.6 nozzle.json index 49e519d2ec..a55153bab7 100644 --- a/resources/profiles/Blocks/machine/BLOCKS Pro S100 0.6 nozzle.json +++ b/resources/profiles/Blocks/machine/BLOCKS Pro S100 0.6 nozzle.json @@ -6,7 +6,7 @@ "setting_id": "XkWdS210oUMQN17N", "instantiation": "true", "printer_model": "BLOCKS Pro S100", - "default_print_profile": "0.30mm Standard 0.6 nozzle @Blocks", + "default_print_profile": "0.30mm Standard 0.6 nozzle @Blocks_Pro_S100", "max_layer_height": [ "0.50" ], @@ -26,5 +26,8 @@ "upward_compatible_machine": [ "BLOCKS Pro S100" ], - "printer_variant": "0.6" + "printer_variant": "0.6", + "default_filament_profile": [ + "Blocks PLA @Blocks_Pro_S100" + ] } diff --git a/resources/profiles/Blocks/machine/BLOCKS Pro S100 0.8 nozzle.json b/resources/profiles/Blocks/machine/BLOCKS Pro S100 0.8 nozzle.json index 3c3a29f111..7e889bbf14 100644 --- a/resources/profiles/Blocks/machine/BLOCKS Pro S100 0.8 nozzle.json +++ b/resources/profiles/Blocks/machine/BLOCKS Pro S100 0.8 nozzle.json @@ -6,7 +6,7 @@ "setting_id": "I6PdeCS7SbvIlkZf", "instantiation": "true", "printer_model": "BLOCKS Pro S100", - "default_print_profile": "0.40mm Standard 0.8 nozzle @Blocks", + "default_print_profile": "0.40mm Standard 0.8 nozzle @Blocks_Pro_S100", "max_layer_height": [ "0.56" ], @@ -26,5 +26,8 @@ "upward_compatible_machine": [ "BLOCKS Pro S100" ], - "printer_variant": "0.8" + "printer_variant": "0.8", + "default_filament_profile": [ + "Blocks PLA @Blocks_Pro_S100" + ] } diff --git a/resources/profiles/Blocks/machine/BLOCKS Pro S100 1.0 nozzle.json b/resources/profiles/Blocks/machine/BLOCKS Pro S100 1.0 nozzle.json index 1be375c34b..c84ad8c227 100644 --- a/resources/profiles/Blocks/machine/BLOCKS Pro S100 1.0 nozzle.json +++ b/resources/profiles/Blocks/machine/BLOCKS Pro S100 1.0 nozzle.json @@ -6,7 +6,7 @@ "setting_id": "elLdUyy9RhUoa37o", "instantiation": "true", "printer_model": "BLOCKS Pro S100", - "default_print_profile": "0.50mm Standard 1.0 nozzle @Blocks", + "default_print_profile": "0.50mm Standard 1.0 nozzle @Blocks_Pro_S100", "max_layer_height": [ "0.7" ], @@ -26,5 +26,8 @@ "upward_compatible_machine": [ "BLOCKS Pro S100" ], - "printer_variant": "1.0" + "printer_variant": "1.0", + "default_filament_profile": [ + "Blocks PLA @Blocks_Pro_S100" + ] } diff --git a/resources/profiles/Blocks/machine/BLOCKS Pro S100 1.2 nozzle.json b/resources/profiles/Blocks/machine/BLOCKS Pro S100 1.2 nozzle.json index 426fdafd55..11aab094cf 100644 --- a/resources/profiles/Blocks/machine/BLOCKS Pro S100 1.2 nozzle.json +++ b/resources/profiles/Blocks/machine/BLOCKS Pro S100 1.2 nozzle.json @@ -6,7 +6,7 @@ "setting_id": "xtsGSJ4JkbHTPi44", "instantiation": "true", "printer_model": "BLOCKS Pro S100", - "default_print_profile": "0.60mm Standard 1.2 nozzle @Blocks", + "default_print_profile": "0.60mm Standard 1.2 nozzle @Blocks_Pro_S100", "max_layer_height": [ "0.8" ], @@ -26,5 +26,8 @@ "upward_compatible_machine": [ "BLOCKS Pro S100" ], - "printer_variant": "1.2" + "printer_variant": "1.2", + "default_filament_profile": [ + "Blocks PLA @Blocks_Pro_S100" + ] } diff --git a/resources/profiles/Blocks/machine/BLOCKS Pro S100.json b/resources/profiles/Blocks/machine/BLOCKS Pro S100.json index de9ea3756c..e034ffd9b1 100644 --- a/resources/profiles/Blocks/machine/BLOCKS Pro S100.json +++ b/resources/profiles/Blocks/machine/BLOCKS Pro S100.json @@ -8,5 +8,5 @@ "bed_model": "PRO S100 HotBed model.stl", "bed_texture": "PRO S100 HotBed texture.svg", "hotend_model": "BLOCKS PrintCore.stl", - "default_materials": "Generic PLA @Blocks;Generic PETG @Blocks;Generic TPU @Blocks" + "default_materials": "Blocks PLA @Blocks_Pro_S100;Blocks PETG @Blocks_Pro_S100;Blocks TPU @Blocks_Pro_S100" } diff --git a/resources/profiles/Blocks/machine/BLOCKS RD50 V2 0.4 nozzle.json b/resources/profiles/Blocks/machine/BLOCKS RD50 V2 0.4 nozzle.json index 3d2908a403..c5613b39ec 100644 --- a/resources/profiles/Blocks/machine/BLOCKS RD50 V2 0.4 nozzle.json +++ b/resources/profiles/Blocks/machine/BLOCKS RD50 V2 0.4 nozzle.json @@ -34,5 +34,9 @@ "printable_height": "500", "upward_compatible_machine": [ "BLOCKS RD50 V2" + ], + "printer_variant": "0.4", + "default_filament_profile": [ + "Blocks PLA @Blocks_RD50_V2" ] } diff --git a/resources/profiles/Blocks/machine/BLOCKS RD50 V2 0.6 nozzle.json b/resources/profiles/Blocks/machine/BLOCKS RD50 V2 0.6 nozzle.json index bf41f1070f..92cde6244c 100644 --- a/resources/profiles/Blocks/machine/BLOCKS RD50 V2 0.6 nozzle.json +++ b/resources/profiles/Blocks/machine/BLOCKS RD50 V2 0.6 nozzle.json @@ -35,5 +35,8 @@ "deretraction_speed": [ "80" ], - "printer_variant": "0.6" + "printer_variant": "0.6", + "default_filament_profile": [ + "Blocks PLA @Blocks_RD50_V2" + ] } diff --git a/resources/profiles/Blocks/machine/BLOCKS RD50 V2 0.8 nozzle.json b/resources/profiles/Blocks/machine/BLOCKS RD50 V2 0.8 nozzle.json index 23c0808be2..756e77efb7 100644 --- a/resources/profiles/Blocks/machine/BLOCKS RD50 V2 0.8 nozzle.json +++ b/resources/profiles/Blocks/machine/BLOCKS RD50 V2 0.8 nozzle.json @@ -35,5 +35,8 @@ "deretraction_speed": [ "80" ], - "printer_variant": "0.8" + "printer_variant": "0.8", + "default_filament_profile": [ + "Blocks PLA @Blocks_RD50_V2" + ] } diff --git a/resources/profiles/Blocks/machine/BLOCKS RD50 V2.json b/resources/profiles/Blocks/machine/BLOCKS RD50 V2.json index 76dafd429e..1cc75448ac 100644 --- a/resources/profiles/Blocks/machine/BLOCKS RD50 V2.json +++ b/resources/profiles/Blocks/machine/BLOCKS RD50 V2.json @@ -8,5 +8,5 @@ "bed_model": "RD50 V2 HotBed model.stl", "bed_texture": "RD50 V2 HotBed texture.svg", "hotend_model": "BLOCKS PrintCore.stl", - "default_materials": "Generic PLA @Blocks;Generic PETG @Blocks;Generic TPU @Blocks" + "default_materials": "Blocks PLA @Blocks_RD50_V2;Blocks PETG @Blocks_RD50_V2;Blocks TPU @Blocks_RD50_V2" } diff --git a/resources/profiles/Blocks/machine/BLOCKS RF50 0.4 nozzle.json b/resources/profiles/Blocks/machine/BLOCKS RF50 0.4 nozzle.json index a589b6620b..9e523ef843 100644 --- a/resources/profiles/Blocks/machine/BLOCKS RF50 0.4 nozzle.json +++ b/resources/profiles/Blocks/machine/BLOCKS RF50 0.4 nozzle.json @@ -51,7 +51,7 @@ "12" ], "retraction_length": [ - "1" + "1.2" ], "retraction_speed": [ "60" @@ -79,5 +79,10 @@ ], "retract_before_wipe": [ "0" - ] + ], + "default_filament_profile": [ + "Blocks PLA @Blocks_RF50" + ], + "support_multi_bed_types": "1", + "default_bed_type": "Textured PEI Plate" } diff --git a/resources/profiles/Blocks/machine/BLOCKS RF50 0.6 nozzle.json b/resources/profiles/Blocks/machine/BLOCKS RF50 0.6 nozzle.json index fea3007abc..b0dbc7d2b9 100644 --- a/resources/profiles/Blocks/machine/BLOCKS RF50 0.6 nozzle.json +++ b/resources/profiles/Blocks/machine/BLOCKS RF50 0.6 nozzle.json @@ -51,7 +51,7 @@ "12" ], "retraction_length": [ - "1" + "1.2" ], "retraction_speed": [ "60" @@ -75,8 +75,8 @@ "BLOCKS RF50" ], "machine_start_gcode": [ - "PRINT_START EXTRUDER=[nozzle_temperature_initial_layer] BED=[bed_temperature_initial_layer]", - "SET_PRESSURE_ADVANCE ADVANCE=0.046" + "PRINT_START EXTRUDER=[nozzle_temperature_initial_layer] BED=[bed_temperature_initial_layer]\n", + "SET_PRESSURE_ADVANCE ADVANCE=0.046\n" ], "printer_variant": "0.6", "wipe_distance": [ @@ -84,5 +84,10 @@ ], "retract_before_wipe": [ "0" - ] + ], + "default_filament_profile": [ + "Blocks PLA @Blocks_RF50" + ], + "support_multi_bed_types": "1", + "default_bed_type": "Textured PEI Plate" } diff --git a/resources/profiles/Blocks/machine/BLOCKS RF50 0.8 nozzle.json b/resources/profiles/Blocks/machine/BLOCKS RF50 0.8 nozzle.json index c8d6cec882..c361a8da16 100644 --- a/resources/profiles/Blocks/machine/BLOCKS RF50 0.8 nozzle.json +++ b/resources/profiles/Blocks/machine/BLOCKS RF50 0.8 nozzle.json @@ -51,7 +51,7 @@ "12" ], "retraction_length": [ - "1" + "1.2" ], "retraction_speed": [ "60" @@ -80,5 +80,10 @@ ], "retract_before_wipe": [ "0" - ] + ], + "default_filament_profile": [ + "Blocks PLA @Blocks_RF50" + ], + "support_multi_bed_types": "1", + "default_bed_type": "Textured PEI Plate" } diff --git a/resources/profiles/Blocks/machine/BLOCKS RF50.json b/resources/profiles/Blocks/machine/BLOCKS RF50.json index 14ae8bc5f4..79aeec9ebc 100644 --- a/resources/profiles/Blocks/machine/BLOCKS RF50.json +++ b/resources/profiles/Blocks/machine/BLOCKS RF50.json @@ -8,5 +8,6 @@ "bed_model": "RF50 HotBed model.stl", "bed_texture": "RF50 HotBed texture.svg", "hotend_model": "BLOCKS PrintCore.stl", - "default_materials": "Generic PLA @Blocks;Generic PETG @Blocks;Generic TPU @Blocks" + "default_materials": "Blocks PLA @Blocks_RF50;Blocks PETG @Blocks_RF50;Blocks TPU @Blocks_RF50", + "not_support_bed_type": "Smooth Cool Plate;Engineering Plate;Textured Cool Plate;Cool Plate (SuperTack)" } diff --git a/resources/profiles/Blocks/machine/fdm_klipper_common.json b/resources/profiles/Blocks/machine/fdm_klipper_common.json index 5372b42547..eab501bf4b 100644 --- a/resources/profiles/Blocks/machine/fdm_klipper_common.json +++ b/resources/profiles/Blocks/machine/fdm_klipper_common.json @@ -123,9 +123,6 @@ "wipe": [ "1" ], - "default_filament_profile": [ - "Generic PLA @Blocks" - ], "bed_exclude_area": [ "0x0" ], diff --git a/resources/profiles/Blocks/process/0.12mm Fine 0.4 nozzle @Blocks_RF50.json b/resources/profiles/Blocks/process/0.12mm Fine 0.4 nozzle @Blocks_RF50.json index 315256dcab..43474f76c1 100644 --- a/resources/profiles/Blocks/process/0.12mm Fine 0.4 nozzle @Blocks_RF50.json +++ b/resources/profiles/Blocks/process/0.12mm Fine 0.4 nozzle @Blocks_RF50.json @@ -21,7 +21,7 @@ "top_solid_infill_flow_ratio": "0.97", "bottom_solid_infill_flow_ratio": "1.08", "seam_position": "aligned", - "sparse_infill_patter": "grid", + "sparse_infill_pattern": "grid", "initial_layer_speed": "60", "initial_layer_infill_speed": "80", "initial_travel_speed": "100%", @@ -57,5 +57,7 @@ "accel_to_decel_enable": "1", "accel_to_decel_factor": "50%", "elefant_foot_compensation": "0.25", - "elefant_foot_compensation_layers": "1" + "elefant_foot_compensation_layers": "1", + "skirt_loops": "2", + "skirt_type": "perobject" } diff --git a/resources/profiles/Blocks/process/0.16mm Optimal 0.4 nozzle @Blocks_RF50.json b/resources/profiles/Blocks/process/0.16mm Optimal 0.4 nozzle @Blocks_RF50.json index ca6facb720..b7351a4996 100644 --- a/resources/profiles/Blocks/process/0.16mm Optimal 0.4 nozzle @Blocks_RF50.json +++ b/resources/profiles/Blocks/process/0.16mm Optimal 0.4 nozzle @Blocks_RF50.json @@ -21,7 +21,7 @@ "top_solid_infill_flow_ratio": "0.97", "bottom_solid_infill_flow_ratio": "1.08", "seam_position": "aligned", - "sparse_infill_patter": "grid", + "sparse_infill_pattern": "grid", "initial_layer_speed": "60", "initial_layer_infill_speed": "80", "initial_travel_speed": "100%", @@ -57,5 +57,7 @@ "accel_to_decel_enable": "1", "accel_to_decel_factor": "50%", "elefant_foot_compensation": "0.25", - "elefant_foot_compensation_layers": "1" + "elefant_foot_compensation_layers": "1", + "skirt_loops": "2", + "skirt_type": "perobject" } diff --git a/resources/profiles/Blocks/process/0.20mm Optimal 0.6 nozzle @Blocks_RF50.json b/resources/profiles/Blocks/process/0.20mm Optimal 0.6 nozzle @Blocks_RF50.json index b80b051a71..aa2b2c8e4a 100644 --- a/resources/profiles/Blocks/process/0.20mm Optimal 0.6 nozzle @Blocks_RF50.json +++ b/resources/profiles/Blocks/process/0.20mm Optimal 0.6 nozzle @Blocks_RF50.json @@ -21,7 +21,7 @@ "top_solid_infill_flow_ratio": "0.97", "bottom_solid_infill_flow_ratio": "1.08", "seam_position": "aligned", - "sparse_infill_patter": "grid", + "sparse_infill_pattern": "grid", "initial_layer_speed": "60", "initial_layer_infill_speed": "80", "initial_travel_speed": "100%", @@ -57,5 +57,7 @@ "accel_to_decel_enable": "1", "accel_to_decel_factor": "50%", "elefant_foot_compensation": "0.25", - "elefant_foot_compensation_layers": "1" + "elefant_foot_compensation_layers": "1", + "skirt_loops": "2", + "skirt_type": "perobject" } diff --git a/resources/profiles/Blocks/process/0.20mm Standard 0.4 nozzle @Blocks.json b/resources/profiles/Blocks/process/0.20mm Standard 0.4 nozzle @Blocks_Pro_S100.json similarity index 62% rename from resources/profiles/Blocks/process/0.20mm Standard 0.4 nozzle @Blocks.json rename to resources/profiles/Blocks/process/0.20mm Standard 0.4 nozzle @Blocks_Pro_S100.json index 9f66196279..d5a27fa23b 100644 --- a/resources/profiles/Blocks/process/0.20mm Standard 0.4 nozzle @Blocks.json +++ b/resources/profiles/Blocks/process/0.20mm Standard 0.4 nozzle @Blocks_Pro_S100.json @@ -1,14 +1,15 @@ { "type": "process", - "name": "0.20mm Standard 0.4 nozzle @Blocks", + "name": "0.20mm Standard 0.4 nozzle @Blocks_Pro_S100", "inherits": "fdm_process_blocks_common", "from": "system", - "setting_id": "47aDtVL6E5DVr7Mt", + "setting_id": "QSEguMMChNFZsK5H", "instantiation": "true", "layer_height": "0.2", "bottom_shell_layers": "4", "top_shell_layers": "5", "compatible_printers": [ "BLOCKS Pro S100 0.4 nozzle" - ] + ], + "renamed_from": "0.20mm Standard 0.4 nozzle @Blocks" } diff --git a/resources/profiles/Blocks/process/0.20mm Standard 0.4 nozzle @Blocks_RF50.json b/resources/profiles/Blocks/process/0.20mm Standard 0.4 nozzle @Blocks_RF50.json index 5c88e00c2a..901f3f811d 100644 --- a/resources/profiles/Blocks/process/0.20mm Standard 0.4 nozzle @Blocks_RF50.json +++ b/resources/profiles/Blocks/process/0.20mm Standard 0.4 nozzle @Blocks_RF50.json @@ -25,7 +25,7 @@ "top_solid_infill_flow_ratio": "0.97", "bottom_solid_infill_flow_ratio": "1.08", "seam_position": "aligned", - "sparse_infill_patter": "grid", + "sparse_infill_pattern": "grid", "initial_layer_speed": "60", "initial_layer_infill_speed": "80", "initial_travel_speed": "100%", @@ -61,5 +61,7 @@ "accel_to_decel_enable": "1", "accel_to_decel_factor": "50%", "elefant_foot_compensation": "0.25", - "elefant_foot_compensation_layers": "1" + "elefant_foot_compensation_layers": "1", + "skirt_loops": "2", + "skirt_type": "perobject" } diff --git a/resources/profiles/Blocks/process/0.24mm Draft 0.4 nozzle @Blocks.json b/resources/profiles/Blocks/process/0.24mm Draft 0.4 nozzle @Blocks_Pro_S100.json similarity index 63% rename from resources/profiles/Blocks/process/0.24mm Draft 0.4 nozzle @Blocks.json rename to resources/profiles/Blocks/process/0.24mm Draft 0.4 nozzle @Blocks_Pro_S100.json index 2bc124f2dc..2716ce0c66 100644 --- a/resources/profiles/Blocks/process/0.24mm Draft 0.4 nozzle @Blocks.json +++ b/resources/profiles/Blocks/process/0.24mm Draft 0.4 nozzle @Blocks_Pro_S100.json @@ -1,14 +1,15 @@ { "type": "process", - "name": "0.24mm Draft 0.4 nozzle @Blocks", + "name": "0.24mm Draft 0.4 nozzle @Blocks_Pro_S100", "inherits": "fdm_process_blocks_common", "from": "system", - "setting_id": "ETADjxV6ViJQdnHA", + "setting_id": "uALfEFHGmup6vBYI", "instantiation": "true", "layer_height": "0.24", "bottom_shell_layers": "4", "top_shell_layers": "5", "compatible_printers": [ "BLOCKS Pro S100 0.4 nozzle" - ] + ], + "renamed_from": "0.24mm Draft 0.4 nozzle @Blocks" } diff --git a/resources/profiles/Blocks/process/0.24mm Draft 0.4 nozzle @Blocks_RF50.json b/resources/profiles/Blocks/process/0.24mm Draft 0.4 nozzle @Blocks_RF50.json index edb1bfcc2d..ab911910b9 100644 --- a/resources/profiles/Blocks/process/0.24mm Draft 0.4 nozzle @Blocks_RF50.json +++ b/resources/profiles/Blocks/process/0.24mm Draft 0.4 nozzle @Blocks_RF50.json @@ -21,7 +21,7 @@ "top_solid_infill_flow_ratio": "0.97", "bottom_solid_infill_flow_ratio": "1.08", "seam_position": "aligned", - "sparse_infill_patter": "grid", + "sparse_infill_pattern": "grid", "initial_layer_speed": "60", "initial_layer_infill_speed": "80", "initial_travel_speed": "100%", @@ -57,5 +57,7 @@ "accel_to_decel_enable": "1", "accel_to_decel_factor": "50%", "elefant_foot_compensation": "0.25", - "elefant_foot_compensation_layers": "1" + "elefant_foot_compensation_layers": "1", + "skirt_loops": "2", + "skirt_type": "perobject" } diff --git a/resources/profiles/Blocks/process/0.26mm Standard 0.6 nozzle @Blocks_RF50.json b/resources/profiles/Blocks/process/0.26mm Standard 0.6 nozzle @Blocks_RF50.json index d2f853b638..739b4f7168 100644 --- a/resources/profiles/Blocks/process/0.26mm Standard 0.6 nozzle @Blocks_RF50.json +++ b/resources/profiles/Blocks/process/0.26mm Standard 0.6 nozzle @Blocks_RF50.json @@ -21,7 +21,7 @@ "top_solid_infill_flow_ratio": "0.97", "bottom_solid_infill_flow_ratio": "1.08", "seam_position": "aligned", - "sparse_infill_patter": "grid", + "sparse_infill_pattern": "grid", "initial_layer_speed": "60", "initial_layer_infill_speed": "80", "initial_travel_speed": "100%", @@ -57,5 +57,7 @@ "accel_to_decel_enable": "1", "accel_to_decel_factor": "50%", "elefant_foot_compensation": "0.25", - "elefant_foot_compensation_layers": "1" + "elefant_foot_compensation_layers": "1", + "skirt_loops": "2", + "skirt_type": "perobject" } diff --git a/resources/profiles/Blocks/process/0.28mm Extra Draft 0.4 nozzle @Blocks_RF50.json b/resources/profiles/Blocks/process/0.28mm Extra Draft 0.4 nozzle @Blocks_RF50.json index dd6b60d371..7c9a108287 100644 --- a/resources/profiles/Blocks/process/0.28mm Extra Draft 0.4 nozzle @Blocks_RF50.json +++ b/resources/profiles/Blocks/process/0.28mm Extra Draft 0.4 nozzle @Blocks_RF50.json @@ -22,7 +22,7 @@ "top_solid_infill_flow_ratio": "0.97", "bottom_solid_infill_flow_ratio": "1.08", "seam_position": "aligned", - "sparse_infill_patter": "grid", + "sparse_infill_pattern": "grid", "initial_layer_speed": "60", "initial_layer_infill_speed": "80", "initial_travel_speed": "100%", @@ -57,5 +57,7 @@ "accel_to_decel_enable": "1", "accel_to_decel_factor": "50%", "elefant_foot_compensation": "0.25", - "elefant_foot_compensation_layers": "1" + "elefant_foot_compensation_layers": "1", + "skirt_loops": "2", + "skirt_type": "perobject" } diff --git a/resources/profiles/Blocks/process/0.30mm Extra Draft 0.4 nozzle @Blocks.json b/resources/profiles/Blocks/process/0.30mm Extra Draft 0.4 nozzle @Blocks_Pro_S100.json similarity index 61% rename from resources/profiles/Blocks/process/0.30mm Extra Draft 0.4 nozzle @Blocks.json rename to resources/profiles/Blocks/process/0.30mm Extra Draft 0.4 nozzle @Blocks_Pro_S100.json index 0cef66fb5a..c67ebf9341 100644 --- a/resources/profiles/Blocks/process/0.30mm Extra Draft 0.4 nozzle @Blocks.json +++ b/resources/profiles/Blocks/process/0.30mm Extra Draft 0.4 nozzle @Blocks_Pro_S100.json @@ -1,14 +1,15 @@ { "type": "process", - "name": "0.30mm Extra Draft 0.4 nozzle @Blocks", + "name": "0.30mm Extra Draft 0.4 nozzle @Blocks_Pro_S100", "inherits": "fdm_process_blocks_common", "from": "system", - "setting_id": "UbuICsmppKDsaaZ4", + "setting_id": "HYKF5l2OGvpugSQy", "instantiation": "true", "bottom_shell_layers": "3", "top_shell_layers": "4", "layer_height": "0.30", "compatible_printers": [ "BLOCKS Pro S100 0.4 nozzle" - ] + ], + "renamed_from": "0.30mm Extra Draft 0.4 nozzle @Blocks" } diff --git a/resources/profiles/Blocks/process/0.30mm Optimal 0.8 nozzle @Blocks.json b/resources/profiles/Blocks/process/0.30mm Optimal 0.8 nozzle @Blocks_Pro_S100.json similarity index 63% rename from resources/profiles/Blocks/process/0.30mm Optimal 0.8 nozzle @Blocks.json rename to resources/profiles/Blocks/process/0.30mm Optimal 0.8 nozzle @Blocks_Pro_S100.json index bbb74c97a9..bbd486176f 100644 --- a/resources/profiles/Blocks/process/0.30mm Optimal 0.8 nozzle @Blocks.json +++ b/resources/profiles/Blocks/process/0.30mm Optimal 0.8 nozzle @Blocks_Pro_S100.json @@ -1,14 +1,15 @@ { "type": "process", - "name": "0.30mm Optimal 0.8 nozzle @Blocks", + "name": "0.30mm Optimal 0.8 nozzle @Blocks_Pro_S100", "inherits": "fdm_process_common 0.8 nozzle", "from": "system", - "setting_id": "YqkYzp5zdH4R5upm", + "setting_id": "OUfZvizM5MGnvHfp", "instantiation": "true", "bottom_shell_layers": "3", "top_shell_layers": "3", "layer_height": "0.3", "compatible_printers": [ "BLOCKS Pro S100 0.8 nozzle" - ] + ], + "renamed_from": "0.30mm Optimal 0.8 nozzle @Blocks" } diff --git a/resources/profiles/Blocks/process/0.30mm Optimal 0.8 nozzle @Blocks_RF50.json b/resources/profiles/Blocks/process/0.30mm Optimal 0.8 nozzle @Blocks_RF50.json index 9d909c1dd4..f6763c9494 100644 --- a/resources/profiles/Blocks/process/0.30mm Optimal 0.8 nozzle @Blocks_RF50.json +++ b/resources/profiles/Blocks/process/0.30mm Optimal 0.8 nozzle @Blocks_RF50.json @@ -21,7 +21,7 @@ "top_solid_infill_flow_ratio": "0.97", "bottom_solid_infill_flow_ratio": "1.08", "seam_position": "aligned", - "sparse_infill_patter": "grid", + "sparse_infill_pattern": "grid", "initial_layer_speed": "60", "initial_layer_infill_speed": "80", "initial_travel_speed": "100%", @@ -57,5 +57,7 @@ "accel_to_decel_enable": "1", "accel_to_decel_factor": "50%", "elefant_foot_compensation": "0.25", - "elefant_foot_compensation_layers": "1" + "elefant_foot_compensation_layers": "1", + "skirt_loops": "2", + "skirt_type": "perobject" } diff --git a/resources/profiles/Blocks/process/0.30mm Optimal 1.0 nozzle @Blocks.json b/resources/profiles/Blocks/process/0.30mm Optimal 1.0 nozzle @Blocks_Pro_S100.json similarity index 63% rename from resources/profiles/Blocks/process/0.30mm Optimal 1.0 nozzle @Blocks.json rename to resources/profiles/Blocks/process/0.30mm Optimal 1.0 nozzle @Blocks_Pro_S100.json index 8820018b9d..e7ce874a77 100644 --- a/resources/profiles/Blocks/process/0.30mm Optimal 1.0 nozzle @Blocks.json +++ b/resources/profiles/Blocks/process/0.30mm Optimal 1.0 nozzle @Blocks_Pro_S100.json @@ -1,14 +1,15 @@ { "type": "process", - "name": "0.30mm Optimal 1.0 nozzle @Blocks", + "name": "0.30mm Optimal 1.0 nozzle @Blocks_Pro_S100", "inherits": "fdm_process_common 1.0 nozzle", "from": "system", - "setting_id": "8pBawPScHkyQu0SW", + "setting_id": "HGG9WxKVr89qNFDx", "instantiation": "true", "bottom_shell_layers": "4", "top_shell_layers": "4", "layer_height": "0.30", "compatible_printers": [ "BLOCKS Pro S100 1.0 nozzle" - ] + ], + "renamed_from": "0.30mm Optimal 1.0 nozzle @Blocks" } diff --git a/resources/profiles/Blocks/process/0.30mm Standard 0.6 nozzle @Blocks.json b/resources/profiles/Blocks/process/0.30mm Standard 0.6 nozzle @Blocks_Pro_S100.json similarity index 62% rename from resources/profiles/Blocks/process/0.30mm Standard 0.6 nozzle @Blocks.json rename to resources/profiles/Blocks/process/0.30mm Standard 0.6 nozzle @Blocks_Pro_S100.json index d2a815e849..00e37a7860 100644 --- a/resources/profiles/Blocks/process/0.30mm Standard 0.6 nozzle @Blocks.json +++ b/resources/profiles/Blocks/process/0.30mm Standard 0.6 nozzle @Blocks_Pro_S100.json @@ -1,14 +1,15 @@ { "type": "process", - "name": "0.30mm Standard 0.6 nozzle @Blocks", + "name": "0.30mm Standard 0.6 nozzle @Blocks_Pro_S100", "inherits": "fdm_process_common 0.6 nozzle", "from": "system", - "setting_id": "EPI3PAVK9LpJOZWO", + "setting_id": "gO2I1YjBl4nf8yzr", "instantiation": "true", "bottom_shell_layers": "3", "top_shell_layers": "3", "layer_height": "0.30", "compatible_printers": [ "BLOCKS Pro S100 0.6 nozzle" - ] + ], + "renamed_from": "0.30mm Standard 0.6 nozzle @Blocks" } diff --git a/resources/profiles/Blocks/process/0.32mm Draft 0.6 nozzle @Blocks_RF50.json b/resources/profiles/Blocks/process/0.32mm Draft 0.6 nozzle @Blocks_RF50.json index 60c6eae19e..b19346e30a 100644 --- a/resources/profiles/Blocks/process/0.32mm Draft 0.6 nozzle @Blocks_RF50.json +++ b/resources/profiles/Blocks/process/0.32mm Draft 0.6 nozzle @Blocks_RF50.json @@ -22,7 +22,7 @@ "top_solid_infill_flow_ratio": "0.97", "bottom_solid_infill_flow_ratio": "1.08", "seam_position": "aligned", - "sparse_infill_patter": "grid", + "sparse_infill_pattern": "grid", "initial_layer_speed": "60", "initial_layer_infill_speed": "80", "initial_travel_speed": "100%", @@ -57,5 +57,7 @@ "accel_to_decel_enable": "1", "accel_to_decel_factor": "50%", "elefant_foot_compensation": "0.25", - "elefant_foot_compensation_layers": "1" + "elefant_foot_compensation_layers": "1", + "skirt_loops": "2", + "skirt_type": "perobject" } diff --git a/resources/profiles/Blocks/process/0.38mm Extra Draft 0.6 nozzle @Blocks_RF50.json b/resources/profiles/Blocks/process/0.38mm Extra Draft 0.6 nozzle @Blocks_RF50.json index f28a975208..12922fa105 100644 --- a/resources/profiles/Blocks/process/0.38mm Extra Draft 0.6 nozzle @Blocks_RF50.json +++ b/resources/profiles/Blocks/process/0.38mm Extra Draft 0.6 nozzle @Blocks_RF50.json @@ -21,7 +21,7 @@ "top_solid_infill_flow_ratio": "0.97", "bottom_solid_infill_flow_ratio": "1.08", "seam_position": "aligned", - "sparse_infill_patter": "grid", + "sparse_infill_pattern": "grid", "initial_layer_speed": "60", "initial_layer_infill_speed": "80", "initial_travel_speed": "100%", @@ -57,5 +57,7 @@ "accel_to_decel_enable": "1", "accel_to_decel_factor": "50%", "elefant_foot_compensation": "0.25", - "elefant_foot_compensation_layers": "1" + "elefant_foot_compensation_layers": "1", + "skirt_loops": "2", + "skirt_type": "perobject" } diff --git a/resources/profiles/Blocks/process/0.38mm Standard 0.8 nozzle @Blocks_RF50.json b/resources/profiles/Blocks/process/0.38mm Standard 0.8 nozzle @Blocks_RF50.json index 7b94febc1c..5c2245f114 100644 --- a/resources/profiles/Blocks/process/0.38mm Standard 0.8 nozzle @Blocks_RF50.json +++ b/resources/profiles/Blocks/process/0.38mm Standard 0.8 nozzle @Blocks_RF50.json @@ -22,7 +22,7 @@ "top_solid_infill_flow_ratio": "0.97", "bottom_solid_infill_flow_ratio": "1.08", "seam_position": "aligned", - "sparse_infill_patter": "grid", + "sparse_infill_pattern": "grid", "initial_layer_speed": "60", "initial_layer_infill_speed": "80", "initial_travel_speed": "100%", @@ -57,5 +57,7 @@ "accel_to_decel_enable": "1", "accel_to_decel_factor": "50%", "elefant_foot_compensation": "0.25", - "elefant_foot_compensation_layers": "1" + "elefant_foot_compensation_layers": "1", + "skirt_loops": "2", + "skirt_type": "perobject" } diff --git a/resources/profiles/Blocks/process/0.40mm Draft 0.6 nozzle @Blocks.json b/resources/profiles/Blocks/process/0.40mm Draft 0.6 nozzle @Blocks_Pro_S100.json similarity index 63% rename from resources/profiles/Blocks/process/0.40mm Draft 0.6 nozzle @Blocks.json rename to resources/profiles/Blocks/process/0.40mm Draft 0.6 nozzle @Blocks_Pro_S100.json index 45fdd61179..915d160b6c 100644 --- a/resources/profiles/Blocks/process/0.40mm Draft 0.6 nozzle @Blocks.json +++ b/resources/profiles/Blocks/process/0.40mm Draft 0.6 nozzle @Blocks_Pro_S100.json @@ -1,14 +1,15 @@ { "type": "process", - "name": "0.40mm Draft 0.6 nozzle @Blocks", + "name": "0.40mm Draft 0.6 nozzle @Blocks_Pro_S100", "inherits": "fdm_process_common 0.6 nozzle", "from": "system", - "setting_id": "CShVKoGspbMJNPw8", + "setting_id": "OjsLUl1heqv1cevs", "instantiation": "true", "bottom_shell_layers": "2", "top_shell_layers": "2", "layer_height": "0.40", "compatible_printers": [ "BLOCKS Pro S100 0.6 nozzle" - ] + ], + "renamed_from": "0.40mm Draft 0.6 nozzle @Blocks" } diff --git a/resources/profiles/Blocks/process/0.40mm Standard 0.8 nozzle @Blocks.json b/resources/profiles/Blocks/process/0.40mm Standard 0.8 nozzle @Blocks_Pro_S100.json similarity index 62% rename from resources/profiles/Blocks/process/0.40mm Standard 0.8 nozzle @Blocks.json rename to resources/profiles/Blocks/process/0.40mm Standard 0.8 nozzle @Blocks_Pro_S100.json index 177b620e51..20f02ff7af 100644 --- a/resources/profiles/Blocks/process/0.40mm Standard 0.8 nozzle @Blocks.json +++ b/resources/profiles/Blocks/process/0.40mm Standard 0.8 nozzle @Blocks_Pro_S100.json @@ -1,14 +1,15 @@ { "type": "process", - "name": "0.40mm Standard 0.8 nozzle @Blocks", + "name": "0.40mm Standard 0.8 nozzle @Blocks_Pro_S100", "inherits": "fdm_process_common 0.8 nozzle", "from": "system", - "setting_id": "TSRjmfWaatY7oLJB", + "setting_id": "laOTioBGySeudJpl", "instantiation": "true", "bottom_shell_layers": "3", "top_shell_layers": "4", "layer_height": "0.40", "compatible_printers": [ "BLOCKS Pro S100 0.8 nozzle" - ] + ], + "renamed_from": "0.40mm Standard 0.8 nozzle @Blocks" } diff --git a/resources/profiles/Blocks/process/0.46mm Draft 0.8 nozzle @Blocks_RF50.json b/resources/profiles/Blocks/process/0.46mm Draft 0.8 nozzle @Blocks_RF50.json index d49633e89d..be66641b28 100644 --- a/resources/profiles/Blocks/process/0.46mm Draft 0.8 nozzle @Blocks_RF50.json +++ b/resources/profiles/Blocks/process/0.46mm Draft 0.8 nozzle @Blocks_RF50.json @@ -22,7 +22,7 @@ "top_solid_infill_flow_ratio": "0.97", "bottom_solid_infill_flow_ratio": "1.08", "seam_position": "aligned", - "sparse_infill_patter": "grid", + "sparse_infill_pattern": "grid", "initial_layer_speed": "60", "initial_layer_infill_speed": "80", "initial_travel_speed": "100%", @@ -57,5 +57,7 @@ "accel_to_decel_enable": "1", "accel_to_decel_factor": "50%", "elefant_foot_compensation": "0.25", - "elefant_foot_compensation_layers": "1" + "elefant_foot_compensation_layers": "1", + "skirt_loops": "2", + "skirt_type": "perobject" } diff --git a/resources/profiles/Blocks/process/0.50mm Draft 0.8 nozzle @Blocks.json b/resources/profiles/Blocks/process/0.50mm Draft 0.8 nozzle @Blocks_Pro_S100.json similarity index 63% rename from resources/profiles/Blocks/process/0.50mm Draft 0.8 nozzle @Blocks.json rename to resources/profiles/Blocks/process/0.50mm Draft 0.8 nozzle @Blocks_Pro_S100.json index fc1a875d67..8f358e60e2 100644 --- a/resources/profiles/Blocks/process/0.50mm Draft 0.8 nozzle @Blocks.json +++ b/resources/profiles/Blocks/process/0.50mm Draft 0.8 nozzle @Blocks_Pro_S100.json @@ -1,14 +1,15 @@ { "type": "process", - "name": "0.50mm Draft 0.8 nozzle @Blocks", + "name": "0.50mm Draft 0.8 nozzle @Blocks_Pro_S100", "inherits": "fdm_process_common 0.8 nozzle", "from": "system", - "setting_id": "vOtZHrDS88Shmf2m", + "setting_id": "oAhgUZdADR7kP87e", "instantiation": "true", "bottom_shell_layers": "3", "top_shell_layers": "4", "layer_height": "0.50", "compatible_printers": [ "BLOCKS Pro S100 0.8 nozzle" - ] + ], + "renamed_from": "0.50mm Draft 0.8 nozzle @Blocks" } diff --git a/resources/profiles/Blocks/process/0.50mm Optimal 1.2 nozzle @Blocks.json b/resources/profiles/Blocks/process/0.50mm Optimal 1.2 nozzle @Blocks_Pro_S100.json similarity index 63% rename from resources/profiles/Blocks/process/0.50mm Optimal 1.2 nozzle @Blocks.json rename to resources/profiles/Blocks/process/0.50mm Optimal 1.2 nozzle @Blocks_Pro_S100.json index 6b59b1c101..11c79d1a65 100644 --- a/resources/profiles/Blocks/process/0.50mm Optimal 1.2 nozzle @Blocks.json +++ b/resources/profiles/Blocks/process/0.50mm Optimal 1.2 nozzle @Blocks_Pro_S100.json @@ -1,14 +1,15 @@ { "type": "process", - "name": "0.50mm Optimal 1.2 nozzle @Blocks", + "name": "0.50mm Optimal 1.2 nozzle @Blocks_Pro_S100", "inherits": "fdm_process_common 1.2 nozzle", "from": "system", - "setting_id": "BKrEAKqDYzdH43wc", + "setting_id": "0eqNgX26jemsBfV5", "instantiation": "true", "bottom_shell_layers": "2", "top_shell_layers": "3", "layer_height": "0.50", "compatible_printers": [ "BLOCKS Pro S100 1.2 nozzle" - ] + ], + "renamed_from": "0.50mm Optimal 1.2 nozzle @Blocks" } diff --git a/resources/profiles/Blocks/process/0.50mm Standard 1.0 nozzle @Blocks.json b/resources/profiles/Blocks/process/0.50mm Standard 1.0 nozzle @Blocks_Pro_S100.json similarity index 62% rename from resources/profiles/Blocks/process/0.50mm Standard 1.0 nozzle @Blocks.json rename to resources/profiles/Blocks/process/0.50mm Standard 1.0 nozzle @Blocks_Pro_S100.json index 80e3ba5649..0bd91d3405 100644 --- a/resources/profiles/Blocks/process/0.50mm Standard 1.0 nozzle @Blocks.json +++ b/resources/profiles/Blocks/process/0.50mm Standard 1.0 nozzle @Blocks_Pro_S100.json @@ -1,14 +1,15 @@ { "type": "process", - "name": "0.50mm Standard 1.0 nozzle @Blocks", + "name": "0.50mm Standard 1.0 nozzle @Blocks_Pro_S100", "inherits": "fdm_process_common 1.0 nozzle", "from": "system", - "setting_id": "D40iksDm7mFjhSKn", + "setting_id": "z1qCW1cEMc4QvBbV", "instantiation": "true", "bottom_shell_layers": "3", "top_shell_layers": "3", "layer_height": "0.50", "compatible_printers": [ "BLOCKS Pro S100 1.0 nozzle" - ] + ], + "renamed_from": "0.50mm Standard 1.0 nozzle @Blocks" } diff --git a/resources/profiles/Blocks/process/0.54mm Extra Draft 0.8 nozzle @Blocks_RF50.json b/resources/profiles/Blocks/process/0.54mm Extra Draft 0.8 nozzle @Blocks_RF50.json index a0e9121ceb..6700893916 100644 --- a/resources/profiles/Blocks/process/0.54mm Extra Draft 0.8 nozzle @Blocks_RF50.json +++ b/resources/profiles/Blocks/process/0.54mm Extra Draft 0.8 nozzle @Blocks_RF50.json @@ -21,7 +21,7 @@ "top_solid_infill_flow_ratio": "0.97", "bottom_solid_infill_flow_ratio": "1.08", "seam_position": "aligned", - "sparse_infill_patter": "grid", + "sparse_infill_pattern": "grid", "initial_layer_speed": "60", "initial_layer_infill_speed": "80", "initial_travel_speed": "100%", @@ -57,5 +57,7 @@ "accel_to_decel_enable": "1", "accel_to_decel_factor": "50%", "elefant_foot_compensation": "0.25", - "elefant_foot_compensation_layers": "1" + "elefant_foot_compensation_layers": "1", + "skirt_loops": "2", + "skirt_type": "perobject" } diff --git a/resources/profiles/Blocks/process/0.60mm Draft 1.0 nozzle @Blocks.json b/resources/profiles/Blocks/process/0.60mm Draft 1.0 nozzle @Blocks_Pro_S100.json similarity index 63% rename from resources/profiles/Blocks/process/0.60mm Draft 1.0 nozzle @Blocks.json rename to resources/profiles/Blocks/process/0.60mm Draft 1.0 nozzle @Blocks_Pro_S100.json index e59174620f..f63ebde1bc 100644 --- a/resources/profiles/Blocks/process/0.60mm Draft 1.0 nozzle @Blocks.json +++ b/resources/profiles/Blocks/process/0.60mm Draft 1.0 nozzle @Blocks_Pro_S100.json @@ -1,14 +1,15 @@ { "type": "process", - "name": "0.60mm Draft 1.0 nozzle @Blocks", + "name": "0.60mm Draft 1.0 nozzle @Blocks_Pro_S100", "inherits": "fdm_process_common 1.0 nozzle", "from": "system", - "setting_id": "UJUe8XCBzZf8NyCL", + "setting_id": "gTTgtfG8qb9My3hH", "instantiation": "true", "bottom_shell_layers": "2", "top_shell_layers": "3", "layer_height": "0.60", "compatible_printers": [ "BLOCKS Pro S100 1.0 nozzle" - ] + ], + "renamed_from": "0.60mm Draft 1.0 nozzle @Blocks" } diff --git a/resources/profiles/Blocks/process/0.60mm Standard 1.2 nozzle @Blocks.json b/resources/profiles/Blocks/process/0.60mm Standard 1.2 nozzle @Blocks_Pro_S100.json similarity index 62% rename from resources/profiles/Blocks/process/0.60mm Standard 1.2 nozzle @Blocks.json rename to resources/profiles/Blocks/process/0.60mm Standard 1.2 nozzle @Blocks_Pro_S100.json index 598534c050..ba93c393a6 100644 --- a/resources/profiles/Blocks/process/0.60mm Standard 1.2 nozzle @Blocks.json +++ b/resources/profiles/Blocks/process/0.60mm Standard 1.2 nozzle @Blocks_Pro_S100.json @@ -1,14 +1,15 @@ { "type": "process", - "name": "0.60mm Standard 1.2 nozzle @Blocks", + "name": "0.60mm Standard 1.2 nozzle @Blocks_Pro_S100", "inherits": "fdm_process_common 1.2 nozzle", "from": "system", - "setting_id": "PSBFrTykpkytPI2Q", + "setting_id": "ApcyToENCIANrI71", "instantiation": "true", "bottom_shell_layers": "2", "top_shell_layers": "3", "layer_height": "0.60", "compatible_printers": [ "BLOCKS Pro S100 1.2 nozzle" - ] + ], + "renamed_from": "0.60mm Standard 1.2 nozzle @Blocks" } diff --git a/resources/profiles/Blocks/process/0.70mm Draft 1.2 nozzle @Blocks.json b/resources/profiles/Blocks/process/0.70mm Draft 1.2 nozzle @Blocks_Pro_S100.json similarity index 63% rename from resources/profiles/Blocks/process/0.70mm Draft 1.2 nozzle @Blocks.json rename to resources/profiles/Blocks/process/0.70mm Draft 1.2 nozzle @Blocks_Pro_S100.json index 905bb32a48..7950bce0ca 100644 --- a/resources/profiles/Blocks/process/0.70mm Draft 1.2 nozzle @Blocks.json +++ b/resources/profiles/Blocks/process/0.70mm Draft 1.2 nozzle @Blocks_Pro_S100.json @@ -1,14 +1,15 @@ { "type": "process", - "name": "0.70mm Draft 1.2 nozzle @Blocks", + "name": "0.70mm Draft 1.2 nozzle @Blocks_Pro_S100", "inherits": "fdm_process_common 1.2 nozzle", "from": "system", - "setting_id": "0ZQ0USGX9SwAKr29", + "setting_id": "DEv7X7zaTfxRQmjo", "instantiation": "true", "bottom_shell_layers": "2", "top_shell_layers": "3", "layer_height": "0.70", "compatible_printers": [ "BLOCKS Pro S100 1.2 nozzle" - ] + ], + "renamed_from": "0.70mm Draft 1.2 nozzle @Blocks" } diff --git a/resources/profiles/Blocks/process/0.70mm Extra Draft 1.0 nozzle @Blocks.json b/resources/profiles/Blocks/process/0.70mm Extra Draft 1.0 nozzle @Blocks_Pro_S100.json similarity index 61% rename from resources/profiles/Blocks/process/0.70mm Extra Draft 1.0 nozzle @Blocks.json rename to resources/profiles/Blocks/process/0.70mm Extra Draft 1.0 nozzle @Blocks_Pro_S100.json index 49eaf2c7b9..49d864ed8f 100644 --- a/resources/profiles/Blocks/process/0.70mm Extra Draft 1.0 nozzle @Blocks.json +++ b/resources/profiles/Blocks/process/0.70mm Extra Draft 1.0 nozzle @Blocks_Pro_S100.json @@ -1,14 +1,15 @@ { "type": "process", - "name": "0.70mm Extra Draft 1.0 nozzle @Blocks", + "name": "0.70mm Extra Draft 1.0 nozzle @Blocks_Pro_S100", "inherits": "fdm_process_common 1.0 nozzle", "from": "system", - "setting_id": "69PFmjOVFBOIp3Qg", + "setting_id": "nUW7N9dJmTyQT4AG", "instantiation": "true", "bottom_shell_layers": "2", "top_shell_layers": "3", "layer_height": "0.70", "compatible_printers": [ "BLOCKS Pro S100 1.0 nozzle" - ] + ], + "renamed_from": "0.70mm Extra Draft 1.0 nozzle @Blocks" } diff --git a/resources/profiles/Blocks/process/0.80mm Extra Draft 1.2 nozzle @Blocks.json b/resources/profiles/Blocks/process/0.80mm Extra Draft 1.2 nozzle @Blocks_Pro_S100.json similarity index 61% rename from resources/profiles/Blocks/process/0.80mm Extra Draft 1.2 nozzle @Blocks.json rename to resources/profiles/Blocks/process/0.80mm Extra Draft 1.2 nozzle @Blocks_Pro_S100.json index df6d97a9d7..22f7628081 100644 --- a/resources/profiles/Blocks/process/0.80mm Extra Draft 1.2 nozzle @Blocks.json +++ b/resources/profiles/Blocks/process/0.80mm Extra Draft 1.2 nozzle @Blocks_Pro_S100.json @@ -1,14 +1,15 @@ { "type": "process", - "name": "0.80mm Extra Draft 1.2 nozzle @Blocks", + "name": "0.80mm Extra Draft 1.2 nozzle @Blocks_Pro_S100", "inherits": "fdm_process_common 1.2 nozzle", "from": "system", - "setting_id": "iBwRI5JJewW5HJSv", + "setting_id": "JMy62SonRfK0cAdL", "instantiation": "true", "bottom_shell_layers": "2", "top_shell_layers": "2", "layer_height": "0.80", "compatible_printers": [ "BLOCKS Pro S100 1.2 nozzle" - ] + ], + "renamed_from": "0.80mm Extra Draft 1.2 nozzle @Blocks" } diff --git a/resources/profiles/OrcaFilamentLibrary.json b/resources/profiles/OrcaFilamentLibrary.json index 3d8a191dc6..f54e45df5a 100644 --- a/resources/profiles/OrcaFilamentLibrary.json +++ b/resources/profiles/OrcaFilamentLibrary.json @@ -1,6 +1,6 @@ { "name": "OrcaFilamentLibrary", - "version": "02.04.00.12", + "version": "02.04.00.13", "force_update": "0", "description": "Orca Filament Library", "filament_list": [ diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Elegoo/Elegoo PLA @base.json b/resources/profiles/OrcaFilamentLibrary/filament/Elegoo/Elegoo PLA @base.json index 3ba4c8c14f..624c4ed95b 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Elegoo/Elegoo PLA @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Elegoo/Elegoo PLA @base.json @@ -6,7 +6,7 @@ "filament_id": "OFvgE0Zh", "instantiation": "false", "fan_cooling_layer_time": [ - "80" + "81" ], "fan_min_speed": [ "50" diff --git a/src/libslic3r/CAD/CadDocument.cpp b/src/libslic3r/CAD/CadDocument.cpp index c20b636ae7..ea20ffd966 100644 --- a/src/libslic3r/CAD/CadDocument.cpp +++ b/src/libslic3r/CAD/CadDocument.cpp @@ -2673,10 +2673,10 @@ void CadDocument::apply_feature(TopoDS_Shape& result, bool& have_body, ridge = pipe.Shape(); have_ridge = !ridge.IsNull(); } + } catch (const Standard_Failure&) { + have_ridge = false; // OCCT failure — on OCCT >= 8 Standard_Failure derives from std::exception, so this handler must come first } catch (const std::exception&) { have_ridge = false; // fall back to the bare cylinder/bore below - } catch (const Standard_Failure&) { - have_ridge = false; // OCCT failure (not a std::exception) — must be caught here too } if (f.thread_internal) { diff --git a/src/libslic3r/CAD/GeometryEngine.cpp b/src/libslic3r/CAD/GeometryEngine.cpp index ede3924056..2b923938c2 100644 --- a/src/libslic3r/CAD/GeometryEngine.cpp +++ b/src/libslic3r/CAD/GeometryEngine.cpp @@ -15,6 +15,8 @@ #include #include #include +#include +#include #include #include #include diff --git a/src/libslic3r/Format/STEP.cpp b/src/libslic3r/Format/STEP.cpp index 22e39b207f..8305174e73 100644 --- a/src/libslic3r/Format/STEP.cpp +++ b/src/libslic3r/Format/STEP.cpp @@ -25,6 +25,7 @@ #include "XCAFDoc_DocumentTool.hxx" #include "XCAFDoc_ShapeTool.hxx" #include "XCAFApp_Application.hxx" +#include "TDF_LabelSequence.hxx" #include "TopoDS_Solid.hxx" #include "TopoDS_Compound.hxx" #include "TopoDS_Builder.hxx" diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 1f4120a0bb..941818c78f 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -2504,7 +2504,8 @@ void GCode::do_export(Print* print, const char* path, GCodeProcessorResult* resu { LifecycleEventContext ctx; - ctx.name = std::to_string(print->model().id().id); + ctx.id = std::to_string(print->model().id().id); + ctx.name = print->get_model_name(); ctx.code = LifecycleEvtCode::Ok; ctx.msg = path; ctx.cancellation_check = [print]() { return print->canceled(); }; @@ -2556,7 +2557,8 @@ void GCode::do_export(Print* print, const char* path, GCodeProcessorResult* resu } { LifecycleEventContext ctx; - ctx.name = std::to_string(print->model().id().id); + ctx.id = std::to_string(print->model().id().id); + ctx.name = print->get_model_name(); ctx.code = LifecycleEvtCode::Error; ctx.msg = std::string(path) + "\n" + err_msg; ctx.cancellation_check = [print]() { return print->canceled(); }; @@ -2580,7 +2582,8 @@ void GCode::do_export(Print* print, const char* path, GCodeProcessorResult* resu boost::nowide::remove(path_tmp.c_str()); { LifecycleEventContext ctx; - ctx.name = std::to_string(print->model().id().id); + ctx.id = std::to_string(print->model().id().id); + ctx.name = print->get_model_name(); ctx.code = LifecycleEvtCode::Error; ctx.msg = std::string(path) + "\n" + ex.what(); ctx.cancellation_check = [print]() { return print->canceled(); }; @@ -2693,7 +2696,8 @@ void GCode::do_export(Print* print, const char* path, GCodeProcessorResult* resu if (ret) { { LifecycleEventContext ctx; - ctx.name = std::to_string(print->model().id().id); + ctx.id = std::to_string(print->model().id().id); + ctx.name = print->get_model_name(); ctx.code = LifecycleEvtCode::Error; ctx.msg = std::string(path) + "\nFailed to rename the output G-code file: " + ret.message(); ctx.cancellation_check = [print]() { return print->canceled(); }; @@ -2712,7 +2716,8 @@ void GCode::do_export(Print* print, const char* path, GCodeProcessorResult* resu { LifecycleEventContext ctx; - ctx.name = std::to_string(print->model().id().id); + ctx.id = std::to_string(print->model().id().id); + ctx.name = print->get_model_name(); ctx.code = LifecycleEvtCode::Ok; ctx.msg = path; ctx.cancellation_check = [print]() { return print->canceled(); }; @@ -7964,6 +7969,20 @@ double GCode::calc_max_volumetric_speed(const double layer_height, const double return res; } +// ORCA: Overlap at or below which the overhang fan switches on; negative when it does not depend on overlap +// (Overhang_threshold_none cools every external perimeter). +static float overhang_fan_overlap_threshold(int overhang_fan_threshold) +{ + switch (overhang_fan_threshold) { + case (int) Overhang_threshold_1_4: return 0.9f; + case (int) Overhang_threshold_2_4: return 0.75f; + case (int) Overhang_threshold_3_4: return 0.5f; + case (int) Overhang_threshold_4_4: return 0.25f; + case (int) Overhang_threshold_bridge: return 0.05f; + default: return -1.f; + } +} + std::string GCode::_extrude(const ExtrusionPath &path, std::string description, double speed) { std::string gcode; @@ -8306,6 +8325,13 @@ std::string GCode::_extrude(const ExtrusionPath &path, std::string description, ConfigOptionPercents overhang_overlap_levels({90, 75, 50, 25, 13, 0}); + // ORCA: Lets the path be split where the overhang fan switches, not only where the speed changes. + // Bridges and overhang perimeters are cooled regardless of overlap. + float fan_overlap_threshold = -1.f; + if (FILAMENT_CONFIG(enable_overhang_bridge_fan) && m_enable_cooling_markers && path.role() != erBridgeInfill && + path.role() != erOverhangPerimeter) + fan_overlap_threshold = overhang_fan_overlap_threshold(FILAMENT_CONFIG(overhang_fan_threshold)); + if (NOZZLE_CONFIG(slowdown_for_curled_perimeters)){ ConfigOptionFloatsOrPercents dynamic_overhang_speeds( {FloatOrPercent{100, true}, @@ -8326,7 +8352,8 @@ std::string GCode::_extrude(const ExtrusionPath &path, std::string description, FloatOrPercent{NOZZLE_CONFIG(overhang_4_4_speed).get_abs_value(ref_speed) * 100 / ref_speed, true}}); new_points = m_extrusion_quality_estimator.estimate_extrusion_quality(path, overhang_overlap_levels, dynamic_overhang_speeds, - ref_speed, speed, NOZZLE_CONFIG(slowdown_for_curled_perimeters)); + ref_speed, speed, NOZZLE_CONFIG(slowdown_for_curled_perimeters), + fan_overlap_threshold); }else{ ConfigOptionFloatsOrPercents dynamic_overhang_speeds( {FloatOrPercent{100, true}, @@ -8345,7 +8372,8 @@ std::string GCode::_extrude(const ExtrusionPath &path, std::string description, FloatOrPercent{NOZZLE_CONFIG(bridge_speed) * 100 / ref_speed, true}}); new_points = m_extrusion_quality_estimator.estimate_extrusion_quality(path, overhang_overlap_levels, dynamic_overhang_speeds, - ref_speed, speed, NOZZLE_CONFIG(slowdown_for_curled_perimeters)); + ref_speed, speed, NOZZLE_CONFIG(slowdown_for_curled_perimeters), + fan_overlap_threshold); } variable_speed = std::any_of(new_points.begin(), new_points.end(), [speed](const ProcessedPoint &p) { return fabs(double(p.speed) - speed) > 1; }); // Ignore small speed variations (under 1mm/sec) @@ -8497,28 +8525,10 @@ std::string GCode::_extrude(const ExtrusionPath &path, std::string description, if (role == erBridgeInfill || role == erOverhangPerimeter) { // ORCA: Split out bridge infill to internal and external to apply separate fan settings return true; } - switch (overhang_fan_threshold) { - case (int)Overhang_threshold_1_4: - return overlap <= 0.9f; - break; - case (int)Overhang_threshold_2_4: - return overlap <= 0.75f; - break; - case (int)Overhang_threshold_3_4: - return overlap <= 0.5f; - break; - case (int)Overhang_threshold_4_4: - return overlap <= 0.25f; - break; - case (int)Overhang_threshold_bridge: - return overlap <= 0.05f; - break; - case (int)Overhang_threshold_none: + if (overhang_fan_threshold == Overhang_threshold_none) return is_external_perimeter(role); - break; - default: - return false; - } + const float overlap_threshold = overhang_fan_overlap_threshold(overhang_fan_threshold); + return overlap_threshold >= 0.f && overlap <= overlap_threshold; }; std::string comment; diff --git a/src/libslic3r/GCode/ExtrusionProcessor.hpp b/src/libslic3r/GCode/ExtrusionProcessor.hpp index 1d65e83f3e..8ed829aa6e 100644 --- a/src/libslic3r/GCode/ExtrusionProcessor.hpp +++ b/src/libslic3r/GCode/ExtrusionProcessor.hpp @@ -41,10 +41,12 @@ std::vector> estimate_points_properties(const POINTS& float flow_width, float max_line_length = -1.0f, float min_distance = -1.0f, - // Maps an overhang distance onto the speed it will be printed at. Interior sampling - // needs it to tell which of the points it could add would change the G-code, and is - // skipped without it. - const std::function& distance_to_speed = {}) + // Speed an overhang distance prints at. Without it, interior sampling + // is skipped and every line over 4mm is split. + const std::function& distance_to_speed = {}, + // Overlap (1 - distance / flow_width) at or below which the overhang + // fan switches on; negative when the fan does not depend on overlap. + float fan_overlap_threshold = -1.0f) { bool looped = input_points.front() == input_points.back(); std::function get_prev_index = [](size_t idx, size_t count) { @@ -125,29 +127,43 @@ std::vector> estimate_points_properties(const POINTS& points.push_back(next_point); } + // ORCA: How an overhang distance prints, which is what the passes below compare. A segment is printed at the lower + // of the speeds at its two ends, and with the overhang fan on if the overlap at either end turns it on. A point + // added to a path can therefore only change the G-code where it prints at a different speed or fan state from the + // points either side of it, and the passes below add points there and nowhere else. + const float width_inv = 1.f / flow_width; + // Whether an overhang distance turns the overhang fan on. The overlap test check_overhang_fan applies in GCode.cpp. + auto fan_on = [fan_overlap_threshold, width_inv](float distance) { + return fan_overlap_threshold >= 0.f && 1.f - distance * width_inv <= fan_overlap_threshold; + }; + // Whether two overhang distances are interchangeable ie have the same speed (beyond a 1mm/sec threshold that gcode.cpp filters out on) + // and the same fan state. + auto same_speed_and_fan = [&distance_to_speed, &fan_on](float a, float b) { + return std::abs(distance_to_speed(a) - distance_to_speed(b)) <= 1.f && fan_on(a) == fan_on(b); + }; + // Whether the first overhang distance prints slower than the second, beyond the 1mm/sec gcode.cpp tolerance, or turns the overhang + // fan on where the second does not. Against a supported point (overhang distance 0) it tells whether an end is + // affected by the overhang. + auto slower_or_cooled = [&distance_to_speed, &fan_on](float a, float b) { + return distance_to_speed(a) < distance_to_speed(b) - 1.f || (fan_on(a) && !fan_on(b)); + }; + // ORCA: Interior sampling - // The passes below infer the support under a span from its endpoints alone, so an interior that is supported - // differently from both ends is invisible to them: the outer perimeter of an overhang whose ends are caged by - // full height walls reads as supported along its whole length. Probe the interior, keep the samples the - // endpoint interpolation fails to predict, and bisect either side of each one, so a span that is only partly - // unsupported gets points where its support actually changes instead of one reading spread across all of it. - if (PREV_LAYER_BOUNDARY_OFFSET && ADD_INTERSECTIONS && min_distance > 0 && distance_to_speed) { + // The passes below infer the support under a span from its endpoints alone, so a part that is supported + // differently from both ends is invisible to them. The outer perimeter of an overhang whose ends are supported by + // reads as supported along its whole length. Probe the interior, keep the samples the endpoint interpolation fails to predict, + // and bisect either side of each one, so a span that is only partly unsupported gets points where its support actually changes + // instead of one reading being spread across all of it. + // Skipped where there is nothing to find: min_distance <= 0 when no overhang can slow this path down, and + // fan_overlap_threshold < 0 when no overhang switches the fan on. It also needs distance_to_speed to tell which of + // the points it could add would change the G-code. + if (PREV_LAYER_BOUNDARY_OFFSET && ADD_INTERSECTIONS && distance_to_speed && (min_distance > 0 || fan_overlap_threshold >= 0.f)) { // Probe at least this densely before treating matching samples as evidence that a span is uniform. The // segmentation pass below only splits lines of 2mm or more, and every pass here drops points closer - // together than min_spacing, so finer discovery would not produce a more precise speed transition. + // together than min_spacing, so finer discovery would not produce a more precise transition. const double max_probe_spacing = std::max(2., 4. * min_spacing); // A backstop for that length test, which on a non-finite length would never be met. constexpr int max_bisection_depth = 10; - // Whether two readings are interchangeable. A segment is printed at the lower of the speeds its ends - // read, so a sample that agrees on speed with what is already known cannot change the G-code, whatever - // its distance says. The distances themselves are far too coarse a stand-in for this: the speed sections - // interpolate, so readings a small fraction of min_distance apart can still be tens of mm/s apart. - // The tolerance matches the one GCode.cpp applies when it decides a path has a variable speed at all. - auto same_speed = [&distance_to_speed](float a, float b) { - return std::abs(distance_to_speed(a) - distance_to_speed(b)) <= 1.f; - }; - // Whether the first reading is printed slower than the second, once they are known to differ. - auto prints_slower = [&distance_to_speed](float a, float b) { return distance_to_speed(a) < distance_to_speed(b); }; // Part of a segment still to bisect: its positions along the segment and bisections left. struct Subspan { double t0, t1; int depth; }; @@ -185,8 +201,8 @@ std::vector> estimate_points_properties(const POINTS& if (!interior.empty()) { std::sort(interior.begin(), interior.end(), [](const std::pair& l, const std::pair& r) { return l.first < r.first; }); - // Coarse probing keeps every sample it took until this pass can see which ones bracket a speed - // transition. Matching samples cannot be discarded during discovery: one may be the last + // Coarse probing keeps every sample it took until this pass can see which ones bracket a speed or + // fan transition. Matching samples cannot be discarded during discovery: one may be the last // supported point before a narrow unsupported pocket found by a later probe. size_t kept = 0; for (size_t i = 0; i < interior.size(); ++i) { @@ -195,15 +211,15 @@ std::vector> estimate_points_properties(const POINTS& const bool at_end = i + 1 == interior.size(); // And nothing follows the last sample but the segment's end const float before = at_start ? curr.distance : interior[kept - 1].second; const float after = at_end ? next.distance : interior[i + 1].second; - // A sample is worth a point in the path only where it prints at a different speed from the - // readings either side of it. Differing from one of the segment's own ends is not enough on - // its own where the sample is the faster of the two: the segmentation pass below already - // ends the slowdown an end reads, at a distance taken from how far out that end is rather - // than from wherever bisection happened to stop, and a point here would leave the span - // beside the end too short for that pass to run at all. Support an end cannot account for, - // where the interior is the slower reading, is exactly what this pass is here to find. - const bool worth_before = !same_speed(sample, before) && (!at_start || prints_slower(sample, before)); - const bool worth_after = !same_speed(sample, after) && (!at_end || prints_slower(sample, after)); + // A sample is worth a point in the path only where it prints differently, in speed or fan state, + // from the points either side of it. Differing from one of the segment's own ends is not enough on + // its own where the sample is not the slower or cooled of the two: the segmentation pass below + // already confines the slowdown and cooling at an end, at a distance taken from how far out that + // end is rather than from wherever bisection happened to stop, and a point here would leave the + // span beside the end too short for that pass to run at all. Support an end cannot account for, + // where the interior is the slower or cooled of the two, is exactly what this pass is here to find. + const bool worth_before = !same_speed_and_fan(sample, before) && (!at_start || slower_or_cooled(sample, before)); + const bool worth_after = !same_speed_and_fan(sample, after) && (!at_end || slower_or_cooled(sample, after)); if (worth_before || worth_after) interior[kept++] = interior[i]; } @@ -238,52 +254,60 @@ std::vector> estimate_points_properties(const POINTS& if ((curr.distance > -boundary_offset && curr.distance < boundary_offset + 2.0f) || (next.distance > -boundary_offset && next.distance < boundary_offset + 2.0f)) { double line_len = (next.position - curr.position).norm(); - - // ORCA: Segment path to smaller lines by adding additional points only if the path has an overhang that - // will trigger a slowdown and the path is also reasonably large, i.e. 2mm in length or more - // If there is no overhang in the start/end point, dont segment it. - // Ignore this check if the control of segmentation for overhangs is disabled (min_distance=-1) - if ((min_distance > 0 && ((std::abs(curr.distance) > min_distance) || (std::abs(next.distance) > min_distance)) && line_len >= 2.f) || - (min_distance <= 0 && line_len > 4.0f)) { + + // ORCA: A line prints as slow as its slower end and is cooled if either end is, so an overhang at one + // end would otherwise slow down or cool the whole line. Split the line so that only the part beside + // that end prints that way, if the line is reasonably long (2mm or more) and at least one end prints + // slower or cooled compared with a supported point (overhang distance 0). Deciding on how the end + // prints, rather than on its overhang distance against min_distance, also catches an end whose overhang + // distance is exactly where the slowdown begins, such as an outline crossing at half a line width. + // Without distance_to_speed, split every line over 4mm. + const bool split_line = distance_to_speed ? + line_len >= 2.f && (slower_or_cooled(curr.distance, 0.f) || slower_or_cooled(next.distance, 0.f)) : + line_len > 4.0f; + if (split_line) { + // Each end's piece is that end's overhang distance plus 1.5 line widths (3 * boundary_offset) long: + // a0 ends the piece beside curr, a1 starts the piece beside next. double a0 = std::clamp((curr.distance + 3 * boundary_offset) / line_len, 0.0, 1.0); double a1 = std::clamp(1.0f - (next.distance + 3 * boundary_offset) / line_len, 0.0, 1.0); double t0 = std::min(a0, a1); double t1 = std::max(a0, a1); - if (t0 < 1.0) { - Vec p0 = curr.position + t0 * (next.position - curr.position); - auto [p0_dist, p0_near_l, p0_x] = unscaled_prev_layer.template distance_from_lines_extra( - p0.template cast()); - ExtendedPoint new_p{}; - new_p.position = p0; - new_p.distance = float(p0_dist + boundary_offset); - // ORCA: only create a new point in the path if the new point overhang distance will be used to generate a speed change - // or if this option is disabled (min_distance<=0) - if( (std::abs(p0_dist) > min_distance) || (min_distance<=0)){ - // ORCA: also filter out points that are introduced to the start of the path when their distance from the start point is - // not meaningful - if ((p0 - curr.position).norm() > min_spacing && (next.position - p0).norm() > min_spacing) { - new_points.push_back(new_p); - } - } + // Up to two cut points, in order along the line. Each takes its own overhang distance, so every + // piece prints by the overhang distances at its own two ends. t0 >= 1 or t1 <= 0 falls on the + // line's own end, so there is no cut. A cut closer than min_spacing to either end of the line is + // not meaningful and is filtered out (#6714). + ExtendedPoint cut[2]{}; + bool keep[2] = {false, false}; + for (int k = 0; k < 2; ++k) { + const double t = k == 0 ? t0 : t1; + if (k == 0 ? t >= 1.0 : t <= 0.0) + continue; + const Vec p = curr.position + t * (next.position - curr.position); + auto [p_dist, p_near_l, p_x] = unscaled_prev_layer.template distance_from_lines_extra( + p.template cast()); + cut[k].position = p; + cut[k].distance = float(p_dist + boundary_offset); + keep[k] = (p - curr.position).norm() > min_spacing && (next.position - p).norm() > min_spacing; } - if (t1 > 0.0) { - Vec p1 = curr.position + t1 * (next.position - curr.position); - auto [p1_dist, p1_near_l, p1_x] = unscaled_prev_layer.template distance_from_lines_extra( - p1.template cast()); - ExtendedPoint new_p{}; - new_p.position = p1; - new_p.distance = float(p1_dist + boundary_offset); - // ORCA: only create a new point in the path if the new point overhang distance will be used to generate a speed change - // or if this option is disabled (min_distance<=0) - if( (std::abs(p1_dist) > min_distance) || (min_distance<=0)){ - // ORCA: filter out points that are introduced to the end of the path when their distance from the end point is - // not meaningful - if ((p1 - curr.position).norm() > min_spacing && (next.position - p1).norm() > min_spacing) { - new_points.push_back(new_p); - } - } + if (distance_to_speed) { + // Only keep a cut that changes the G-code: one that prints differently from at least one of the + // points either side of it, which are the line's ends or the other cut where that is kept. A cut + // that prints like both would only split a move into two identical ones. + if (keep[0]) + keep[0] = !same_speed_and_fan(cut[0].distance, curr.distance) || + !same_speed_and_fan(cut[0].distance, keep[1] ? cut[1].distance : next.distance); + if (keep[1]) + keep[1] = !same_speed_and_fan(cut[1].distance, keep[0] ? cut[0].distance : curr.distance) || + !same_speed_and_fan(cut[1].distance, next.distance); + // Two cuts closer together than min_spacing would leave a micro segment between them, so only the + // first is kept. + if (keep[0] && keep[1] && (cut[1].position - cut[0].position).norm() <= min_spacing) + keep[1] = false; } + for (int k = 0; k < 2; ++k) + if (keep[k]) + new_points.push_back(cut[k]); } } new_points.push_back(next); @@ -423,7 +447,10 @@ public: const ConfigOptionFloatsOrPercents &speeds, float ext_perimeter_speed, float original_speed, - bool slowdown_for_curled_edges) + bool slowdown_for_curled_edges, + // Overlap at or below which the overhang fan switches on; negative when the fan + // does not depend on overlap. + float fan_overlap_threshold = -1.0f) { size_t speed_sections_count = std::min(overlaps.values.size(), speeds.values.size()); std::vector> speed_sections; @@ -463,7 +490,8 @@ public: } } - // If a meaningful (i.e. needing slowdown) overhang distance was not found, then we shouldn't split the lines + // If no overhang distance slows this path down, -1 turns interior sampling off unless the overhang fan can switch. + // Lines are only split where an end prints slower or cooled, so here only a fan switch splits them. if (!found) smallest_distance_with_lower_speed=-1.f; @@ -487,9 +515,17 @@ public: return round(final_speed); }; + // ORCA: The speed sections are built from ext_perimeter_speed, which can be above the speed this path prints at + // (original_speed, e.g. held down by resonance avoidance). Every segment is capped at original_speed below, so + // overhang distances whose speeds differ only above it print the same and must not count as a speed change when + // the path is split. + auto effective_speed = [&calculate_speed, original_speed](float distance) { + return std::min(calculate_speed(distance), original_speed); + }; + std::vector> extended_points = estimate_points_properties(path.polyline.points, prev_layer_boundaries[current_object], path.width, -1, - smallest_distance_with_lower_speed, calculate_speed); + smallest_distance_with_lower_speed, effective_speed, fan_overlap_threshold); const auto width_inv = 1.0f / path.width; std::vector processed_points; processed_points.reserve(extended_points.size()); diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index 00398f9ebb..ed3ac6de88 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -2717,7 +2717,8 @@ void Print::process(long long *time_cost_with_cache, bool use_cache) { LifecycleEventContext ctx; - ctx.name = std::to_string(m_model.id().id); + ctx.id = std::to_string(m_model.id().id); + ctx.name = get_model_name(); ctx.code = LifecycleEvtCode::Ok; ctx.cancellation_check = [this]() { return canceled(); }; fire_lifecycle_event(LifecycleEvent::SliceStarted, ctx); @@ -3344,7 +3345,8 @@ void Print::process(long long *time_cost_with_cache, bool use_cache) { LifecycleEventContext ctx; - ctx.name = std::to_string(m_model.id().id); + ctx.id = std::to_string(m_model.id().id); + ctx.name = get_model_name(); ctx.code = LifecycleEvtCode::Ok; ctx.cancellation_check = [this]() { return canceled(); }; fire_lifecycle_event(LifecycleEvent::SliceGeometryFinished, ctx); @@ -4950,7 +4952,8 @@ void Print::export_gcode_from_previous_file(const std::string& file, GCodeProces { { LifecycleEventContext ctx; - ctx.name = std::to_string(m_model.id().id); + ctx.id = std::to_string(m_model.id().id); + ctx.name = get_model_name(); ctx.code = LifecycleEvtCode::Ok; ctx.msg = file; ctx.cancellation_check = [this]() { return canceled(); }; @@ -4980,7 +4983,8 @@ void Print::export_gcode_from_previous_file(const std::string& file, GCodeProces BOOST_LOG_TRIVIAL(error) << __FUNCTION__ << boost::format(": found errors when process gcode file %1%") %file.c_str(); { LifecycleEventContext ctx; - ctx.name = std::to_string(m_model.id().id); + ctx.id = std::to_string(m_model.id().id); + ctx.name = get_model_name(); ctx.code = LifecycleEvtCode::Error; ctx.msg = file + "\n" + ex.what(); ctx.cancellation_check = [this]() { return canceled(); }; @@ -4994,7 +4998,8 @@ void Print::export_gcode_from_previous_file(const std::string& file, GCodeProces { LifecycleEventContext ctx; - ctx.name = std::to_string(m_model.id().id); + ctx.id = std::to_string(m_model.id().id); + ctx.name = get_model_name(); ctx.code = LifecycleEvtCode::Ok; ctx.msg = file; ctx.cancellation_check = [this]() { return canceled(); }; diff --git a/src/libvgcode/src/Shaders.hpp b/src/libvgcode/src/Shaders.hpp index 596b42df5c..9f546d6dc8 100644 --- a/src/libvgcode/src/Shaders.hpp +++ b/src/libvgcode/src/Shaders.hpp @@ -34,6 +34,10 @@ static const char* Segments_Vertex_Shader = // ORCA: 0 during the shadow caster pass - the bias below shifts eye_position but not // world_position, so the caster would write a depth the receiver never looks up. "uniform float bias_scale;\n" +// draw the instances last to first, top layers before the ones they hide, so that early depth +// rejection discards most of the hidden fragments; set when the camera looks down on the print +"uniform int reverse_order;\n" +"uniform int instance_count;\n" "in int vertex_id;\n" "out vec3 color;\n" "// ORCA: realistic view - the light the shadow map is able to block, kept apart from the\n" @@ -59,7 +63,8 @@ static const char* Segments_Vertex_Shader = " return top_diffuse + front_diffuse + top_specular;\n" "}\n" "void main() {\n" -" int id_a = int(texelFetch(segment_index_tex, gl_InstanceID).r);\n" +" int instance = (reverse_order != 0) ? instance_count - 1 - gl_InstanceID : gl_InstanceID;\n" +" int id_a = int(texelFetch(segment_index_tex, instance).r);\n" " int id_b = id_a + 1;\n" " vec3 pos_a = texelFetch(position_tex, id_a).xyz;\n" " vec3 pos_b = texelFetch(position_tex, id_b).xyz;\n" diff --git a/src/libvgcode/src/ViewerImpl.cpp b/src/libvgcode/src/ViewerImpl.cpp index b1a7550b42..8212717931 100644 --- a/src/libvgcode/src/ViewerImpl.cpp +++ b/src/libvgcode/src/ViewerImpl.cpp @@ -763,6 +763,8 @@ void ViewerImpl::init(const std::string& opengl_context_version) m_uni_segments_height_width_angle_tex_id = glGetUniformLocation(m_segments_shader_id, "height_width_angle_tex"); m_uni_segments_colors_tex_id = glGetUniformLocation(m_segments_shader_id, "color_tex"); m_uni_segments_segment_index_tex_id = glGetUniformLocation(m_segments_shader_id, "segment_index_tex"); + m_uni_segments_reverse_order_id = glGetUniformLocation(m_segments_shader_id, "reverse_order"); + m_uni_segments_instance_count_id = glGetUniformLocation(m_segments_shader_id, "instance_count"); // ORCA: realistic view m_uni_segments_shadow_map_id = glGetUniformLocation(m_segments_shader_id, "shadow_map"); m_uni_segments_shadow_light_vp_id = glGetUniformLocation(m_segments_shader_id, "shadow_light_vp"); @@ -2090,6 +2092,15 @@ void ViewerImpl::render_segments(const Mat4x4& view_matrix, const Mat4x4& projec glsafe(glUniformMatrix4fv(m_uni_segments_view_matrix_id, 1, GL_FALSE, view_matrix.data())); glsafe(glUniformMatrix4fv(m_uni_segments_projection_matrix_id, 1, GL_FALSE, projection_matrix.data())); glsafe(glUniform3fv(m_uni_segments_camera_position_id, 1, camera_position.data())); + // The segments come in print order, bottom layer first. Seen from above, that is back to front, + // and every hidden fragment is shaded before the one that covers it. Drawing them last to first + // lets the depth test reject the hidden ones instead. The camera looks down when the world's + // up axis points towards it, which is the view matrix's (2, 2) entry being positive. + const bool top_down = !m_rendering_shadow_casters && view_matrix[10] > 0.0f; + glsafe(glUniform1i(m_uni_segments_reverse_order_id, top_down ? 1 : 0)); +#ifndef ENABLE_OPENGL_ES + glsafe(glUniform1i(m_uni_segments_instance_count_id, static_cast(m_enabled_segments_count))); +#endif // ENABLE_OPENGL_ES // ORCA: realistic view. The depth pass writes the map it would otherwise read, so it shades // with the lookup off. glsafe(glUniform1i(m_uni_segments_shadow_map_id, m_shadow_map_texture_unit)); diff --git a/src/libvgcode/src/ViewerImpl.hpp b/src/libvgcode/src/ViewerImpl.hpp index c9d658beb1..707f0f6bb7 100644 --- a/src/libvgcode/src/ViewerImpl.hpp +++ b/src/libvgcode/src/ViewerImpl.hpp @@ -362,6 +362,8 @@ private: int m_uni_segments_height_width_angle_tex_id{ -1 }; int m_uni_segments_colors_tex_id{ -1 }; int m_uni_segments_segment_index_tex_id{ -1 }; + int m_uni_segments_reverse_order_id{ -1 }; + int m_uni_segments_instance_count_id{ -1 }; int m_uni_segments_shadow_map_id{ -1 }; int m_uni_segments_shadow_light_vp_id{ -1 }; int m_uni_segments_shadow_intensity_id{ -1 }; diff --git a/src/slic3r/GUI/CAD/DesignPanel.cpp b/src/slic3r/GUI/CAD/DesignPanel.cpp index 0b4f86a618..d247ddfd26 100644 --- a/src/slic3r/GUI/CAD/DesignPanel.cpp +++ b/src/slic3r/GUI/CAD/DesignPanel.cpp @@ -4862,13 +4862,13 @@ void DesignPanel::on_import_mesh() try { shape = GeometryEngine::mesh_to_brep(mesh.its, MESH_IMPORT_TOLERANCE, MESH_IMPORT_MERGE_ANGLE_DEG, stats); - } catch (const std::exception& e) { - fail(_L("Mesh conversion failed: ") + wxString::FromUTF8(e.what())); - return; - } catch (const Standard_Failure& e) { // OCCT throws outside std::exception + } catch (const Standard_Failure& e) { // on OCCT >= 8 Standard_Failure derives from std::exception — must precede that handler fail(_L("Mesh conversion failed: ") + wxString::FromUTF8( e.GetMessageString() ? e.GetMessageString() : "OCCT error")); return; + } catch (const std::exception& e) { + fail(_L("Mesh conversion failed: ") + wxString::FromUTF8(e.what())); + return; } if (shape.IsNull()) { fail(_L("Mesh conversion produced no geometry")); return; } diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 6d4154ee65..cc92570b34 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -12807,8 +12807,6 @@ void Plater::priv::on_process_completed(SlicingProcessCompletedEvent &evt) notification_manager->set_slicing_progress_export_possible(); // Reset the "export G-code path" name, so that the automatic background processing will be enabled again. - const std::string lifecycle_job_name = this->background_process.fff_print() ? - this->background_process.fff_print()->output_filename() : std::string(); this->background_process.reset_export(); // This bool stops showing export finished notification even when process_completed_with_error is false bool has_error = false; @@ -12855,8 +12853,18 @@ void Plater::priv::on_process_completed(SlicingProcessCompletedEvent &evt) { Slic3r::LifecycleEventContext ctx; - ctx.name = lifecycle_job_name; - ctx.code = evt.cancelled() ? Slic3r::LifecycleEvtCode::Warn : (has_error ? Slic3r::LifecycleEvtCode::Error : Slic3r::LifecycleEvtCode::Ok); + if (const PrintBase* print = this->background_process.current_print()) { + const Model& model = print->model(); + ctx.id = std::to_string(model.id().id); + if (model.model_info) + ctx.name = model.model_info->model_name; + } else { + // Realistically Printbase* print will never be null because select_technology already asserts an active print + // and the worker thread asserts it before processing. + BOOST_LOG_TRIVIAL(warning) << __FUNCTION__ << ": slicing completed without an active print; lifecycle event has no model ID"; + } + ctx.code = evt.cancelled() ? Slic3r::LifecycleEvtCode::Warn : + (has_error ? Slic3r::LifecycleEvtCode::Error : Slic3r::LifecycleEvtCode::Ok); ctx.msg = evt.cancelled() ? "cancelled" : (has_error ? lifecycle_error_msg : std::string()); Slic3r::fire_lifecycle_event(Slic3r::LifecycleEvent::SlicingJobComplete, ctx); } diff --git a/src/slic3r/Utils/PrintHost.cpp b/src/slic3r/Utils/PrintHost.cpp index 04709fef4c..f3333c731d 100644 --- a/src/slic3r/Utils/PrintHost.cpp +++ b/src/slic3r/Utils/PrintHost.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include #include @@ -115,10 +116,67 @@ std::string PrintHost::get_print_host_webui(DynamicPrintConfig* config) return webui_url; } +namespace { + +// Moonraker (Klipper's API server) reports a raised exception as { "error": { "code", "message", "traceback" } } +// under every host type that connects to it, often with the cause only in the traceback. Returns the reason to show, +// or empty for any other body. +std::string moonraker_error_reason(const std::string &body) +{ + const auto root = nlohmann::json::parse(body, nullptr, false); + const auto err = root.find("error"); + if (err == root.end()) + return {}; + const auto message = err->find("message"); + const auto traceback = err->find("traceback"); + if (message == err->end() || traceback == err->end() || !message->is_string() || !traceback->is_string()) + return {}; + + const auto &msg = message->get_ref(); + const auto &tb = traceback->get_ref(); + if (msg.empty()) + return {}; + const auto end = tb.find_last_not_of(" \t\r\n"); + if (end == std::string::npos) + return msg; + + // Chained exceptions each start a new traceback; the one that failed the request is the last. + const auto header = tb.rfind("Traceback (most recent call last):", end); + + // Tornado renders a raised HTTPError as "HTTP : [ ()]", and the detail may span lines. + const auto code = err->find("code"); + if (code != err->end() && code->is_number_integer()) { + const std::string marker = "HTTP " + std::to_string(code->get()) + ": "; + const auto pos = tb.rfind(marker, end); + if (pos != std::string::npos && (header == std::string::npos || pos > header) && pos + marker.size() <= end) { + const std::string reason = tb.substr(pos + marker.size(), end + 1 - pos - marker.size()); + // An HTTPError whose detail equals its reason, like HTTPError(401, "Unauthorized"), renders the phrase twice. + return reason == msg + " (" + msg + ")" ? msg : reason; + } + } + + // Any other exception's type and message are everything from the first unindented line after its frames. + auto begin = (header == std::string::npos) ? std::string::npos : tb.find('\n', header); + while (begin != std::string::npos && begin < end) { + ++begin; + if (tb[begin] != ' ' && tb[begin] != '\r' && tb[begin] != '\n') + break; + begin = tb.find('\n', begin); + } + if (begin == std::string::npos || begin > end) { + const auto nl = tb.rfind('\n', end); + begin = (nl == std::string::npos) ? 0 : nl + 1; + } + return msg + " (" + tb.substr(begin, end + 1 - begin) + ")"; +} + +} // namespace + wxString PrintHost::format_error(const std::string &body, const std::string &error, unsigned status) const { if (status != 0) { - auto wxbody = wxString::FromUTF8(body.data()); + const std::string reason = moonraker_error_reason(body); + auto wxbody = wxString::FromUTF8(reason.empty() ? body : reason); return wxString::Format("HTTP %u: %s", status, wxbody); } else { if (error.find("curl:Timeout was reached") != std::string::npos) { diff --git a/tests/fff_print/test_extrusion_processor.cpp b/tests/fff_print/test_extrusion_processor.cpp index 76e331d66a..47f9a62ecf 100644 --- a/tests/fff_print/test_extrusion_processor.cpp +++ b/tests/fff_print/test_extrusion_processor.cpp @@ -244,6 +244,44 @@ float furthest_reading(const std::vector>& points) })->distance; } +// A wall along a supported edge of the previous layer, ending past or just short of the edge's end. Crossing the edge's +// end reads half a line width out. +constexpr double edge_run_length = 64.; // mm, wall start, measured from the end of the previous layer's edge +constexpr double edge_step = 0.384; // mm, how far this layer's contour extends past the previous layer's end +// The centreline is inset half a line width from the contour. +constexpr double edge_wall_end_past = edge_step - 0.5 * caged_wall_width; +constexpr double edge_wall_end_short = 0.05; // mm short of the edge, reading 0.21 - 0.05 = 0.16mm out +// Segmentation splits 1.5 line widths plus the end's reading from an end, so an end's slowdown and cooling stay within this. +constexpr double edge_affected_length = 3. * caged_wall_width; + +std::vector> sampled_wall_along_edge(double wall_end_x, + const std::function& distance_to_speed, + float min_distance, + float fan_overlap_threshold) +{ + const AABBTreeLines::LinesDistancer prev_layer(std::vector{ + {{0., 0.}, {edge_run_length + 10., 0.}}, + {{edge_run_length + 10., 0.}, {edge_run_length + 10., -10.}}, + {{edge_run_length + 10., -10.}, {0., -10.}}, + {{0., -10.}, {0., 0.}}, + }); + const double wall_y = -0.5 * caged_wall_width; + const Points wall{Point::new_scale(edge_run_length, wall_y), Point::new_scale(wall_end_x, wall_y)}; + + return estimate_points_properties(wall, prev_layer, caged_wall_width, -1.f, min_distance, + distance_to_speed, fan_overlap_threshold); +} + +// Length printed with the overhang fan on: segments with either end's overlap at or below the threshold. +double cooled_length(const std::vector>& points, float fan_overlap_threshold) +{ + double length = 0.; + for (size_t i = 0; i + 1 < points.size(); ++i) + if (1.f - std::max(points[i].distance, points[i + 1].distance) / float(caged_wall_width) <= fan_overlap_threshold) + length += (points[i + 1].position - points[i].position).norm(); + return length; +} + DynamicPrintConfig caged_overhang_config(const char* wall_generator){ DynamicPrintConfig config = DynamicPrintConfig::full_print_config(); config.set_deserialize_strict({ @@ -431,6 +469,61 @@ TEST_CASE("A supported wall between overhanging corners is slowed no further tha REQUIRE(sampled <= unsampled); } +// Regression: the line up to a step past the previous layer was not split, so the step's slowdown and cooling covered the +// whole wall. The split required an end reading beyond where the slowdown begins, and an edge crossing reads exactly +// there when the wall speed is held below the reference speed (e.g. resonance avoidance). +TEST_CASE("A wall stepping past the previous layer is slowed and cooled only beside the step", "[ExtrusionProcessor][Regression]") +{ + const float crossing_reading = 0.5f * float(caged_wall_width); + const std::function distance_to_speed = [crossing_reading](float distance) { + return distance < crossing_reading ? 70.f : 15.f; + }; + const float fan_overlap_threshold = 0.75f; // The fan switches on at a 25% overhang + + const std::vector> points = sampled_wall_along_edge(-edge_wall_end_past, distance_to_speed, crossing_reading, + fan_overlap_threshold); + const double slowed = slowed_length(points, distance_to_speed); + const double cooled = cooled_length(points, fan_overlap_threshold); + + REQUIRE(slowed > 0.); + REQUIRE(cooled > 0.); + REQUIRE(slowed < edge_affected_length); + REQUIRE(cooled < edge_affected_length); +} + +// Regression: the fan can switch on at a smaller overhang than the first slowdown. Splitting only on speed changes left +// the whole wall cooled when its end read between the two. +TEST_CASE("A wall is split where only the overhang fan changes", "[ExtrusionProcessor][Regression]") +{ + const float crossing_reading = 0.5f * float(caged_wall_width); + const std::function distance_to_speed = [crossing_reading](float distance) { + return distance < crossing_reading ? 70.f : 15.f; + }; + // The end reads 0.16mm out (overlap 0.62): cooled at a 25% threshold, but not slowed. + const float fan_overlap_threshold = 0.75f; + + const std::vector> points = sampled_wall_along_edge(edge_wall_end_short, distance_to_speed, crossing_reading, + fan_overlap_threshold); + const double cooled = cooled_length(points, fan_overlap_threshold); + + REQUIRE_THAT(slowed_length(points, distance_to_speed), Catch::Matchers::WithinAbs(0., 1e-9)); + REQUIRE(cooled > 0.); + REQUIRE(cooled < edge_affected_length); +} + +// With one speed and a fan threshold no reading reaches, only the wall's ends and the edge crossing remain. +TEST_CASE("A wall is left whole where neither its speed nor its cooling changes", "[ExtrusionProcessor]") +{ + const std::function distance_to_speed = [](float) { return 70.f; }; + // 95% overhang; the step reads 0.384mm out (overlap 0.09). + const float fan_overlap_threshold = 0.05f; + + const std::vector> points = sampled_wall_along_edge(-edge_wall_end_past, distance_to_speed, -1.f, + fan_overlap_threshold); + + REQUIRE(points.size() == 3); +} + TEST_CASE("Benchmark caged overhang interior sampling", "[ExtrusionProcessor][!benchmark]"){ const char* wall_generator = GENERATE("classic", "arachne"); diff --git a/tests/fff_print/test_print.cpp b/tests/fff_print/test_print.cpp index 383a7165d5..32cd608b43 100644 --- a/tests/fff_print/test_print.cpp +++ b/tests/fff_print/test_print.cpp @@ -15,6 +15,9 @@ #include "libslic3r/Layer.hpp" #include "libslic3r/Model.hpp" #include "libslic3r/GCodeReader.hpp" +#include "libslic3r/GCode/GCodeProcessor.hpp" +#include "libslic3r/Exception.hpp" +#include "libslic3r/LifecycleEvents.hpp" #include "test_helpers.hpp" #include "test_utils.hpp" @@ -22,7 +25,10 @@ #include #include #include +#include #include +#include +#include using namespace Slic3r; using namespace Slic3r::Test; @@ -224,8 +230,88 @@ std::string resolved_output_name(Model& model, const std::string& format, const return print.output_filename(filename_base); } +struct ScopedLifecycleHook +{ + explicit ScopedLifecycleHook(LifecycleHookFn hook) { set_lifecycle_hook_fn(std::move(hook)); } + ~ScopedLifecycleHook() { set_lifecycle_hook_fn(nullptr); } +}; + } // namespace +TEST_CASE("Slicing lifecycle events identify the model", "[Print][LifecycleEvents]") +{ + struct ObservedEvent { + LifecycleEvent event; + std::string id; + std::string name; + }; + std::vector events; + ScopedLifecycleHook hook([&](LifecycleEvent event, const LifecycleEventContext& ctx) { + events.push_back({ event, ctx.id, ctx.name }); + }); + + Print print; + Model model; + ModelInfo info; + info.model_name = "Lifecycle test model"; + model.model_info = std::make_shared(std::move(info)); + init_print({cube(20)}, print, model); + + print.process(); + ScopedTemporaryFile temp(".gcode"); + print.export_gcode(temp.string(), nullptr, nullptr); + GCodeProcessorResult result; + print.export_gcode_from_previous_file(temp.string(), &result); + + const std::string expected_id = std::to_string(print.model().id().id); + const std::vector expected_events = { + LifecycleEvent::SliceStarted, + LifecycleEvent::SliceGeometryFinished, + LifecycleEvent::GCodeExportStarted, + LifecycleEvent::GCodeExportFinished, + LifecycleEvent::GCodeExportStarted, + LifecycleEvent::GCodeExportFinished, + }; + REQUIRE(events.size() == expected_events.size()); + for (size_t i = 0; i < expected_events.size(); ++i) { + CHECK(events[i].event == expected_events[i]); + CHECK(events[i].id == expected_id); + CHECK(events[i].name == "Lifecycle test model"); + } +} + +TEST_CASE("Slicing lifecycle event name is empty without model metadata", "[Print][LifecycleEvents]") +{ + std::string event_id; + std::string event_name = "unset"; + ScopedLifecycleHook hook([&](LifecycleEvent event, const LifecycleEventContext& ctx) { + if (event == LifecycleEvent::SliceStarted) { + event_id = ctx.id; + event_name = ctx.name; + } + }); + + Print print; + Model model; + init_print({cube(20)}, print, model); + print.process(); + + CHECK(event_id == std::to_string(print.model().id().id)); + CHECK(event_name.empty()); +} + +TEST_CASE("Output filenames with numeric statistics fail before slicing finishes", "[Print][Regression]") +{ + DynamicPrintConfig config = DynamicPrintConfig::full_print_config(); + config.set_key_value("filename_format", new ConfigOptionString("{int(total_weight*10) / 10.0}")); + + Print print; + Model model; + init_print({cube(20)}, print, model, config); + + CHECK_THROWS_AS(print.output_filename(), PlaceholderParserError); +} + TEST_CASE("Print: {first_object_name} names the first printable object on the plate", "[Print]") { Model model; diff --git a/tests/slic3rutils/CMakeLists.txt b/tests/slic3rutils/CMakeLists.txt index 08f1a6dd8f..7f541f3701 100644 --- a/tests/slic3rutils/CMakeLists.txt +++ b/tests/slic3rutils/CMakeLists.txt @@ -18,6 +18,7 @@ add_executable(${_TEST_NAME}_tests test_plugin_install.cpp test_plugin_lifecycle.cpp test_plugin_printer_agent.cpp + test_printhost.cpp test_slicing_pipeline_bindings.cpp test_slicing_pipeline_config.cpp test_plugin_sort.cpp diff --git a/tests/slic3rutils/test_printhost.cpp b/tests/slic3rutils/test_printhost.cpp new file mode 100644 index 0000000000..557d4a5c89 --- /dev/null +++ b/tests/slic3rutils/test_printhost.cpp @@ -0,0 +1,213 @@ +#include + +#include + +#include "slic3r/Utils/PrintHost.hpp" + +using namespace Slic3r; + +namespace { + +class TestPrintHost : public PrintHost +{ +public: + using PrintHost::format_error; + + const char* get_name() const override { return "Test"; } + bool test(wxString&) const override { return true; } + wxString get_test_ok_msg() const override { return {}; } + wxString get_test_failed_msg(wxString&) const override { return {}; } + bool upload(PrintHostUpload, ProgressFn, ErrorFn, InfoFn) const override { return true; } + bool has_auto_discovery() const override { return false; } + bool can_test() const override { return false; } + PrintHostPostUploadActions get_post_upload_actions() const override { return {}; } + std::string get_host() const override { return {}; } +}; + +std::string format_error(const std::string& body, const std::string& error, unsigned status) +{ + return TestPrintHost().format_error(body, error, status).ToStdString(); +} + +std::string envelope(int code, const std::string& message, const std::string& traceback) +{ + return nlohmann::json{{"error", {{"code", code}, {"message", message}, {"traceback", traceback}}}}.dump(); +} + +std::string moonraker_error(int code, const std::string& message, const std::string& detail = {}) +{ + std::string line = "tornado.web.HTTPError: HTTP " + std::to_string(code) + ": " + message; + if (!detail.empty()) + line += " (" + detail + ")"; + return envelope(code, message, "Traceback (most recent call last):\n ...\n" + line + "\n"); +} + +// A real Moonraker body for uploading a file that is being printed. +constexpr const char* k_busy_file_403 = + R"JSON({"error": {"code": 403, "message": "Forbidden", "traceback": "Traceback (most recent call last):\n\n File \"/home/lava/moonraker/moonraker/components/file_manager/file_manager.py\", line 1017, in _finish_gcode_upload\n can_start = self._handle_operation_check(check_path)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nmoonraker.utils.exceptions.ServerError: File currently in use\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n\n File \"/home/lava/moonraker/moonraker/components/application.py\", line 1069, in post\n raise tornado.web.HTTPError(\ntornado.web.HTTPError: HTTP 403: Forbidden (File is loaded, upload not permitted)\n"}})JSON"; + +} // namespace + +TEST_CASE("A Klipper upload error shows its reason instead of a Python traceback", "[PrintHost][Regression]") +{ + const std::string msg = format_error(k_busy_file_403, "", 403); + INFO("actual: " << msg); + + CHECK(msg == "HTTP 403: Forbidden (File is loaded, upload not permitted)"); + CHECK_THAT(msg, !Catch::Matchers::ContainsSubstring("Traceback")); + CHECK_THAT(msg, !Catch::Matchers::ContainsSubstring("file_manager.py")); +} + +TEST_CASE("The specific cause is recovered from a file endpoint's traceback", "[PrintHost]") +{ + SECTION("a plain detail") + { + const std::string body = moonraker_error(403, "Forbidden", "File is loaded, upload not permitted"); + CHECK(format_error(body, "", 403) == "HTTP 403: Forbidden (File is loaded, upload not permitted)"); + } + + SECTION("a detail whose own parentheses nest (a filename)") + { + const std::string detail = "Directory does not exist (/home/pi/gcodes/plate (1).gcode)"; + const std::string body = moonraker_error(400, "Bad Request", detail); + CHECK(format_error(body, "", 400) == "HTTP 400: Bad Request (" + detail + ")"); + } + + SECTION("a detail that contains the reason phrase") + { + const std::string body = moonraker_error(403, "Forbidden", "Forbidden zone: access denied"); + CHECK(format_error(body, "", 403) == "HTTP 403: Forbidden (Forbidden zone: access denied)"); + } + + SECTION("a detail that spans lines") + { + const std::string detail = "Move out of range\nX=250.000 Y=10.000"; + const std::string body = moonraker_error(400, "Bad Request", detail); + CHECK(format_error(body, "", 400) == "HTTP 400: Bad Request (" + detail + ")"); + } + + SECTION("a detail that only repeats the reason phrase is dropped") + { + const std::string body = moonraker_error(401, "Unauthorized", "Unauthorized"); + CHECK(format_error(body, "", 401) == "HTTP 401: Unauthorized"); + } +} + +TEST_CASE("An unhandled exception shows its type and message", "[PrintHost]") +{ + const std::string frame = "Traceback (most recent call last):\n" + " File \"/home/pi/moonraker/moonraker/components/file_manager/file_manager.py\", line 1, in write\n" + " self._write(data)\n"; + + SECTION("a one-line message") + { + const std::string body = envelope(500, "Internal Server Error", frame + "OSError: [Errno 28] No space left on device\n"); + CHECK(format_error(body, "", 500) == "HTTP 500: Internal Server Error (OSError: [Errno 28] No space left on device)"); + } + + SECTION("a message that spans lines") + { + const std::string body = envelope(500, "Internal Server Error", frame + "ServerError: Klippy request failed\n see klippy.log\n"); + CHECK(format_error(body, "", 500) == "HTTP 500: Internal Server Error (ServerError: Klippy request failed\n see klippy.log)"); + } + + SECTION("raised while handling an HTTPError with the same code") + { + const std::string traceback = frame + "tornado.web.HTTPError: HTTP 500: Internal Server Error (Database locked)\n\n" + "During handling of the above exception, another exception occurred:\n\n" + + frame + "OSError: [Errno 5] Input/output error\n"; + const std::string body = envelope(500, "Internal Server Error", traceback); + CHECK(format_error(body, "", 500) == "HTTP 500: Internal Server Error (OSError: [Errno 5] Input/output error)"); + } + + SECTION("a traceback with no header") + { + const std::string body = envelope(500, "Internal Server Error", "OSError: [Errno 5] Input/output error"); + CHECK(format_error(body, "", 500) == "HTTP 500: Internal Server Error (OSError: [Errno 5] Input/output error)"); + } +} + +TEST_CASE("A reason already complete in message is shown unchanged", "[PrintHost]") +{ + SECTION("message is the whole reason, no trailing detail") + { + const std::string body = moonraker_error(503, "Klippy is not ready"); + CHECK(format_error(body, "", 503) == "HTTP 503: Klippy is not ready"); + } + + SECTION("a message that itself contains parentheses is not duplicated") + { + const std::string reason = "Requested blocks (0-5) are unavailable"; + const std::string body = moonraker_error(400, reason); + CHECK(format_error(body, "", 400) == "HTTP 400: " + reason); + } +} + +TEST_CASE("A Moonraker error with no usable detail shows just the reason phrase", "[PrintHost]") +{ + struct Case + { + const char* name; + const char* body; + unsigned status; + const char* expected; + }; + + const auto c = GENERATE( + Case{"an empty traceback", R"JSON({"error": {"code": 500, "message": "Internal Server Error", "traceback": ""}})JSON", 500, + "HTTP 500: Internal Server Error"}, + Case{"a traceback of only whitespace", R"JSON({"error": {"code": 500, "message": "Internal Server Error", "traceback": "\n \n"}})JSON", + 500, "HTTP 500: Internal Server Error"}); + + DYNAMIC_SECTION(c.name) { CHECK(format_error(c.body, "", c.status) == c.expected); } +} + +TEST_CASE("A percent sign in the reason is not a format specifier", "[PrintHost]") +{ + const std::string body = moonraker_error(507, "Insufficient Storage", "disk 100% full"); + CHECK(format_error(body, "", 507) == "HTTP 507: Insufficient Storage (disk 100% full)"); +} + +TEST_CASE("Error bodies that are not a Moonraker envelope are left unchanged", "[PrintHost]") +{ + SECTION("OctoPrint's string-valued error member") + { + const std::string body = R"JSON({"error": "File not found"})JSON"; + CHECK(format_error(body, "", 404) == "HTTP 404: " + body); + } + + SECTION("PrusaLink's top-level message, not under error") + { + const std::string body = R"JSON({"title": "Conflict", "message": "Printer is printing"})JSON"; + CHECK(format_error(body, "", 409) == "HTTP 409: " + body); + } + + SECTION("a body that is not JSON") + { + const std::string html = "502 Bad Gateway"; + CHECK(format_error(html, "", 502) == "HTTP 502: " + html); + } + + SECTION("an error object with no traceback") + { + const std::string body = R"JSON({"error": {"code": 500, "message": "Internal Server Error"}})JSON"; + CHECK(format_error(body, "", 500) == "HTTP 500: " + body); + } + + SECTION("an error object whose traceback is null") + { + const std::string body = R"JSON({"error": {"code": 500, "message": "Internal Server Error", "traceback": null}})JSON"; + CHECK(format_error(body, "", 500) == "HTTP 500: " + body); + } + + SECTION("an envelope whose reason phrase is empty") + { + const std::string body = envelope(403, "", "Traceback (most recent call last):\nOSError: denied\n"); + CHECK(format_error(body, "", 403) == "HTTP 403: " + body); + } + + SECTION("a transport error with no HTTP status") + { + CHECK(format_error("", "curl:Could not connect", 0) == "curl:Could not connect"); + } +}