From 735ef3dc8a146eebf20e5c4fc04f7db731bbcb3d Mon Sep 17 00:00:00 2001 From: "maosheng.wei" Date: Tue, 26 Sep 2023 11:49:13 +0800 Subject: [PATCH] ENH: remove create filament entry to guide Jira: 4036 Change-Id: I86aa3423761956120e9bf42dcb8eca76dd44202b Signed-off-by: maosheng.wei --- resources/profiles/Template.json | 70 ++ .../filament/filament_abs_template.json | 165 +++ .../filament/filament_asa_template.json | 165 +++ .../filament/filament_hips_template.json | 168 +++ .../filament/filament_pa_template.json | 165 +++ .../filament/filament_pc_template.json | 165 +++ .../filament/filament_pet_template.json | 165 +++ .../filament/filament_pla_template.json | 168 +++ .../filament/filament_ppa_template.json | 165 +++ .../filament/filament_pps_template.json | 165 +++ .../filament/filament_pva_template.json | 168 +++ .../filament/filament_tpu_template.json | 168 +++ .../process/process_0.2_nozzle_template.json | 109 ++ .../process/process_0.4_nozzle_template.json | 109 ++ .../process/process_0.6_nozzle_template.json | 109 ++ .../process/process_0.8_nozzle_template.json | 109 ++ src/libslic3r/Preset.cpp | 40 +- src/libslic3r/Preset.hpp | 11 +- src/libslic3r/PresetBundle.cpp | 4 +- src/slic3r/GUI/CreatePresetsDialog.cpp | 1111 +++++++++++++---- src/slic3r/GUI/CreatePresetsDialog.hpp | 119 +- src/slic3r/GUI/Plater.cpp | 63 +- src/slic3r/GUI/Plater.hpp | 3 +- src/slic3r/GUI/WebGuideDialog.cpp | 43 + 24 files changed, 3398 insertions(+), 329 deletions(-) create mode 100644 resources/profiles/Template.json create mode 100644 resources/profiles/Template/filament/filament_abs_template.json create mode 100644 resources/profiles/Template/filament/filament_asa_template.json create mode 100644 resources/profiles/Template/filament/filament_hips_template.json create mode 100644 resources/profiles/Template/filament/filament_pa_template.json create mode 100644 resources/profiles/Template/filament/filament_pc_template.json create mode 100644 resources/profiles/Template/filament/filament_pet_template.json create mode 100644 resources/profiles/Template/filament/filament_pla_template.json create mode 100644 resources/profiles/Template/filament/filament_ppa_template.json create mode 100644 resources/profiles/Template/filament/filament_pps_template.json create mode 100644 resources/profiles/Template/filament/filament_pva_template.json create mode 100644 resources/profiles/Template/filament/filament_tpu_template.json create mode 100644 resources/profiles/Template/process/process_0.2_nozzle_template.json create mode 100644 resources/profiles/Template/process/process_0.4_nozzle_template.json create mode 100644 resources/profiles/Template/process/process_0.6_nozzle_template.json create mode 100644 resources/profiles/Template/process/process_0.8_nozzle_template.json diff --git a/resources/profiles/Template.json b/resources/profiles/Template.json new file mode 100644 index 0000000000..c750a0473c --- /dev/null +++ b/resources/profiles/Template.json @@ -0,0 +1,70 @@ +{ + "name": "Template", + "version": "01.07.00.02", + "force_update": "0", + "description": "Template configurations", + "machine_model_list": [ + ], + "process_list": [ + { + "name": "process_0.2_nozzle_template", + "sub_path": "process/process_0.2_nozzle_template.json" + }, + { + "name": "process_0.4_nozzle_template", + "sub_path": "process/process_0.4_nozzle_template.json" + }, + { + "name": "process_0.6_nozzle_template", + "sub_path": "process/process_0.6_nozzle_template.json" + }, + { + "name": "process_0.8_nozzle_template", + "sub_path": "process/process_0.8_nozzle_template.json" + } + ], + "filament_list": [ + { + "name": "filament_abs_template", + "sub_path": "filament/filament_abs_template.json" + }, + { + "name": "filament_asa_template", + "sub_path": "filament/filament_asa_template.json" + }, + { + "name": "filament_hips_template", + "sub_path": "filament/filament_hips_template.json" + }, + { + "name": "filament_pa_template", + "sub_path": "filament/filament_pa_template.json" + }, + { + "name": "filament_pet_template", + "sub_path": "filament/filament_pet_template.json" + }, + { + "name": "filament_pla_template", + "sub_path": "filament/filament_pla_template.json" + }, + { + "name": "filament_ppa_template", + "sub_path": "filament/filament_ppa_template.json" + }, + { + "name": "filament_pps_template", + "sub_path": "filament/filament_pps_template.json" + }, + { + "name": "filament_pva_template", + "sub_path": "filament/filament_pva_template.json" + }, + { + "name": "filament_tpu_template", + "sub_path": "filament/filament_tpu_template.json" + } + ], + "machine_list": [ + ] +} \ No newline at end of file diff --git a/resources/profiles/Template/filament/filament_abs_template.json b/resources/profiles/Template/filament/filament_abs_template.json new file mode 100644 index 0000000000..7664477ede --- /dev/null +++ b/resources/profiles/Template/filament/filament_abs_template.json @@ -0,0 +1,165 @@ +{ + "type": "filament", + "name": "Generic ABS template", + "instantiation": "false", + "activate_air_filtration": [ + "1" + ], + "chamber_temperatures": [ + "0" + ], + "close_fan_the_first_x_layers": [ + "3" + ], + "complete_print_exhaust_fan_speed": [ + "70" + ], + "cool_plate_temp": [ + "0" + ], + "cool_plate_temp_initial_layer": [ + "0" + ], + "during_print_exhaust_fan_speed": [ + "70" + ], + "eng_plate_temp": [ + "90" + ], + "eng_plate_temp_initial_layer": [ + "90" + ], + "fan_cooling_layer_time": [ + "30" + ], + "fan_max_speed": [ + "80" + ], + "fan_min_speed": [ + "10" + ], + "filament_cost": [ + "20" + ], + "filament_density": [ + "1.04" + ], + "filament_deretraction_speed": [ + "nil" + ], + "filament_diameter": [ + "1.75" + ], + "filament_flow_ratio": [ + "1" + ], + "filament_is_support": [ + "0" + ], + "filament_max_volumetric_speed": [ + "28.6" + ], + "filament_minimal_purge_on_wipe_tower": [ + "15" + ], + "filament_retract_before_wipe": [ + "nil" + ], + "filament_retract_restart_extra": [ + "nil" + ], + "filament_retract_when_changing_layer": [ + "nil" + ], + "filament_retraction_length": [ + "nil" + ], + "filament_retraction_minimum_travel": [ + "nil" + ], + "filament_retraction_speed": [ + "nil" + ], + "filament_settings_id": [ + "" + ], + "filament_soluble": [ + "0" + ], + "filament_type": [ + "ABS" + ], + "filament_vendor": [ + "Generic" + ], + "filament_wipe": [ + "nil" + ], + "filament_wipe_distance": [ + "nil" + ], + "filament_z_hop": [ + "nil" + ], + "filament_z_hop_types": [ + "nil" + ], + "full_fan_speed_layer": [ + "0" + ], + "hot_plate_temp": [ + "90" + ], + "hot_plate_temp_initial_layer": [ + "90" + ], + "nozzle_temperature": [ + "270" + ], + "nozzle_temperature_initial_layer": [ + "260" + ], + "nozzle_temperature_range_high": [ + "280" + ], + "nozzle_temperature_range_low": [ + "240" + ], + "overhang_fan_speed": [ + "80" + ], + "overhang_fan_threshold": [ + "25%" + ], + "reduce_fan_stop_start_freq": [ + "1" + ], + "required_nozzle_HRC": [ + "3" + ], + "slow_down_for_layer_cooling": [ + "1" + ], + "slow_down_layer_time": [ + "3" + ], + "slow_down_min_speed": [ + "20" + ], + "temperature_vitrification": [ + "100" + ], + "textured_plate_temp": [ + "90" + ], + "textured_plate_temp_initial_layer": [ + "90" + ], + "compatible_printers": [], + "filament_start_gcode": [ + "; Filament gcode\n{if activate_air_filtration[current_extruder] && support_air_filtration}\nM106 P3 S{during_print_exhaust_fan_speed_num[current_extruder]} \n{endif}" + ], + "filament_end_gcode": [ + "; filament end gcode \nM106 P3 S0\n" + ] +} \ No newline at end of file diff --git a/resources/profiles/Template/filament/filament_asa_template.json b/resources/profiles/Template/filament/filament_asa_template.json new file mode 100644 index 0000000000..c960707644 --- /dev/null +++ b/resources/profiles/Template/filament/filament_asa_template.json @@ -0,0 +1,165 @@ +{ + "type": "filament", + "name": "Generic ASA template", + "instantiation": "false", + "activate_air_filtration": [ + "1" + ], + "chamber_temperatures": [ + "0" + ], + "close_fan_the_first_x_layers": [ + "3" + ], + "complete_print_exhaust_fan_speed": [ + "70" + ], + "cool_plate_temp": [ + "0" + ], + "cool_plate_temp_initial_layer": [ + "0" + ], + "during_print_exhaust_fan_speed": [ + "70" + ], + "eng_plate_temp": [ + "90" + ], + "eng_plate_temp_initial_layer": [ + "90" + ], + "fan_cooling_layer_time": [ + "35" + ], + "fan_max_speed": [ + "80" + ], + "fan_min_speed": [ + "10" + ], + "filament_cost": [ + "20" + ], + "filament_density": [ + "1.04" + ], + "filament_deretraction_speed": [ + "nil" + ], + "filament_diameter": [ + "1.75" + ], + "filament_flow_ratio": [ + "1" + ], + "filament_is_support": [ + "0" + ], + "filament_max_volumetric_speed": [ + "28.6" + ], + "filament_minimal_purge_on_wipe_tower": [ + "15" + ], + "filament_retract_before_wipe": [ + "nil" + ], + "filament_retract_restart_extra": [ + "nil" + ], + "filament_retract_when_changing_layer": [ + "nil" + ], + "filament_retraction_length": [ + "nil" + ], + "filament_retraction_minimum_travel": [ + "nil" + ], + "filament_retraction_speed": [ + "nil" + ], + "filament_settings_id": [ + "" + ], + "filament_soluble": [ + "0" + ], + "filament_type": [ + "ASA" + ], + "filament_vendor": [ + "Generic" + ], + "filament_wipe": [ + "nil" + ], + "filament_wipe_distance": [ + "nil" + ], + "filament_z_hop": [ + "nil" + ], + "filament_z_hop_types": [ + "nil" + ], + "full_fan_speed_layer": [ + "0" + ], + "hot_plate_temp": [ + "90" + ], + "hot_plate_temp_initial_layer": [ + "90" + ], + "nozzle_temperature": [ + "260" + ], + "nozzle_temperature_initial_layer": [ + "260" + ], + "nozzle_temperature_range_high": [ + "280" + ], + "nozzle_temperature_range_low": [ + "240" + ], + "overhang_fan_speed": [ + "80" + ], + "overhang_fan_threshold": [ + "25%" + ], + "reduce_fan_stop_start_freq": [ + "1" + ], + "required_nozzle_HRC": [ + "3" + ], + "slow_down_for_layer_cooling": [ + "1" + ], + "slow_down_layer_time": [ + "3" + ], + "slow_down_min_speed": [ + "20" + ], + "temperature_vitrification": [ + "100" + ], + "textured_plate_temp": [ + "90" + ], + "textured_plate_temp_initial_layer": [ + "90" + ], + "compatible_printers": [], + "filament_start_gcode": [ + "; Filament gcode\n{if activate_air_filtration[current_extruder] && support_air_filtration}\nM106 P3 S{during_print_exhaust_fan_speed_num[current_extruder]} \n{endif}" + ], + "filament_end_gcode": [ + "; filament end gcode \nM106 P3 S0\n" + ] +} \ No newline at end of file diff --git a/resources/profiles/Template/filament/filament_hips_template.json b/resources/profiles/Template/filament/filament_hips_template.json new file mode 100644 index 0000000000..22c66f0913 --- /dev/null +++ b/resources/profiles/Template/filament/filament_hips_template.json @@ -0,0 +1,168 @@ +{ + "type": "filament", + "name": "Generic HIPS template", + "instantiation": "false", + "activate_air_filtration": [ + "0" + ], + "additional_cooling_fan_speed": [ + "0" + ], + "chamber_temperatures": [ + "0" + ], + "close_fan_the_first_x_layers": [ + "3" + ], + "complete_print_exhaust_fan_speed": [ + "70" + ], + "cool_plate_temp": [ + "0" + ], + "cool_plate_temp_initial_layer": [ + "0" + ], + "during_print_exhaust_fan_speed": [ + "70" + ], + "eng_plate_temp": [ + "90" + ], + "eng_plate_temp_initial_layer": [ + "90" + ], + "fan_cooling_layer_time": [ + "10" + ], + "fan_max_speed": [ + "60" + ], + "fan_min_speed": [ + "0" + ], + "filament_cost": [ + "22.99" + ], + "filament_density": [ + "1.06" + ], + "filament_deretraction_speed": [ + "nil" + ], + "filament_diameter": [ + "1.75" + ], + "filament_flow_ratio": [ + "1" + ], + "filament_is_support": [ + "0" + ], + "filament_max_volumetric_speed": [ + "8" + ], + "filament_minimal_purge_on_wipe_tower": [ + "15" + ], + "filament_retract_before_wipe": [ + "nil" + ], + "filament_retract_restart_extra": [ + "nil" + ], + "filament_retract_when_changing_layer": [ + "nil" + ], + "filament_retraction_length": [ + "nil" + ], + "filament_retraction_minimum_travel": [ + "nil" + ], + "filament_retraction_speed": [ + "nil" + ], + "filament_settings_id": [ + "" + ], + "filament_soluble": [ + "0" + ], + "filament_type": [ + "HIPS" + ], + "filament_vendor": [ + "Generic" + ], + "filament_wipe": [ + "nil" + ], + "filament_wipe_distance": [ + "nil" + ], + "filament_z_hop": [ + "nil" + ], + "filament_z_hop_types": [ + "nil" + ], + "full_fan_speed_layer": [ + "0" + ], + "hot_plate_temp": [ + "90" + ], + "hot_plate_temp_initial_layer": [ + "90" + ], + "nozzle_temperature": [ + "240" + ], + "nozzle_temperature_initial_layer": [ + "240" + ], + "nozzle_temperature_range_low": [ + "220" + ], + "nozzle_temperature_range_high": [ + "270" + ], + "overhang_fan_speed": [ + "80" + ], + "overhang_fan_threshold": [ + "25%" + ], + "reduce_fan_stop_start_freq": [ + "0" + ], + "required_nozzle_HRC": [ + "3" + ], + "slow_down_for_layer_cooling": [ + "1" + ], + "slow_down_layer_time": [ + "6" + ], + "slow_down_min_speed": [ + "20" + ], + "temperature_vitrification": [ + "100" + ], + "textured_plate_temp": [ + "90" + ], + "textured_plate_temp_initial_layer": [ + "90" + ], + "compatible_printers": [], + "filament_start_gcode": [ + "; Filament gcode\n{if activate_air_filtration[current_extruder] && support_air_filtration}\nM106 P3 S{during_print_exhaust_fan_speed_num[current_extruder]} \n{endif}" + ], + "filament_end_gcode": [ + "; filament end gcode \nM106 P3 S0\n" + ] +} \ No newline at end of file diff --git a/resources/profiles/Template/filament/filament_pa_template.json b/resources/profiles/Template/filament/filament_pa_template.json new file mode 100644 index 0000000000..0d91e2a9fd --- /dev/null +++ b/resources/profiles/Template/filament/filament_pa_template.json @@ -0,0 +1,165 @@ +{ + "type": "filament", + "name": "Generic PA template", + "instantiation": "false", + "activate_air_filtration": [ + "1" + ], + "chamber_temperatures": [ + "0" + ], + "close_fan_the_first_x_layers": [ + "3" + ], + "complete_print_exhaust_fan_speed": [ + "70" + ], + "cool_plate_temp": [ + "0" + ], + "cool_plate_temp_initial_layer": [ + "0" + ], + "during_print_exhaust_fan_speed": [ + "70" + ], + "eng_plate_temp": [ + "100" + ], + "eng_plate_temp_initial_layer": [ + "100" + ], + "fan_cooling_layer_time": [ + "4" + ], + "fan_max_speed": [ + "60" + ], + "fan_min_speed": [ + "0" + ], + "filament_cost": [ + "20" + ], + "filament_density": [ + "1.04" + ], + "filament_deretraction_speed": [ + "nil" + ], + "filament_diameter": [ + "1.75" + ], + "filament_flow_ratio": [ + "1" + ], + "filament_is_support": [ + "0" + ], + "filament_max_volumetric_speed": [ + "8" + ], + "filament_minimal_purge_on_wipe_tower": [ + "15" + ], + "filament_retract_before_wipe": [ + "nil" + ], + "filament_retract_restart_extra": [ + "nil" + ], + "filament_retract_when_changing_layer": [ + "nil" + ], + "filament_retraction_length": [ + "nil" + ], + "filament_retraction_minimum_travel": [ + "nil" + ], + "filament_retraction_speed": [ + "nil" + ], + "filament_settings_id": [ + "" + ], + "filament_soluble": [ + "0" + ], + "filament_type": [ + "PA" + ], + "filament_vendor": [ + "Generic" + ], + "filament_wipe": [ + "nil" + ], + "filament_wipe_distance": [ + "nil" + ], + "filament_z_hop": [ + "nil" + ], + "filament_z_hop_types": [ + "nil" + ], + "full_fan_speed_layer": [ + "0" + ], + "hot_plate_temp": [ + "100" + ], + "hot_plate_temp_initial_layer": [ + "100" + ], + "nozzle_temperature": [ + "290" + ], + "nozzle_temperature_initial_layer": [ + "290" + ], + "nozzle_temperature_range_high": [ + "300" + ], + "nozzle_temperature_range_low": [ + "260" + ], + "overhang_fan_speed": [ + "30" + ], + "overhang_fan_threshold": [ + "95%" + ], + "reduce_fan_stop_start_freq": [ + "0" + ], + "required_nozzle_HRC": [ + "40" + ], + "slow_down_for_layer_cooling": [ + "1" + ], + "slow_down_layer_time": [ + "2" + ], + "slow_down_min_speed": [ + "20" + ], + "temperature_vitrification": [ + "108" + ], + "textured_plate_temp": [ + "100" + ], + "textured_plate_temp_initial_layer": [ + "100" + ], + "compatible_printers": [], + "filament_start_gcode": [ + "; Filament gcode\n{if activate_air_filtration[current_extruder] && support_air_filtration}\nM106 P3 S{during_print_exhaust_fan_speed_num[current_extruder]} \n{endif}" + ], + "filament_end_gcode": [ + "; filament end gcode \nM106 P3 S0\n" + ] +} \ No newline at end of file diff --git a/resources/profiles/Template/filament/filament_pc_template.json b/resources/profiles/Template/filament/filament_pc_template.json new file mode 100644 index 0000000000..ff50a7b718 --- /dev/null +++ b/resources/profiles/Template/filament/filament_pc_template.json @@ -0,0 +1,165 @@ +{ + "type": "filament", + "name": "Generic PC template", + "instantiation": "false", + "activate_air_filtration": [ + "0" + ], + "chamber_temperatures": [ + "0" + ], + "close_fan_the_first_x_layers": [ + "3" + ], + "complete_print_exhaust_fan_speed": [ + "70" + ], + "cool_plate_temp": [ + "0" + ], + "cool_plate_temp_initial_layer": [ + "0" + ], + "during_print_exhaust_fan_speed": [ + "70" + ], + "eng_plate_temp": [ + "110" + ], + "eng_plate_temp_initial_layer": [ + "110" + ], + "fan_cooling_layer_time": [ + "30" + ], + "fan_max_speed": [ + "60" + ], + "fan_min_speed": [ + "10" + ], + "filament_cost": [ + "20" + ], + "filament_density": [ + "1.04" + ], + "filament_deretraction_speed": [ + "nil" + ], + "filament_diameter": [ + "1.75" + ], + "filament_flow_ratio": [ + "1" + ], + "filament_is_support": [ + "0" + ], + "filament_max_volumetric_speed": [ + "23.2" + ], + "filament_minimal_purge_on_wipe_tower": [ + "15" + ], + "filament_retract_before_wipe": [ + "nil" + ], + "filament_retract_restart_extra": [ + "nil" + ], + "filament_retract_when_changing_layer": [ + "nil" + ], + "filament_retraction_length": [ + "nil" + ], + "filament_retraction_minimum_travel": [ + "nil" + ], + "filament_retraction_speed": [ + "nil" + ], + "filament_settings_id": [ + "" + ], + "filament_soluble": [ + "0" + ], + "filament_type": [ + "PC" + ], + "filament_vendor": [ + "Generic" + ], + "filament_wipe": [ + "nil" + ], + "filament_wipe_distance": [ + "nil" + ], + "filament_z_hop": [ + "nil" + ], + "filament_z_hop_types": [ + "nil" + ], + "full_fan_speed_layer": [ + "0" + ], + "hot_plate_temp": [ + "110" + ], + "hot_plate_temp_initial_layer": [ + "110" + ], + "nozzle_temperature": [ + "280" + ], + "nozzle_temperature_initial_layer": [ + "270" + ], + "nozzle_temperature_range_low": [ + "260" + ], + "nozzle_temperature_range_high": [ + "290" + ], + "overhang_fan_speed": [ + "60" + ], + "overhang_fan_threshold": [ + "25%" + ], + "reduce_fan_stop_start_freq": [ + "1" + ], + "required_nozzle_HRC": [ + "3" + ], + "slow_down_for_layer_cooling": [ + "1" + ], + "slow_down_layer_time": [ + "2" + ], + "slow_down_min_speed": [ + "20" + ], + "temperature_vitrification": [ + "120" + ], + "textured_plate_temp": [ + "110" + ], + "textured_plate_temp_initial_layer": [ + "110" + ], + "compatible_printers": [], + "filament_start_gcode": [ + "; Filament gcode\n{if activate_air_filtration[current_extruder] && support_air_filtration}\nM106 P3 S{during_print_exhaust_fan_speed_num[current_extruder]} \n{endif}" + ], + "filament_end_gcode": [ + "; filament end gcode \nM106 P3 S0\n" + ] +} \ No newline at end of file diff --git a/resources/profiles/Template/filament/filament_pet_template.json b/resources/profiles/Template/filament/filament_pet_template.json new file mode 100644 index 0000000000..eeb7029909 --- /dev/null +++ b/resources/profiles/Template/filament/filament_pet_template.json @@ -0,0 +1,165 @@ +{ + "type": "filament", + "name": "Generic PET template", + "instantiation": "false", + "activate_air_filtration": [ + "0" + ], + "chamber_temperatures": [ + "0" + ], + "close_fan_the_first_x_layers": [ + "3" + ], + "complete_print_exhaust_fan_speed": [ + "70" + ], + "cool_plate_temp": [ + "60" + ], + "cool_plate_temp_initial_layer": [ + "60" + ], + "during_print_exhaust_fan_speed": [ + "70" + ], + "eng_plate_temp": [ + "0" + ], + "eng_plate_temp_initial_layer": [ + "0" + ], + "fan_cooling_layer_time": [ + "20" + ], + "fan_max_speed": [ + "100" + ], + "fan_min_speed": [ + "20" + ], + "filament_cost": [ + "30" + ], + "filament_density": [ + "1.27" + ], + "filament_deretraction_speed": [ + "nil" + ], + "filament_diameter": [ + "1.75" + ], + "filament_flow_ratio": [ + "1" + ], + "filament_is_support": [ + "0" + ], + "filament_max_volumetric_speed": [ + "25" + ], + "filament_minimal_purge_on_wipe_tower": [ + "15" + ], + "filament_retract_before_wipe": [ + "nil" + ], + "filament_retract_restart_extra": [ + "nil" + ], + "filament_retract_when_changing_layer": [ + "nil" + ], + "filament_retraction_length": [ + "nil" + ], + "filament_retraction_minimum_travel": [ + "nil" + ], + "filament_retraction_speed": [ + "nil" + ], + "filament_settings_id": [ + "" + ], + "filament_soluble": [ + "0" + ], + "filament_type": [ + "PETG" + ], + "filament_vendor": [ + "Generic" + ], + "filament_wipe": [ + "nil" + ], + "filament_wipe_distance": [ + "nil" + ], + "filament_z_hop": [ + "nil" + ], + "filament_z_hop_types": [ + "nil" + ], + "full_fan_speed_layer": [ + "0" + ], + "hot_plate_temp": [ + "80" + ], + "hot_plate_temp_initial_layer": [ + "80" + ], + "nozzle_temperature": [ + "255" + ], + "nozzle_temperature_initial_layer": [ + "255" + ], + "nozzle_temperature_range_high": [ + "260" + ], + "nozzle_temperature_range_low": [ + "220" + ], + "overhang_fan_speed": [ + "100" + ], + "overhang_fan_threshold": [ + "95%" + ], + "reduce_fan_stop_start_freq": [ + "1" + ], + "required_nozzle_HRC": [ + "3" + ], + "slow_down_for_layer_cooling": [ + "1" + ], + "slow_down_layer_time": [ + "8" + ], + "slow_down_min_speed": [ + "10" + ], + "temperature_vitrification": [ + "70" + ], + "textured_plate_temp": [ + "80" + ], + "textured_plate_temp_initial_layer": [ + "80" + ], + "compatible_printers": [], + "filament_start_gcode": [ + "; filament start gcode\n{if (bed_temperature[current_extruder] >45)||(bed_temperature_initial_layer[current_extruder] >45)}M106 P3 S180\n{elsif (bed_temperature[current_extruder] >50)||(bed_temperature_initial_layer[current_extruder] >50)}M106 P3 S255\n{endif};Prevent PLA from jamming\n\n{if activate_air_filtration[current_extruder] && support_air_filtration}\nM106 P3 S{during_print_exhaust_fan_speed_num[current_extruder]} \n{endif}" + ], + "filament_end_gcode": [ + "; filament end gcode \nM106 P3 S0\n" + ] +} \ No newline at end of file diff --git a/resources/profiles/Template/filament/filament_pla_template.json b/resources/profiles/Template/filament/filament_pla_template.json new file mode 100644 index 0000000000..e76db6615b --- /dev/null +++ b/resources/profiles/Template/filament/filament_pla_template.json @@ -0,0 +1,168 @@ +{ + "type": "filament", + "name": "Generic PLA template", + "instantiation": "false", + "activate_air_filtration": [ + "0" + ], + "additional_cooling_fan_speed": [ + "70" + ], + "chamber_temperatures": [ + "0" + ], + "close_fan_the_first_x_layers": [ + "1" + ], + "complete_print_exhaust_fan_speed": [ + "70" + ], + "cool_plate_temp": [ + "35" + ], + "cool_plate_temp_initial_layer": [ + "35" + ], + "during_print_exhaust_fan_speed": [ + "70" + ], + "eng_plate_temp": [ + "0" + ], + "eng_plate_temp_initial_layer": [ + "0" + ], + "fan_cooling_layer_time": [ + "100" + ], + "fan_max_speed": [ + "100" + ], + "fan_min_speed": [ + "100" + ], + "filament_cost": [ + "20" + ], + "filament_density": [ + "1.24" + ], + "filament_deretraction_speed": [ + "nil" + ], + "filament_diameter": [ + "1.75" + ], + "filament_flow_ratio": [ + "1" + ], + "filament_is_support": [ + "0" + ], + "filament_max_volumetric_speed": [ + "12" + ], + "filament_minimal_purge_on_wipe_tower": [ + "15" + ], + "filament_retract_before_wipe": [ + "nil" + ], + "filament_retract_restart_extra": [ + "nil" + ], + "filament_retract_when_changing_layer": [ + "nil" + ], + "filament_retraction_length": [ + "nil" + ], + "filament_retraction_minimum_travel": [ + "nil" + ], + "filament_retraction_speed": [ + "nil" + ], + "filament_settings_id": [ + "" + ], + "filament_soluble": [ + "0" + ], + "filament_type": [ + "PLA" + ], + "filament_vendor": [ + "Generic" + ], + "filament_wipe": [ + "nil" + ], + "filament_wipe_distance": [ + "nil" + ], + "filament_z_hop": [ + "nil" + ], + "filament_z_hop_types": [ + "nil" + ], + "full_fan_speed_layer": [ + "0" + ], + "hot_plate_temp": [ + "55" + ], + "hot_plate_temp_initial_layer": [ + "55" + ], + "nozzle_temperature": [ + "220" + ], + "nozzle_temperature_initial_layer": [ + "220" + ], + "nozzle_temperature_range_low": [ + "190" + ], + "nozzle_temperature_range_high": [ + "240" + ], + "overhang_fan_speed": [ + "100" + ], + "overhang_fan_threshold": [ + "50%" + ], + "reduce_fan_stop_start_freq": [ + "1" + ], + "required_nozzle_HRC": [ + "3" + ], + "slow_down_for_layer_cooling": [ + "1" + ], + "slow_down_layer_time": [ + "4" + ], + "slow_down_min_speed": [ + "20" + ], + "temperature_vitrification": [ + "55" + ], + "textured_plate_temp": [ + "55" + ], + "textured_plate_temp_initial_layer": [ + "55" + ], + "compatible_printers": [], + "filament_start_gcode": [ + "; filament start gcode\n{if (bed_temperature[current_extruder] >45)||(bed_temperature_initial_layer[current_extruder] >45)}M106 P3 S255\n{elsif(bed_temperature[current_extruder] >35)||(bed_temperature_initial_layer[current_extruder] >35)}M106 P3 S180\n{endif}\n\n{if activate_air_filtration[current_extruder] && support_air_filtration}\nM106 P3 S{during_print_exhaust_fan_speed_num[current_extruder]} \n{endif}" + ], + "filament_end_gcode": [ + "; filament end gcode \nM106 P3 S0\n" + ] +} \ No newline at end of file diff --git a/resources/profiles/Template/filament/filament_ppa_template.json b/resources/profiles/Template/filament/filament_ppa_template.json new file mode 100644 index 0000000000..bfff947b03 --- /dev/null +++ b/resources/profiles/Template/filament/filament_ppa_template.json @@ -0,0 +1,165 @@ +{ + "type": "filament", + "name": "Generic PPA template", + "instantiation": "false", + "activate_air_filtration": [ + "1" + ], + "chamber_temperatures": [ + "0" + ], + "close_fan_the_first_x_layers": [ + "3" + ], + "complete_print_exhaust_fan_speed": [ + "70" + ], + "cool_plate_temp": [ + "0" + ], + "cool_plate_temp_initial_layer": [ + "0" + ], + "during_print_exhaust_fan_speed": [ + "70" + ], + "eng_plate_temp": [ + "100" + ], + "eng_plate_temp_initial_layer": [ + "100" + ], + "fan_cooling_layer_time": [ + "5" + ], + "fan_max_speed": [ + "30" + ], + "fan_min_speed": [ + "10" + ], + "filament_cost": [ + "20" + ], + "filament_density": [ + "1.17" + ], + "filament_deretraction_speed": [ + "nil" + ], + "filament_diameter": [ + "1.75" + ], + "filament_flow_ratio": [ + "0.96" + ], + "filament_is_support": [ + "0" + ], + "filament_max_volumetric_speed": [ + "8" + ], + "filament_minimal_purge_on_wipe_tower": [ + "15" + ], + "filament_retract_before_wipe": [ + "nil" + ], + "filament_retract_restart_extra": [ + "nil" + ], + "filament_retract_when_changing_layer": [ + "nil" + ], + "filament_retraction_length": [ + "nil" + ], + "filament_retraction_minimum_travel": [ + "nil" + ], + "filament_retraction_speed": [ + "nil" + ], + "filament_settings_id": [ + "" + ], + "filament_soluble": [ + "0" + ], + "filament_type": [ + "PPA-CF" + ], + "filament_vendor": [ + "Bambu Lab" + ], + "filament_wipe": [ + "nil" + ], + "filament_wipe_distance": [ + "nil" + ], + "filament_z_hop": [ + "nil" + ], + "filament_z_hop_types": [ + "nil" + ], + "full_fan_speed_layer": [ + "0" + ], + "hot_plate_temp": [ + "100" + ], + "hot_plate_temp_initial_layer": [ + "100" + ], + "nozzle_temperature": [ + "290" + ], + "nozzle_temperature_initial_layer": [ + "290" + ], + "nozzle_temperature_range_high": [ + "320" + ], + "nozzle_temperature_range_low": [ + "280" + ], + "overhang_fan_speed": [ + "40" + ], + "overhang_fan_threshold": [ + "0%" + ], + "reduce_fan_stop_start_freq": [ + "0" + ], + "required_nozzle_HRC": [ + "40" + ], + "slow_down_for_layer_cooling": [ + "1" + ], + "slow_down_layer_time": [ + "2" + ], + "slow_down_min_speed": [ + "20" + ], + "temperature_vitrification": [ + "210" + ], + "textured_plate_temp": [ + "100" + ], + "textured_plate_temp_initial_layer": [ + "100" + ], + "compatible_printers": [], + "filament_start_gcode": [ + "; Filament gcode\n{if activate_air_filtration[current_extruder] && support_air_filtration}\nM106 P3 S{during_print_exhaust_fan_speed_num[current_extruder]} \n{endif}" + ], + "filament_end_gcode": [ + "; filament end gcode \nM106 P3 S0\n" + ] +} \ No newline at end of file diff --git a/resources/profiles/Template/filament/filament_pps_template.json b/resources/profiles/Template/filament/filament_pps_template.json new file mode 100644 index 0000000000..ef107613bf --- /dev/null +++ b/resources/profiles/Template/filament/filament_pps_template.json @@ -0,0 +1,165 @@ +{ + "type": "filament", + "name": "Generic PPS template", + "instantiation": "false", + "activate_air_filtration": [ + "0" + ], + "chamber_temperatures": [ + "60" + ], + "close_fan_the_first_x_layers": [ + "3" + ], + "complete_print_exhaust_fan_speed": [ + "70" + ], + "cool_plate_temp": [ + "0" + ], + "cool_plate_temp_initial_layer": [ + "0" + ], + "during_print_exhaust_fan_speed": [ + "70" + ], + "eng_plate_temp": [ + "110" + ], + "eng_plate_temp_initial_layer": [ + "110" + ], + "fan_cooling_layer_time": [ + "5" + ], + "fan_max_speed": [ + "50" + ], + "fan_min_speed": [ + "0" + ], + "filament_cost": [ + "0" + ], + "filament_density": [ + "1.36" + ], + "filament_deretraction_speed": [ + "nil" + ], + "filament_diameter": [ + "1.75" + ], + "filament_flow_ratio": [ + "0.96" + ], + "filament_is_support": [ + "0" + ], + "filament_max_volumetric_speed": [ + "4" + ], + "filament_minimal_purge_on_wipe_tower": [ + "15" + ], + "filament_retract_before_wipe": [ + "nil" + ], + "filament_retract_restart_extra": [ + "nil" + ], + "filament_retract_when_changing_layer": [ + "nil" + ], + "filament_retraction_length": [ + "nil" + ], + "filament_retraction_minimum_travel": [ + "nil" + ], + "filament_retraction_speed": [ + "nil" + ], + "filament_settings_id": [ + "" + ], + "filament_soluble": [ + "0" + ], + "filament_type": [ + "PPS" + ], + "filament_vendor": [ + "Generic" + ], + "filament_wipe": [ + "nil" + ], + "filament_wipe_distance": [ + "nil" + ], + "filament_z_hop": [ + "nil" + ], + "filament_z_hop_types": [ + "nil" + ], + "full_fan_speed_layer": [ + "0" + ], + "hot_plate_temp": [ + "110" + ], + "hot_plate_temp_initial_layer": [ + "110" + ], + "nozzle_temperature": [ + "320" + ], + "nozzle_temperature_initial_layer": [ + "320" + ], + "nozzle_temperature_range_high": [ + "340" + ], + "nozzle_temperature_range_low": [ + "300" + ], + "overhang_fan_speed": [ + "30" + ], + "overhang_fan_threshold": [ + "0%" + ], + "reduce_fan_stop_start_freq": [ + "0" + ], + "required_nozzle_HRC": [ + "3" + ], + "slow_down_for_layer_cooling": [ + "1" + ], + "slow_down_layer_time": [ + "2" + ], + "slow_down_min_speed": [ + "10" + ], + "temperature_vitrification": [ + "125" + ], + "textured_plate_temp": [ + "110" + ], + "textured_plate_temp_initial_layer": [ + "110" + ], + "compatible_printers": [], + "filament_start_gcode": [ + "; Filament gcode\n{if activate_air_filtration[current_extruder] && support_air_filtration}\nM106 P3 S{during_print_exhaust_fan_speed_num[current_extruder]} \n{endif}" + ], + "filament_end_gcode": [ + "; filament end gcode \nM106 P3 S0\n" + ] +} \ No newline at end of file diff --git a/resources/profiles/Template/filament/filament_pva_template.json b/resources/profiles/Template/filament/filament_pva_template.json new file mode 100644 index 0000000000..aab27ba0f8 --- /dev/null +++ b/resources/profiles/Template/filament/filament_pva_template.json @@ -0,0 +1,168 @@ +{ + "type": "filament", + "name": "Generic PVA template", + "instantiation": "false", + "activate_air_filtration": [ + "0" + ], + "additional_cooling_fan_speed": [ + "70" + ], + "chamber_temperatures": [ + "0" + ], + "close_fan_the_first_x_layers": [ + "1" + ], + "complete_print_exhaust_fan_speed": [ + "70" + ], + "cool_plate_temp": [ + "45" + ], + "cool_plate_temp_initial_layer": [ + "45" + ], + "during_print_exhaust_fan_speed": [ + "70" + ], + "eng_plate_temp": [ + "0" + ], + "eng_plate_temp_initial_layer": [ + "0" + ], + "fan_cooling_layer_time": [ + "100" + ], + "fan_max_speed": [ + "100" + ], + "fan_min_speed": [ + "100" + ], + "filament_cost": [ + "20" + ], + "filament_density": [ + "1.24" + ], + "filament_deretraction_speed": [ + "nil" + ], + "filament_diameter": [ + "1.75" + ], + "filament_flow_ratio": [ + "1" + ], + "filament_is_support": [ + "1" + ], + "filament_max_volumetric_speed": [ + "15" + ], + "filament_minimal_purge_on_wipe_tower": [ + "15" + ], + "filament_retract_before_wipe": [ + "nil" + ], + "filament_retract_restart_extra": [ + "nil" + ], + "filament_retract_when_changing_layer": [ + "nil" + ], + "filament_retraction_length": [ + "nil" + ], + "filament_retraction_minimum_travel": [ + "nil" + ], + "filament_retraction_speed": [ + "nil" + ], + "filament_settings_id": [ + "" + ], + "filament_soluble": [ + "1" + ], + "filament_type": [ + "PVA" + ], + "filament_vendor": [ + "Generic" + ], + "filament_wipe": [ + "nil" + ], + "filament_wipe_distance": [ + "nil" + ], + "filament_z_hop": [ + "nil" + ], + "filament_z_hop_types": [ + "nil" + ], + "full_fan_speed_layer": [ + "0" + ], + "hot_plate_temp": [ + "55" + ], + "hot_plate_temp_initial_layer": [ + "55" + ], + "nozzle_temperature": [ + "220" + ], + "nozzle_temperature_initial_layer": [ + "220" + ], + "nozzle_temperature_range_high": [ + "240" + ], + "nozzle_temperature_range_low": [ + "190" + ], + "overhang_fan_speed": [ + "100" + ], + "overhang_fan_threshold": [ + "50%" + ], + "reduce_fan_stop_start_freq": [ + "1" + ], + "required_nozzle_HRC": [ + "3" + ], + "slow_down_for_layer_cooling": [ + "1" + ], + "slow_down_layer_time": [ + "4" + ], + "slow_down_min_speed": [ + "50" + ], + "temperature_vitrification": [ + "55" + ], + "textured_plate_temp": [ + "55" + ], + "textured_plate_temp_initial_layer": [ + "55" + ], + "compatible_printers": [], + "filament_start_gcode": [ + "; filament start gcode\n{if (bed_temperature[current_extruder] >45)||(bed_temperature_initial_layer[current_extruder] >45)}M106 P3 S255\n{elsif(bed_temperature[current_extruder] >35)||(bed_temperature_initial_layer[current_extruder] >35)}M106 P3 S180\n{endif}\n\n{if activate_air_filtration[current_extruder] && support_air_filtration}\nM106 P3 S{during_print_exhaust_fan_speed_num[current_extruder]} \n{endif}" + ], + "filament_end_gcode": [ + "; filament end gcode \nM106 P3 S0\n" + ] +} \ No newline at end of file diff --git a/resources/profiles/Template/filament/filament_tpu_template.json b/resources/profiles/Template/filament/filament_tpu_template.json new file mode 100644 index 0000000000..5aedc3c87a --- /dev/null +++ b/resources/profiles/Template/filament/filament_tpu_template.json @@ -0,0 +1,168 @@ +{ + "type": "filament", + "name": "Generic TPU template", + "instantiation": "false", + "activate_air_filtration": [ + "0" + ], + "additional_cooling_fan_speed": [ + "70" + ], + "chamber_temperatures": [ + "0" + ], + "close_fan_the_first_x_layers": [ + "1" + ], + "complete_print_exhaust_fan_speed": [ + "70" + ], + "cool_plate_temp": [ + "30" + ], + "cool_plate_temp_initial_layer": [ + "30" + ], + "during_print_exhaust_fan_speed": [ + "70" + ], + "eng_plate_temp": [ + "30" + ], + "eng_plate_temp_initial_layer": [ + "30" + ], + "fan_cooling_layer_time": [ + "100" + ], + "fan_max_speed": [ + "100" + ], + "fan_min_speed": [ + "100" + ], + "filament_cost": [ + "20" + ], + "filament_density": [ + "1.24" + ], + "filament_deretraction_speed": [ + "nil" + ], + "filament_diameter": [ + "1.75" + ], + "filament_flow_ratio": [ + "1" + ], + "filament_is_support": [ + "0" + ], + "filament_max_volumetric_speed": [ + "15" + ], + "filament_minimal_purge_on_wipe_tower": [ + "15" + ], + "filament_retract_before_wipe": [ + "nil" + ], + "filament_retract_restart_extra": [ + "nil" + ], + "filament_retract_when_changing_layer": [ + "nil" + ], + "filament_retraction_length": [ + "0.4" + ], + "filament_retraction_minimum_travel": [ + "nil" + ], + "filament_retraction_speed": [ + "nil" + ], + "filament_settings_id": [ + "" + ], + "filament_soluble": [ + "0" + ], + "filament_type": [ + "TPU" + ], + "filament_vendor": [ + "Generic" + ], + "filament_wipe": [ + "nil" + ], + "filament_wipe_distance": [ + "nil" + ], + "filament_z_hop": [ + "nil" + ], + "filament_z_hop_types": [ + "nil" + ], + "full_fan_speed_layer": [ + "0" + ], + "hot_plate_temp": [ + "35" + ], + "hot_plate_temp_initial_layer": [ + "35" + ], + "nozzle_temperature": [ + "240" + ], + "nozzle_temperature_initial_layer": [ + "240" + ], + "nozzle_temperature_range_high": [ + "250" + ], + "nozzle_temperature_range_low": [ + "200" + ], + "overhang_fan_speed": [ + "100" + ], + "overhang_fan_threshold": [ + "95%" + ], + "reduce_fan_stop_start_freq": [ + "1" + ], + "required_nozzle_HRC": [ + "3" + ], + "slow_down_for_layer_cooling": [ + "1" + ], + "slow_down_layer_time": [ + "8" + ], + "slow_down_min_speed": [ + "10" + ], + "temperature_vitrification": [ + "35" + ], + "textured_plate_temp": [ + "35" + ], + "textured_plate_temp_initial_layer": [ + "35" + ], + "compatible_printers": [], + "filament_start_gcode": [ + "; filament start gcode\n{if (bed_temperature[current_extruder] >35)||(bed_temperature_initial_layer[current_extruder] >35)}M106 P3 S255\n{elsif(bed_temperature[current_extruder] >30)||(bed_temperature_initial_layer[current_extruder] >30)}M106 P3 S180\n{endif}\n\n{if activate_air_filtration[current_extruder] && support_air_filtration}\nM106 P3 S{during_print_exhaust_fan_speed_num[current_extruder]} \n{endif}" + ], + "filament_end_gcode": [ + "; filament end gcode \nM106 P3 S0\n" + ] +} \ No newline at end of file diff --git a/resources/profiles/Template/process/process_0.2_nozzle_template.json b/resources/profiles/Template/process/process_0.2_nozzle_template.json new file mode 100644 index 0000000000..2bad557c80 --- /dev/null +++ b/resources/profiles/Template/process/process_0.2_nozzle_template.json @@ -0,0 +1,109 @@ +{ + "type": "process", + "name": "process_0.2_nozzle_template", + "instantiation": "false", + "adaptive_layer_height": "0", + "bridge_flow": "1", + "bridge_speed": "50", + "brim_width": "5", + "bridge_no_support": "0", + "bottom_surface_pattern": "monotonic", + "bottom_shell_layers": "5", + "bottom_shell_thickness": "0", + "brim_object_gap": "0.1", + "compatible_printers_condition": "", + "default_acceleration": "10000", + "detect_overhang_wall": "1", + "detect_thin_wall": "0", + "draft_shield": "disabled", + "elefant_foot_compensation": "0", + "enable_support": "0", + "enable_prime_tower": "1", + "enable_arc_fitting": "1", + "filename_format": "{input_filename_base}_{filament_type[0]}_{print_time}.gcode", + "gap_infill_speed": "50", + "infill_direction": "45", + "initial_layer_line_width": "0.25", + "initial_layer_print_height": "0.1", + "initial_layer_speed": "40", + "infill_combination": "0", + "infill_wall_overlap": "15%", + "interface_shells": "0", + "inner_wall_line_width": "0.22", + "inner_wall_speed": "150", + "internal_solid_infill_line_width": "0.22", + "internal_solid_infill_speed": "150", + "internal_bridge_support_thickness": "0.8", + "initial_layer_acceleration": "500", + "ironing_flow": "10%", + "ironing_spacing": "0.15", + "ironing_speed": "30", + "ironing_type": "no ironing", + "initial_layer_infill_speed": "70", + "line_width": "0.22", + "layer_height": "0.1", + "minimum_sparse_infill_area": "15", + "max_travel_detour_distance": "0", + "outer_wall_line_width": "0.22", + "outer_wall_speed": "120", + "outer_wall_acceleration": "5000", + "overhang_1_4_speed": "0", + "overhang_2_4_speed": "50", + "overhang_3_4_speed": "30", + "overhang_4_4_speed": "10", + "only_one_wall_top": "1", + "print_sequence": "by layer", + "print_settings_id": "", + "prime_tower_width": "35", + "reduce_crossing_wall": "0", + "reduce_infill_retraction": "1", + "raft_layers": "0", + "resolution": "0.012", + "sparse_infill_density": "15%", + "sparse_infill_pattern": "grid", + "sparse_infill_line_width": "0.22", + "sparse_infill_speed": "100", + "seam_position": "aligned", + "skirt_distance": "2", + "skirt_height": "1", + "spiral_mode": "0", + "standby_temperature_delta": "-5", + "support_filament": "0", + "support_line_width": "0.22", + "support_interface_filament": "0", + "support_on_build_plate_only": "0", + "support_top_z_distance": "0.2", + "support_interface_loop_pattern": "0", + "support_interface_top_layers": "2", + "support_interface_spacing": "0.5", + "support_interface_speed": "80", + "support_interface_pattern": "auto", + "support_base_pattern": "default", + "support_base_pattern_spacing": "2.5", + "support_speed": "150", + "support_threshold_angle": "30", + "support_object_xy_distance": "0.35", + "skirt_loops": "0", + "support_type": "normal(auto)", + "support_style": "default", + "support_bottom_z_distance": "0.2", + "support_interface_bottom_layers": "2", + "support_expansion": "0", + "top_surface_line_width": "0.22", + "top_surface_speed": "150", + "travel_speed": "500", + "tree_support_branch_diameter": "2", + "tree_support_branch_angle": "45", + "tree_support_wall_count": "1", + "top_surface_pattern": "monotonicline", + "top_surface_acceleration": "2000", + "top_shell_layers": "7", + "top_shell_thickness": "0.8", + "wall_loops": "4", + "wall_infill_order": "inner wall/outer wall/infill", + "wipe_tower_no_sparse_layers": "0", + "wall_generator": "classic", + "xy_hole_compensation": "0", + "xy_contour_compensation": "0", + "compatible_printers": [] +} \ No newline at end of file diff --git a/resources/profiles/Template/process/process_0.4_nozzle_template.json b/resources/profiles/Template/process/process_0.4_nozzle_template.json new file mode 100644 index 0000000000..5ff1801aee --- /dev/null +++ b/resources/profiles/Template/process/process_0.4_nozzle_template.json @@ -0,0 +1,109 @@ +{ + "type": "process", + "name": "process_0.4_nozzle_template", + "instantiation": "false", + "adaptive_layer_height": "0", + "bridge_flow": "1", + "bridge_speed": "50", + "brim_width": "5", + "bridge_no_support": "0", + "bottom_surface_pattern": "monotonic", + "bottom_shell_layers": "3", + "bottom_shell_thickness": "0", + "brim_object_gap": "0.1", + "compatible_printers_condition": "", + "default_acceleration": "10000", + "detect_overhang_wall": "1", + "detect_thin_wall": "0", + "draft_shield": "disabled", + "elefant_foot_compensation": "0.15", + "enable_support": "0", + "enable_prime_tower": "1", + "enable_arc_fitting": "1", + "filename_format": "{input_filename_base}_{filament_type[0]}_{print_time}.gcode", + "gap_infill_speed": "250", + "infill_direction": "45", + "initial_layer_line_width": "0.5", + "initial_layer_print_height": "0.2", + "initial_layer_speed": "50", + "infill_combination": "0", + "infill_wall_overlap": "15%", + "interface_shells": "0", + "inner_wall_line_width": "0.45", + "inner_wall_speed": "300", + "internal_solid_infill_line_width": "0.42", + "internal_solid_infill_speed": "250", + "internal_bridge_support_thickness": "0.8", + "initial_layer_acceleration": "500", + "ironing_flow": "10%", + "ironing_spacing": "0.15", + "ironing_speed": "30", + "ironing_type": "no ironing", + "initial_layer_infill_speed": "105", + "line_width": "0.42", + "layer_height": "0.2", + "minimum_sparse_infill_area": "15", + "max_travel_detour_distance": "0", + "outer_wall_line_width": "0.42", + "outer_wall_speed": "200", + "outer_wall_acceleration": "5000", + "overhang_1_4_speed": "0", + "overhang_2_4_speed": "50", + "overhang_3_4_speed": "30", + "overhang_4_4_speed": "10", + "only_one_wall_top": "1", + "print_sequence": "by layer", + "print_settings_id": "", + "prime_tower_width": "35", + "reduce_crossing_wall": "0", + "reduce_infill_retraction": "1", + "raft_layers": "0", + "resolution": "0.012", + "sparse_infill_density": "15%", + "sparse_infill_pattern": "grid", + "sparse_infill_line_width": "0.45", + "sparse_infill_speed": "270", + "seam_position": "aligned", + "skirt_distance": "2", + "skirt_height": "1", + "spiral_mode": "0", + "standby_temperature_delta": "-5", + "support_filament": "0", + "support_line_width": "0.42", + "support_interface_filament": "0", + "support_on_build_plate_only": "0", + "support_top_z_distance": "0.2", + "support_interface_loop_pattern": "0", + "support_interface_top_layers": "2", + "support_interface_spacing": "0.5", + "support_interface_speed": "80", + "support_interface_pattern": "auto", + "support_base_pattern": "default", + "support_base_pattern_spacing": "2.5", + "support_speed": "150", + "support_threshold_angle": "30", + "support_object_xy_distance": "0.35", + "skirt_loops": "0", + "support_type": "normal(auto)", + "support_style": "default", + "support_bottom_z_distance": "0.2", + "support_interface_bottom_layers": "2", + "support_expansion": "0", + "top_surface_line_width": "0.42", + "top_surface_speed": "200", + "travel_speed": "500", + "tree_support_branch_diameter": "2", + "tree_support_branch_angle": "45", + "tree_support_wall_count": "1", + "top_surface_pattern": "monotonicline", + "top_surface_acceleration": "2000", + "top_shell_layers": "3", + "top_shell_thickness": "0.6", + "wall_loops": "2", + "wall_infill_order": "inner wall/outer wall/infill", + "wipe_tower_no_sparse_layers": "0", + "wall_generator": "classic", + "xy_hole_compensation": "0", + "xy_contour_compensation": "0", + "compatible_printers": [] +} \ No newline at end of file diff --git a/resources/profiles/Template/process/process_0.6_nozzle_template.json b/resources/profiles/Template/process/process_0.6_nozzle_template.json new file mode 100644 index 0000000000..d0ddf96a43 --- /dev/null +++ b/resources/profiles/Template/process/process_0.6_nozzle_template.json @@ -0,0 +1,109 @@ +{ + "type": "process", + "name": "process_0.6_nozzle_template", + "instantiation": "false", + "adaptive_layer_height": "0", + "bridge_flow": "1", + "bridge_speed": "30", + "brim_width": "5", + "bridge_no_support": "0", + "bottom_surface_pattern": "monotonic", + "bottom_shell_layers": "3", + "bottom_shell_thickness": "0", + "brim_object_gap": "0.1", + "compatible_printers_condition": "", + "default_acceleration": "10000", + "detect_overhang_wall": "1", + "detect_thin_wall": "0", + "draft_shield": "disabled", + "elefant_foot_compensation": "0", + "enable_support": "0", + "enable_prime_tower": "1", + "enable_arc_fitting": "1", + "filename_format": "{input_filename_base}_{filament_type[0]}_{print_time}.gcode", + "gap_infill_speed": "50", + "infill_direction": "45", + "initial_layer_line_width": "0.62", + "initial_layer_print_height": "0.3", + "initial_layer_speed": "35", + "infill_combination": "0", + "infill_wall_overlap": "15%", + "interface_shells": "0", + "inner_wall_line_width": "0.62", + "inner_wall_speed": "150", + "internal_solid_infill_line_width": "0.62", + "internal_solid_infill_speed": "150", + "internal_bridge_support_thickness": "0.8", + "initial_layer_acceleration": "500", + "ironing_flow": "10%", + "ironing_spacing": "0.15", + "ironing_speed": "30", + "ironing_type": "no ironing", + "initial_layer_infill_speed": "55", + "line_width": "0.62", + "layer_height": "0.3", + "minimum_sparse_infill_area": "15", + "max_travel_detour_distance": "0", + "outer_wall_line_width": "0.62", + "outer_wall_speed": "120", + "outer_wall_acceleration": "5000", + "overhang_1_4_speed": "0", + "overhang_2_4_speed": "50", + "overhang_3_4_speed": "15", + "overhang_4_4_speed": "10", + "only_one_wall_top": "1", + "print_sequence": "by layer", + "print_settings_id": "", + "prime_tower_width": "35", + "reduce_crossing_wall": "0", + "reduce_infill_retraction": "1", + "raft_layers": "0", + "resolution": "0.012", + "sparse_infill_density": "15%", + "sparse_infill_pattern": "grid", + "sparse_infill_line_width": "0.62", + "sparse_infill_speed": "100", + "seam_position": "aligned", + "skirt_distance": "2", + "skirt_height": "1", + "spiral_mode": "0", + "standby_temperature_delta": "-5", + "support_filament": "0", + "support_line_width": "0.62", + "support_interface_filament": "0", + "support_on_build_plate_only": "0", + "support_top_z_distance": "0.2", + "support_interface_loop_pattern": "0", + "support_interface_top_layers": "2", + "support_interface_spacing": "0.5", + "support_interface_speed": "80", + "support_interface_pattern": "auto", + "support_base_pattern": "default", + "support_base_pattern_spacing": "2.5", + "support_speed": "150", + "support_threshold_angle": "30", + "support_object_xy_distance": "0.35", + "skirt_loops": "0", + "support_type": "normal(auto)", + "support_style": "default", + "support_bottom_z_distance": "0.2", + "support_interface_bottom_layers": "2", + "support_expansion": "0", + "top_surface_line_width": "0.62", + "top_surface_speed": "150", + "travel_speed": "500", + "tree_support_branch_diameter": "2", + "tree_support_branch_angle": "45", + "tree_support_wall_count": "1", + "top_surface_pattern": "monotonicline", + "top_surface_acceleration": "2000", + "top_shell_layers": "3", + "top_shell_thickness": "0.8", + "wall_loops": "2", + "wall_infill_order": "inner wall/outer wall/infill", + "wipe_tower_no_sparse_layers": "0", + "wall_generator": "classic", + "xy_hole_compensation": "0", + "xy_contour_compensation": "0", + "compatible_printers": [] +} \ No newline at end of file diff --git a/resources/profiles/Template/process/process_0.8_nozzle_template.json b/resources/profiles/Template/process/process_0.8_nozzle_template.json new file mode 100644 index 0000000000..c83558c26e --- /dev/null +++ b/resources/profiles/Template/process/process_0.8_nozzle_template.json @@ -0,0 +1,109 @@ +{ + "type": "process", + "name": "process_0.8_nozzle_template", + "instantiation": "false", + "adaptive_layer_height": "0", + "bridge_flow": "1", + "bridge_speed": "30", + "brim_width": "5", + "bridge_no_support": "0", + "bottom_surface_pattern": "monotonic", + "bottom_shell_layers": "3", + "bottom_shell_thickness": "0", + "brim_object_gap": "0.1", + "compatible_printers_condition": "", + "default_acceleration": "10000", + "detect_overhang_wall": "1", + "detect_thin_wall": "0", + "draft_shield": "disabled", + "elefant_foot_compensation": "0", + "enable_support": "0", + "enable_prime_tower": "1", + "enable_arc_fitting": "1", + "filename_format": "{input_filename_base}_{filament_type[0]}_{print_time}.gcode", + "gap_infill_speed": "50", + "infill_direction": "45", + "initial_layer_line_width": "0.82", + "initial_layer_print_height": "0.4", + "initial_layer_speed": "35", + "infill_combination": "0", + "infill_wall_overlap": "15%", + "interface_shells": "0", + "inner_wall_line_width": "0.82", + "inner_wall_speed": "150", + "internal_solid_infill_line_width": "0.82", + "internal_solid_infill_speed": "150", + "internal_bridge_support_thickness": "0.8", + "initial_layer_acceleration": "500", + "ironing_flow": "10%", + "ironing_spacing": "0.15", + "ironing_speed": "30", + "ironing_type": "no ironing", + "initial_layer_infill_speed": "55", + "line_width": "0.82", + "layer_height": "0.4", + "minimum_sparse_infill_area": "15", + "max_travel_detour_distance": "0", + "outer_wall_line_width": "0.82", + "outer_wall_speed": "120", + "outer_wall_acceleration": "5000", + "overhang_1_4_speed": "0", + "overhang_2_4_speed": "50", + "overhang_3_4_speed": "25", + "overhang_4_4_speed": "5", + "only_one_wall_top": "1", + "print_sequence": "by layer", + "print_settings_id": "", + "prime_tower_width": "35", + "reduce_crossing_wall": "0", + "reduce_infill_retraction": "1", + "raft_layers": "0", + "resolution": "0.012", + "sparse_infill_density": "15%", + "sparse_infill_pattern": "grid", + "sparse_infill_line_width": "0.82", + "sparse_infill_speed": "100", + "seam_position": "aligned", + "skirt_distance": "2", + "skirt_height": "1", + "spiral_mode": "0", + "standby_temperature_delta": "-5", + "support_filament": "0", + "support_line_width": "0.82", + "support_interface_filament": "0", + "support_on_build_plate_only": "0", + "support_top_z_distance": "0.2", + "support_interface_loop_pattern": "0", + "support_interface_top_layers": "2", + "support_interface_spacing": "0.5", + "support_interface_speed": "80", + "support_interface_pattern": "auto", + "support_base_pattern": "default", + "support_base_pattern_spacing": "2.5", + "support_speed": "150", + "support_threshold_angle": "30", + "support_object_xy_distance": "0.35", + "skirt_loops": "0", + "support_type": "normal(auto)", + "support_style": "default", + "support_bottom_z_distance": "0.2", + "support_interface_bottom_layers": "2", + "support_expansion": "0", + "top_surface_line_width": "0.82", + "top_surface_speed": "150", + "travel_speed": "500", + "tree_support_branch_diameter": "2", + "tree_support_branch_angle": "45", + "tree_support_wall_count": "1", + "top_surface_pattern": "monotonic", + "top_surface_acceleration": "2000", + "top_shell_layers": "3", + "top_shell_thickness": "0.8", + "wall_loops": "2", + "wall_infill_order": "inner wall/outer wall/infill", + "wipe_tower_no_sparse_layers": "0", + "wall_generator": "classic", + "xy_hole_compensation": "0", + "xy_contour_compensation": "0", + "compatible_printers": [] +} \ No newline at end of file diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index a2a0dc9d37..ed14f6ad7f 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -2143,23 +2143,47 @@ bool PresetCollection::clone_presets_for_printer(std::vector con }, force_rewritten); } -bool PresetCollection::create_presets_from_template_for_printer(std::vector const &templates, std::vector &failures, std::string const &printer) +bool PresetCollection::create_presets_from_template_for_printer(std::vector const & templates, + std::vector & failures, + std::string const & printer, + std::function create_filament_id, + bool force_rewritten) { - return false; + return clone_presets(templates, failures, [printer, create_filament_id](Preset &preset, Preset::Type &type) { + preset.name = preset.name.substr(0, preset.name.find("@")) + " @" + printer; + auto *compatible_printers = dynamic_cast(preset.config.option("compatible_printers")); + compatible_printers->values = std::vector{ printer }; + preset.is_visible = true; + if (type == Preset::TYPE_FILAMENT) + preset.filament_id = create_filament_id(preset.name); + }, force_rewritten); } -bool PresetCollection::clone_presets_for_filament(std::vector const &presets, +bool PresetCollection::clone_presets_for_filament(Preset const * const &preset, std::vector & failures, std::string const & filament_name, std::string const & filament_id, const std::string & vendor_name, + const std::string & compatible_printers, bool force_rewritten) { - return clone_presets(presets, failures, [filament_name, filament_id, vendor_name](Preset &preset, Preset::Type &type) { - preset.name = filament_name + " " + preset.name.substr(preset.name.find_last_of('@')); - if (type == Preset::TYPE_FILAMENT) - preset.config.option("filament_vendor", true)->values[0] = vendor_name; - preset.filament_id = filament_id; + std::vector const presets = {preset}; + return clone_presets(presets, failures, [&filament_name, &filament_id, &vendor_name, &compatible_printers](Preset &preset, Preset::Type &type) { + preset.name = filament_name + " @" + compatible_printers; + if (type == Preset::TYPE_FILAMENT) { + auto filament_vendor = preset.config.option("filament_vendor", true); + if (filament_vendor->values.empty()) { + filament_vendor->values.push_back(vendor_name); + } else { + filament_vendor->values = {vendor_name}; + } + auto compatible_printers_option = preset.config.option("compatible_printers", true); + if (compatible_printers_option->values.empty()) { compatible_printers_option->values.push_back(compatible_printers); + } else { + compatible_printers_option->values = {compatible_printers}; + } + preset.filament_id = filament_id; + } }, force_rewritten); } diff --git a/src/libslic3r/Preset.hpp b/src/libslic3r/Preset.hpp index cb791d528a..0a979f59b4 100644 --- a/src/libslic3r/Preset.hpp +++ b/src/libslic3r/Preset.hpp @@ -20,6 +20,8 @@ #define PRESET_PRINTER_NAME "machine" #define PRESET_SLA_PRINT_NAME "sla_print" #define PRESET_SLA_MATERIALS_NAME "sla_materials" +#define PRESET_PROFILES_DIR "profiles" +#define PRESET_TEMPLATE_DIR "Template" //BBS: iot preset type strings #define PRESET_IOT_PRINTER_TYPE "printer" @@ -57,6 +59,9 @@ #define BBL_JSON_KEY_DEFAULT_MATERIALS "default_materials" #define BBL_JSON_KEY_MODEL_ID "model_id" +//BBL: json path + + namespace Slic3r { class AppConfig; @@ -452,8 +457,10 @@ public: bool clone_presets(std::vector const &presets, std::vector &failures, std::function modifier, bool force_rewritten = false); bool clone_presets_for_printer(std::vector const &presets, std::vector &failures, std::string const &printer, bool force_rewritten = false); - bool create_presets_from_template_for_printer(std::vector const &templates, std::vector &failures, std::string const &printer); - bool clone_presets_for_filament(std::vector const &presets, std::vector &failures, std::string const &filament_name, std::string const &filament_id, const std::string& vendor, bool force_rewritten = false); + bool create_presets_from_template_for_printer( + std::vector const &templates, std::vector &failures, std::string const &printer, std::function create_filament_id, bool force_rewritten = false); + bool clone_presets_for_filament(Preset const * const &preset, std::vector &failures, std::string const &filament_name, std::string const &filament_id, const std::string& vendor, + const std::string& compatible_printers, bool force_rewritten = false); std::map> get_filament_presets() const; diff --git a/src/libslic3r/PresetBundle.cpp b/src/libslic3r/PresetBundle.cpp index 6b4b218a28..ae177bcbe1 100644 --- a/src/libslic3r/PresetBundle.cpp +++ b/src/libslic3r/PresetBundle.cpp @@ -3270,7 +3270,7 @@ std::pair PresetBundle::load_vendor_configs_ } config = *default_config; config.apply(config_src); - if (instantiation == "false") { + if (instantiation == "false" && "Template" != vendor_name) { config_maps.emplace(preset_name, std::move(config)); if ((presets_collection->type() == Preset::TYPE_FILAMENT) && (!filament_id.empty())) filament_id_maps.emplace(preset_name, filament_id); @@ -3348,7 +3348,7 @@ std::pair PresetBundle::load_vendor_configs_ loaded.setting_id = setting_id; loaded.filament_id = filament_id; if (presets_collection->type() == Preset::TYPE_FILAMENT) { - if (filament_id.empty()) { + if (filament_id.empty() && "Template" != vendor_name) { BOOST_LOG_TRIVIAL(error) << __FUNCTION__<< ": can not find filament_id for " << preset_name; //throw ConfigurationError(format("can not find inherits %1% for %2%", inherits, preset_name)); reason = "Can not find filament_id for " + preset_name; diff --git a/src/slic3r/GUI/CreatePresetsDialog.cpp b/src/slic3r/GUI/CreatePresetsDialog.cpp index 6541cd428c..ab23431cca 100644 --- a/src/slic3r/GUI/CreatePresetsDialog.cpp +++ b/src/slic3r/GUI/CreatePresetsDialog.cpp @@ -120,6 +120,14 @@ static std::string get_curr_timestmp() return timestampString; } +static void get_filament_compatible_printer(Preset* preset, vector& printers) +{ + auto compatible_printers = dynamic_cast(preset->config.option("compatible_printers")); + for (const std::string &printer_name : compatible_printers->values) { + printers.push_back(printer_name); + } +} + static wxBoxSizer* create_checkbox(wxWindow* parent, Preset* preset, std::string& preset_name, std::vector>& preset_checkbox) { wxBoxSizer *sizer = new wxBoxSizer(wxHORIZONTAL); @@ -131,6 +139,17 @@ static wxBoxSizer* create_checkbox(wxWindow* parent, Preset* preset, std::string return sizer; } +static wxBoxSizer *create_checkbox(wxWindow *parent, std::string &compatible_printer, Preset* preset, std::unordered_map> &ptinter_compatible_filament_preset) +{ + wxBoxSizer *sizer = new wxBoxSizer(wxHORIZONTAL); + CheckBox * checkbox = new CheckBox(parent); + sizer->Add(checkbox, 0, 0, 0); + ptinter_compatible_filament_preset[checkbox] = std::make_pair(compatible_printer, preset); + wxStaticText *preset_name_str = new wxStaticText(parent, wxID_ANY, wxString::FromUTF8(compatible_printer)); + sizer->Add(preset_name_str, 0, wxLEFT, 5); + return sizer; +} + static wxBoxSizer *create_checkbox(wxWindow *parent, std::string &preset_name, std::vector> &preset_checkbox) { wxBoxSizer *sizer = new wxBoxSizer(wxHORIZONTAL); @@ -183,6 +202,28 @@ static std::string get_filament_name(std::string &preset_name) } } +static wxBoxSizer *create_preset_tree(wxWindow *parent, std::pair>> printer_and_preset) +{ + wxTreeCtrl *treeCtrl = new wxTreeCtrl(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTR_DEFAULT_STYLE | wxNO_BORDER); + wxColour backgroundColor = parent->GetBackgroundColour(); + treeCtrl->SetBackgroundColour(backgroundColor); + + wxString printer_name = wxString::FromUTF8(printer_and_preset.first); + wxTreeItemId rootId = treeCtrl->AddRoot(printer_name); + for (std::shared_ptr preset : printer_and_preset.second) { + wxString preset_name = wxString::FromUTF8(get_filament_name(preset->name)); + wxTreeItemId childId1 = treeCtrl->AppendItem(rootId, preset_name); + } + + treeCtrl->Expand(rootId); + wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL); + sizer->SetMinSize(wxSize(220,-1)); + treeCtrl->SetMaxSize(wxSize(-1, 60)); + sizer->Add(treeCtrl, 0, wxEXPAND | wxALL, 0); + + return sizer; +} + static std::string get_vendor_name(std::string& preset_name) { if (preset_name.empty()) return ""; @@ -197,9 +238,9 @@ static std::string get_vendor_name(std::string& preset_name) } static wxBoxSizer *create_select_filament_preset_checkbox(wxWindow * parent, - std::string & machine_name, + std::string & compatible_printer, std::vector presets, - std::unordered_map &machine_filament_preset) + std::unordered_map> &machine_filament_preset) { wxBoxSizer *horizontal_sizer = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer *checkbox_sizer = new wxBoxSizer(wxVERTICAL); @@ -207,18 +248,18 @@ static wxBoxSizer *create_select_filament_preset_checkbox(wxWindow * checkbox_sizer->Add(checkbox, 0, wxEXPAND | wxRIGHT, 5); wxBoxSizer *combobox_sizer = new wxBoxSizer(wxVERTICAL); - wxStaticText *machine_name_str = new wxStaticText(parent, wxID_ANY, wxString::FromUTF8(machine_name)); + wxStaticText *machine_name_str = new wxStaticText(parent, wxID_ANY, wxString::FromUTF8(compatible_printer)); ComboBox * combobox = new ComboBox(parent, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(200, 24), 0, nullptr, wxCB_READONLY); combobox->SetBackgroundColor(PRINTER_LIST_COLOUR); combobox->SetBorderColor(*wxWHITE); combobox->SetLabel(_L("Select filament preset")); - combobox->Bind(wxEVT_COMBOBOX, [combobox, checkbox, presets, &machine_filament_preset](wxCommandEvent &e) { + combobox->Bind(wxEVT_COMBOBOX, [combobox, checkbox, presets, &machine_filament_preset, &compatible_printer](wxCommandEvent &e) { combobox->SetLabelColor(*wxBLACK); wxString preset_name = combobox->GetStringSelection(); checkbox->SetValue(true); for (Preset *preset : presets) { if (preset_name == wxString::FromUTF8(preset->name)) { - machine_filament_preset[checkbox] = preset; + machine_filament_preset[checkbox] = std::make_pair(compatible_printer, preset); } } e.Skip(); @@ -308,12 +349,10 @@ static std::string get_filament_id(std::string vendor_typr_serial) if (have_same_filament_name) { break; } - else { + else { //Different names correspond to the same filament id user_filament_id = "P" + calculate_md5(vendor_typr_serial + get_curr_time()).substr(0, 7); } } - - return user_filament_id; } @@ -371,8 +410,8 @@ static char* read_json_file(const std::string &preset_path) return json_contents; } -CreateFilamentPresetDialog::CreateFilamentPresetDialog(wxWindow *parent, bool modify_filament) - : DPIDialog(parent ? parent : nullptr, wxID_ANY, _L("Creat Filament"), wxDefaultPosition, wxDefaultSize, wxCAPTION | wxCLOSE_BOX), m_modify_filament(modify_filament) +CreateFilamentPresetDialog::CreateFilamentPresetDialog(wxWindow *parent) + : DPIDialog(parent ? parent : nullptr, wxID_ANY, _L("Creat Filament"), wxDefaultPosition, wxDefaultSize, wxCAPTION | wxCLOSE_BOX) { m_create_type.base_filament = _L("Create based on current filamet"); @@ -469,7 +508,6 @@ wxBoxSizer *CreateFilamentPresetDialog::create_vendor_item() Layout(); Fit(); }); - m_filament_vendor_combobox->Enable(!m_modify_filament); horizontal_sizer->Add(comboBoxSizer, 0, wxEXPAND | wxALL | wxALIGN_CENTER_VERTICAL, FromDIP(10)); @@ -507,7 +545,6 @@ wxBoxSizer *CreateFilamentPresetDialog::create_type_item() m_filament_type_combobox->Set(filament_type); comboBoxSizer->Add(m_filament_type_combobox, 0, wxEXPAND | wxALL, 0); horizontal_sizer->Add(comboBoxSizer, 0, wxEXPAND | wxALL | wxALIGN_CENTER_VERTICAL, FromDIP(10)); - m_filament_type_combobox->Enable(!m_modify_filament); m_filament_type_combobox->Bind(wxEVT_COMBOBOX, [this](wxCommandEvent &e) { m_filament_type_combobox->SetLabelColor(*wxBLACK); @@ -551,7 +588,6 @@ wxBoxSizer *CreateFilamentPresetDialog::create_serial_item() } event.Skip(); }); - m_filament_serial_input->Enable(!m_modify_filament); wxStaticText *static_eg_text = new wxStaticText(this, wxID_ANY, _L("e.g. Basic, Matte, Silk, Marble"), wxDefaultPosition, wxDefaultSize); static_eg_text->SetForegroundColour(wxColour("#6B6B6B")); @@ -589,16 +625,19 @@ wxBoxSizer *CreateFilamentPresetDialog::create_filament_preset_item() m_filament_presets_sizer->Clear(true); m_filament_preset.clear(); if (iter != m_filament_choice_map.end()) { - for (Preset* preset : iter->second) { - std::string preset_name = preset->name; - size_t index_at = preset_name.find("@"); - if (std::string::npos != index_at) { - std::string machine_name = preset_name.substr(index_at + 1); - m_filament_presets_sizer->Add(create_checkbox(m_filament_preset_panel, preset, machine_name, m_filament_preset), 0, wxEXPAND | wxTOP | wxLEFT, FromDIP(5)); + for (Preset* preset : iter->second) { + auto compatible_printers = preset->config.option("compatible_printers", true); + if (compatible_printers->values.empty()) { + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << "there is a preset has no compatible printers and the preset name is: " << preset->name; + continue; + } + for (std::string &compatible_printer_name : compatible_printers->values) { + m_filament_presets_sizer->Add(create_checkbox(m_filament_preset_panel, compatible_printer_name, preset, m_filament_preset), 0, wxEXPAND | wxTOP | wxLEFT, FromDIP(5)); + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << "show compatible printer name: " << compatible_printer_name << "and preset name is: " << preset; } } } else { - + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << " not find filament id corresponding to the type: and the type is" << filament_type; } m_filament_preset_panel->Thaw(); @@ -708,92 +747,49 @@ wxBoxSizer *CreateFilamentPresetDialog::create_button_item() const wxString &curr_create_type = curr_create_filament_type(); PresetBundle * preset_bundle = wxGetApp().preset_bundle; - std::vector filament_presets; if (curr_create_type == m_create_type.base_filament) { BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ":clone filament create type filament "; - for (const std::pair &preset : m_filament_preset) { - if (preset.first->GetValue()) { - filament_presets.push_back(preset.second); - } - } - if (!filament_presets.empty()) { - std::vector failures; - bool res = preset_bundle->filaments.clone_presets_for_filament(filament_presets, failures, filament_preset_name, user_filament_id, vendor_name); - if (!res) { - std::string failure_names; - for (std::string &failure : failures) { - failure_names += failure + "\n"; - } - MessageDialog dlg(this, _L("Some existing presets have failed to be created, as follows:\n") + failure_names + _L("\nDo you want to rewrite it?"), - wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), wxYES_NO | wxYES_DEFAULT | wxCENTRE); - if (dlg.ShowModal() == wxID_YES) { - res = preset_bundle->filaments.clone_presets_for_filament(filament_presets, failures, filament_preset_name, user_filament_id, vendor_name, true); - BOOST_LOG_TRIVIAL(info) << "clone filament have failures rewritten is successful? "<< res; - } else { - std::vector temp_filament_presets; - for (const Preset* preset : filament_presets) { - for (const std::string &exist_name : failures) { - size_t index_at = preset->name.find_last_of('@'); - if (std::string::npos == index_at) continue; - if (exist_name == filament_preset_name + " " + preset->name.substr(index_at)) { - continue; - } - temp_filament_presets.push_back(preset); - } + for (const std::pair> &checkbox_preset : m_filament_preset) { + if (checkbox_preset.first->GetValue()) { + std::string compatible_printer_name = checkbox_preset.second.first; + std::vector failures; + Preset const *const checked_preset = checkbox_preset.second.second; + bool res = preset_bundle->filaments.clone_presets_for_filament(checked_preset, failures, filament_preset_name, user_filament_id, vendor_name, + compatible_printer_name); + if (!res) { + std::string failure_names; + for (std::string &failure : failures) { failure_names += failure + "\n"; } + MessageDialog dlg(this, _L("Some existing presets have failed to be created, as follows:\n") + failure_names + _L("\nDo you want to rewrite it?"), + wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), wxYES_NO | wxYES_DEFAULT | wxCENTRE); + if (dlg.ShowModal() == wxID_YES) { + res = preset_bundle->filaments.clone_presets_for_filament(checked_preset, failures, filament_preset_name, user_filament_id, vendor_name, + compatible_printer_name, true); + BOOST_LOG_TRIVIAL(info) << "clone filament have failures rewritten is successful? " << res; } - if (temp_filament_presets.empty()) return; - preset_bundle->filaments.clone_presets_for_filament(temp_filament_presets, failures, filament_preset_name, user_filament_id, vendor_name); - BOOST_LOG_TRIVIAL(info) << "clone filament have failures not rewritten is successful? " << res; } + BOOST_LOG_TRIVIAL(info) << "clone filament no failures is successful? " << res; } - BOOST_LOG_TRIVIAL(info) << "clone filament no failures is successful? " << res; - } else { - MessageDialog dlg(this, _L("You have not selected a filament preset, please choose."), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), - wxYES | wxYES_DEFAULT | wxCENTRE); - dlg.ShowModal(); - return; } } else if (curr_create_type == m_create_type.base_filament_preset) { BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ":clone filament presets create type filament preset"; - for (const std::pair &checkbox_preset : m_machint_filament_preset) { + for (const std::pair> &checkbox_preset : m_machint_filament_preset) { if (checkbox_preset.first->GetValue()) { - filament_presets.push_back(checkbox_preset.second); - } - } - if (!filament_presets.empty()) { - std::vector failures; - bool res = preset_bundle->filaments.clone_presets_for_filament(filament_presets, failures, filament_preset_name, user_filament_id, vendor_name); - if (!res) { - std::string failure_names; - for (std::string &failure : failures) { failure_names += failure + "\n"; } - MessageDialog dlg(this, _L("Some existing presets have failed to be created, as follows:\n") + failure_names + _L("\nDo you want to rewrite it?"), - wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), wxYES_NO | wxYES_DEFAULT | wxCENTRE); - if (wxID_YES == dlg.ShowModal()) { - res = preset_bundle->filaments.clone_presets_for_filament(filament_presets, failures, filament_preset_name, user_filament_id, vendor_name, true); - BOOST_LOG_TRIVIAL(info) << "clone filament presets have failures rewritten is successful? " << res; - } else { - std::vector temp_filament_presets; - for (const Preset *preset : filament_presets) { - for (const std::string &exist_name : failures) { - size_t index_at = preset->name.find_last_of('@'); - if (std::string::npos == index_at) continue; - if (exist_name == filament_preset_name + " " + preset->name.substr(index_at)) { - continue; - } - temp_filament_presets.push_back(preset); - } + std::string compatible_printer_name = checkbox_preset.second.first; + std::vector failures; + Preset const *const checked_preset = checkbox_preset.second.second; + bool res = preset_bundle->filaments.clone_presets_for_filament(checked_preset, failures, filament_preset_name, user_filament_id, vendor_name, compatible_printer_name); + if (!res) { + std::string failure_names; + for (std::string &failure : failures) { failure_names += failure + "\n"; } + MessageDialog dlg(this, _L("Some existing presets have failed to be created, as follows:\n") + failure_names + _L("\nDo you want to rewrite it?"), + wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), wxYES_NO | wxYES_DEFAULT | wxCENTRE); + if (wxID_YES == dlg.ShowModal()) { + res = preset_bundle->filaments.clone_presets_for_filament(checked_preset, failures, filament_preset_name, user_filament_id, vendor_name, compatible_printer_name, true); + BOOST_LOG_TRIVIAL(info) << "clone filament presets have failures rewritten is successful? " << res; } - if (temp_filament_presets.empty()) return; - preset_bundle->filaments.clone_presets_for_filament(temp_filament_presets, failures, filament_preset_name, user_filament_id, vendor_name); - BOOST_LOG_TRIVIAL(info) << "clone filament have failures not rewritten is successful? " << res; } + BOOST_LOG_TRIVIAL(info) << "clone filament presets no failures is successful? " << res; } - BOOST_LOG_TRIVIAL(info) << "clone filament presets no failures is successful? " << res; - } else { - MessageDialog dlg(this, _L("You have not selected a filament preset, please choose."), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), - wxYES | wxYES_DEFAULT | wxCENTRE); - dlg.ShowModal(); - return; } } @@ -845,6 +841,7 @@ wxArrayString CreateFilamentPresetDialog::get_filament_preset_choices() std::set preset_name_set; for (Preset* filament_preset : preset.second) { std::string preset_name = filament_preset->name; + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << " filament id: " << filament_preset->filament_id << " preset name: " << filament_preset->name; size_t index_at = preset_name.find("@"); if (std::string::npos != index_at) { std::string cur_preset_name = preset_name.substr(0, index_at - 1); @@ -852,6 +849,9 @@ wxArrayString CreateFilamentPresetDialog::get_filament_preset_choices() } } assert(1 == preset_name_set.size()); + if (preset_name_set.size() > 1) { + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << " the same filament has different filament(vendor type serial)"; + } for (const wxString& public_name : preset_name_set) { if (m_public_name_to_filament_id_map.find(public_name) != m_public_name_to_filament_id_map.end()) { suffix++; @@ -948,22 +948,23 @@ void CreateFilamentPresetDialog::get_filament_presets_by_machine() } std::unordered_map> machine_name_to_presets; - for (std::pair filament_preset : m_all_presets_map) { - std::string preset_name = filament_preset.first; - if (std::string::npos == preset_name.find(type_name)) continue; - size_t index_at = preset_name.find("@"); - if (std::string::npos == index_at) continue; - else { - std::string machine_name = get_machine_name(preset_name); - machine_name_to_presets[machine_name].push_back(filament_preset.second); + for (std::pair filament_preset : m_all_presets_map) { + Preset * preset = filament_preset.second; + auto compatible_printers = preset->config.option("compatible_printers", true); + if (compatible_printers->values.empty()) { + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << "there is a preset has no compatible printers and the preset name is: " << preset->name; + continue; + } + for (std::string &compatible_printer_name : compatible_printers->values) { + machine_name_to_presets[compatible_printer_name].push_back(preset); } } m_filament_preset_panel->Freeze(); for (std::pair> machine_filament_presets : machine_name_to_presets) { - std::string machine_name = machine_filament_presets.first; + std::string compatible_printer = machine_filament_presets.first; std::vector &presets = machine_filament_presets.second; - m_filament_presets_sizer->Add(create_select_filament_preset_checkbox(m_filament_preset_panel, machine_name, presets, m_machint_filament_preset), 0, wxEXPAND | wxALL, FromDIP(5)); + m_filament_presets_sizer->Add(create_select_filament_preset_checkbox(m_filament_preset_panel, compatible_printer, presets, m_machint_filament_preset), 0, wxEXPAND | wxALL, FromDIP(5)); } m_filament_preset_panel->Thaw(); } @@ -1015,9 +1016,10 @@ void CreateFilamentPresetDialog::clear_filament_preset_map() CreatePrinterPresetDialog::CreatePrinterPresetDialog(wxWindow *parent) : DPIDialog(parent ? parent : nullptr, wxID_ANY, _L("Create Printer/Nozzle"), wxDefaultPosition, wxDefaultSize, wxCAPTION | wxCLOSE_BOX) { - m_create_presets_type = {_L("Create from template"), _L("Create based on current printer")}; - m_create_printer_type = {_L("Create Printer"), _L("Create Nozzle for existing printer")}; - + m_create_type.create_printer = _L("Create Printer"); + m_create_type.create_nozzle = _L("Create Nozzle for existing printer"); + m_create_type.base_template = _L("Create from template"); + m_create_type.base_curr_printer = _L("Create based on current printer"); this->SetBackgroundColour(*wxWHITE); SetSizeHints(wxDefaultSize, wxDefaultSize); @@ -1138,8 +1140,8 @@ wxBoxSizer *CreatePrinterPresetDialog::create_type_item(wxWindow *parent) wxBoxSizer *radioBoxSizer = new wxBoxSizer(wxVERTICAL); - radioBoxSizer->Add(create_radio_item(m_create_printer_type[0], parent, wxEmptyString, m_create_type_btns), 0, wxEXPAND | wxALL, 0); - radioBoxSizer->Add(create_radio_item(m_create_printer_type[1], parent, wxEmptyString, m_create_type_btns), 0, wxEXPAND | wxTOP, FromDIP(10)); + radioBoxSizer->Add(create_radio_item(m_create_type.create_printer, parent, wxEmptyString, m_create_type_btns), 0, wxEXPAND | wxALL, 0); + radioBoxSizer->Add(create_radio_item(m_create_type.create_nozzle, parent, wxEmptyString, m_create_type_btns), 0, wxEXPAND | wxTOP, FromDIP(10)); horizontal_sizer->Add(radioBoxSizer, 0, wxEXPAND | wxALL | wxALIGN_CENTER_VERTICAL, FromDIP(10)); return horizontal_sizer; @@ -1546,6 +1548,116 @@ void CreatePrinterPresetDialog::load_model_stl() m_custom_model = file_name; } +bool CreatePrinterPresetDialog::load_system_and_user_presets_with_curr_model(PresetBundle &temp_preset_bundle, bool just_template) +{ + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << " is load template: "<< just_template; + std::string selected_vendor_id; + std::string curr_selected_model = into_u8(m_printer_model->GetStringSelection()); + int nozzle_index = curr_selected_model.find_first_of("@"); + std::string select_model = curr_selected_model.substr(0, nozzle_index - 1); + for (const Slic3r::VendorProfile::PrinterModel &model : m_printer_preset_vendor_selected.models) { + if (model.name == select_model) { + m_printer_preset_model_selected = model; + break; + } + } + if (m_printer_preset_vendor_selected.id.empty() || m_printer_preset_model_selected.id.empty()) { + BOOST_LOG_TRIVIAL(info) << "selected id is not find"; + MessageDialog dlg(this, _L("Preset path is not find, please reselect vendor."), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), wxYES_NO | wxYES_DEFAULT | wxCENTRE); + dlg.ShowModal(); + return false; + } + selected_vendor_id = m_printer_preset_vendor_selected.id; + + std::string preset_path; + if (boost::filesystem::exists(boost::filesystem::path(Slic3r::data_dir()) / PRESET_SYSTEM_DIR / selected_vendor_id)) { + preset_path = (boost::filesystem::path(Slic3r::data_dir()) / PRESET_SYSTEM_DIR).string(); + } else if (boost::filesystem::exists(boost::filesystem::path(Slic3r::resources_dir()) / "profiles" / selected_vendor_id)) { + preset_path = (boost::filesystem::path(Slic3r::resources_dir()) / "profiles").string(); + } + + if (preset_path.empty()) { + BOOST_LOG_TRIVIAL(info) << "Preset path is not find"; + MessageDialog dlg(this, _L("Preset path is not find, please reselect vendor."), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), wxYES_NO | wxYES_DEFAULT | wxCENTRE); + dlg.ShowModal(); + return false; + } + + try { + temp_preset_bundle.load_vendor_configs_from_json(preset_path, selected_vendor_id, PresetBundle::LoadConfigBundleAttribute::LoadSystem, + ForwardCompatibilitySubstitutionRule::EnableSilent); + } catch (...) { + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << "load vendor fonfigs form json failed"; + MessageDialog dlg(this, _L("The printer model was not found, please reselect."), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), wxYES_NO | wxYES_DEFAULT | wxCENTRE); + dlg.ShowModal(); + return false; + } + + if (!just_template) { + std::string dir_user_presets = wxGetApp().app_config->get("preset_folder"); + if (dir_user_presets.empty()) { + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << "default user presets path"; + temp_preset_bundle.load_user_presets(DEFAULT_USER_FOLDER_NAME, ForwardCompatibilitySubstitutionRule::EnableSilent); + } else { + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << "user presets path"; + temp_preset_bundle.load_user_presets(dir_user_presets, ForwardCompatibilitySubstitutionRule::EnableSilent); + } + } + + std::string model_varient = into_u8(m_printer_model->GetStringSelection()); + size_t index_at = model_varient.find(" @ "); + size_t index_nozzle = model_varient.find("nozzle"); + std::string varient; + if (index_at != std::string::npos && index_nozzle != std::string::npos) { + varient = model_varient.substr(index_at + 3, index_nozzle - index_at - 4); + } else { + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << "get nozzle failed"; + MessageDialog dlg(this, _L("The nozzle diameter is not fond, place reselect."), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), wxYES_NO | wxYES_DEFAULT | wxCENTRE); + dlg.ShowModal(); + return false; + } + + const Preset *temp_printer_preset = temp_preset_bundle.printers.find_system_preset_by_model_and_variant(m_printer_preset_model_selected.id, varient); + + if (temp_printer_preset) { + m_printer_preset = new Preset(*temp_printer_preset); + } else { + MessageDialog dlg(this, _L("The printer preset is not fond, place reselect."), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), wxYES_NO | wxYES_DEFAULT | wxCENTRE); + dlg.ShowModal(); + return false; + } + + if (!just_template) { + temp_preset_bundle.printers.select_preset_by_name(temp_printer_preset->name, true); + temp_preset_bundle.update_compatible(PresetSelectCompatibleType::Always); + } else { + selected_vendor_id = PRESET_TEMPLATE_DIR; + preset_path.clear(); + if (boost::filesystem::exists(boost::filesystem::path(Slic3r::resources_dir()) / PRESET_PROFILES_DIR / selected_vendor_id)) { + preset_path = (boost::filesystem::path(Slic3r::resources_dir()) / PRESET_PROFILES_DIR).string(); + } + if (preset_path.empty()) { + BOOST_LOG_TRIVIAL(info) << "Preset path is not find"; + MessageDialog dlg(this, _L("Preset path is not find, please reselect vendor."), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), + wxYES_NO | wxYES_DEFAULT | wxCENTRE); + dlg.ShowModal(); + return false; + } + try { + temp_preset_bundle.load_vendor_configs_from_json(preset_path, selected_vendor_id, PresetBundle::LoadConfigBundleAttribute::LoadSystem, + ForwardCompatibilitySubstitutionRule::EnableSilent); + } catch (...) { + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << "load vendor fonfigs form json failed"; + MessageDialog dlg(this, _L("The printer model was not found, please reselect."), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), + wxYES_NO | wxYES_DEFAULT | wxCENTRE); + dlg.ShowModal(); + return false; + } + } + + return true; +} + wxBoxSizer *CreatePrinterPresetDialog::create_radio_item(wxString title, wxWindow *parent, wxString tooltip, std::vector> &radiobox_list) { wxBoxSizer *horizontal_sizer = new wxBoxSizer(wxHORIZONTAL); @@ -1577,14 +1689,18 @@ void CreatePrinterPresetDialog::select_curr_radiobox(std::vectorSetValue(true); wxString curr_selected_type = radiobox_list[i].second; - if (curr_selected_type == m_create_presets_type[0]) { - m_filament_preset_template_sizer->Clear(true); - m_filament_preset.clear(); - m_process_preset_template_sizer->Clear(true); - m_process_preset.clear(); + if (curr_selected_type == m_create_type.base_template) { + if (m_printer_model->GetValue() == _L("Select model")) { + m_filament_preset_template_sizer->Clear(true); + m_filament_preset.clear(); + m_process_preset_template_sizer->Clear(true); + m_process_preset.clear(); + } else { + update_presets_list(true); + } m_page2->SetSizerAndFit(m_page2_sizer); - } else if (curr_selected_type == m_create_presets_type[1]) { - if (into_u8(m_printer_model->GetLabel()) == _L("Select model")) { + } else if (curr_selected_type == m_create_type.base_curr_printer) { + if (m_printer_model->GetValue() == _L("Select model")) { m_filament_preset_template_sizer->Clear(true); m_filament_preset.clear(); m_process_preset_template_sizer->Clear(true); @@ -1593,7 +1709,7 @@ void CreatePrinterPresetDialog::select_curr_radiobox(std::vectorSetSizerAndFit(m_page2_sizer); - } else if (curr_selected_type == m_create_printer_type[0]) { + } else if (curr_selected_type == m_create_type.create_printer) { m_select_printer->Hide(); m_select_vendor->Show(); m_select_model->Show(); @@ -1603,7 +1719,7 @@ void CreatePrinterPresetDialog::select_curr_radiobox(std::vectorShow(); } m_page1->SetSizerAndFit(m_page1_sizer); - } else if (curr_selected_type == m_create_printer_type[1]) { + } else if (curr_selected_type == m_create_type.create_nozzle) { m_select_vendor->Hide(); m_select_model->Hide(); m_can_not_find_vendor_combox->Hide(); @@ -1692,8 +1808,8 @@ wxBoxSizer *CreatePrinterPresetDialog::create_presets_item(wxWindow *parent) wxBoxSizer *radioBoxSizer = new wxBoxSizer(wxVERTICAL); - radioBoxSizer->Add(create_radio_item(m_create_presets_type[0], parent, wxEmptyString, m_create_presets_btns), 0, wxEXPAND | wxALL, 0); - radioBoxSizer->Add(create_radio_item(m_create_presets_type[1], parent, wxEmptyString, m_create_presets_btns), 0, wxEXPAND | wxTOP, FromDIP(10)); + radioBoxSizer->Add(create_radio_item(m_create_type.base_template, parent, wxEmptyString, m_create_presets_btns), 0, wxEXPAND | wxALL, 0); + radioBoxSizer->Add(create_radio_item(m_create_type.base_curr_printer, parent, wxEmptyString, m_create_presets_btns), 0, wxEXPAND | wxTOP, FromDIP(10)); horizontal_sizer->Add(radioBoxSizer, 0, wxEXPAND | wxALL | wxALIGN_CENTER_VERTICAL, FromDIP(10)); return horizontal_sizer; @@ -1810,89 +1926,114 @@ wxBoxSizer *CreatePrinterPresetDialog::create_page2_btns_item(wxWindow *parent) m_button_create->Bind(wxEVT_LEFT_DOWN, [this](wxMouseEvent &e) { PresetBundle *preset_bundle = wxGetApp().preset_bundle; - wxString curr_selected_printer_type = curr_create_printer_type(); - wxString curr_selected_preset_type = curr_create_preset_type(); - if (curr_selected_preset_type == m_create_presets_type[0]) { + const wxString curr_selected_printer_type = curr_create_printer_type(); + const wxString curr_selected_preset_type = curr_create_preset_type(); - } else if (curr_selected_printer_type == m_create_printer_type[0] && curr_selected_preset_type == m_create_presets_type[1]) {//create printer and based on printer - /****************************** clone printer preset ********************************/ - //create preset name - std::string printer_preset_name; - std::string nozzle_diameter = into_u8(m_nozzle_diameter->GetStringSelection()); - if (m_can_not_find_vendor_combox->GetValue()) { - std::string vendor_model = into_u8(m_custom_vendor_model->GetValue()); - if (vendor_model.empty()) { - MessageDialog dlg(this, _L("The custom printer and model are not inputed, place return page 1 to input."), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), + // Confirm if the printer preset exists + if (!m_printer_preset) { + MessageDialog dlg(this, _L("You have not yet chosen which printer preset to create based on. Please choose the vendor and model of the printer"), + wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), wxYES | wxYES_DEFAULT | wxCENTRE); + dlg.ShowModal(); + return; + show_page1(); + } + + // create preset name + std::string printer_preset_name; + std::string nozzle_diameter = into_u8(m_nozzle_diameter->GetStringSelection()); + if (m_can_not_find_vendor_combox->GetValue()) { + std::string vendor_model = into_u8(m_custom_vendor_model->GetValue()); + if (vendor_model.empty()) { + MessageDialog dlg(this, _L("The custom printer and model are not inputed, place return page 1 to input."), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), + wxYES | wxYES_DEFAULT | wxCENTRE); + dlg.ShowModal(); + show_page1(); + return; + } + printer_preset_name = vendor_model + " " + nozzle_diameter; + } else { + std::string vender_name = into_u8(m_select_vendor->GetStringSelection()); + std::string model_name = into_u8(m_select_model->GetStringSelection()); + printer_preset_name = vender_name + " " + model_name + " " + nozzle_diameter; + } + + // Confirm if the printer preset has a duplicate name + if (!rewritten && preset_bundle->printers.find_preset(printer_preset_name)) { + MessageDialog dlg(this, + _L("The preset you created already has a preset with the same name. Do you want to overwrite it?\n\tYes: Overwrite the printer preset with the " + "same name, and filament and process presets with the same preset name will not be recreated.\n\tCancel: Do not create a preset, return to the " + "creation interface."), + wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), wxYES | wxCANCEL | wxYES_DEFAULT | wxCENTRE); + int res = dlg.ShowModal(); + if (res == wxID_YES) { + rewritten = true; + } else { + return; + } + } + + // Confirm if the filament preset is exist + bool filament_preset_is_exist = false; + std::vector selected_filament_presets; + for (std::pair filament_preset : m_filament_preset) { + if (filament_preset.first->GetValue()) { selected_filament_presets.push_back(filament_preset.second); } + if (!filament_preset_is_exist && preset_bundle->filaments.find_preset(filament_preset.second->alias + " @ " + printer_preset_name) != nullptr) { + filament_preset_is_exist = true; + } + } + if (selected_filament_presets.empty() && !filament_preset_is_exist) { + MessageDialog dlg(this, _L("You need to select at least one filament preset."), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), wxYES | wxYES_DEFAULT | wxCENTRE); + dlg.ShowModal(); + return; + } + + // Confirm if the process preset is exist + bool process_preset_is_exist = false; + std::vector selected_process_presets; + for (std::pair process_preset : m_process_preset) { + if (process_preset.first->GetValue()) { selected_process_presets.push_back(process_preset.second); } + if (!process_preset_is_exist && preset_bundle->prints.find_preset(process_preset.second->alias + " @" + printer_preset_name) != nullptr) { + process_preset_is_exist = true; + } + } + if (selected_process_presets.empty() && !process_preset_is_exist) { + MessageDialog dlg(this, _L("You need to select at least one process preset."), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), wxYES | wxYES_DEFAULT | wxCENTRE); + dlg.ShowModal(); + return; + } + + if (curr_selected_printer_type == m_create_type.create_printer && curr_selected_preset_type == m_create_type.base_template) { + /****************************** clone filament preset ********************************/ + std::vector failures; + if (!selected_filament_presets.empty()) { + bool create_preset_result = preset_bundle->filaments.create_presets_from_template_for_printer(selected_filament_presets, failures, printer_preset_name, get_filament_id, rewritten); + if (!create_preset_result) { + std::string message; + for (const std::string &failure : failures) { message += "\t" + failure + "\n"; } + MessageDialog dlg(this, _L("Create filament presets failed. As follows:\n") + message, wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), wxYES | wxYES_DEFAULT | wxCENTRE); dlg.ShowModal(); - show_page1(); - return; - } - printer_preset_name = vendor_model + " " + nozzle_diameter; - } else { - std::string vender_name = into_u8(m_select_vendor->GetStringSelection()); - std::string model_name = into_u8(m_select_model->GetStringSelection()); - printer_preset_name = vender_name + " " + model_name + " " + nozzle_diameter; - } - //Confirm if the printer preset exists - if (!m_printer_preset) { - MessageDialog dlg(this, _L("You have not yet chosen which printer preset to create based on. Please choose the vendor and model of the printer"), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), - wxYES | wxYES_DEFAULT | wxCENTRE); - dlg.ShowModal(); - return; - show_page1(); - } - // Confirm if the printer preset has a duplicate name - if (!rewritten && preset_bundle->printers.find_preset(printer_preset_name)) { - MessageDialog dlg(this, - _L("The preset you created already has a preset with the same name. Do you want to overwrite it?\n\tYes: Overwrite the printer preset with the " - "same name, and filament and process presets with the same preset name will not be recreated.\n\tCancel: Do not create a preset, return to the creation interface."), - wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), wxYES | wxCANCEL | wxYES_DEFAULT | wxCENTRE); - int res = dlg.ShowModal(); - if (res == wxID_YES) { - rewritten = true; - } else { - return; } } - //Confirm if the filament preset is exist - bool filament_preset_is_exist = false; - std::vector selected_filament_presets; - for (std::pair filament_preset : m_filament_preset) { - if (filament_preset.first->GetValue()) { - selected_filament_presets.push_back(filament_preset.second); - } - if (!filament_preset_is_exist && preset_bundle->filaments.find_preset(filament_preset.second->alias + " @ " + printer_preset_name) != nullptr) { - filament_preset_is_exist = true; + /****************************** clone process preset ********************************/ + failures.clear(); + if (!selected_process_presets.empty()) { + bool create_preset_result = preset_bundle->prints.create_presets_from_template_for_printer(selected_process_presets, failures, printer_preset_name, get_filament_id, rewritten); + if (!create_preset_result) { + std::string message; + for (const std::string &failure : failures) { message += "\t" + failure + "\n"; } + MessageDialog dlg(this, _L("Create process presets failed. As follows:\n") + message, wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), + wxYES | wxYES_DEFAULT | wxCENTRE); + dlg.ShowModal(); } } - if (selected_filament_presets.empty() && !filament_preset_is_exist) { - MessageDialog dlg(this, _L("You need to select at least one filament preset."), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), - wxYES | wxYES_DEFAULT | wxCENTRE); - dlg.ShowModal(); - return; - } + save_printable_area_config(m_printer_preset); + preset_bundle->printers.save_current_preset(printer_preset_name, true, false, m_printer_preset); + preset_bundle->update_compatible(PresetSelectCompatibleType::Always); - // Confirm if the process preset is exist - bool process_preset_is_exist = false; - std::vector selected_process_presets; - for (std::pair process_preset : m_process_preset) { - if (process_preset.first->GetValue()) { - selected_process_presets.push_back(process_preset.second); - } - if (!process_preset_is_exist && preset_bundle->prints.find_preset(process_preset.second->alias + " @" + printer_preset_name) != nullptr) { - process_preset_is_exist = true; - } - } - if (selected_process_presets.empty() && !process_preset_is_exist) { - MessageDialog dlg(this, _L("You need to select at least one process preset."), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), - wxYES | wxYES_DEFAULT | wxCENTRE); - dlg.ShowModal(); - return; - } - - BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ":creater printer "; + } else if (curr_selected_printer_type == m_create_type.create_printer && curr_selected_preset_type == m_create_type.base_curr_printer) { // create printer and based on printer + /****************************** clone filament preset ********************************/ std::vector failures; if (!selected_filament_presets.empty()) { @@ -1921,6 +2062,9 @@ wxBoxSizer *CreatePrinterPresetDialog::create_page2_btns_item(wxWindow *parent) dlg.ShowModal(); } } + + /****************************** clone printer preset ********************************/ + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ":creater printer "; save_printable_area_config(m_printer_preset); preset_bundle->printers.save_current_preset(printer_preset_name, true, false, m_printer_preset); preset_bundle->update_compatible(PresetSelectCompatibleType::Always); @@ -2089,69 +2233,10 @@ void CreatePrinterPresetDialog::deselect_all_preset_template(std::vectorGetStringSelection()); - int nozzle_index = curr_selected_model.find_first_of("@"); - std::string select_model = curr_selected_model.substr(0, nozzle_index - 1); - for (const Slic3r::VendorProfile::PrinterModel &model : m_printer_preset_vendor_selected.models) { - if (model.name == select_model) { - m_printer_preset_model_selected = model; - break; - } - } - if (m_printer_preset_model_selected.id.empty()) return; - - PresetBundle temp_preset_bundle; - std::string preset_path; - if (boost::filesystem::exists(boost::filesystem::path(Slic3r::data_dir()) / PRESET_SYSTEM_DIR / m_printer_preset_vendor_selected.id)) { - preset_path = (boost::filesystem::path(Slic3r::data_dir()) / PRESET_SYSTEM_DIR).string(); - } else if (boost::filesystem::exists(boost::filesystem::path(Slic3r::resources_dir()) / "profiles" / m_printer_preset_vendor_selected.id)) { - preset_path = (boost::filesystem::path(Slic3r::resources_dir()) / "profiles").string(); - } - - if (preset_path.empty()) { - BOOST_LOG_TRIVIAL(info) << "Preset path is not find"; - MessageDialog dlg(this, _L("Preset path is not find, please reselect vendor."), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), wxYES_NO | wxYES_DEFAULT | wxCENTRE); - dlg.ShowModal(); - return; - } - temp_preset_bundle.load_vendor_configs_from_json(preset_path, m_printer_preset_vendor_selected.id, PresetBundle::LoadConfigBundleAttribute::LoadSystem, - ForwardCompatibilitySubstitutionRule::EnableSilent); - - std::string dir_user_presets = wxGetApp().app_config->get("preset_folder"); - if (dir_user_presets.empty()) { - temp_preset_bundle.load_user_presets(DEFAULT_USER_FOLDER_NAME, ForwardCompatibilitySubstitutionRule::EnableSilent); - } else { - temp_preset_bundle.load_user_presets(dir_user_presets, ForwardCompatibilitySubstitutionRule::EnableSilent); - } - - std::string model_varient = into_u8(m_printer_model->GetStringSelection()); - size_t index_at = model_varient.find(" @ "); - size_t index_nozzle = model_varient.find("nozzle"); - std::string varient; - if (index_at != std::string::npos && index_nozzle != std::string::npos) { - varient = model_varient.substr(index_at + 3, index_nozzle - index_at - 4); - } - else { - MessageDialog dlg(this, _L("The nozzle diameter is not fond, place reselect."), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), wxYES_NO | wxYES_DEFAULT | wxCENTRE); - dlg.ShowModal(); - return; - } - - const Preset* temp_printer_preset = temp_preset_bundle.printers.find_system_preset_by_model_and_variant(m_printer_preset_model_selected.id, varient); - - if (temp_printer_preset) { - temp_preset_bundle.printers.select_preset_by_name(temp_printer_preset->name, true); - m_printer_preset = new Preset(*temp_printer_preset); - } - else { - MessageDialog dlg(this, _L("The printer preset is not fond, place reselect."), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), wxYES_NO | wxYES_DEFAULT | wxCENTRE); - dlg.ShowModal(); - return; - } - - temp_preset_bundle.update_compatible(PresetSelectCompatibleType::Always); + PresetBundle temp_preset_bundle; + if (!load_system_and_user_presets_with_curr_model(temp_preset_bundle, just_template)) return; const std::deque &filament_presets = temp_preset_bundle.filaments.get_presets(); const std::deque &process_presets = temp_preset_bundle.prints.get_presets(); @@ -2173,6 +2258,7 @@ void CreatePrinterPresetDialog::update_presets_list() for (const Preset &process_preset : process_presets) { if (process_preset.is_compatible) { if (process_preset.name == "Default Setting") continue; + Preset *temp_process = new Preset(process_preset); std::string temp_process_name = wxString::FromUTF8(temp_process->name).ToStdString(); m_process_preset_template_sizer->Add(create_checkbox(m_process_preset_panel, temp_process, temp_process_name, m_process_preset), 0, wxEXPAND, FromDIP(5)); @@ -2281,7 +2367,7 @@ bool CreatePrinterPresetDialog::validate_input_valid() dlg.ShowModal(); return false; } - if (m_custom_texture.empty()) { + /*if (m_custom_texture.empty()) { MessageDialog dlg(this, _L("You have not upload bed texture."), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), wxYES | wxYES_DEFAULT | wxCENTRE); dlg.ShowModal(); @@ -2292,7 +2378,7 @@ bool CreatePrinterPresetDialog::validate_input_valid() wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), wxYES | wxYES_DEFAULT | wxCENTRE); dlg.ShowModal(); return false; - } + }*/ if (check_printable_area() == false) { MessageDialog dlg(this, _L("Please check bed shape input."), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), wxYES | wxYES_DEFAULT | wxCENTRE); dlg.ShowModal(); @@ -2307,10 +2393,10 @@ void CreatePrinterPresetDialog::on_preset_model_value_change(wxCommandEvent &e) if (m_printer_preset_vendor_selected.models.empty()) return; wxString curr_selected_preset_type = curr_create_preset_type(); - if (curr_selected_preset_type == m_create_presets_type[1]) { + if (curr_selected_preset_type == m_create_type.base_curr_printer) { update_presets_list(); - } else if (curr_selected_preset_type == m_create_presets_type[0]) { - clear_preset_combobox(); + } else if (curr_selected_preset_type == m_create_type.base_template) { + update_presets_list(true); } rewritten = false; @@ -2715,10 +2801,11 @@ ExportConfigsDialog::ExportCase ExportConfigsDialog::save_presets_to_zip(const s } for (std::pair config_path : config_paths) { - std::string preset_name = config_path.first; + std::string preset_name = into_u8(wxString::FromUTF8(config_path.first)); + std::string path = into_u8(wxString::FromUTF8(config_path.second)); // Add a file to the ZIP file - status = mz_zip_writer_add_file(&zip_archive, (preset_name).c_str(), config_path.second.c_str(), NULL, 0, MZ_DEFAULT_COMPRESSION); + status = mz_zip_writer_add_file(&zip_archive, (preset_name).c_str(), path.c_str(), NULL, 0, MZ_DEFAULT_COMPRESSION); // status = mz_zip_writer_add_mem(&zip_archive, ("printer/" + printer_preset->name + ".json").c_str(), json_contents, strlen(json_contents), MZ_DEFAULT_COMPRESSION); if (MZ_FALSE == status) { BOOST_LOG_TRIVIAL(info) << preset_name << " Filament preset failed to add file to ZIP archive"; @@ -2827,7 +2914,8 @@ ExportConfigsDialog::ExportCase ExportConfigsDialog::archive_preset_bundle_to_fi } // Add a file to the ZIP file - std::string printer_config_file_name = "printer/" + pronter_file_path.filename().string(); + std::string printer_config_file_name = into_u8(wxString::FromUTF8("printer/" + pronter_file_path.filename().string())); + status = mz_zip_writer_add_file(&zip_archive, printer_config_file_name.c_str(), preset_path.c_str(), NULL, 0, MZ_DEFAULT_COMPRESSION); //status = mz_zip_writer_add_mem(&zip_archive, ("printer/" + printer_preset->name + ".json").c_str(), json_contents, strlen(json_contents), MZ_DEFAULT_COMPRESSION); if (MZ_FALSE == status) { @@ -2849,7 +2937,7 @@ ExportConfigsDialog::ExportCase ExportConfigsDialog::archive_preset_bundle_to_fi continue; } - std::string filament_config_file_name = "filament/" + filament_file_path.filename().string(); + std::string filament_config_file_name = into_u8(wxString::FromUTF8("filament/" + filament_file_path.filename().string())); status = mz_zip_writer_add_file(&zip_archive, filament_config_file_name.c_str(), filament_preset_path.c_str(), NULL, 0, MZ_DEFAULT_COMPRESSION); if (MZ_FALSE == status) { BOOST_LOG_TRIVIAL(info) << preset->name << " Failed to add file to ZIP archive"; @@ -2871,7 +2959,7 @@ ExportConfigsDialog::ExportCase ExportConfigsDialog::archive_preset_bundle_to_fi continue; } - std::string process_config_file_name = "process/" + process_file_path.filename().string(); + std::string process_config_file_name = into_u8(wxString::FromUTF8("process/" + process_file_path.filename().string())); status = mz_zip_writer_add_file(&zip_archive, process_config_file_name.c_str(), process_preset_path.c_str(), NULL, 0, MZ_DEFAULT_COMPRESSION); if (MZ_FALSE == status) { BOOST_LOG_TRIVIAL(info) << preset->name << " Failed to add file to ZIP archive"; @@ -2955,7 +3043,7 @@ ExportConfigsDialog::ExportCase ExportConfigsDialog::archive_filament_bundle_to_ continue; } // Add a file to the ZIP file - std::string file_name = printer_vendor + "/" + filament_preset->name + ".json"; + std::string file_name = into_u8(wxString::FromUTF8(printer_vendor + "/" + filament_preset->name + ".json")); status = mz_zip_writer_add_file(&zip_archive, file_name.c_str(), preset_path.c_str(), NULL, 0, MZ_DEFAULT_COMPRESSION); // status = mz_zip_writer_add_mem(&zip_archive, ("printer/" + printer_preset->name + ".json").c_str(), json_contents, strlen(json_contents), MZ_DEFAULT_COMPRESSION); if (MZ_FALSE == status) { @@ -3240,4 +3328,491 @@ void ExportConfigsDialog::data_init() } } -}} //Slic3r \ No newline at end of file +EditFilamentPresetDialog::EditFilamentPresetDialog(wxWindow *parent, FilamentInfomation *filament_info) + : DPIDialog(parent ? parent : nullptr, wxID_ANY, _L("Edit Filament"), wxDefaultPosition, wxDefaultSize, wxCAPTION | wxCLOSE_BOX) + , m_filament_id("") + , m_filament_name("") + , m_vendor_name("") + , m_filament_type("") + , m_filament_serial("") +{ + this->SetBackgroundColour(*wxWHITE); + this->SetMinSize(wxSize(FromDIP(600), -1)); + + std::string icon_path = (boost::format("%1%/images/BambuStudioTitle.ico") % resources_dir()).str(); + SetIcon(wxIcon(encode_path(icon_path.c_str()), wxBITMAP_TYPE_ICO)); + + wxBoxSizer *main_sizer = new wxBoxSizer(wxVERTICAL); + // top line + auto m_line_top = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxSize(-1, 1), wxTAB_TRAVERSAL); + m_line_top->SetBackgroundColour(wxColour(0xA6, 0xa9, 0xAA)); + main_sizer->Add(m_line_top, 0, wxEXPAND, 0); + main_sizer->Add(0, 0, 0, wxTOP, FromDIP(5)); + + wxStaticText* basic_infomation = new wxStaticText(this, wxID_ANY, _L("Basic Information")); + basic_infomation->SetFont(Label::Head_16); + + main_sizer->Add(basic_infomation, 0, wxALL, FromDIP(10)); + m_filament_id = filament_info->filament_id; + //std::string filament_name = filament_info->filament_name; + bool get_filament_presets = get_same_filament_id_presets(m_filament_id); + // get filament vendor, type, serial, and name + if (get_filament_presets && !m_printer_compatible_presets.empty()) { + std::shared_ptr preset = m_printer_compatible_presets.begin()->second[0]; + m_filament_name = get_filament_name(preset->name); + auto vendor_names = dynamic_cast(preset->config.option("filament_vendor")); + if (vendor_names && !vendor_names->values.empty()) m_vendor_name = vendor_names->values[0]; + auto filament_types = dynamic_cast(preset->config.option("filament_type")); + if (filament_types && !filament_types->values.empty()) m_filament_type = filament_types->values[0]; + size_t index = m_filament_name.find(m_filament_type); + if (std::string::npos != index && index + m_filament_type.size() < m_filament_name.size()) { + m_filament_serial = m_filament_name.substr(index + m_filament_type.size()); + if (m_filament_serial.size() > 2 && m_filament_serial[0] == ' ') { + m_filament_serial = m_filament_serial.substr(1); + } + } + } + + main_sizer->Add(create_filament_basic_info(), 0, wxEXPAND | wxALL, 0); + + // divider line + auto line_divider = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxSize(-1, 1), wxTAB_TRAVERSAL); + line_divider->SetBackgroundColour(wxColour(0xA6, 0xa9, 0xAA)); + main_sizer->Add(line_divider, 0, wxEXPAND | wxLEFT | wxRIGHT, FromDIP(10)); + main_sizer->Add(0, 0, 0, wxTOP, FromDIP(5)); + + wxStaticText *presets_infomation = new wxStaticText(this, wxID_ANY, _L("Filament presets under this filament")); + presets_infomation->SetFont(Label::Head_16); + main_sizer->Add(presets_infomation, 0, wxLEFT | wxRIGHT, FromDIP(10)); + + main_sizer->Add(create_add_filament_btn(), 0, wxEXPAND | wxALL, 0); + main_sizer->Add(create_preset_tree_sizer(), 0, wxEXPAND | wxALL, 0); + main_sizer->Add(create_button_sizer(), 0, wxEXPAND | wxALL, 0); + + update_preset_tree(); + + this->SetSizer(main_sizer); + this->Layout(); + this->Fit(); + wxGetApp().UpdateDlgDarkUI(this); +} +EditFilamentPresetDialog::~EditFilamentPresetDialog() {} + +void EditFilamentPresetDialog::on_dpi_changed(const wxRect &suggested_rect) {} + +bool EditFilamentPresetDialog::get_same_filament_id_presets(std::string filament_id) +{ + PresetBundle *preset_bundle = wxGetApp().preset_bundle; + std::map> filament_presets = preset_bundle->filaments.get_filament_presets(); + std::map>::iterator iter = filament_presets.find(filament_id); + if (filament_presets.end() == iter) { + BOOST_LOG_TRIVIAL(info)<< __FUNCTION__ << " filament id: "<< filament_id; + return false; + } + m_printer_compatible_presets.clear(); + for (Preset const *preset : iter->second) { + std::shared_ptr new_preset = std::make_shared(*preset); + std::vector printers; + get_filament_compatible_printer(new_preset.get(), printers); + for (const std::string &printer_name : printers) { + m_printer_compatible_presets[printer_name].push_back(new_preset); + } + } + if (m_printer_compatible_presets.empty()) { + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << " no filament presets "; + return false; + } + + return true; +} + +void EditFilamentPresetDialog::update_preset_tree() +{ + this->Freeze(); + m_preset_tree_sizer->Clear(true); + for (std::pair>> printer_and_presets : m_printer_compatible_presets) { + m_preset_tree_sizer->Add(create_preset_tree(m_preset_tree_window, printer_and_presets)); + } + m_preset_tree_window->SetSizerAndFit(m_preset_tree_sizer); + this->Layout(); + this->Fit(); + this->Thaw(); +} + +wxBoxSizer *EditFilamentPresetDialog::create_filament_basic_info() +{ + wxBoxSizer *basic_info_sizer = new wxBoxSizer(wxVERTICAL); + + wxBoxSizer *vendor_sizer = new wxBoxSizer(wxHORIZONTAL); + wxBoxSizer *type_sizer = new wxBoxSizer(wxHORIZONTAL); + wxBoxSizer *serial_sizer = new wxBoxSizer(wxHORIZONTAL); + + //vendor + wxBoxSizer * vendor_key_sizer = new wxBoxSizer(wxVERTICAL); + wxStaticText *static_vendor_text = new wxStaticText(this, wxID_ANY, _L("Vendor"), wxDefaultPosition, wxDefaultSize); + vendor_key_sizer->Add(static_vendor_text, 0, wxEXPAND | wxALL, 0); + vendor_key_sizer->SetMinSize(OPTION_SIZE); + vendor_sizer->Add(vendor_key_sizer, 0, wxEXPAND | wxALL | wxALIGN_CENTER_VERTICAL, FromDIP(10)); + + wxBoxSizer *vendor_value_sizer = new wxBoxSizer(wxVERTICAL); + wxStaticText *vendor_text = new wxStaticText(this, wxID_ANY, m_vendor_name, wxDefaultPosition, wxDefaultSize); + vendor_value_sizer->Add(vendor_text, 0, wxEXPAND | wxALL, 0); + vendor_sizer->Add(vendor_value_sizer, 0, wxEXPAND | wxALL | wxALIGN_CENTER_VERTICAL, FromDIP(10)); + + //type + wxBoxSizer * type_key_sizer = new wxBoxSizer(wxVERTICAL); + wxStaticText *static_type_text = new wxStaticText(this, wxID_ANY, _L("Type"), wxDefaultPosition, wxDefaultSize); + type_key_sizer->Add(static_type_text, 0, wxEXPAND | wxALL, 0); + type_key_sizer->SetMinSize(OPTION_SIZE); + type_sizer->Add(type_key_sizer, 0, wxEXPAND | wxALL | wxALIGN_CENTER_VERTICAL, FromDIP(10)); + + wxBoxSizer * type_value_sizer = new wxBoxSizer(wxVERTICAL); + wxStaticText *type_text = new wxStaticText(this, wxID_ANY, m_filament_type, wxDefaultPosition, wxDefaultSize); + type_value_sizer->Add(type_text, 0, wxEXPAND | wxALL, 0); + type_sizer->Add(type_value_sizer, 0, wxEXPAND | wxALL | wxALIGN_CENTER_VERTICAL, FromDIP(10)); + + //serial + wxBoxSizer * serial_key_sizer = new wxBoxSizer(wxVERTICAL); + wxStaticText *static_serial_text = new wxStaticText(this, wxID_ANY, _L("Serial"), wxDefaultPosition, wxDefaultSize); + serial_key_sizer->Add(static_serial_text, 0, wxEXPAND | wxALL, 0); + serial_key_sizer->SetMinSize(OPTION_SIZE); + serial_sizer->Add(serial_key_sizer, 0, wxEXPAND | wxALL | wxALIGN_CENTER_VERTICAL, FromDIP(10)); + + wxBoxSizer * serial_value_sizer = new wxBoxSizer(wxVERTICAL); + wxStaticText *serial_text = new wxStaticText(this, wxID_ANY, m_filament_serial, wxDefaultPosition, wxDefaultSize); + serial_value_sizer->Add(serial_text, 0, wxEXPAND | wxALL, 0); + serial_sizer->Add(serial_value_sizer, 0, wxEXPAND | wxALL | wxALIGN_CENTER_VERTICAL, FromDIP(10)); + + basic_info_sizer->Add(vendor_sizer, 0, wxEXPAND | wxALL, 0); + basic_info_sizer->Add(type_sizer, 0, wxEXPAND | wxALL, 0); + basic_info_sizer->Add(serial_sizer, 0, wxEXPAND | wxALL, 0); + + return basic_info_sizer; +} + +wxBoxSizer *EditFilamentPresetDialog::create_add_filament_btn() +{ + wxBoxSizer *add_filament_btn_sizer = new wxBoxSizer(wxHORIZONTAL); + m_add_filament_btn = new Button(this, _L("+ Add Preset")); + m_add_filament_btn->SetFont(Label::Body_10); + m_add_filament_btn->SetPaddingSize(wxSize(FromDIP(8), FromDIP(3))); + m_add_filament_btn->SetCornerRadius(FromDIP(8)); + + StateColor flush_bg_col(std::pair(wxColour(219, 253, 231), StateColor::Pressed), std::pair(wxColour(238, 238, 238), StateColor::Hovered), + std::pair(wxColour(238, 238, 238), StateColor::Normal)); + + StateColor flush_fg_col(std::pair(wxColour(107, 107, 106), StateColor::Pressed), std::pair(wxColour(107, 107, 106), StateColor::Hovered), + std::pair(wxColour(107, 107, 106), StateColor::Normal)); + + StateColor flush_bd_col(std::pair(wxColour(0, 174, 66), StateColor::Pressed), std::pair(wxColour(0, 174, 66), StateColor::Hovered), + std::pair(wxColour(172, 172, 172), StateColor::Normal)); + + m_add_filament_btn->SetBackgroundColor(flush_bg_col); + m_add_filament_btn->SetBorderColor(flush_bd_col); + m_add_filament_btn->SetTextColor(flush_fg_col); + add_filament_btn_sizer->Add(m_add_filament_btn, 0, wxEXPAND | wxALL, FromDIP(10)); + + m_add_filament_btn->Bind(wxEVT_BUTTON, [this](wxCommandEvent &e) { + CreatePresetForPrinterDialog dlg(nullptr, m_filament_type, m_filament_id, m_vendor_name, m_filament_name); + int res = dlg.ShowModal(); + if (res == wxID_OK) { + if (get_same_filament_id_presets(m_filament_id)) { + update_preset_tree(); + } + } + }); + + return add_filament_btn_sizer; +} + +wxBoxSizer *EditFilamentPresetDialog::create_preset_tree_sizer() +{ + wxBoxSizer *filament_preset_tree_sizer = new wxBoxSizer(wxHORIZONTAL); + m_preset_tree_window = new wxScrolledWindow(this); + m_preset_tree_window->SetBackgroundColour(PRINTER_LIST_COLOUR); + m_preset_tree_window->SetMaxSize(wxSize(-1, FromDIP(500))); + m_preset_tree_sizer = new wxGridSizer(3, FromDIP(5), FromDIP(5)); + m_preset_tree_window->SetSizer(m_preset_tree_sizer); + filament_preset_tree_sizer->Add(m_preset_tree_window, 0, wxEXPAND | wxALL | wxALIGN_CENTER_VERTICAL, FromDIP(10)); + + return filament_preset_tree_sizer; +} + +wxBoxSizer *EditFilamentPresetDialog::create_button_sizer() +{ + wxBoxSizer *bSizer_button = new wxBoxSizer(wxHORIZONTAL); + + m_del_filament_btn = new Button(this, _L("Delete Filament")); + m_del_filament_btn->SetBackgroundColor(*wxRED); + m_del_filament_btn->SetBorderColor(*wxWHITE); + m_del_filament_btn->SetTextColor(wxColour(0xFFFFFE)); + m_del_filament_btn->SetFont(Label::Body_12); + m_del_filament_btn->SetSize(wxSize(FromDIP(58), FromDIP(24))); + m_del_filament_btn->SetMinSize(wxSize(FromDIP(58), FromDIP(24))); + m_del_filament_btn->SetCornerRadius(FromDIP(12)); + bSizer_button->Add(m_del_filament_btn, 0, wxLEFT | wxBOTTOM, FromDIP(10)); + + bSizer_button->Add(0, 0, 1, wxEXPAND, 0); + + StateColor btn_bg_green(std::pair(wxColour(27, 136, 68), StateColor::Pressed), std::pair(wxColour(61, 203, 115), StateColor::Hovered), + std::pair(wxColour(0, 174, 66), StateColor::Normal)); + + m_ok_btn = new Button(this, _L("OK")); + m_ok_btn->SetBackgroundColor(btn_bg_green); + m_ok_btn->SetBorderColor(*wxWHITE); + m_ok_btn->SetTextColor(wxColour(0xFFFFFE)); + m_ok_btn->SetFont(Label::Body_12); + m_ok_btn->SetSize(wxSize(FromDIP(58), FromDIP(24))); + m_ok_btn->SetMinSize(wxSize(FromDIP(58), FromDIP(24))); + m_ok_btn->SetCornerRadius(FromDIP(12)); + bSizer_button->Add(m_ok_btn, 0, wxRIGHT | wxBOTTOM, FromDIP(10)); + + StateColor btn_bg_white(std::pair(wxColour(206, 206, 206), StateColor::Pressed), std::pair(wxColour(238, 238, 238), StateColor::Hovered), + std::pair(*wxWHITE, StateColor::Normal)); + + m_cancel_btn = new Button(this, _L("Cancel")); + m_cancel_btn->SetBackgroundColor(btn_bg_white); + m_cancel_btn->SetBorderColor(wxColour(38, 46, 48)); + m_cancel_btn->SetFont(Label::Body_12); + m_cancel_btn->SetSize(wxSize(FromDIP(58), FromDIP(24))); + m_cancel_btn->SetMinSize(wxSize(FromDIP(58), FromDIP(24))); + m_cancel_btn->SetCornerRadius(FromDIP(12)); + bSizer_button->Add(m_cancel_btn, 0, wxRIGHT | wxBOTTOM, FromDIP(10)); + + m_del_filament_btn->Bind(wxEVT_BUTTON, ([this](wxCommandEvent &e) { + WarningDialog dlg(this, _L("Delete filament?\nDelete filament would deleted all the attatched filament presets"), _L("Delete filament"), wxYES | wxCANCEL | wxCANCEL_DEFAULT | wxCENTRE); + int res = dlg.ShowModal(); + if (wxID_YES == res) { + PresetBundle *preset_bundle = wxGetApp().preset_bundle; + for (std::pair>> printer_and_preset : m_printer_compatible_presets) { + for (std::shared_ptr preset : printer_and_preset.second) { + bool delete_result = preset_bundle->filaments.delete_preset(preset->name); + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << " filament name: " << preset->name << delete_result ? "delete successful" : "delete failed"; + } + } + m_printer_compatible_presets.clear(); + EndModal(wxID_OK); + } + e.Skip(); + })); + + m_ok_btn->Bind(wxEVT_LEFT_DOWN, [this](wxMouseEvent &e) { EndModal(wxID_OK); }); + m_cancel_btn->Bind(wxEVT_LEFT_DOWN, [this](wxMouseEvent &e) { EndModal(wxID_CANCEL); }); + + return bSizer_button; + +} + +CreatePresetForPrinterDialog::CreatePresetForPrinterDialog(wxWindow *parent, std::string filament_type, std::string filament_id, std::string filament_vendor, std::string filament_name) + : DPIDialog(parent ? parent : nullptr, wxID_ANY, _L("Add Preset"), wxDefaultPosition, wxDefaultSize, wxCAPTION | wxCLOSE_BOX) + , m_filament_id(filament_id) + , m_filament_name(filament_name) + , m_filament_vendor(filament_vendor) + , m_filament_type(filament_type) +{ + m_preset_bundle = std::make_shared(*(wxGetApp().preset_bundle)); + get_visible_printer_and_compatible_filament_presets(); + + this->SetBackgroundColour(*wxWHITE); + + std::string icon_path = (boost::format("%1%/images/BambuStudioTitle.ico") % resources_dir()).str(); + SetIcon(wxIcon(encode_path(icon_path.c_str()), wxBITMAP_TYPE_ICO)); + + wxBoxSizer *main_sizer = new wxBoxSizer(wxVERTICAL); + // top line + auto m_line_top = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxSize(-1, 1), wxTAB_TRAVERSAL); + m_line_top->SetBackgroundColour(wxColour(0xA6, 0xa9, 0xAA)); + main_sizer->Add(m_line_top, 0, wxEXPAND, 0); + main_sizer->Add(0, 0, 0, wxTOP, FromDIP(5)); + + wxStaticText *basic_infomation = new wxStaticText(this, wxID_ANY, _L("Add preset for new printer")); + basic_infomation->SetFont(Label::Head_16); + main_sizer->Add(basic_infomation, 0, wxALL, FromDIP(10)); + + main_sizer->Add(create_selected_printer_preset_sizer(), 0, wxALL, FromDIP(10)); + main_sizer->Add(create_selected_filament_preset_sizer(), 0, wxALL, FromDIP(10)); + main_sizer->Add(create_button_sizer(), 0, wxALL, FromDIP(10)); + + this->SetSizer(main_sizer); + this->Layout(); + this->Fit(); + wxGetApp().UpdateDlgDarkUI(this); +} + +CreatePresetForPrinterDialog::~CreatePresetForPrinterDialog() {} + +void CreatePresetForPrinterDialog::on_dpi_changed(const wxRect &suggested_rect) {} + +void CreatePresetForPrinterDialog::get_visible_printer_and_compatible_filament_presets() +{ + const std::deque &printer_presets = m_preset_bundle->printers.get_presets(); + m_printer_compatible_filament_presets.clear(); + for (const Preset &printer_preset : printer_presets) { + if (printer_preset.is_visible) { + if (m_preset_bundle->printers.select_preset_by_name(printer_preset.name, false)) { + m_preset_bundle->update_compatible(PresetSelectCompatibleType::Always); + const std::deque &filament_presets = m_preset_bundle->filaments.get_presets(); + for (const Preset &filament_preset : filament_presets) { + if ("Default Filament" == filament_preset.name) continue; + auto filament_types = dynamic_cast(const_cast(&filament_preset)->config.option("filament_type")); + if (filament_types && filament_types->values.empty()) continue; + const std::string filament_type = filament_types->values[0]; + if (filament_type != m_filament_type) continue; + if (filament_preset.is_compatible) { + m_printer_compatible_filament_presets[std::make_shared(printer_preset)].push_back(std::make_shared(filament_preset)); + } + } + } + } + } +} + +wxBoxSizer *CreatePresetForPrinterDialog::create_selected_printer_preset_sizer() +{ + wxBoxSizer *select_preseter_preset_sizer = new wxBoxSizer(wxVERTICAL); + wxStaticText *printer_text = new wxStaticText(this, wxID_ANY, _L("Printer"), wxDefaultPosition, wxDefaultSize); + select_preseter_preset_sizer->Add(printer_text, 0, wxEXPAND | wxALL, 0); + m_selected_printer = new ComboBox(this, wxID_ANY, wxEmptyString, wxDefaultPosition, PRINTER_PRESET_MODEL_SIZE, 0, nullptr, wxCB_READONLY); + select_preseter_preset_sizer->Add(m_selected_printer, 0, wxEXPAND | wxTOP, FromDIP(5)); + wxArrayString printer_choices; + for (std::pair, std::vector>> printer_to_filament_presets : m_printer_compatible_filament_presets) { + std::shared_ptr printer_preset = printer_to_filament_presets.first; + auto compatible_printer_name = printer_preset->name; + if (compatible_printer_name.empty()) { + BOOST_LOG_TRIVIAL(info)<<__FUNCTION__ << " a printer has no name and the preset name is: " << printer_preset->name; + continue; + } + wxString printer_name = wxString::FromUTF8(compatible_printer_name); + printer_choice_to_printer_preset[printer_name] = printer_preset; + printer_choices.push_back(printer_name); + } + m_selected_printer->Set(printer_choices); + + + return select_preseter_preset_sizer; +} + +wxBoxSizer *CreatePresetForPrinterDialog::create_selected_filament_preset_sizer() +{ + wxBoxSizer * select_filament_preset_sizer = new wxBoxSizer(wxVERTICAL); + wxStaticText *printer_text = new wxStaticText(this, wxID_ANY, _L("Copy preset from filament"), wxDefaultPosition, wxDefaultSize); + select_filament_preset_sizer->Add(printer_text, 0, wxEXPAND | wxALL, 0); + m_selected_filament = new ComboBox(this, wxID_ANY, wxEmptyString, wxDefaultPosition, PRINTER_PRESET_MODEL_SIZE, 0, nullptr, wxCB_READONLY); + select_filament_preset_sizer->Add(m_selected_filament, 0, wxEXPAND | wxTOP, FromDIP(5)); + + m_selected_printer->Bind(wxEVT_COMBOBOX, [this](wxCommandEvent &e) { + wxString printer_name = m_selected_printer->GetStringSelection(); + std::unordered_map>::iterator iter = printer_choice_to_printer_preset.find(printer_name); + if (printer_choice_to_printer_preset.end() != iter) { + std::unordered_map, std::vector>>::iterator filament_iter = m_printer_compatible_filament_presets.find(iter->second); + if (m_printer_compatible_filament_presets.end() != filament_iter) { + filament_choice_to_filament_preset.clear(); + wxArrayString filament_choices; + for (std::shared_ptr filament_preset : filament_iter->second) { + wxString filament_name = wxString::FromUTF8(filament_preset->name); + filament_choice_to_filament_preset[filament_name] = filament_preset; + filament_choices.push_back(filament_name); + } + m_selected_filament->Set(filament_choices); + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << " count of compatible filament presets :" << filament_choices.size(); + if (filament_choices.size()) { + m_selected_filament->SetSelection(0); + } + } else { + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << "printer preset not find compatible filament presets"; + } + } else { + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << "printer choice not find printer preset"; + } + }); + + return select_filament_preset_sizer; +} + +wxBoxSizer *CreatePresetForPrinterDialog::create_button_sizer() +{ + wxBoxSizer *bSizer_button = new wxBoxSizer(wxHORIZONTAL); + + bSizer_button->Add(0, 0, 1, wxEXPAND, 0); + + StateColor btn_bg_green(std::pair(wxColour(27, 136, 68), StateColor::Pressed), std::pair(wxColour(61, 203, 115), StateColor::Hovered), + std::pair(wxColour(0, 174, 66), StateColor::Normal)); + + m_ok_btn = new Button(this, _L("OK")); + m_ok_btn->SetBackgroundColor(btn_bg_green); + m_ok_btn->SetBorderColor(*wxWHITE); + m_ok_btn->SetTextColor(wxColour(0xFFFFFE)); + m_ok_btn->SetFont(Label::Body_12); + m_ok_btn->SetSize(wxSize(FromDIP(58), FromDIP(24))); + m_ok_btn->SetMinSize(wxSize(FromDIP(58), FromDIP(24))); + m_ok_btn->SetCornerRadius(FromDIP(12)); + bSizer_button->Add(m_ok_btn, 0, wxRIGHT | wxBOTTOM, FromDIP(10)); + + StateColor btn_bg_white(std::pair(wxColour(206, 206, 206), StateColor::Pressed), std::pair(wxColour(238, 238, 238), StateColor::Hovered), + std::pair(*wxWHITE, StateColor::Normal)); + + m_cancel_btn = new Button(this, _L("Cancel")); + m_cancel_btn->SetBackgroundColor(btn_bg_white); + m_cancel_btn->SetBorderColor(wxColour(38, 46, 48)); + m_cancel_btn->SetFont(Label::Body_12); + m_cancel_btn->SetSize(wxSize(FromDIP(58), FromDIP(24))); + m_cancel_btn->SetMinSize(wxSize(FromDIP(58), FromDIP(24))); + m_cancel_btn->SetCornerRadius(FromDIP(12)); + bSizer_button->Add(m_cancel_btn, 0, wxRIGHT | wxBOTTOM, FromDIP(10)); + + m_ok_btn->Bind(wxEVT_BUTTON, [this](wxCommandEvent &e) { + wxString selected_printer_name = m_selected_printer->GetStringSelection(); + std::shared_ptr printer_preset = printer_choice_to_printer_preset[selected_printer_name]; + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << " add preset: get compatible printer name:"; + + auto compatible_printer_name = printer_preset->name; + if (compatible_printer_name.empty()) { + BOOST_LOG_TRIVIAL(info) << " add preset: selected printer has no name"; + MessageDialog dlg(this, _L("The printer preset you selected does not have a name, please reselect it"), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), wxYES | wxYES_DEFAULT | wxCENTRE); + dlg.ShowModal(); + return; + } + std::string printer_name = compatible_printer_name; + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << " add preset: get compatible printer name:"; + wxString filament_preset_name = m_selected_filament->GetStringSelection(); + std::unordered_map>::iterator iter = filament_choice_to_filament_preset.find(filament_preset_name); + if (filament_choice_to_filament_preset.end() != iter) { + std::shared_ptr filament_preset = iter->second; + PresetBundle * preset_bundle = wxGetApp().preset_bundle; + std::vector failures; + bool res = preset_bundle->filaments.clone_presets_for_filament(filament_preset.get(), failures, m_filament_name, m_filament_id, m_filament_vendor, printer_name); + if (!res) { + std::string failure_names; + for (std::string &failure : failures) { failure_names += failure + "\n"; } + MessageDialog dlg(this, _L("Some existing presets have failed to be created, as follows:\n") + failure_names + _L("\nDo you want to rewrite it?"), + wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), wxYES_NO | wxYES_DEFAULT | wxCENTRE); + if (dlg.ShowModal() == wxID_YES) { + res = preset_bundle->filaments.clone_presets_for_filament(filament_preset.get(), failures, m_filament_name, m_filament_id, m_filament_vendor, printer_name, + true); + BOOST_LOG_TRIVIAL(info) << "clone filament have failures rewritten is successful? " << res; + } else { + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << "have same name preset and not rewritten"; + return; + } + } else { + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << "create filament preset successful and name is:" << m_filament_name + " @" + printer_name; + } + + } else { + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << "filament choice not find filament preset and choice is:" << filament_preset_name; + MessageDialog dlg(this, _L("The filament choice not find filament preset, please reselect it"), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), + wxYES | wxYES_DEFAULT | wxCENTRE); + dlg.ShowModal(); + return; + } + + EndModal(wxID_OK); + }); + m_cancel_btn->Bind(wxEVT_BUTTON, [this](wxCommandEvent &e) { EndModal(wxID_CANCEL); }); + + return bSizer_button; +} + +} // namespace GUI + +} // namespace Slic3r \ No newline at end of file diff --git a/src/slic3r/GUI/CreatePresetsDialog.hpp b/src/slic3r/GUI/CreatePresetsDialog.hpp index 0e7a847aef..8bdddb3fa8 100644 --- a/src/slic3r/GUI/CreatePresetsDialog.hpp +++ b/src/slic3r/GUI/CreatePresetsDialog.hpp @@ -15,10 +15,17 @@ namespace Slic3r { namespace GUI { +class FilamentInfomation : public wxObject +{ +public: + std::string filament_id; + std::string filament_name; +}; + class CreateFilamentPresetDialog : public DPIDialog { public: - CreateFilamentPresetDialog(wxWindow *parent, bool modify_filament = false); + CreateFilamentPresetDialog(wxWindow *parent); ~CreateFilamentPresetDialog(); protected: @@ -58,24 +65,23 @@ private: }; private: - std::vector> m_create_type_btns; - std::vector> m_filament_preset; - std::unordered_map m_machint_filament_preset; - std::unordered_map> m_filament_choice_map; - std::unordered_map m_public_name_to_filament_id_map; - std::unordered_map m_all_presets_map; - bool m_modify_filament; - CreateType m_create_type; - Button * m_button_create = nullptr; - Button * m_button_cancel = nullptr; - ComboBox * m_filament_vendor_combobox = nullptr; - ComboBox * m_filament_type_combobox = nullptr; - ComboBox * m_exist_vendor_combobox = nullptr; - ComboBox * m_filament_preset_combobox = nullptr; - TextInput * m_filament_custom_vendor_input = nullptr; - wxGridSizer * m_filament_presets_sizer = nullptr; - wxPanel * m_filament_preset_panel = nullptr; - TextInput * m_filament_serial_input = nullptr; + std::vector> m_create_type_btns; + std::unordered_map> m_filament_preset; + std::unordered_map> m_machint_filament_preset; + std::unordered_map> m_filament_choice_map; + std::unordered_map m_public_name_to_filament_id_map; + std::unordered_map m_all_presets_map; + CreateType m_create_type; + Button * m_button_create = nullptr; + Button * m_button_cancel = nullptr; + ComboBox * m_filament_vendor_combobox = nullptr; + ComboBox * m_filament_type_combobox = nullptr; + ComboBox * m_exist_vendor_combobox = nullptr; + ComboBox * m_filament_preset_combobox = nullptr; + TextInput * m_filament_custom_vendor_input = nullptr; + wxGridSizer * m_filament_presets_sizer = nullptr; + wxPanel * m_filament_preset_panel = nullptr; + TextInput * m_filament_serial_input = nullptr; }; @@ -117,7 +123,7 @@ protected: void select_curr_radiobox(std::vector> &radiobox_list, int btn_idx); void select_all_preset_template(std::vector> &preset_templates); void deselect_all_preset_template(std::vector> &preset_templates); - void update_presets_list(); + void update_presets_list(bool jast_template = false); void on_preset_model_value_change(wxCommandEvent &e); void clear_preset_combobox(); bool save_printable_area_config(Preset *preset); @@ -125,6 +131,7 @@ protected: bool validate_input_valid(); void load_texture(); void load_model_stl(); + bool load_system_and_user_presets_with_curr_model(PresetBundle &temp_preset_bundle, bool just_template = false); wxArrayString printer_preset_sort_with_nozzle_diameter(const VendorProfile &vendor_profile, float nozzle_diameter); wxBoxSizer *create_radio_item(wxString title, wxWindow *parent, wxString tooltip, std::vector> &radiobox_list); @@ -133,12 +140,19 @@ protected: wxString curr_create_printer_type(); private: + struct CreatePrinterType + { + wxString create_printer; + wxString create_nozzle; + wxString base_template; + wxString base_curr_printer; + }; + + CreatePrinterType m_create_type; std::vector> m_create_type_btns; std::vector> m_create_presets_btns; std::vector> m_filament_preset; std::vector> m_process_preset; - std::vector m_create_printer_type; - std::vector m_create_presets_type; VendorProfile m_printer_preset_vendor_selected; Slic3r::VendorProfile::PrinterModel m_printer_preset_model_selected; bool rewritten = false; @@ -262,6 +276,67 @@ private: wxStaticText * m_serial_text = nullptr; }; +class CreatePresetForPrinterDialog : public DPIDialog +{ +public: + CreatePresetForPrinterDialog(wxWindow *parent, std::string filament_type, std::string filament_id, std::string filament_vendor, std::string filament_name); + ~CreatePresetForPrinterDialog(); + +private: + void on_dpi_changed(const wxRect &suggested_rect) override; + void get_visible_printer_and_compatible_filament_presets(); + wxBoxSizer *create_selected_printer_preset_sizer(); + wxBoxSizer *create_selected_filament_preset_sizer(); + wxBoxSizer *create_button_sizer(); + +private: + std::string m_filament_id; + std::string m_filament_name; + std::string m_filament_vendor; + std::string m_filament_type; + std::shared_ptr m_preset_bundle; + std::string m_filamnt_type; + ComboBox * m_selected_printer = nullptr; + ComboBox * m_selected_filament = nullptr; + Button * m_ok_btn = nullptr; + Button * m_cancel_btn = nullptr; + std::unordered_map> printer_choice_to_printer_preset; + std::unordered_map> filament_choice_to_filament_preset; + std::unordered_map, std::vector>> m_printer_compatible_filament_presets;//need be used when add presets + +}; + +class EditFilamentPresetDialog : public DPIDialog +{ +public: + EditFilamentPresetDialog(wxWindow *parent, FilamentInfomation *filament_info); + ~EditFilamentPresetDialog(); + +private: + void on_dpi_changed(const wxRect &suggested_rect) override; + bool get_same_filament_id_presets(std::string filament_id); + void update_preset_tree(); + wxBoxSizer *create_filament_basic_info(); + wxBoxSizer *create_add_filament_btn(); + wxBoxSizer *create_preset_tree_sizer(); + wxBoxSizer *create_button_sizer(); + +private: + std::string m_filament_id; + std::string m_filament_name; + std::string m_vendor_name; + std::string m_filament_type; + std::string m_filament_serial; + Button * m_add_filament_btn = nullptr; + Button * m_del_filament_btn = nullptr; + Button * m_ok_btn = nullptr; + Button * m_cancel_btn = nullptr; + wxGridSizer * m_preset_tree_sizer = nullptr; + wxScrolledWindow * m_preset_tree_window = nullptr; + std::unordered_map>> m_printer_compatible_presets; + +}; + } } #endif \ No newline at end of file diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 6bbc6596b1..85597e8860 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -175,6 +175,10 @@ wxDEFINE_EVENT(EVT_GLCANVAS_COLOR_MODE_CHANGED, SimpleEvent); //BBS: print wxDEFINE_EVENT(EVT_PRINT_FROM_SDCARD_VIEW, SimpleEvent); +wxDEFINE_EVENT(EVT_CREATE_FILAMENT, SimpleEvent); + +wxDEFINE_EVENT(EVT_MODIFY_FILAMENT, SimpleEvent); + bool Plater::has_illegal_filename_characters(const wxString& wxs_name) { @@ -790,31 +794,7 @@ Sidebar::Sidebar(Plater *parent) wxPostEvent(parent, SimpleEvent(EVT_SCHEDULE_BACKGROUND_PROCESS, parent)); } })); - auto create_filament_preset_btn = new Button(p->m_panel_filament_title, _L("Create Filament")); - create_filament_preset_btn->SetFont(Label::Body_10); - create_filament_preset_btn->SetPaddingSize(wxSize(FromDIP(8), FromDIP(3))); - create_filament_preset_btn->SetCornerRadius(FromDIP(8)); - create_filament_preset_btn->SetBackgroundColor(flush_bg_col); - create_filament_preset_btn->SetBorderColor(flush_bd_col); - create_filament_preset_btn->SetTextColor(flush_fg_col); - create_filament_preset_btn->Bind(wxEVT_BUTTON, [this](wxCommandEvent &e) { - CreateFilamentPresetDialog dlg(p->m_panel_filament_title); - //CreatePrinterPresetDialog dlg(p->m_panel_filament_title); - int res = dlg.ShowModal(); - if (wxID_OK == res) { - wxGetApp().mainframe->update_side_preset_ui(); - update_ui_from_settings(); - update_all_preset_comboboxes(); - CreatePresetSuccessfulDialog success_dlg(p->m_panel_filament_title, SuccessType::FILAMENT); - int res = success_dlg.ShowModal(); - /*if (res == wxID_OK) { - p->editing_filament = 0; - p->combos_filament[0]->switch_to_tab(); - }*/ - } - }); - - bSizer39->Add(create_filament_preset_btn, 0, wxALIGN_CENTER_VERTICAL | wxLEFT, FromDIP(5)); + bSizer39->Add(p->m_flushing_volume_btn, 0, wxALIGN_CENTER_VERTICAL | wxLEFT, FromDIP(5)); bSizer39->Hide(p->m_flushing_volume_btn); bSizer39->Add(FromDIP(10), 0, 0, 0, 0 ); @@ -1008,7 +988,7 @@ Sidebar::~Sidebar() {} void Sidebar::create_printer_preset() { - CreatePrinterPresetDialog dlg(p->m_panel_printer_title); + CreatePrinterPresetDialog dlg(wxGetApp().mainframe); int res = dlg.ShowModal(); if (wxID_OK == res) { wxGetApp().mainframe->update_side_preset_ui(); @@ -2317,6 +2297,8 @@ struct Plater::priv void on_action_split_objects(SimpleEvent&); void on_action_split_volumes(SimpleEvent&); void on_action_layersediting(SimpleEvent&); + void on_create_filament(SimpleEvent &); + void on_modify_filament(SimpleEvent &); void on_object_select(SimpleEvent&); void on_plate_name_change(SimpleEvent &); @@ -2545,6 +2527,8 @@ Plater::priv::priv(Plater *q, MainFrame *main_frame) this->q->Bind(EVT_PREVIEW_ONLY_MODE_HINT, &priv::show_preview_only_hint, this); this->q->Bind(EVT_GLCANVAS_COLOR_MODE_CHANGED, &priv::on_change_color_mode, this); this->q->Bind(wxEVT_SYS_COLOUR_CHANGED, &priv::on_apple_change_color_mode, this); + this->q->Bind(EVT_CREATE_FILAMENT, &priv::on_create_filament, this); + this->q->Bind(EVT_MODIFY_FILAMENT, &priv::on_modify_filament, this); view3D = new View3D(q, bed, &model, config, &background_process); //BBS: use partplater's gcode @@ -7519,6 +7503,33 @@ void Plater::priv::on_action_layersediting(SimpleEvent&) notification_manager->set_move_from_overlay(view3D->is_layers_editing_enabled()); } +void Plater::priv::on_create_filament(SimpleEvent &) +{ + CreateFilamentPresetDialog dlg(wxGetApp().mainframe); + int res = dlg.ShowModal(); + if (wxID_OK == res) { + wxGetApp().mainframe->update_side_preset_ui(); + update_ui_from_settings(); + sidebar->update_all_preset_comboboxes(); + CreatePresetSuccessfulDialog success_dlg(wxGetApp().mainframe, SuccessType::FILAMENT); + int res = success_dlg.ShowModal(); + } +} + +void Plater::priv::on_modify_filament(SimpleEvent &evt) +{ + FilamentInfomation * filament_info = static_cast(evt.GetEventObject()); + EditFilamentPresetDialog dlg(wxGetApp().mainframe, filament_info); + int res = dlg.ShowModal(); + if (wxID_OK == res) { + wxGetApp().mainframe->update_side_preset_ui(); + update_ui_from_settings(); + sidebar->update_all_preset_comboboxes(); + /*CreatePresetSuccessfulDialog success_dlg(wxGetApp().mainframe, SuccessType::FILAMENT); + int res = success_dlg.ShowModal();*/ + } +} + void Plater::priv::enter_gizmos_stack() { assert(m_undo_redo_stack_active == &m_undo_redo_stack_main); diff --git a/src/slic3r/GUI/Plater.hpp b/src/slic3r/GUI/Plater.hpp index 78b3c69a1a..23acb23e8e 100644 --- a/src/slic3r/GUI/Plater.hpp +++ b/src/slic3r/GUI/Plater.hpp @@ -96,7 +96,8 @@ wxDECLARE_EVENT(EVT_UPDATE_PLUGINS_WHEN_LAUNCH, wxCommandEvent); wxDECLARE_EVENT(EVT_PREVIEW_ONLY_MODE_HINT, wxCommandEvent); wxDECLARE_EVENT(EVT_GLCANVAS_COLOR_MODE_CHANGED, SimpleEvent); wxDECLARE_EVENT(EVT_PRINT_FROM_SDCARD_VIEW, SimpleEvent); - +wxDECLARE_EVENT(EVT_CREATE_FILAMENT, SimpleEvent); +wxDECLARE_EVENT(EVT_MODIFY_FILAMENT, SimpleEvent); const wxString DEFAULT_PROJECT_NAME = "Untitled"; diff --git a/src/slic3r/GUI/WebGuideDialog.cpp b/src/slic3r/GUI/WebGuideDialog.cpp index 63ae3b2a08..67ef99f56c 100644 --- a/src/slic3r/GUI/WebGuideDialog.cpp +++ b/src/slic3r/GUI/WebGuideDialog.cpp @@ -27,6 +27,7 @@ #include #include #include +#include "CreatePresetsDialog.hpp" using namespace nlohmann; @@ -34,6 +35,34 @@ namespace Slic3r { namespace GUI { json m_ProfileJson; +static wxString update_custom_filaments() +{ + json m_Res = json::object(); + m_Res["command"] = "update_custom_filaments"; + m_Res["sequence_id"] = "2000"; + json m_CustomFilaments = json::array(); + PresetBundle * preset_bundle = wxGetApp().preset_bundle; + std::map> temp_filament_id_to_presets = preset_bundle->filaments.get_filament_presets(); + json temp_j; + for (std::pair> filament_id_to_presets : temp_filament_id_to_presets) { + std::string filament_id = filament_id_to_presets.first; + if (filament_id.empty()) continue; + for (const Preset *preset : filament_id_to_presets.second) { + if (preset->is_system || filament_id.empty() || "null" == filament_id || filament_id.size() != 8 || filament_id[0] != 'P') break; + temp_j["id"] = preset->filament_id; + std::string preset_name = preset->name; + size_t index_at = preset_name.find_last_of('@'); + if (std::string::npos != index_at) { preset_name = preset_name.substr(0, index_at - 1); } + temp_j["name"] = preset_name; + m_CustomFilaments.push_back(temp_j); + break; + } + } + m_Res["data"] = m_CustomFilaments; + wxString strJS = wxString::Format("HandleStudio(%s)", wxString::FromUTF8(m_Res.dump(-1, ' ', false, json::error_handler_t::ignore))); + return strJS; +} + GuideFrame::GuideFrame(GUI_App *pGUI, long style) : DPIDialog((wxWindow *) (pGUI->mainframe), wxID_ANY, "BambuStudio", wxDefaultPosition, wxDefaultSize, style), m_appconfig_new() @@ -322,6 +351,20 @@ void GuideFrame::OnScriptMessage(wxWebViewEvent &evt) wxGetApp().CallAfter([this,strJS] { RunScript(strJS); }); } + else if (strCmd == "request_custom_filaments") { + wxString strJS = update_custom_filaments(); + wxGetApp().CallAfter([this, strJS] { RunScript(strJS); }); + } + else if (strCmd == "create_custom_filament") { + this->EndModal(wxID_OK); + wxQueueEvent(wxGetApp().plater(), new SimpleEvent(EVT_CREATE_FILAMENT)); + } else if (strCmd == "modify_custom_filament") { + this->EndModal(wxID_OK); + FilamentInfomation *filament_info = new FilamentInfomation(); + filament_info->filament_id = j["id"]; + //filament_info->filament_name = j["name"]; + wxQueueEvent(wxGetApp().plater(), new SimpleEvent(EVT_MODIFY_FILAMENT, filament_info)); + } else if (strCmd == "save_userguide_models") { json MSelected = j["data"];