From 454ef1571b30d49312a3f4c037f41882663531b6 Mon Sep 17 00:00:00 2001 From: Davide Garberi Date: Mon, 21 Sep 2026 10:01:14 +0200 Subject: [PATCH 01/48] Update generic filament profiles for Creality SPARKX i7 (#14388) --- resources/profiles/Creality.json | 2 +- .../filament/Generic PETG @SPARKX i7-all.json | 2 +- .../filament/Generic PLA @SPARKX i7-all.json | 17 ++++++++++------- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/resources/profiles/Creality.json b/resources/profiles/Creality.json index 2ba6a5aa62..ecb8ebe2b1 100644 --- a/resources/profiles/Creality.json +++ b/resources/profiles/Creality.json @@ -1,6 +1,6 @@ { "name": "Creality", - "version": "02.03.02.82", + "version": "02.03.02.83", "force_update": "0", "description": "Creality configurations", "machine_model_list": [ diff --git a/resources/profiles/Creality/filament/Generic PETG @SPARKX i7-all.json b/resources/profiles/Creality/filament/Generic PETG @SPARKX i7-all.json index a7c58188b0..4005f5c8b4 100644 --- a/resources/profiles/Creality/filament/Generic PETG @SPARKX i7-all.json +++ b/resources/profiles/Creality/filament/Generic PETG @SPARKX i7-all.json @@ -55,7 +55,7 @@ "0" ], "filament_max_volumetric_speed": [ - "12" + "8" ], "filament_retract_before_wipe": [ "100" diff --git a/resources/profiles/Creality/filament/Generic PLA @SPARKX i7-all.json b/resources/profiles/Creality/filament/Generic PLA @SPARKX i7-all.json index bfa143866e..3a8af3548a 100644 --- a/resources/profiles/Creality/filament/Generic PLA @SPARKX i7-all.json +++ b/resources/profiles/Creality/filament/Generic PLA @SPARKX i7-all.json @@ -43,19 +43,19 @@ "1.75" ], "filament_flow_ratio": [ - "0.98" + "0.95" ], "filament_is_support": [ "0" ], "filament_max_volumetric_speed": [ - "16" + "14" ], "filament_minimal_purge_on_wipe_tower": [ "15" ], "filament_retract_before_wipe": [ - "nil" + "100%" ], "filament_retract_restart_extra": [ "nil" @@ -67,7 +67,7 @@ "nil" ], "filament_retraction_minimum_travel": [ - "nil" + "2" ], "filament_retraction_speed": [ "nil" @@ -106,7 +106,10 @@ "0" ], "slow_down_layer_time": [ - "8" + "14" + ], + "slow_down_min_speed": [ + "20" ], "temperature_vitrification": [ "110" @@ -118,7 +121,7 @@ "55" ], "filament_start_gcode": [ - "; Filament gcode\n" + ";filament start gcode\n" ], "filament_end_gcode": [ "; filament end gcode \n" @@ -153,7 +156,7 @@ "filament_unloading_speed_start": "100", "material_flow_dependent_temperature": "0", "material_flow_temp_graph": "[[0.2,210],[0.6,220]]", - "pressure_advance": "0.12", + "pressure_advance": "0.032", "support_material_interface_fan_speed": "-1", "compatible_printers": [ "Creality SPARKX i7 0.2 nozzle", From 83eaf3bcfc2a33840f4b80f6ad908c501d23514d Mon Sep 17 00:00:00 2001 From: gyarros Date: Mon, 21 Sep 2026 05:07:49 -0300 Subject: [PATCH 02/48] FilAr PLA-mate: lower bed temperature to 50 C (#14489) --- .../filament/FilAr/FilAr PLA-mate @base.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/resources/profiles/OrcaFilamentLibrary/filament/FilAr/FilAr PLA-mate @base.json b/resources/profiles/OrcaFilamentLibrary/filament/FilAr/FilAr PLA-mate @base.json index 729e9d7b9c..972f5a4220 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/FilAr/FilAr PLA-mate @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/FilAr/FilAr PLA-mate @base.json @@ -33,15 +33,15 @@ "210" ], "hot_plate_temp": [ - "60" + "50" ], "hot_plate_temp_initial_layer": [ - "60" + "50" ], "textured_plate_temp": [ - "60" + "50" ], "textured_plate_temp_initial_layer": [ - "60" + "50" ] } \ No newline at end of file From 3eae4c69978d10eda341ead98f1370e7df20a218 Mon Sep 17 00:00:00 2001 From: Alexander Haibl Date: Mon, 21 Sep 2026 10:22:32 +0200 Subject: [PATCH 03/48] fix-start-gcode for many creality printers (#14652) --- resources/profiles/Creality.json | 2 +- .../Creality/machine/Creality Ender-3 V4 0.4 nozzle.json | 2 +- .../profiles/Creality/machine/Creality K1 (0.4 nozzle).json | 2 +- .../profiles/Creality/machine/Creality K1 (0.6 nozzle).json | 2 +- .../profiles/Creality/machine/Creality K1 (0.8 nozzle).json | 2 +- .../profiles/Creality/machine/Creality K1 Max (0.4 nozzle).json | 2 +- .../profiles/Creality/machine/Creality K1 Max (0.6 nozzle).json | 2 +- .../profiles/Creality/machine/Creality K1 Max (0.8 nozzle).json | 2 +- .../Creality/machine/Creality K1 Max_CFS-C 0.4 nozzle.json | 2 +- .../profiles/Creality/machine/Creality K1 SE 0.4 nozzle.json | 2 +- .../profiles/Creality/machine/Creality K1 SE 0.6 nozzle.json | 2 +- .../profiles/Creality/machine/Creality K1 SE 0.8 nozzle.json | 2 +- .../Creality/machine/Creality K1 SE_CFS-C 0.4 nozzle.json | 2 +- .../profiles/Creality/machine/Creality K1C 0.4 nozzle.json | 2 +- .../profiles/Creality/machine/Creality K1C 0.6 nozzle.json | 2 +- .../profiles/Creality/machine/Creality K1C 0.8 nozzle.json | 2 +- .../Creality/machine/Creality K1C_CFS-C 0.4 nozzle.json | 2 +- .../profiles/Creality/machine/Creality K1_CFS-C 0.4 nozzle.json | 2 +- .../Creality/machine/Creality SPARKX i7 0.2 nozzle.json | 2 +- .../Creality/machine/Creality SPARKX i7 0.4 nozzle.json | 2 +- .../Creality/machine/Creality SPARKX i7 0.6 nozzle.json | 2 +- .../Creality/machine/Creality SPARKX i7 0.8 nozzle.json | 2 +- 22 files changed, 22 insertions(+), 22 deletions(-) diff --git a/resources/profiles/Creality.json b/resources/profiles/Creality.json index ecb8ebe2b1..b5d5b420bd 100644 --- a/resources/profiles/Creality.json +++ b/resources/profiles/Creality.json @@ -1,6 +1,6 @@ { "name": "Creality", - "version": "02.03.02.83", + "version": "02.03.02.84", "force_update": "0", "description": "Creality configurations", "machine_model_list": [ diff --git a/resources/profiles/Creality/machine/Creality Ender-3 V4 0.4 nozzle.json b/resources/profiles/Creality/machine/Creality Ender-3 V4 0.4 nozzle.json index 5829268d2e..ce5d13c8d9 100644 --- a/resources/profiles/Creality/machine/Creality Ender-3 V4 0.4 nozzle.json +++ b/resources/profiles/Creality/machine/Creality Ender-3 V4 0.4 nozzle.json @@ -54,7 +54,7 @@ "machine_min_travel_rate": "0,0", "machine_pause_gcode": "PAUSE", "machine_platform_motion_enable": "0", - "machine_start_gcode": "M140 S0\nM104 S0 \nSTART_PRINT EXTRUDER_TEMP=[nozzle_temperature_initial_layer] BED_TEMP=[bed_temperature_initial_layer_single]\nT[initial_no_support_extruder]\nM104 S[nozzle_temperature_initial_layer]\nM204 S2000\nG1 Z3 F600\nM83\nG1 X20 Y-1 F30000\nG1 Z0.3 F1200\nG1 X100 E10 F{filament_max_volumetric_speed[initial_extruder]/0.3*60}\nG1 X105 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4*60}\nG1 X110 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)*60}\nG1 X115 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4*60}\nG1 X120 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)*60}\nG1 X125 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4*60}\nG91\nG1 X1 Z-0.300\nG1 X4\nG92 E0\nG1 Z1 F1200", + "machine_start_gcode": "M140 S0\nM104 S0 \nSTART_PRINT EXTRUDER_TEMP=[nozzle_temperature_initial_layer] BED_TEMP=[bed_temperature_initial_layer_single]\nT[initial_no_support_extruder]\nM109 S[nozzle_temperature_initial_layer]\nM204 S2000\nG1 Z3 F600\nM83\nG1 X20 Y-1 F30000\nG1 Z0.3 F1200\nG1 X100 E10 F{filament_max_volumetric_speed[initial_extruder]/0.3*60}\nG1 X105 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4*60}\nG1 X110 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)*60}\nG1 X115 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4*60}\nG1 X120 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)*60}\nG1 X125 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4*60}\nG91\nG1 X1 Z-0.300\nG1 X4\nG92 E0\nG1 Z1 F1200", "machine_unload_filament_time": "0", "manual_filament_change": "0", "nozzle_hrc": "0", diff --git a/resources/profiles/Creality/machine/Creality K1 (0.4 nozzle).json b/resources/profiles/Creality/machine/Creality K1 (0.4 nozzle).json index 765e3b3125..11edd6f072 100644 --- a/resources/profiles/Creality/machine/Creality K1 (0.4 nozzle).json +++ b/resources/profiles/Creality/machine/Creality K1 (0.4 nozzle).json @@ -123,7 +123,7 @@ "default_filament_profile": [ "Generic PLA HF @Creality" ], - "machine_start_gcode": "START_PRINT EXTRUDER_TEMP=[nozzle_temperature_initial_layer] BED_TEMP=[bed_temperature_initial_layer_single]\nT[initial_no_support_extruder]\nM204 S2000\nM104 S[nozzle_temperature_initial_layer]\nG1 Z3 F600\nM83\nG92 E0\nG1 Z1 F600", + "machine_start_gcode": "START_PRINT EXTRUDER_TEMP=[nozzle_temperature_initial_layer] BED_TEMP=[bed_temperature_initial_layer_single]\nT[initial_no_support_extruder]\nM204 S2000\nM109 S[nozzle_temperature_initial_layer]\nG1 Z3 F600\nM83\nG92 E0\nG1 Z1 F600", "machine_end_gcode": "END_PRINT", "scan_first_layer": "0", "thumbnails": [ diff --git a/resources/profiles/Creality/machine/Creality K1 (0.6 nozzle).json b/resources/profiles/Creality/machine/Creality K1 (0.6 nozzle).json index ac6c71187b..1c79748908 100644 --- a/resources/profiles/Creality/machine/Creality K1 (0.6 nozzle).json +++ b/resources/profiles/Creality/machine/Creality K1 (0.6 nozzle).json @@ -123,7 +123,7 @@ "default_filament_profile": [ "Generic PLA HF @Creality" ], - "machine_start_gcode": "START_PRINT EXTRUDER_TEMP=[nozzle_temperature_initial_layer] BED_TEMP=[bed_temperature_initial_layer_single]\nT[initial_no_support_extruder]\nM204 S2000\nM104 S[nozzle_temperature_initial_layer]\nG1 Z3 F600\nM83\nG92 E0\nG1 Z1 F600", + "machine_start_gcode": "START_PRINT EXTRUDER_TEMP=[nozzle_temperature_initial_layer] BED_TEMP=[bed_temperature_initial_layer_single]\nT[initial_no_support_extruder]\nM204 S2000\nM109 S[nozzle_temperature_initial_layer]\nG1 Z3 F600\nM83\nG92 E0\nG1 Z1 F600", "machine_end_gcode": "END_PRINT", "scan_first_layer": "0", "thumbnails": [ diff --git a/resources/profiles/Creality/machine/Creality K1 (0.8 nozzle).json b/resources/profiles/Creality/machine/Creality K1 (0.8 nozzle).json index e2df1ba34c..64744dd2d5 100644 --- a/resources/profiles/Creality/machine/Creality K1 (0.8 nozzle).json +++ b/resources/profiles/Creality/machine/Creality K1 (0.8 nozzle).json @@ -123,7 +123,7 @@ "default_filament_profile": [ "Generic PLA HF @Creality" ], - "machine_start_gcode": "START_PRINT EXTRUDER_TEMP=[nozzle_temperature_initial_layer] BED_TEMP=[bed_temperature_initial_layer_single]\nT[initial_no_support_extruder]\nM204 S2000\nM104 S[nozzle_temperature_initial_layer]\nG1 Z3 F600\nM83\nG92 E0\nG1 Z1 F600", + "machine_start_gcode": "START_PRINT EXTRUDER_TEMP=[nozzle_temperature_initial_layer] BED_TEMP=[bed_temperature_initial_layer_single]\nT[initial_no_support_extruder]\nM204 S2000\nM109 S[nozzle_temperature_initial_layer]\nG1 Z3 F600\nM83\nG92 E0\nG1 Z1 F600", "machine_end_gcode": "END_PRINT", "scan_first_layer": "0", "thumbnails": [ diff --git a/resources/profiles/Creality/machine/Creality K1 Max (0.4 nozzle).json b/resources/profiles/Creality/machine/Creality K1 Max (0.4 nozzle).json index 291affba77..037c48e64a 100644 --- a/resources/profiles/Creality/machine/Creality K1 Max (0.4 nozzle).json +++ b/resources/profiles/Creality/machine/Creality K1 Max (0.4 nozzle).json @@ -124,7 +124,7 @@ "default_filament_profile": [ "Generic PLA HF @Creality" ], - "machine_start_gcode": "START_PRINT EXTRUDER_TEMP=[nozzle_temperature_initial_layer] BED_TEMP=[bed_temperature_initial_layer_single]\nT[initial_no_support_extruder]\nM204 S2000\nM104 S[nozzle_temperature_initial_layer]\nG1 Z3 F600\nM83\nG92 E0\nG1 Z1 F600", + "machine_start_gcode": "START_PRINT EXTRUDER_TEMP=[nozzle_temperature_initial_layer] BED_TEMP=[bed_temperature_initial_layer_single]\nT[initial_no_support_extruder]\nM204 S2000\nM109 S[nozzle_temperature_initial_layer]\nG1 Z3 F600\nM83\nG92 E0\nG1 Z1 F600", "machine_end_gcode": "END_PRINT", "scan_first_layer": "0", "thumbnails": [ diff --git a/resources/profiles/Creality/machine/Creality K1 Max (0.6 nozzle).json b/resources/profiles/Creality/machine/Creality K1 Max (0.6 nozzle).json index 523abd4de4..097777db73 100644 --- a/resources/profiles/Creality/machine/Creality K1 Max (0.6 nozzle).json +++ b/resources/profiles/Creality/machine/Creality K1 Max (0.6 nozzle).json @@ -124,7 +124,7 @@ "default_filament_profile": [ "Generic PLA HF @Creality" ], - "machine_start_gcode": "START_PRINT EXTRUDER_TEMP=[nozzle_temperature_initial_layer] BED_TEMP=[bed_temperature_initial_layer_single]\nT[initial_no_support_extruder]\nM204 S2000\nM104 S[nozzle_temperature_initial_layer]\nG1 Z3 F600\nM83\nG92 E0\nG1 Z1 F600", + "machine_start_gcode": "START_PRINT EXTRUDER_TEMP=[nozzle_temperature_initial_layer] BED_TEMP=[bed_temperature_initial_layer_single]\nT[initial_no_support_extruder]\nM204 S2000\nM109 S[nozzle_temperature_initial_layer]\nG1 Z3 F600\nM83\nG92 E0\nG1 Z1 F600", "machine_end_gcode": "END_PRINT", "scan_first_layer": "0", "thumbnails": [ diff --git a/resources/profiles/Creality/machine/Creality K1 Max (0.8 nozzle).json b/resources/profiles/Creality/machine/Creality K1 Max (0.8 nozzle).json index c67622c90b..e2ae32cae4 100644 --- a/resources/profiles/Creality/machine/Creality K1 Max (0.8 nozzle).json +++ b/resources/profiles/Creality/machine/Creality K1 Max (0.8 nozzle).json @@ -124,7 +124,7 @@ "default_filament_profile": [ "Generic PLA HF @Creality" ], - "machine_start_gcode": "START_PRINT EXTRUDER_TEMP=[nozzle_temperature_initial_layer] BED_TEMP=[bed_temperature_initial_layer_single]\nT[initial_no_support_extruder]\nM204 S2000\nM104 S[nozzle_temperature_initial_layer]\nG1 Z3 F600\nM83\nG92 E0\nG1 Z1 F600", + "machine_start_gcode": "START_PRINT EXTRUDER_TEMP=[nozzle_temperature_initial_layer] BED_TEMP=[bed_temperature_initial_layer_single]\nT[initial_no_support_extruder]\nM204 S2000\nM109 S[nozzle_temperature_initial_layer]\nG1 Z3 F600\nM83\nG92 E0\nG1 Z1 F600", "machine_end_gcode": "END_PRINT", "scan_first_layer": "0", "thumbnails": [ diff --git a/resources/profiles/Creality/machine/Creality K1 Max_CFS-C 0.4 nozzle.json b/resources/profiles/Creality/machine/Creality K1 Max_CFS-C 0.4 nozzle.json index 6d382f4c09..2e96b092ab 100644 --- a/resources/profiles/Creality/machine/Creality K1 Max_CFS-C 0.4 nozzle.json +++ b/resources/profiles/Creality/machine/Creality K1 Max_CFS-C 0.4 nozzle.json @@ -56,7 +56,7 @@ "machine_pause_gcode": "PAUSE", "machine_platform_motion_enable": "1", "machine_ptc_exist": "1", - "machine_start_gcode": "START_PRINT EXTRUDER_TEMP=[nozzle_temperature_initial_layer] BED_TEMP=[bed_temperature_initial_layer_single]\nT[initial_no_support_extruder]\nM204 S2000\nM104 S[nozzle_temperature_initial_layer]\nG1 Z3 F600\nM83\nG92 E0\nG1 Z1 F600", + "machine_start_gcode": "START_PRINT EXTRUDER_TEMP=[nozzle_temperature_initial_layer] BED_TEMP=[bed_temperature_initial_layer_single]\nT[initial_no_support_extruder]\nM204 S2000\nM109 S[nozzle_temperature_initial_layer]\nG1 Z3 F600\nM83\nG92 E0\nG1 Z1 F600", "machine_unload_filament_time": "0", "manual_filament_change": "0", "nozzle_hrc": "0", diff --git a/resources/profiles/Creality/machine/Creality K1 SE 0.4 nozzle.json b/resources/profiles/Creality/machine/Creality K1 SE 0.4 nozzle.json index a8aaadeadb..71214d34a8 100644 --- a/resources/profiles/Creality/machine/Creality K1 SE 0.4 nozzle.json +++ b/resources/profiles/Creality/machine/Creality K1 SE 0.4 nozzle.json @@ -123,7 +123,7 @@ "default_filament_profile": [ "Generic PLA @Creality K1-all" ], - "machine_start_gcode": "START_PRINT EXTRUDER_TEMP=[nozzle_temperature_initial_layer] BED_TEMP=[bed_temperature_initial_layer_single]\nT[initial_no_support_extruder]\nM204 S2000\nM104 S[nozzle_temperature_initial_layer]\nG1 Z3 F600\nM83\nG92 E0\nG1 Z1 F600", + "machine_start_gcode": "START_PRINT EXTRUDER_TEMP=[nozzle_temperature_initial_layer] BED_TEMP=[bed_temperature_initial_layer_single]\nT[initial_no_support_extruder]\nM204 S2000\nM109 S[nozzle_temperature_initial_layer]\nG1 Z3 F600\nM83\nG92 E0\nG1 Z1 F600", "machine_end_gcode": "END_PRINT", "scan_first_layer": "0", "thumbnails_format": "PNG", diff --git a/resources/profiles/Creality/machine/Creality K1 SE 0.6 nozzle.json b/resources/profiles/Creality/machine/Creality K1 SE 0.6 nozzle.json index 59435515f5..e1212431e2 100644 --- a/resources/profiles/Creality/machine/Creality K1 SE 0.6 nozzle.json +++ b/resources/profiles/Creality/machine/Creality K1 SE 0.6 nozzle.json @@ -57,7 +57,7 @@ "machine_min_travel_rate": "0,0", "machine_pause_gcode": "PAUSE", "machine_platform_motion_enable": "1", - "machine_start_gcode": "START_PRINT EXTRUDER_TEMP=[nozzle_temperature_initial_layer] BED_TEMP=[bed_temperature_initial_layer_single]\nT[initial_no_support_extruder]\nM204 S2000\nM104 S[nozzle_temperature_initial_layer]\nG1 Z3 F600\nM83\nG92 E0\nG1 Z1 F600", + "machine_start_gcode": "START_PRINT EXTRUDER_TEMP=[nozzle_temperature_initial_layer] BED_TEMP=[bed_temperature_initial_layer_single]\nT[initial_no_support_extruder]\nM204 S2000\nM109 S[nozzle_temperature_initial_layer]\nG1 Z3 F600\nM83\nG92 E0\nG1 Z1 F600", "machine_unload_filament_time": "0", "manual_filament_change": "0", "nozzle_hrc": "0", diff --git a/resources/profiles/Creality/machine/Creality K1 SE 0.8 nozzle.json b/resources/profiles/Creality/machine/Creality K1 SE 0.8 nozzle.json index 0db81bbdec..e17cfbaee4 100644 --- a/resources/profiles/Creality/machine/Creality K1 SE 0.8 nozzle.json +++ b/resources/profiles/Creality/machine/Creality K1 SE 0.8 nozzle.json @@ -57,7 +57,7 @@ "machine_min_travel_rate": "0,0", "machine_pause_gcode": "PAUSE", "machine_platform_motion_enable": "1", - "machine_start_gcode": "START_PRINT EXTRUDER_TEMP=[nozzle_temperature_initial_layer] BED_TEMP=[bed_temperature_initial_layer_single]\nT[initial_no_support_extruder]\nM204 S2000\nM104 S[nozzle_temperature_initial_layer]\nG1 Z3 F600\nM83\nG92 E0\nG1 Z1 F600", + "machine_start_gcode": "START_PRINT EXTRUDER_TEMP=[nozzle_temperature_initial_layer] BED_TEMP=[bed_temperature_initial_layer_single]\nT[initial_no_support_extruder]\nM204 S2000\nM109 S[nozzle_temperature_initial_layer]\nG1 Z3 F600\nM83\nG92 E0\nG1 Z1 F600", "machine_unload_filament_time": "0", "manual_filament_change": "0", "nozzle_hrc": "0", diff --git a/resources/profiles/Creality/machine/Creality K1 SE_CFS-C 0.4 nozzle.json b/resources/profiles/Creality/machine/Creality K1 SE_CFS-C 0.4 nozzle.json index 8fda2c9f43..aff5f6df86 100644 --- a/resources/profiles/Creality/machine/Creality K1 SE_CFS-C 0.4 nozzle.json +++ b/resources/profiles/Creality/machine/Creality K1 SE_CFS-C 0.4 nozzle.json @@ -55,7 +55,7 @@ "machine_min_travel_rate": "0,0", "machine_pause_gcode": "PAUSE", "machine_platform_motion_enable": "1", - "machine_start_gcode": "START_PRINT EXTRUDER_TEMP=[nozzle_temperature_initial_layer] BED_TEMP=[bed_temperature_initial_layer_single]\nT[initial_no_support_extruder]\nM204 S2000\nM104 S[nozzle_temperature_initial_layer]\nG1 Z3 F600\nM83\nG92 E0\nG1 Z1 F600", + "machine_start_gcode": "START_PRINT EXTRUDER_TEMP=[nozzle_temperature_initial_layer] BED_TEMP=[bed_temperature_initial_layer_single]\nT[initial_no_support_extruder]\nM204 S2000\nM109 S[nozzle_temperature_initial_layer]\nG1 Z3 F600\nM83\nG92 E0\nG1 Z1 F600", "machine_unload_filament_time": "0", "manual_filament_change": "0", "nozzle_hrc": "0", diff --git a/resources/profiles/Creality/machine/Creality K1C 0.4 nozzle.json b/resources/profiles/Creality/machine/Creality K1C 0.4 nozzle.json index 9f355f391a..00e71f72c3 100644 --- a/resources/profiles/Creality/machine/Creality K1C 0.4 nozzle.json +++ b/resources/profiles/Creality/machine/Creality K1C 0.4 nozzle.json @@ -124,7 +124,7 @@ "default_filament_profile": [ "Generic PLA @Creality K1-all" ], - "machine_start_gcode": "START_PRINT EXTRUDER_TEMP=[nozzle_temperature_initial_layer] BED_TEMP=[bed_temperature_initial_layer_single]\nT[initial_no_support_extruder]\nM204 S2000\nM104 S[nozzle_temperature_initial_layer]\nG1 Z3 F600\nM83\nG92 E0\nG1 Z1 F600", + "machine_start_gcode": "START_PRINT EXTRUDER_TEMP=[nozzle_temperature_initial_layer] BED_TEMP=[bed_temperature_initial_layer_single]\nT[initial_no_support_extruder]\nM204 S2000\nM109 S[nozzle_temperature_initial_layer]\nG1 Z3 F600\nM83\nG92 E0\nG1 Z1 F600", "machine_end_gcode": "END_PRINT", "scan_first_layer": "0", "thumbnails": [ diff --git a/resources/profiles/Creality/machine/Creality K1C 0.6 nozzle.json b/resources/profiles/Creality/machine/Creality K1C 0.6 nozzle.json index 44c5147f58..755128ca67 100644 --- a/resources/profiles/Creality/machine/Creality K1C 0.6 nozzle.json +++ b/resources/profiles/Creality/machine/Creality K1C 0.6 nozzle.json @@ -124,7 +124,7 @@ "default_filament_profile": [ "Generic PLA @Creality K1-all" ], - "machine_start_gcode": "START_PRINT EXTRUDER_TEMP=[nozzle_temperature_initial_layer] BED_TEMP=[bed_temperature_initial_layer_single]\nT[initial_no_support_extruder]\nM204 S2000\nM104 S[nozzle_temperature_initial_layer]\nG1 Z3 F600\nM83\nG92 E0\nG1 Z1 F600", + "machine_start_gcode": "START_PRINT EXTRUDER_TEMP=[nozzle_temperature_initial_layer] BED_TEMP=[bed_temperature_initial_layer_single]\nT[initial_no_support_extruder]\nM204 S2000\nM109 S[nozzle_temperature_initial_layer]\nG1 Z3 F600\nM83\nG92 E0\nG1 Z1 F600", "machine_end_gcode": "END_PRINT", "scan_first_layer": "0", "thumbnails": [ diff --git a/resources/profiles/Creality/machine/Creality K1C 0.8 nozzle.json b/resources/profiles/Creality/machine/Creality K1C 0.8 nozzle.json index 9a271da17f..5aad49cdc1 100644 --- a/resources/profiles/Creality/machine/Creality K1C 0.8 nozzle.json +++ b/resources/profiles/Creality/machine/Creality K1C 0.8 nozzle.json @@ -124,7 +124,7 @@ "default_filament_profile": [ "Generic PLA @Creality K1-all" ], - "machine_start_gcode": "START_PRINT EXTRUDER_TEMP=[nozzle_temperature_initial_layer] BED_TEMP=[bed_temperature_initial_layer_single]\nT[initial_no_support_extruder]\nM204 S2000\nM104 S[nozzle_temperature_initial_layer]\nG1 Z3 F600\nM83\nG92 E0\nG1 Z1 F600", + "machine_start_gcode": "START_PRINT EXTRUDER_TEMP=[nozzle_temperature_initial_layer] BED_TEMP=[bed_temperature_initial_layer_single]\nT[initial_no_support_extruder]\nM204 S2000\nM109 S[nozzle_temperature_initial_layer]\nG1 Z3 F600\nM83\nG92 E0\nG1 Z1 F600", "machine_end_gcode": "END_PRINT", "scan_first_layer": "0", "thumbnails": [ diff --git a/resources/profiles/Creality/machine/Creality K1C_CFS-C 0.4 nozzle.json b/resources/profiles/Creality/machine/Creality K1C_CFS-C 0.4 nozzle.json index a49967f597..3c21fddd9e 100644 --- a/resources/profiles/Creality/machine/Creality K1C_CFS-C 0.4 nozzle.json +++ b/resources/profiles/Creality/machine/Creality K1C_CFS-C 0.4 nozzle.json @@ -56,7 +56,7 @@ "machine_pause_gcode": "PAUSE", "machine_platform_motion_enable": "1", "machine_ptc_exist": "1", - "machine_start_gcode": "START_PRINT EXTRUDER_TEMP=[nozzle_temperature_initial_layer] BED_TEMP=[bed_temperature_initial_layer_single]\nT[initial_no_support_extruder]\nM204 S2000\nM104 S[nozzle_temperature_initial_layer]\nG1 Z3 F600\nM83\nG92 E0\nG1 Z1 F600", + "machine_start_gcode": "START_PRINT EXTRUDER_TEMP=[nozzle_temperature_initial_layer] BED_TEMP=[bed_temperature_initial_layer_single]\nT[initial_no_support_extruder]\nM204 S2000\nM109 S[nozzle_temperature_initial_layer]\nG1 Z3 F600\nM83\nG92 E0\nG1 Z1 F600", "machine_unload_filament_time": "0", "manual_filament_change": "0", "nozzle_hrc": "0", diff --git a/resources/profiles/Creality/machine/Creality K1_CFS-C 0.4 nozzle.json b/resources/profiles/Creality/machine/Creality K1_CFS-C 0.4 nozzle.json index 375e0bc71b..c19ca981f8 100644 --- a/resources/profiles/Creality/machine/Creality K1_CFS-C 0.4 nozzle.json +++ b/resources/profiles/Creality/machine/Creality K1_CFS-C 0.4 nozzle.json @@ -57,7 +57,7 @@ "machine_pause_gcode": "PAUSE", "machine_platform_motion_enable": "1", "machine_ptc_exist": "1", - "machine_start_gcode": "START_PRINT EXTRUDER_TEMP=[nozzle_temperature_initial_layer] BED_TEMP=[bed_temperature_initial_layer_single]\nT[initial_no_support_extruder]\nM204 S2000\nM104 S[nozzle_temperature_initial_layer]\nG1 Z3 F600\nM83\nG92 E0\nG1 Z1 F600", + "machine_start_gcode": "START_PRINT EXTRUDER_TEMP=[nozzle_temperature_initial_layer] BED_TEMP=[bed_temperature_initial_layer_single]\nT[initial_no_support_extruder]\nM204 S2000\nM109 S[nozzle_temperature_initial_layer]\nG1 Z3 F600\nM83\nG92 E0\nG1 Z1 F600", "machine_unload_filament_time": "0", "manual_filament_change": "0", "nozzle_hrc": "0", diff --git a/resources/profiles/Creality/machine/Creality SPARKX i7 0.2 nozzle.json b/resources/profiles/Creality/machine/Creality SPARKX i7 0.2 nozzle.json index 6a499942bf..146628aded 100644 --- a/resources/profiles/Creality/machine/Creality SPARKX i7 0.2 nozzle.json +++ b/resources/profiles/Creality/machine/Creality SPARKX i7 0.2 nozzle.json @@ -59,7 +59,7 @@ "machine_pause_gcode": "PAUSE", "machine_platform_motion_enable": "0", "machine_ptc_exist": "0", - "machine_start_gcode": "M140 S0\nM104 S0 \nSTART_PRINT EXTRUDER_TEMP=[nozzle_temperature_initial_layer] BED_TEMP=[bed_temperature_initial_layer_single]\nM83 \nM8200 P S[initial_no_support_extruder]\nM220 S100\n\nSET_VELOCITY_LIMIT ACCEL=5000 ACCEL_TO_DECEL=5000\nG0 X267 F18000 \nG0 X278 F2400\nM104 S[nozzle_temperature_initial_layer]\nM106 S0\nT[initial_no_support_extruder]\n\nM8200 O\nM204 S2000\nG1 Z3 F600\nM83\nG1 Y0 F12000\nG1 X150 F30000\nG1 Z0.2 F600\nG1 X120 Y0 E15 F{filament_max_volumetric_speed[initial_extruder]/0.3*60*0.1}\nG1 X115 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4*60}\nG1 X110 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)*60}\nG1 X105 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4*60}\nG1 X100 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)*60}\nG1 X95 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4*60}\nG91\nG1 X-1 Z-0.3\nG1 X-4\nG92 E0", + "machine_start_gcode": "M140 S0\nM104 S0 \nSTART_PRINT EXTRUDER_TEMP=[nozzle_temperature_initial_layer] BED_TEMP=[bed_temperature_initial_layer_single]\nM83 \nM8200 P S[initial_no_support_extruder]\nM220 S100\n\nSET_VELOCITY_LIMIT ACCEL=5000 ACCEL_TO_DECEL=5000\nG0 X267 F18000 \nG0 X278 F2400\nM109 S[nozzle_temperature_initial_layer]\nM106 S0\nT[initial_no_support_extruder]\n\nM8200 O\nM204 S2000\nG1 Z3 F600\nM83\nG1 Y0 F12000\nG1 X150 F30000\nG1 Z0.2 F600\nG1 X120 Y0 E15 F{filament_max_volumetric_speed[initial_extruder]/0.3*60*0.1}\nG1 X115 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4*60}\nG1 X110 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)*60}\nG1 X105 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4*60}\nG1 X100 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)*60}\nG1 X95 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4*60}\nG91\nG1 X-1 Z-0.3\nG1 X-4\nG92 E0", "machine_tool_change_time": "0", "machine_unload_filament_time": "30", "manual_filament_change": "0", diff --git a/resources/profiles/Creality/machine/Creality SPARKX i7 0.4 nozzle.json b/resources/profiles/Creality/machine/Creality SPARKX i7 0.4 nozzle.json index 68dedf568b..bf30a2ce49 100644 --- a/resources/profiles/Creality/machine/Creality SPARKX i7 0.4 nozzle.json +++ b/resources/profiles/Creality/machine/Creality SPARKX i7 0.4 nozzle.json @@ -59,7 +59,7 @@ "machine_pause_gcode": "PAUSE", "machine_platform_motion_enable": "0", "machine_ptc_exist": "0", - "machine_start_gcode": "M140 S0\nM104 S0 \nSTART_PRINT EXTRUDER_TEMP=[nozzle_temperature_initial_layer] BED_TEMP=[bed_temperature_initial_layer_single]\nM83 \nM8200 P S[initial_no_support_extruder]\nM220 S100\n\nSET_VELOCITY_LIMIT ACCEL=5000 ACCEL_TO_DECEL=5000\nG0 X267 F18000 \nG0 X278 F2400\nM104 S[nozzle_temperature_initial_layer]\nM106 S0\nT[initial_no_support_extruder]\n\nM8200 O\nM204 S2000\nG1 Z3 F600\nM83\nG1 Y0 F12000\nG1 X150 F30000\nG1 Z0.2 F600\nG1 X120 Y0 E15 F{filament_max_volumetric_speed[initial_extruder]/0.3*60*0.1}\nG1 X115 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4*60}\nG1 X110 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)*60}\nG1 X105 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4*60}\nG1 X100 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)*60}\nG1 X95 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4*60}\nG91\nG1 X-1 Z-0.3\nG1 X-4\nG92 E0", + "machine_start_gcode": "M140 S0\nM104 S0 \nSTART_PRINT EXTRUDER_TEMP=[nozzle_temperature_initial_layer] BED_TEMP=[bed_temperature_initial_layer_single]\nM83 \nM8200 P S[initial_no_support_extruder]\nM220 S100\n\nSET_VELOCITY_LIMIT ACCEL=5000 ACCEL_TO_DECEL=5000\nG0 X267 F18000 \nG0 X278 F2400\nM109 S[nozzle_temperature_initial_layer]\nM106 S0\nT[initial_no_support_extruder]\n\nM8200 O\nM204 S2000\nG1 Z3 F600\nM83\nG1 Y0 F12000\nG1 X150 F30000\nG1 Z0.2 F600\nG1 X120 Y0 E15 F{filament_max_volumetric_speed[initial_extruder]/0.3*60*0.1}\nG1 X115 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4*60}\nG1 X110 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)*60}\nG1 X105 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4*60}\nG1 X100 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)*60}\nG1 X95 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4*60}\nG91\nG1 X-1 Z-0.3\nG1 X-4\nG92 E0", "machine_tool_change_time": "0", "machine_unload_filament_time": "30", "manual_filament_change": "0", diff --git a/resources/profiles/Creality/machine/Creality SPARKX i7 0.6 nozzle.json b/resources/profiles/Creality/machine/Creality SPARKX i7 0.6 nozzle.json index f13761fa81..e327895da7 100644 --- a/resources/profiles/Creality/machine/Creality SPARKX i7 0.6 nozzle.json +++ b/resources/profiles/Creality/machine/Creality SPARKX i7 0.6 nozzle.json @@ -59,7 +59,7 @@ "machine_pause_gcode": "PAUSE", "machine_platform_motion_enable": "0", "machine_ptc_exist": "0", - "machine_start_gcode": "M140 S0\nM104 S0 \nSTART_PRINT EXTRUDER_TEMP=[nozzle_temperature_initial_layer] BED_TEMP=[bed_temperature_initial_layer_single]\nM83 \nM8200 P S[initial_no_support_extruder]\nM220 S100\n\nSET_VELOCITY_LIMIT ACCEL=5000 ACCEL_TO_DECEL=5000\nG0 X267 F18000 \nG0 X278 F2400\nM104 S[nozzle_temperature_initial_layer]\nM106 S0\nT[initial_no_support_extruder]\n\nM8200 O\nM204 S2000\nG1 Z3 F600\nM83\nG1 Y0 F12000\nG1 X150 F30000\nG1 Z0.2 F600\nG1 X120 Y0 E15 F{filament_max_volumetric_speed[initial_extruder]/0.3*60*0.1}\nG1 X115 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4*60}\nG1 X110 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)*60}\nG1 X105 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4*60}\nG1 X100 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)*60}\nG1 X95 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4*60}\nG91\nG1 X-1 Z-0.3\nG1 X-4\nG92 E0", + "machine_start_gcode": "M140 S0\nM104 S0 \nSTART_PRINT EXTRUDER_TEMP=[nozzle_temperature_initial_layer] BED_TEMP=[bed_temperature_initial_layer_single]\nM83 \nM8200 P S[initial_no_support_extruder]\nM220 S100\n\nSET_VELOCITY_LIMIT ACCEL=5000 ACCEL_TO_DECEL=5000\nG0 X267 F18000 \nG0 X278 F2400\nM109 S[nozzle_temperature_initial_layer]\nM106 S0\nT[initial_no_support_extruder]\n\nM8200 O\nM204 S2000\nG1 Z3 F600\nM83\nG1 Y0 F12000\nG1 X150 F30000\nG1 Z0.2 F600\nG1 X120 Y0 E15 F{filament_max_volumetric_speed[initial_extruder]/0.3*60*0.1}\nG1 X115 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4*60}\nG1 X110 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)*60}\nG1 X105 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4*60}\nG1 X100 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)*60}\nG1 X95 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4*60}\nG91\nG1 X-1 Z-0.3\nG1 X-4\nG92 E0", "machine_tool_change_time": "0", "machine_unload_filament_time": "30", "manual_filament_change": "0", diff --git a/resources/profiles/Creality/machine/Creality SPARKX i7 0.8 nozzle.json b/resources/profiles/Creality/machine/Creality SPARKX i7 0.8 nozzle.json index 053f23fd77..a3fad94bab 100644 --- a/resources/profiles/Creality/machine/Creality SPARKX i7 0.8 nozzle.json +++ b/resources/profiles/Creality/machine/Creality SPARKX i7 0.8 nozzle.json @@ -59,7 +59,7 @@ "machine_pause_gcode": "PAUSE", "machine_platform_motion_enable": "0", "machine_ptc_exist": "0", - "machine_start_gcode": "M140 S0\nM104 S0 \nSTART_PRINT EXTRUDER_TEMP=[nozzle_temperature_initial_layer] BED_TEMP=[bed_temperature_initial_layer_single]\nM83 \nM8200 P S[initial_no_support_extruder]\nM220 S100\n\nSET_VELOCITY_LIMIT ACCEL=5000 ACCEL_TO_DECEL=5000\nG0 X267 F18000 \nG0 X278 F2400\nM104 S[nozzle_temperature_initial_layer]\nM106 S0\nT[initial_no_support_extruder]\n\nM8200 O\nM204 S2000\nG1 Z3 F600\nM83\nG1 Y0 F12000\nG1 X150 F30000\nG1 Z0.2 F600\nG1 X120 Y0 E15 F{filament_max_volumetric_speed[initial_extruder]/0.3*60*0.1}\nG1 X115 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4*60}\nG1 X110 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)*60}\nG1 X105 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4*60}\nG1 X100 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)*60}\nG1 X95 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4*60}\nG91\nG1 X-1 Z-0.3\nG1 X-4\nG92 E0", + "machine_start_gcode": "M140 S0\nM104 S0 \nSTART_PRINT EXTRUDER_TEMP=[nozzle_temperature_initial_layer] BED_TEMP=[bed_temperature_initial_layer_single]\nM83 \nM8200 P S[initial_no_support_extruder]\nM220 S100\n\nSET_VELOCITY_LIMIT ACCEL=5000 ACCEL_TO_DECEL=5000\nG0 X267 F18000 \nG0 X278 F2400\nM109 S[nozzle_temperature_initial_layer]\nM106 S0\nT[initial_no_support_extruder]\n\nM8200 O\nM204 S2000\nG1 Z3 F600\nM83\nG1 Y0 F12000\nG1 X150 F30000\nG1 Z0.2 F600\nG1 X120 Y0 E15 F{filament_max_volumetric_speed[initial_extruder]/0.3*60*0.1}\nG1 X115 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4*60}\nG1 X110 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)*60}\nG1 X105 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4*60}\nG1 X100 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)*60}\nG1 X95 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4*60}\nG91\nG1 X-1 Z-0.3\nG1 X-4\nG92 E0", "machine_tool_change_time": "0", "machine_unload_filament_time": "30", "manual_filament_change": "0", From c8bfd2ad3e28ea557b6c7abe8248b7062ed33743 Mon Sep 17 00:00:00 2001 From: dremc <93659055+dremc@users.noreply.github.com> Date: Mon, 21 Sep 2026 18:53:16 +1000 Subject: [PATCH 04/48] Fix instantiation on DREMC Filament (#14659) --- resources/profiles/OrcaFilamentLibrary.json | 2 +- .../filament/DREMC/DREMC ABS @System.json | 3 ++- .../filament/DREMC/DREMC ABS+ @System.json | 3 ++- .../filament/DREMC/DREMC ASA @System.json | 3 ++- .../filament/DREMC/DREMC ASA CF @System.json | 3 ++- .../filament/DREMC/DREMC ASA GF @System.json | 3 ++- .../filament/DREMC/DREMC PA12-CF @System.json | 3 ++- .../filament/DREMC/DREMC PET-CF @System.json | 3 ++- .../filament/DREMC/DREMC PETG @System.json | 3 ++- .../filament/DREMC/DREMC PLA HS @System.json | 5 +++-- .../filament/DREMC/DREMC PLA+ @System.json | 3 ++- .../filament/DREMC/DREMC TPU 95A @System.json | 3 ++- 12 files changed, 24 insertions(+), 13 deletions(-) diff --git a/resources/profiles/OrcaFilamentLibrary.json b/resources/profiles/OrcaFilamentLibrary.json index 68212a1d5e..58abbb2be0 100644 --- a/resources/profiles/OrcaFilamentLibrary.json +++ b/resources/profiles/OrcaFilamentLibrary.json @@ -1,6 +1,6 @@ { "name": "OrcaFilamentLibrary", - "version": "02.04.00.08", + "version": "02.04.00.09", "force_update": "0", "description": "Orca Filament Library", "filament_list": [ diff --git a/resources/profiles/OrcaFilamentLibrary/filament/DREMC/DREMC ABS @System.json b/resources/profiles/OrcaFilamentLibrary/filament/DREMC/DREMC ABS @System.json index 6f46fb74dd..5fac752fcf 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/DREMC/DREMC ABS @System.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/DREMC/DREMC ABS @System.json @@ -3,6 +3,7 @@ "name": "DREMC ABS @System", "inherits": "DREMC ABS @base", "from": "system", - "instantiation": "false", + "setting_id": "gNjISMxTLwQzDrV9", + "instantiation": "true", "compatible_printers": [] } \ No newline at end of file diff --git a/resources/profiles/OrcaFilamentLibrary/filament/DREMC/DREMC ABS+ @System.json b/resources/profiles/OrcaFilamentLibrary/filament/DREMC/DREMC ABS+ @System.json index e9279cc5ba..0d0345828e 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/DREMC/DREMC ABS+ @System.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/DREMC/DREMC ABS+ @System.json @@ -3,6 +3,7 @@ "name": "DREMC ABS+ @System", "inherits": "DREMC ABS+ @base", "from": "system", - "instantiation": "false", + "setting_id": "M73sIwcpWv6zpFrb", + "instantiation": "true", "compatible_printers": [] } diff --git a/resources/profiles/OrcaFilamentLibrary/filament/DREMC/DREMC ASA @System.json b/resources/profiles/OrcaFilamentLibrary/filament/DREMC/DREMC ASA @System.json index 6a11bbe8ce..10d6626540 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/DREMC/DREMC ASA @System.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/DREMC/DREMC ASA @System.json @@ -3,6 +3,7 @@ "name": "DREMC ASA @System", "inherits": "DREMC ASA @base", "from": "system", - "instantiation": "false", + "setting_id": "PMulSQ0tYbNyvOYw", + "instantiation": "true", "compatible_printers": [] } diff --git a/resources/profiles/OrcaFilamentLibrary/filament/DREMC/DREMC ASA CF @System.json b/resources/profiles/OrcaFilamentLibrary/filament/DREMC/DREMC ASA CF @System.json index 6814312593..0e10750d78 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/DREMC/DREMC ASA CF @System.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/DREMC/DREMC ASA CF @System.json @@ -3,6 +3,7 @@ "name": "DREMC ASA CF @System", "inherits": "DREMC ASA CF @base", "from": "system", - "instantiation": "false", + "setting_id": "ZcipEKAqtBcAm6vR", + "instantiation": "true", "compatible_printers": [] } diff --git a/resources/profiles/OrcaFilamentLibrary/filament/DREMC/DREMC ASA GF @System.json b/resources/profiles/OrcaFilamentLibrary/filament/DREMC/DREMC ASA GF @System.json index e40cd71479..2d0f99fa1e 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/DREMC/DREMC ASA GF @System.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/DREMC/DREMC ASA GF @System.json @@ -3,6 +3,7 @@ "name": "DREMC ASA GF @System", "inherits": "DREMC ASA GF @base", "from": "system", - "instantiation": "false", + "setting_id": "8J3lt7KlQWcx0VUS", + "instantiation": "true", "compatible_printers": [] } \ No newline at end of file diff --git a/resources/profiles/OrcaFilamentLibrary/filament/DREMC/DREMC PA12-CF @System.json b/resources/profiles/OrcaFilamentLibrary/filament/DREMC/DREMC PA12-CF @System.json index 0cecab4c3c..b126651441 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/DREMC/DREMC PA12-CF @System.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/DREMC/DREMC PA12-CF @System.json @@ -3,6 +3,7 @@ "name": "DREMC PA12-CF @System", "inherits": "DREMC PA12-CF @base", "from": "system", - "instantiation": "false", + "setting_id": "jVlZ1KPsA5i8RIED", + "instantiation": "true", "compatible_printers": [] } diff --git a/resources/profiles/OrcaFilamentLibrary/filament/DREMC/DREMC PET-CF @System.json b/resources/profiles/OrcaFilamentLibrary/filament/DREMC/DREMC PET-CF @System.json index 80100b072f..85efd31920 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/DREMC/DREMC PET-CF @System.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/DREMC/DREMC PET-CF @System.json @@ -3,6 +3,7 @@ "name": "DREMC PET-CF @System", "inherits": "DREMC PET-CF @base", "from": "system", - "instantiation": "false", + "setting_id": "hal1nPyBF13UL9qB", + "instantiation": "true", "compatible_printers": [] } diff --git a/resources/profiles/OrcaFilamentLibrary/filament/DREMC/DREMC PETG @System.json b/resources/profiles/OrcaFilamentLibrary/filament/DREMC/DREMC PETG @System.json index 04cfb22339..46f2cb9b20 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/DREMC/DREMC PETG @System.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/DREMC/DREMC PETG @System.json @@ -3,7 +3,8 @@ "name": "DREMC PETG @System", "inherits": "DREMC PETG @base", "from": "system", - "instantiation": "false", + "setting_id": "gTGiaBYfymmtlyfG", + "instantiation": "true", "filament_max_volumetric_speed": [ "20" ], diff --git a/resources/profiles/OrcaFilamentLibrary/filament/DREMC/DREMC PLA HS @System.json b/resources/profiles/OrcaFilamentLibrary/filament/DREMC/DREMC PLA HS @System.json index a2b96c1862..8e98be30b8 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/DREMC/DREMC PLA HS @System.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/DREMC/DREMC PLA HS @System.json @@ -1,9 +1,10 @@ { "type": "filament", "name": "DREMC PLA+ HS @System", - "inherits": "DREMC PLA+ @base", + "inherits": "DREMC PLA+ HS @base", "from": "system", - "instantiation": "false", + "setting_id": "I0HWhYAZ3ppq91Gx", + "instantiation": "true", "filament_max_volumetric_speed": [ "22" ], diff --git a/resources/profiles/OrcaFilamentLibrary/filament/DREMC/DREMC PLA+ @System.json b/resources/profiles/OrcaFilamentLibrary/filament/DREMC/DREMC PLA+ @System.json index 71ff24bb1b..869633969a 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/DREMC/DREMC PLA+ @System.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/DREMC/DREMC PLA+ @System.json @@ -3,7 +3,8 @@ "name": "DREMC PLA+ @System", "inherits": "DREMC PLA+ @base", "from": "system", - "instantiation": "false", + "setting_id": "fIjHIsFmdDWIM1bf", + "instantiation": "true", "filament_max_volumetric_speed": [ "18" ], diff --git a/resources/profiles/OrcaFilamentLibrary/filament/DREMC/DREMC TPU 95A @System.json b/resources/profiles/OrcaFilamentLibrary/filament/DREMC/DREMC TPU 95A @System.json index 3b58f57d25..86d5d02151 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/DREMC/DREMC TPU 95A @System.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/DREMC/DREMC TPU 95A @System.json @@ -3,7 +3,8 @@ "name": "DREMC TPU 95A @System", "inherits": "DREMC TPU 95A @base", "from": "system", - "instantiation": "false", + "setting_id": "AfnFh14wKZsNEaZ1", + "instantiation": "true", "filament_max_volumetric_speed": [ "6" ], From 8b63628cf9dd1de4aebf9d1945025ec091c98226 Mon Sep 17 00:00:00 2001 From: HanifKoh <76276251+HanifKoh@users.noreply.github.com> Date: Mon, 21 Sep 2026 17:09:05 +0800 Subject: [PATCH 05/48] Restore Plugin HTML After a WebKit Reload (#15737) Plugin dialog content is injected with SetPage, so on the WebKit backends a reload (context menu, keyboard shortcut or location.reload()) re-fetches the SetPage base URL instead of the injected document, and the plugin UI is gone for good: load_plugin_content() returned early once m_content_loaded was set. Re-inject the plugin HTML when a main-frame load after the initial swap is neither that swap nor a page the plugin linked to. m_own_page_load marks the load our own SetPage caused, and the URL test recognises the reload: the injected document and the directory a reload re-fetches both report the base URL, so a load of any other URL is left alone. The test ignores a fragment the page navigated to, and undoes the escaping the web view applies to what the resources path holds. A load reaching the base URL is not enough on its own, because WebKitGTK reports a navigation that never committed against the document that stayed and then finishes that document again: a link to a missing file therefore arrives as a load of the base URL and reads exactly like a reload. So the re-injection also requires a navigation to the base URL to have committed, which a reload always does and a failure never does. A bootstrap page that cannot be loaded is still not recovered from: WebKitGTK substitutes a stock error page for it, and that load supersedes the swap whichever way the swap is ordered around it. The file ships, so this is a broken-install path; nothing here makes it worse than it already was. No separate MSW path is needed: wxWebViewEdge ignores the SetPage base URL, so its documents report about:blank and the test never matches there, and WebView2 reloads NavigateToString content from its own history entry anyway. --- src/slic3r/GUI/PluginWebDialog.cpp | 40 +++++++++++++++++++++++++----- src/slic3r/GUI/PluginWebDialog.hpp | 3 +++ 2 files changed, 37 insertions(+), 6 deletions(-) diff --git a/src/slic3r/GUI/PluginWebDialog.cpp b/src/slic3r/GUI/PluginWebDialog.cpp index d89aac7270..7d696dd8db 100644 --- a/src/slic3r/GUI/PluginWebDialog.cpp +++ b/src/slic3r/GUI/PluginWebDialog.cpp @@ -8,6 +8,7 @@ #include #include +#include #include @@ -55,6 +56,14 @@ wxString web_base_url() return wxString("file://") + from_u8(dir) + "/"; } +// Whether a loaded document is the plugin HTML's own base URL. The web view reports the URL it +// parsed, so any fragment the page navigated to is ignored and the escaping it applies to what the +// resources path holds (a space, a non-ASCII character) is undone first. +bool is_content_url(const wxString& url) +{ + return wxURI::Unescape(url.BeforeFirst('#')) == web_base_url(); +} + } // namespace PluginWebDialog::PluginWebDialog(wxWindow* parent, @@ -89,6 +98,7 @@ PluginWebDialog::PluginWebDialog(wxWindow* parent, // missing/blocked bootstrap resource (e.g. a packaged build) still triggers it. Bind(wxEVT_WEBVIEW_LOADED, &PluginWebDialog::on_bootstrap_event, this, wv->GetId()); Bind(wxEVT_WEBVIEW_ERROR, &PluginWebDialog::on_bootstrap_event, this, wv->GetId()); + Bind(wxEVT_WEBVIEW_NAVIGATED, &PluginWebDialog::on_navigated, this, wv->GetId()); } Bind(wxEVT_CLOSE_WINDOW, &PluginWebDialog::on_close_window, this); } @@ -139,19 +149,37 @@ void PluginWebDialog::destroy_for_plugin(PluginWebDialog* dialog) void PluginWebDialog::on_bootstrap_event(wxWebViewEvent& event) { - // The first bootstrap load (or its error) triggers the swap to plugin HTML; - // the resulting plugin-page load is ignored (guarded by m_content_loaded). - load_plugin_content(); + const bool loaded = event.GetEventType() == wxEVT_WEBVIEW_LOADED; + // The first bootstrap load (or its error) triggers the swap to plugin HTML. + if (!m_content_loaded) + load_plugin_content(); + // WebKit reloads the SetPage base URL, so a committed load of it that we did not start is a reload. + // A failed navigation is reported against the page that stayed but never commits. Edge ignores the + // base URL and restores SetPage content itself, so nothing matches there. + else if (is_content_url(event.GetURL())) { + if (m_own_page_load) + m_own_page_load = false; + else if (loaded && m_content_navigated) + load_plugin_content(); + } + if (loaded) + m_content_navigated = false; + event.Skip(); +} + +void PluginWebDialog::on_navigated(wxWebViewEvent& event) +{ + m_content_navigated = is_content_url(event.GetURL()); event.Skip(); } void PluginWebDialog::load_plugin_content() { - if (m_content_loaded) - return; m_content_loaded = true; - if (wxWebView* wv = browser()) + if (wxWebView* wv = browser()) { + m_own_page_load = true; wv->SetPage(wxString::FromUTF8(m_html), web_base_url()); + } } void PluginWebDialog::on_script_message(const nlohmann::json& payload) diff --git a/src/slic3r/GUI/PluginWebDialog.hpp b/src/slic3r/GUI/PluginWebDialog.hpp index 05f77f5148..a62e0b260c 100644 --- a/src/slic3r/GUI/PluginWebDialog.hpp +++ b/src/slic3r/GUI/PluginWebDialog.hpp @@ -64,6 +64,7 @@ protected: private: void on_bootstrap_event(wxWebViewEvent& event); + void on_navigated(wxWebViewEvent& event); void load_plugin_content(); void on_close_window(wxCloseEvent& event); void fire_submit(const nlohmann::json& data); @@ -72,6 +73,8 @@ private: std::string m_html; bool m_content_loaded{false}; + bool m_own_page_load{false}; // a SetPage of the plugin HTML is in flight + bool m_content_navigated{false}; // a navigation to the base URL has committed bool m_open{true}; bool m_close_fired{false}; std::optional m_result; From 45940a573d1a9af2e2d1cc5ab182cd4a79b9e3a4 Mon Sep 17 00:00:00 2001 From: SoftFever Date: Mon, 21 Sep 2026 17:11:56 +0800 Subject: [PATCH 06/48] Grant pull-requests write so profile PR labels and the partner notice actually post --- .github/workflows/pr-merge-bot.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/pr-merge-bot.yml b/.github/workflows/pr-merge-bot.yml index a2722f105e..75025daddf 100644 --- a/.github/workflows/pr-merge-bot.yml +++ b/.github/workflows/pr-merge-bot.yml @@ -529,7 +529,7 @@ jobs: && github.event_name == 'pull_request_target' permissions: contents: read - pull-requests: read + pull-requests: write issues: write runs-on: ubuntu-latest timeout-minutes: 5 @@ -636,7 +636,7 @@ jobs: && github.event_name == 'pull_request_target' permissions: contents: read # delegatable subtree, for file modes - pull-requests: read + pull-requests: write issues: write # label + comment runs-on: ubuntu-latest timeout-minutes: 10 From 64cad00569a31e31319e05798432fd0528eaf9e1 Mon Sep 17 00:00:00 2001 From: barmanr Date: Mon, 21 Sep 2026 15:23:13 +0530 Subject: [PATCH 07/48] fix: update OrcaArena product URL (#15796) Merged by /bot merge on behalf of @barmanr (id 281100727). Grants: resources/profiles/OrcaArena, resources/profiles/OrcaArena.json Head: 794db5d30d4d05f648be970bef9125ba3b0ee58d --- resources/profiles/OrcaArena.json | 2 +- resources/profiles/OrcaArena/machine/Orca Arena X1 Carbon.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/profiles/OrcaArena.json b/resources/profiles/OrcaArena.json index dd5f307a95..d997b9eb73 100644 --- a/resources/profiles/OrcaArena.json +++ b/resources/profiles/OrcaArena.json @@ -1,7 +1,7 @@ { "name": "Orca Arena Printer", "url": "", - "version": "02.04.00.05", + "version": "02.04.00.06", "force_update": "0", "description": "Orca Arena configuration files", "machine_model_list": [ diff --git a/resources/profiles/OrcaArena/machine/Orca Arena X1 Carbon.json b/resources/profiles/OrcaArena/machine/Orca Arena X1 Carbon.json index aa166a4c90..8d543bac21 100644 --- a/resources/profiles/OrcaArena/machine/Orca Arena X1 Carbon.json +++ b/resources/profiles/OrcaArena/machine/Orca Arena X1 Carbon.json @@ -2,7 +2,7 @@ "type": "machine_model", "name": "Orca Arena X1 Carbon", "model_id": "orca_arena_x1c", - "url": "", + "url": "https://www.orcaslicer.com", "nozzle_diameter": "0.4;0.2;0.6;0.8", "machine_tech": "FFF", "family": "ARENA-3DP", From 09d67b1bb490b6d2239644b61c794e2a29e342aa Mon Sep 17 00:00:00 2001 From: peachismomo Date: Mon, 21 Sep 2026 18:17:15 +0800 Subject: [PATCH 08/48] fix: remove some logging --- .github/workflows/post_merge_profiles.yml | 9 --------- 1 file changed, 9 deletions(-) diff --git a/.github/workflows/post_merge_profiles.yml b/.github/workflows/post_merge_profiles.yml index 469bb2a6c3..67780e37bd 100644 --- a/.github/workflows/post_merge_profiles.yml +++ b/.github/workflows/post_merge_profiles.yml @@ -75,8 +75,6 @@ jobs: if [ -z "$base" ] || [ "$base" = "0000000000000000000000000000000000000000" ] || ! git cat-file -e "$base^{commit}" 2>/dev/null; then base="$head^" fi - echo "Diffing $base..$head" - mapfile -t candidates < <( git diff --name-only "$base" "$head" -- resources/profiles \ | sed -nE 's#^resources/profiles/([^/]+)/.*#\1#p; s#^resources/profiles/([^/]+)\.json$#\1#p' \ @@ -95,7 +93,6 @@ jobs: done if [ "${#vendors[@]}" -eq 0 ]; then - echo "No changed vendor profiles in this push; nothing to publish." echo "vendors=" >> "$GITHUB_OUTPUT" exit 0 fi @@ -138,13 +135,10 @@ jobs: done if [ "${#unauthorized[@]}" -ne 0 ]; then - echo "Changed vendor profiles are not covered by FOLDER_MERGERS: ${unauthorized[*]}" - echo "No profile caches will be published for this push." echo "vendors=" >> "$GITHUB_OUTPUT" exit 0 fi - printf 'Changed vendors: %s\n' "${vendors[*]}" echo "vendors=${vendors[*]}" >> "$GITHUB_OUTPUT" - name: Resolve Orca version @@ -163,7 +157,6 @@ jobs: # OrcaCloud keys R2 on; orca_ver (X.Y.Z) is the asset-name prefix. echo "release_tag=$raw" >> "$GITHUB_OUTPUT" echo "orca_ver=$orca_ver" >> "$GITHUB_OUTPUT" - echo "Orca version: release_tag=$raw asset_prefix=$orca_ver" - name: Validate profile versions id: pver @@ -179,7 +172,6 @@ jobs: exit 1 fi printf '%s\t%s\n' "$v" "$pv" >> "$RUNNER_TEMP/pver.tsv" - echo "$v -> $pv" done - name: Download generate_system_cache @@ -214,7 +206,6 @@ jobs: pv="$(awk -F'\t' -v v="$v" '$1==v{print $2}' "$RUNNER_TEMP/pver.tsv")" name="${orca_ver}_${v}_${pv}_${ts}.zip" ( cd resources/profiles && zip -q -j "$out/$name" "$v.opc" ) - echo "packaged $name" done echo "dir=$out" >> "$GITHUB_OUTPUT" From 162cf7fd4c0756ae1d17b7b23472635153afb192 Mon Sep 17 00:00:00 2001 From: "Byeon Ho cheol." Date: Mon, 21 Sep 2026 19:18:57 +0900 Subject: [PATCH 09/48] Update Cubicon profiles: filament/process tuning and xCeler-Mini compatibility (#14660) --- resources/profiles/Cubicon.json | 2 +- .../Cubicon/filament/Cubicon ABS @base.json | 23 ++++-- .../filament/Cubicon ABS-A100 @base.json | 45 +++++++++--- .../Cubicon/filament/Cubicon ABSk @base.json | 14 ++-- .../Cubicon/filament/Cubicon PC @base.json | 72 +++++++++++++++++++ .../Cubicon/filament/Cubicon PETG @base.json | 37 +++++++++- .../Cubicon/filament/Cubicon PLA @base.json | 33 +++++++++ .../Cubicon/filament/Cubicon PLA+ @base.json | 9 +++ .../Cubicon xCeler-Plus 0.4 nozzle.json | 8 +-- .../Cubicon/process/cubicon common @base.json | 45 ++++++------ .../Cubicon/process/fdm_process_common.json | 2 +- .../process/process template @base.json | 2 +- 12 files changed, 238 insertions(+), 54 deletions(-) diff --git a/resources/profiles/Cubicon.json b/resources/profiles/Cubicon.json index f70517a0b1..57f9da37d6 100644 --- a/resources/profiles/Cubicon.json +++ b/resources/profiles/Cubicon.json @@ -1,6 +1,6 @@ { "name": "Cubicon", - "version": "02.04.00.05", + "version": "02.04.00.06", "force_update": "0", "description": "Cubicon configurations", "machine_model_list": [ diff --git a/resources/profiles/Cubicon/filament/Cubicon ABS @base.json b/resources/profiles/Cubicon/filament/Cubicon ABS @base.json index 31efe73b11..42e6db95e7 100644 --- a/resources/profiles/Cubicon/filament/Cubicon ABS @base.json +++ b/resources/profiles/Cubicon/filament/Cubicon ABS @base.json @@ -15,7 +15,7 @@ "115" ], "hot_plate_temp_initial_layer": [ - "115" + "120" ], "close_fan_the_first_x_layers": [ "3" @@ -24,13 +24,13 @@ "30" ], "filament_density": [ - "1.24" + "1.04" ], "filament_flow_ratio": [ "0.99" ], "filament_max_volumetric_speed": [ - "23" + "14" ], "nozzle_temperature_initial_layer": [ "240" @@ -39,19 +39,19 @@ "80" ], "fan_min_speed": [ - "70" + "15" ], "slow_down_min_speed": [ - "30" + "20" ], "slow_down_layer_time": [ - "3" + "10" ], "nozzle_temperature": [ "245" ], "temperature_vitrification": [ - "78" + "105" ], "nozzle_temperature_range_low": [ "220" @@ -61,5 +61,14 @@ ], "additional_cooling_fan_speed": [ "0" + ], + "activate_air_filtration": [ + "1" + ], + "during_print_exhaust_fan_speed": [ + "0" + ], + "complete_print_exhaust_fan_speed": [ + "255" ] } diff --git a/resources/profiles/Cubicon/filament/Cubicon ABS-A100 @base.json b/resources/profiles/Cubicon/filament/Cubicon ABS-A100 @base.json index 5c64ed0fa5..52b06dbb80 100644 --- a/resources/profiles/Cubicon/filament/Cubicon ABS-A100 @base.json +++ b/resources/profiles/Cubicon/filament/Cubicon ABS-A100 @base.json @@ -12,10 +12,10 @@ "Cubicon" ], "hot_plate_temp": [ - "100" + "105" ], "hot_plate_temp_initial_layer": [ - "100" + "115" ], "close_fan_the_first_x_layers": [ "3" @@ -24,13 +24,13 @@ "30" ], "filament_density": [ - "1.24" + "1.04" ], "filament_flow_ratio": [ - "0.99" + "1.04" ], "filament_max_volumetric_speed": [ - "23" + "8" ], "nozzle_temperature_initial_layer": [ "225" @@ -39,19 +39,19 @@ "80" ], "fan_min_speed": [ - "70" + "15" ], "slow_down_min_speed": [ - "30" + "20" ], "slow_down_layer_time": [ - "3" + "10" ], "nozzle_temperature": [ "230" ], "temperature_vitrification": [ - "78" + "105" ], "nozzle_temperature_range_low": [ "220" @@ -61,5 +61,32 @@ ], "additional_cooling_fan_speed": [ "0" + ], + "enable_pressure_advance": [ + "1" + ], + "pressure_advance": [ + "0.04" + ], + "filament_retraction_length": [ + "1.2" + ], + "filament_z_hop": [ + "0" + ], + "filament_retraction_speed": [ + "40" + ], + "filament_deretraction_speed": [ + "25" + ], + "filament_wipe": [ + "1" + ], + "filament_wipe_distance": [ + "2" + ], + "filament_retract_before_wipe": [ + "70%" ] } diff --git a/resources/profiles/Cubicon/filament/Cubicon ABSk @base.json b/resources/profiles/Cubicon/filament/Cubicon ABSk @base.json index 46a8f2d48c..584ce663ad 100644 --- a/resources/profiles/Cubicon/filament/Cubicon ABSk @base.json +++ b/resources/profiles/Cubicon/filament/Cubicon ABSk @base.json @@ -15,7 +15,7 @@ "115" ], "hot_plate_temp_initial_layer": [ - "115" + "120" ], "close_fan_the_first_x_layers": [ "3" @@ -24,13 +24,13 @@ "30" ], "filament_density": [ - "1.24" + "1.04" ], "filament_flow_ratio": [ "0.99" ], "filament_max_volumetric_speed": [ - "23" + "14" ], "nozzle_temperature_initial_layer": [ "240" @@ -39,19 +39,19 @@ "80" ], "fan_min_speed": [ - "70" + "15" ], "slow_down_min_speed": [ - "30" + "20" ], "slow_down_layer_time": [ - "3" + "10" ], "nozzle_temperature": [ "240" ], "temperature_vitrification": [ - "85" + "105" ], "nozzle_temperature_range_low": [ "220" diff --git a/resources/profiles/Cubicon/filament/Cubicon PC @base.json b/resources/profiles/Cubicon/filament/Cubicon PC @base.json index 001434a2b1..e5f12e1503 100644 --- a/resources/profiles/Cubicon/filament/Cubicon PC @base.json +++ b/resources/profiles/Cubicon/filament/Cubicon PC @base.json @@ -10,5 +10,77 @@ ], "filament_vendor": [ "Cubicon" + ], + "fan_max_speed": [ + "25" + ], + "fan_min_speed": [ + "0" + ], + "enable_pressure_advance": [ + "1" + ], + "pressure_advance": [ + "0.01" + ], + "close_fan_the_first_x_layers": [ + "5" + ], + "overhang_fan_threshold": [ + "50%" + ], + "overhang_fan_speed": [ + "25" + ], + "slow_down_layer_time": [ + "8" + ], + "filament_max_volumetric_speed": [ + "4" + ], + "filament_flow_ratio": [ + "0.94" + ], + "nozzle_temperature_initial_layer": [ + "245" + ], + "nozzle_temperature": [ + "250" + ], + "nozzle_temperature_range_low": [ + "240" + ], + "nozzle_temperature_range_high": [ + "280" + ], + "filament_retraction_length": [ + "0.8" + ], + "filament_z_hop": [ + "0" + ], + "filament_retraction_speed": [ + "40" + ], + "filament_deretraction_speed": [ + "25" + ], + "filament_wipe": [ + "1" + ], + "filament_wipe_distance": [ + "2" + ], + "filament_retract_before_wipe": [ + "70%" + ], + "activate_air_filtration": [ + "1" + ], + "during_print_exhaust_fan_speed": [ + "0" + ], + "complete_print_exhaust_fan_speed": [ + "255" ] } diff --git a/resources/profiles/Cubicon/filament/Cubicon PETG @base.json b/resources/profiles/Cubicon/filament/Cubicon PETG @base.json index 61fc5c647a..a1e38584a7 100644 --- a/resources/profiles/Cubicon/filament/Cubicon PETG @base.json +++ b/resources/profiles/Cubicon/filament/Cubicon PETG @base.json @@ -15,7 +15,7 @@ "80" ], "hot_plate_temp_initial_layer": [ - "80" + "85" ], "close_fan_the_first_x_layers": [ "3" @@ -54,12 +54,45 @@ "70" ], "nozzle_temperature_range_low": [ - "230" + "220" ], "nozzle_temperature_range_high": [ "250" ], "additional_cooling_fan_speed": [ "0" + ], + "enable_pressure_advance": [ + "1" + ], + "pressure_advance": [ + "0.08" + ], + "filament_retraction_length": [ + "2.0" + ], + "filament_z_hop": [ + "0" + ], + "filament_retraction_speed": [ + "40" + ], + "filament_deretraction_speed": [ + "25" + ], + "filament_wipe": [ + "1" + ], + "filament_wipe_distance": [ + "2" + ], + "filament_retract_before_wipe": [ + "70%" + ], + "activate_air_filtration": [ + "1" + ], + "complete_print_exhaust_fan_speed": [ + "255" ] } diff --git a/resources/profiles/Cubicon/filament/Cubicon PLA @base.json b/resources/profiles/Cubicon/filament/Cubicon PLA @base.json index 53df18afc5..dae8e34bee 100644 --- a/resources/profiles/Cubicon/filament/Cubicon PLA @base.json +++ b/resources/profiles/Cubicon/filament/Cubicon PLA @base.json @@ -53,5 +53,38 @@ ], "additional_cooling_fan_speed": [ "80" + ], + "close_fan_the_first_x_layers": [ + "1" + ], + "filament_retraction_length": [ + "2.0" + ], + "filament_z_hop": [ + "0" + ], + "filament_retraction_speed": [ + "40" + ], + "filament_deretraction_speed": [ + "25" + ], + "filament_wipe": [ + "1" + ], + "filament_wipe_distance": [ + "2" + ], + "filament_retract_before_wipe": [ + "70%" + ], + "activate_air_filtration": [ + "1" + ], + "during_print_exhaust_fan_speed": [ + "255" + ], + "complete_print_exhaust_fan_speed": [ + "255" ] } diff --git a/resources/profiles/Cubicon/filament/Cubicon PLA+ @base.json b/resources/profiles/Cubicon/filament/Cubicon PLA+ @base.json index 5e7c8dc10b..635f6483d1 100644 --- a/resources/profiles/Cubicon/filament/Cubicon PLA+ @base.json +++ b/resources/profiles/Cubicon/filament/Cubicon PLA+ @base.json @@ -18,5 +18,14 @@ ], "nozzle_temperature_range_high": [ "220" + ], + "filament_max_volumetric_speed": [ + "8" + ], + "enable_pressure_advance": [ + "1" + ], + "pressure_advance": [ + "0.025" ] } diff --git a/resources/profiles/Cubicon/machine/Cubicon xCeler-Plus 0.4 nozzle.json b/resources/profiles/Cubicon/machine/Cubicon xCeler-Plus 0.4 nozzle.json index 398f4e3457..616fa60297 100644 --- a/resources/profiles/Cubicon/machine/Cubicon xCeler-Plus 0.4 nozzle.json +++ b/resources/profiles/Cubicon/machine/Cubicon xCeler-Plus 0.4 nozzle.json @@ -73,12 +73,12 @@ "20000" ], "machine_max_acceleration_z": [ - "250", - "500" + "50", + "100" ], "machine_max_speed_z": [ - "25", - "12" + "5", + "10" ], "machine_max_acceleration_retracting": [ "5000", diff --git a/resources/profiles/Cubicon/process/cubicon common @base.json b/resources/profiles/Cubicon/process/cubicon common @base.json index 8de7c25078..a269d19529 100644 --- a/resources/profiles/Cubicon/process/cubicon common @base.json +++ b/resources/profiles/Cubicon/process/cubicon common @base.json @@ -5,7 +5,8 @@ "instantiation": "false", "compatible_printers": [ "Cubicon xCeler-I 0.4 nozzle", - "Cubicon xCeler-Plus 0.4 nozzle" + "Cubicon xCeler-Plus 0.4 nozzle", + "Cubicon xCeler-Mini 0.4 nozzle" ], "print_settings_id": "cubicon common @base", "accel_to_decel_enable": "1", @@ -14,26 +15,24 @@ "bridge_flow": "0.9", "internal_bridge_flow": "0.9", "brim_type": "no_brim", - "detect_overhang_wall": "1", + "detect_overhang_wall": "0", "resolution": "0.012", "elefant_foot_compensation": "0.15", - "percise_outer_wall": "1", - "percise_z_height": "0.2", "enable_overhang_speed": "1", - "enable_prime_tower": "1", + "enable_prime_tower": "0", "enable_support": "0", "exclude_object": "0", "filename_format": "{input_filename_base}_{layer_height}mm_{filament_type[initial_tool]}_{printer_model}_{print_time}.gcode", "gap_infill_speed": "250", - "infill_combination": "1", + "infill_combination": "0", "infill_direction": "45", "infill_wall_overlap": "15", "infill_anchor": "400%", "infill_anchor_max": "20", "initial_layer_line_width": "0.5", - "initial_layer_print_height": "0.25", - "initial_layer_speed": "60", - "initial_layer_infill_speed": "60", + "initial_layer_print_height": "0.2", + "initial_layer_speed": "50", + "initial_layer_infill_speed": "100", "initial_layer_travel_speed": "500", "slow_down_layers": "1", "only_one_wall_top": "1", @@ -47,9 +46,9 @@ "outer_wall_speed": "200", "print_sequence": "by layer", "raft_layers": "0", - "reduce_crossing_wall": "0", + "reduce_crossing_wall": "1", "reduce_infill_retraction": "1", - "seam_position": "back", + "seam_position": "aligned", "seam_gap": "10%", "enable_arc_fitting": "0", "staggered_inner_seams": "1", @@ -57,7 +56,7 @@ "skirt_distance": "2.5", "skirt_height": "1", "skirt_speed": "50", - "skirt_start_angle": "-45", + "skirt_start_angle": "-135", "sparse_infill_density": "15", "sparse_infill_speed": "270", "sparse_infill_pattern": "grid", @@ -84,7 +83,7 @@ "support_threshold_angle": "15", "wall_loops": "2", "thick_bridges": "0", - "extra_perimeters_on_overhangs": "1", + "extra_perimeters_on_overhangs": "0", "top_shell_layers": "5", "top_shell_thickness": "1", "slow_down_curled_perimeters": "0", @@ -93,18 +92,18 @@ "travel_jerk": "12", "infill_jerk": "12", "initial_layer_jerk": "9", - "inner_wall_jerk": "7", - "outer_wall_jerk": "7", - "default_acceleration": "13000", - "travel_acceleration": "13000", - "outer_wall_acceleration": "5000", - "inner_wall_acceleration": "5000", - "initial_layer_acceleration": "1000", + "inner_wall_jerk": "3.5", + "outer_wall_jerk": "3", + "default_acceleration": "10000", + "travel_acceleration": "10000", + "outer_wall_acceleration": "2000", + "inner_wall_acceleration": "6000", + "initial_layer_acceleration": "500", "top_surface_acceleration": "2000", "raft_first_layer_density": "90", "raft_first_layer_expansion": "2", "precise_outer_wall": "1", - "precise_z_height": "0", + "precise_z_height": "1", "slowdown_for_curled_perimeters": "0", "bridge_speed": "50", "internal_bridge_speed": "150%", @@ -112,5 +111,7 @@ "overhang_2_4_speed": "50", "overhang_3_4_speed": "30", "overhang_4_4_speed": "10", - "independent_support_layer_height": "1" + "independent_support_layer_height": "1", + "solid_infill_direction": "90", + "max_travel_detour_distance": "80%" } diff --git a/resources/profiles/Cubicon/process/fdm_process_common.json b/resources/profiles/Cubicon/process/fdm_process_common.json index d7da41458a..7308a806fa 100644 --- a/resources/profiles/Cubicon/process/fdm_process_common.json +++ b/resources/profiles/Cubicon/process/fdm_process_common.json @@ -62,7 +62,7 @@ "top_surface_line_width": "0.4", "top_surface_speed": "30", "travel_speed": "400", - "enable_prime_tower": "1", + "enable_prime_tower": "0", "prime_tower_width": "60", "xy_hole_compensation": "0", "xy_contour_compensation": "0" diff --git a/resources/profiles/Cubicon/process/process template @base.json b/resources/profiles/Cubicon/process/process template @base.json index 073bf4ea23..1b9b4d2288 100644 --- a/resources/profiles/Cubicon/process/process template @base.json +++ b/resources/profiles/Cubicon/process/process template @base.json @@ -42,7 +42,7 @@ "enable_arc_fitting": "1", "enable_extra_bridge_layer": "disabled", "enable_overhang_speed": "1", - "enable_prime_tower": "1", + "enable_prime_tower": "0", "enable_support": "0", "enforce_support_layers": "0", "ensure_vertical_shell_thickness": "ensure_all", From 8581df4a8a4e30f67c96ffb655dc9f7b34a6120a Mon Sep 17 00:00:00 2001 From: peachismomo Date: Mon, 21 Sep 2026 18:30:25 +0800 Subject: [PATCH 10/48] fix: update pr-merge-bot.yml to run post_merge_profiles.yml after merge --- .github/workflows/pr-merge-bot.yml | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/.github/workflows/pr-merge-bot.yml b/.github/workflows/pr-merge-bot.yml index a2722f105e..102f9ae413 100644 --- a/.github/workflows/pr-merge-bot.yml +++ b/.github/workflows/pr-merge-bot.yml @@ -520,6 +520,28 @@ jobs: } catch (error) { core.warning(`Merged successfully, but dispatching build_all.yml failed: ${error.message}`); } + // ---- re-kick the profile publish ---- + // Same reason as above: post_merge_profiles.yml is push-triggered, so a + // GITHUB_TOKEN merge never starts it. workflow_dispatch skips the paths: + // filter, so only dispatch when the PR actually touched profiles. + const touchesProfiles = files.some((file) => + [file.filename, file.previous_filename] + .filter(Boolean) + .some((p) => p.startsWith('resources/profiles/')) + ); + if (touchesProfiles) { + try { + await github.rest.actions.createWorkflowDispatch({ + owner, + repo, + workflow_id: 'post_merge_profiles.yml', + ref: pr.base.ref + }); + core.info(`Dispatched post_merge_profiles.yml on ${pr.base.ref}.`); + } catch (error) { + core.warning(`Merged successfully, but dispatching post_merge_profiles.yml failed: ${error.message}`); + } + } label-profile: # Independent of the merge rules: any PR that changes only files inside From cf1c164546a180a166abfa77c68b96dcc3708708 Mon Sep 17 00:00:00 2001 From: Ian Chua Date: Mon, 21 Sep 2026 18:40:24 +0800 Subject: [PATCH 11/48] feat: add printer-agent.md doc to HLSD --- docs/HLSD/printer-agent.md | 240 +++++++++++++++++++++++++++++++++++++ 1 file changed, 240 insertions(+) create mode 100644 docs/HLSD/printer-agent.md diff --git a/docs/HLSD/printer-agent.md b/docs/HLSD/printer-agent.md new file mode 100644 index 0000000000..7062fab966 --- /dev/null +++ b/docs/HLSD/printer-agent.md @@ -0,0 +1,240 @@ +# Printer agents + +Printer agents isolate printer-specific communication from the rest of OrcaSlicer. The GUI and +`DeviceManager` operate on a shared set of printer operations and device state; a selected printer +agent implements those operations for a particular printer ecosystem. The agent boundary allows +Bambu, Moonraker-based printers, built-in integrations, and Python-provided integrations to use the +same application workflow without making the GUI understand every printer protocol. + +The current boundary is an adapter boundary around the existing application contract. In particular, +some request fields and message payloads still use the Bambu-shaped representation that existing +`MachineObject` and `DeviceManager` code consumes. The printer agent is responsible for translating +that representation into the protocol spoken by its printer. This is an intentional compatibility +constraint of the current design; the interface is not yet a neutral printer protocol. + +The v1 dialect migration path is deliberately narrow. `DeviceManager` currently speaks the Bambu JSON +dialect because that is the payload shape already used throughout the command and state workflow. The +v1 `OrcaPrinterAgent` also accepts that Bambu dialect. Its transport path places the small translation +needed for the target printer at `deliver_to_sink`, keeping the compatibility code at the edge rather +than spreading it through `DeviceManager` or the agent interface. + +The eventual direction is for `DeviceManager` to produce an Orca JSON dialect. The Bambu agent will then +own the translation from Orca JSON to Bambu's protocol, while `OrcaPrinterAgent` can forward the Orca +payload directly to its sink. The v1 translation at `deliver_to_sink` can then be removed without +changing `DeviceManager`, the command callers, or the rest of the agent workflow. + +## Components + +The system has four relevant layers: + +```text +GUI / DeviceManager / MachineObject + | + NetworkAgent + / \ + IPrinterAgent ICloudServiceAgent + | | + printer protocol authentication and cloud services +``` + +### `DeviceManager` and `MachineObject` + +`DeviceManager` owns the application-facing printer workflow. It maintains `MachineObject` instances, +updates their state, filters devices for the active printer agent, and initiates operations such as +homing, temperature changes, printing, subscriptions, and camera playback. + +`MachineObject` remains the shared state model used by the GUI. It does not contain the implementation +of a printer protocol. When a device is discovered or returned by a cloud query, the device is tagged +with the active `printer_agent_id`. Device lists and selected-machine operations use that tag to avoid +sending an operation through an agent that does not own the device. + +### `NetworkAgent` + +`NetworkAgent` is the façade used by the GUI and `DeviceManager`. It owns: + +- the currently selected `IPrinterAgent`; +- the registered cloud-service instances, indexed by provider; +- callbacks shared by the active printer agent and the application; +- the forwarding methods for printer commands and cloud operations. + +There is one active printer agent for the currently selected printer preset. Switching the preset +increments the machine-list generation, disconnects the old printer agent, removes its callbacks, and +installs the newly selected agent. The façade then forwards printer operations to that agent. + +Cloud operations are selected separately using a provider key. `NetworkAgent` forwards a cloud request +to the matching `ICloudServiceAgent`, and forwards cloud camera operations with a device ID. The +printer agent receives a cloud-agent pointer through `set_cloud_agent()` when it is created, allowing +printer communication to obtain cloud tokens without depending on a concrete cloud implementation. + +### `IPrinterAgent` + +`IPrinterAgent` is the printer-facing contract. It covers: + +- cloud-relay and direct-LAN message delivery; +- LAN connection, discovery, binding, and certificates; +- printer subscriptions and callbacks; +- print operations; +- filament synchronization; +- camera capability and local camera URL reporting; +- printer command methods. + +Concrete built-in implementations include the Bambu wrapper, the native Orca/Moonraker path, and +other printer-agent implementations registered by the application. A printer agent may use either +the cloud agent, a direct LAN connection, or both. + +### `ICloudServiceAgent` + +`ICloudServiceAgent` owns authentication and services provided by a cloud backend. It covers login +state, tokens, user and printer lists, settings synchronization, model services, cloud messages, and +cloud camera operations. + +Cloud camera operations are device-scoped: + +- `get_camera_url(dev_id, callback)` obtains a stream URL for one device; +- `create_camera_signaling_channel(dev_id)` creates signaling for one device where the provider + supports it. + +This is separate from the local camera URL exposed by `IPrinterAgent`, which is currently scoped to +the active printer agent because a normal LAN agent represents one physical printer connection. + +## Agent registration and selection + +`NetworkAgentFactory` maintains the printer-agent registry. Each registry entry contains an agent ID, +a display name, and a factory function. Built-in agents register during application initialization. +Python printer-agent capabilities register dynamically and contribute an agent ID and factory entry. + +The selected printer preset contains the printer-agent choice. If no explicit choice is stored, the +application preserves the existing default behavior: Bambu presets select the Bambu agent and other +presets select the native Orca agent. When a preset is changed, `GUI_App` resolves the effective agent +ID, obtains the corresponding cloud agent, creates the printer agent through the registry, and installs +it in `NetworkAgent`. + +The registry rejects conflicting agent IDs. This matters for Python plugins because an agent ID is the +stable identity used by presets and device ownership; two enabled plugin capabilities must not claim +the same ID. + +## Message and command flow + +There are two low-level message paths: + +- `send_message()` publishes a command through the printer's cloud relay; +- `send_message_to_printer()` sends a command directly to the printer over the LAN path. + +Both paths accept a JSON string, quality-of-service and flag values, and return the existing network +status code domain. The agent owns the conversion from that JSON contract to its native transport. + +The typed `command_*` methods are the application-facing convenience layer. The five generic defaults +currently implemented by `IPrinterAgent` construct the existing JSON dialect and route through the +same message path: + +| Method | Default operation | +| --- | --- | +| `command_xyz_abs()` | Send `G90` for absolute positioning | +| `command_auto_leveling()` | Send `G29` for bed leveling | +| `command_go_home()` | Use the supported homing operation or send `G28` | +| `command_set_bed()` | Use the supported bed control or send `M140` | +| `command_set_nozzle()` | Send `M104` for nozzle temperature | + +These are compatibility defaults for common printer workflows, not a guarantee that every firmware +implements every command identically. An agent can override a method when its protocol needs another +operation. For example, a Klipper configuration may use `BED_MESH_CALIBRATE` instead of `G29`. + +The remaining common command methods default to `ORCA_NETWORK_ERR_CMD_NOT_SUPPORTED` because their +existing behavior is vendor-specific or has no portable implementation: + +- AMS RFID refresh; +- AMS calibration; +- AMS tray selection; +- camera start; +- axis control. + +The methods remain on the common interface so an agent that supports them can override them explicitly. +`sequence_id` remains part of the command contract because `DeviceManager` creates and tracks it as +the command ID. + +## Device ownership and stale responses + +Printer-agent ownership is represented by `printer_agent_id` on device records and `MachineObject` +instances. The active agent ID is attached when a device is discovered, returned by a cloud list, or +reused after a preset switch. Local-machine configuration also persists the agent ID so a saved LAN +device is not silently reused by an unrelated agent. + +Cloud printer-list responses carry three pieces of request context added by `NetworkAgent`: + +```text +provider cloud provider used for the request +agent_id active printer agent when the request was made +generation machine-list generation when the request was made +``` + +`DeviceManager` accepts the response only when those values still match the current provider, active +agent, and generation. This prevents a slow response from the previous preset or provider from +repopulating the current device list. + +The provider mapping is currently selected by `GUI_App`: the Bambu agent maps to the Bambu cloud +provider and other agents map to the Orca cloud provider. The generation check protects that existing +selection from races; it does not make cloud-provider ownership intrinsic to an agent. Cloud-printer +ownership and the broader Orca cloud services are therefore still separate architectural concerns. + +## Python printer agents + +`PrinterAgentPluginCapability` implements `IPrinterAgent` directly. The live capability object is +registered with `NetworkAgentFactory` and handed out as the printer agent when its agent ID is selected. +The plugin receives the selected `ICloudServiceAgent` through `set_cloud_agent()` just like a built-in +printer agent. + +Python plugins must implement the core communication and lifecycle methods required by the interface, +including agent metadata, printer connection, discovery callbacks, and the two message-send methods. +Methods that are meaningful only to a particular printer are optional overrides where the C++ base +class provides a default. + +All ten `command_*` methods are available in the Python binding and in the trampoline. Their override +status is intentionally optional: + +- the five generic commands use the C++ default when Python does not override them; +- the five vendor-specific commands return `NOT_SUPPORTED` unless Python supplies an implementation; +- a Python implementation can replace either behavior for its own protocol. + +The Python camera binding exposes HTTP, HTTPS, RTSP, and HTTP-snapshot modes. WebRTC remains a +built-in C++ camera mode, but is not exposed as a Python mode because the current Python capability +does not provide the corresponding cloud signaling-channel contract. + +## Camera playback boundary + +The camera stream mode describes how a stream is obtained; it does not by itself define ownership of +the wxWidgets view that renders it. `MediaPlayCtrl` selects and tears down the active backend, while +the wx parent owns the child window or renderer. This is important because a web view, native media +control, and frame-based/WebRTC renderer have different wx window-lifetime requirements. + +Cloud URL and signaling requests are routed through `NetworkAgent` to the cloud provider selected for +the device. Local URL requests are routed to the active printer agent. The distinction keeps cloud +account services device-scoped while preserving the current one-LAN-agent/one-printer model. + +## Compatibility constraints + +The printer-agent boundary intentionally preserves several existing application contracts: + +- Bambu-shaped JSON is still the shared command representation; +- existing network status codes are reused, with Orca-specific unsupported/capability errors added + in the Orca-reserved range; +- `MachineObject` remains the shared device-state model; +- preset and local-machine data retain compatibility with the existing agent-selection behavior; +- Python plugins use the existing capability and pybind11 registration system. + +The agent abstraction is therefore responsible for containing vendor differences, not for pretending +that all vendor protocols are identical. The planned Orca JSON dialect is the protocol-neutral command +model for the `DeviceManager`/agent boundary. Once it is introduced, Bambu-specific translation remains +inside the Bambu agent and the Orca agent's v1 sink adapter can be removed as a self-contained cleanup. + +## Main implementation locations + +- [`IPrinterAgent`](../../src/slic3r/Utils/IPrinterAgent.hpp) — printer-agent contract and generic command defaults +- [`ICloudServiceAgent`](../../src/slic3r/Utils/ICloudServiceAgent.hpp) — cloud service and per-device + cloud camera contract +- [`NetworkAgent`](../../src/slic3r/Utils/NetworkAgent.hpp) — façade and dispatch between active agents +- [`NetworkAgentFactory`](../../src/slic3r/Utils/NetworkAgentFactory.hpp) — built-in and Python agent registry +- [`DeviceManager`](../../src/slic3r/GUI/DeviceCore/DevManager.cpp) — device ownership, filtering, and + stale-response checks +- [`PrinterAgentPluginCapability`](../../src/slic3r/plugin/pluginTypes/printerAgent/PrinterAgentPluginCapability.cpp) + — Python bindings +- [`MediaPlayCtrl`](../../src/slic3r/GUI/MediaPlayCtrl.cpp) — camera backend selection and playback lifecycle From cdcef47e3db87956c4803ccf15fdb722b5256546 Mon Sep 17 00:00:00 2001 From: barmanr Date: Mon, 21 Sep 2026 16:40:10 +0530 Subject: [PATCH 12/48] test: bump OrcaArena profile version for OTA retry (#15798) Merged by /bot merge on behalf of @barmanr (id 281100727). Grants: resources/profiles/OrcaArena, resources/profiles/OrcaArena.json Head: 32113de7fd96de0d4a84b4d10f7c5c75bbef1de9 --- resources/profiles/OrcaArena.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/profiles/OrcaArena.json b/resources/profiles/OrcaArena.json index d997b9eb73..9bb97fb232 100644 --- a/resources/profiles/OrcaArena.json +++ b/resources/profiles/OrcaArena.json @@ -1,7 +1,7 @@ { "name": "Orca Arena Printer", "url": "", - "version": "02.04.00.06", + "version": "02.04.00.07", "force_update": "0", "description": "Orca Arena configuration files", "machine_model_list": [ From 1e038bfc531c74ca42375be445372615e0f7b1b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=B0lker=20Kara?= <48905528+karailker@users.noreply.github.com> Date: Mon, 21 Sep 2026 15:36:55 +0300 Subject: [PATCH 13/48] fix(linux): build deps on older GCC and Ubuntu 22.04 (#15151) - GMP: name the parameters in the configure probe from 0001-GMP_GCC15.patch. Unnamed parameters are a hard error on GCC 10 and older, so configure failed there. - TBB: turn off the automatic hwloc search so a system libhwloc-dev is not picked up. - scripts/linux.d/debian: run apt update before checking which webkit2gtk package exists, and prefer webkit2gtk-4.1 since the build requires it. Add automake, which MPFR's autoreconf needs. --- deps/GMP/0001-GMP_GCC15.patch | 6 +++--- deps/TBB/TBB.cmake | 1 + scripts/linux.d/debian | 15 ++++++++++----- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/deps/GMP/0001-GMP_GCC15.patch b/deps/GMP/0001-GMP_GCC15.patch index e005120acd..fdabed26f7 100644 --- a/deps/GMP/0001-GMP_GCC15.patch +++ b/deps/GMP/0001-GMP_GCC15.patch @@ -5,7 +5,7 @@ #if defined (__GNUC__) && ! defined (__cplusplus) typedef unsigned long long t1;typedef t1*t2; -void g(){} -+void g(int,t1 const*,t1,t2,t1 const*,int){} ++void g(int a,t1 const*b,t1 c,t2 dd,t1 const*e,int ff){} void h(){} static __inline__ t1 e(t2 rp,t2 up,int n,t1 v0) {t1 c,x,r;int i;if(v0){c=1;for(i=1;i/dev/null)" != "" ] + # The package lists must be current before checking what is available. + sudo apt update + + # src/slic3r/CMakeLists.txt requires webkit2gtk-4.1 unconditionally (no + # 4.0 fallback), so prefer it; only fall back to 4.0-dev when 4.1 isn't + # packaged for this distro. + if [ "$(apt show --quiet libwebkit2gtk-4.1-dev 2>/dev/null)" != "" ] then - REQUIRED_DEV_PACKAGES+=(libwebkit2gtk-4.0-dev) - else REQUIRED_DEV_PACKAGES+=(libwebkit2gtk-4.1-dev) + else + REQUIRED_DEV_PACKAGES+=(libwebkit2gtk-4.0-dev) fi # install them all at once - sudo apt update sudo apt install -y "${REQUIRED_DEV_PACKAGES[@]}" echo -e "done\n" From 2adb631d6fe018df7d1e4b3ffaf9cd6350730df7 Mon Sep 17 00:00:00 2001 From: RH3D <127200179+RH3D@users.noreply.github.com> Date: Mon, 21 Sep 2026 16:02:31 +0200 Subject: [PATCH 14/48] RH3D new printer and print profiles update (#14707) * Update 0.25mm Standard @E3NG v1.2S.json * Create 0.20mm Fast @Virtu E3.json * Update 0.20mm Fast Virtu E3.json * Create 0.20mm SLOW Virtu E3.json * Update and rename 0.20mm Fast @Virtu E3.json to 0.20mm FAST @Virtu E3.json * Update and rename 0.20mm Fast @E3NG v1.2S.json to 0.20mm FAST @E3NG v1.2S.json * Update and rename 0.20mm Slow @E3NG v1.2S.json to 0.20mm SLOW @E3NG v1.2S.json * Update and rename 0.20mm Standard @E3NG v1.2S.json to 0.20mm STANDARD @E3NG v1.2S.json * Create 0.20mm STANDARD @VIRTU E3 * Update and rename 0.20mm FAST Virtu E3.json to 0.20mm FAST VIRTU E3.json * Rename 0.20mm SLOW Virtu E3.json to 0.20mm SLOW VIRTU E3.json * Update 0.20mm STANDARD @VIRTU E3 * Update 0.20mm STANDARD VIRTU E3 * Update and rename 0.25mm Fast @E3NG v1.2S.json to 0.25mm FAST @E3NG v1.2S.json * Create 0.25mm FAST VIRTU E3 * Update and rename 0.15mm Standard @E3NG v1.2S.json to 0.15mm STANDARD @E3NG v1.2S.json * Update and rename 0.10mm Standard @E3NG v1.2S.json to 0.10mm STANDARD @E3NG v1.2S.json * Create 0.15mm STANDARD VIRTU E3 * Create 0.10mm STANDARD VIRTU E3.json * Rename 0.15mm STANDARD @VIRTU E3 to 0.15mm STANDARD @VIRTU E3.json * Update 0.15mm STANDARD VIRTU E3.json * Update 0.20mm STANDARD VIRTU E3 * Update and rename 0.25mm FAST VIRTU E3 to 0.25mm FAST VIRTU E3.json * Rename 0.20mm STANDARD VIRTU E3 to 0.20mm STANDARD VIRTU E3.json * Update 0.15mm STANDARD VIRTU E3.json * Update and rename 0.25mm Standard @E3NG v1.2S.json to 0.25mm STANDARD @E3NG v1.2S.json * Create 0.25mm STANDARD VIRTU E3.json * Create process_common_VIRTU E3.json * Create process_FAST_VIRTU E3.json * Update 0.20mm FAST VIRTU E3.json * Update 0.25mm FAST VIRTU E3.json * Create process_SLOW_VIRTU E3.json * Update 0.20mm SLOW @VIRTU E3.json * Update 0.20mm SLOW VIRTU E3.json * Update and rename process_common_VIRTU E3.json to process_STANDARD_VIRTU E3.json * Update 0.10mm STANDARD VIRTU E3.json * Update 0.15mm STANDARD VIRTU E3.json * Update 0.20mm STANDARD VIRTU E3.json * Update 0.25mm STANDARD @VIRTU E3.json * Update process_STANDARD_VIRTU E3.json * Update 0.25mm STANDARD VIRTU E3.json * Update 0.20mm STANDARD VIRTU E3.json * Update 0.15mm STANDARD @VIRTU E3.json * Update 0.10mm STANDARD VIRTU E3.json * Update 0.15mm STANDARD VIRTU E3.json * Update 0.20mm SLOW VIRTU E3.json * Update RH3D.json * Update RH3D.json * Create VIRTU E3 - 0.2 nozzle.json * Create VIRTU E3 - 0.3 nozzle.json * Create VIRTU E3 - 0.4 nozzle.json * Create VIRTU E3 - 0.5 nozzle.json * Create VIRTU E3 - 0.6 nozzle.json * Create VIRTU E3,json * Update fdm_common_E3NG v1.2S.json * Update fdm_machine_common.json * Create fdm_common_VIRTU E3.json * Create Generic ABS VIRTU E3.json * Create Generic ASA @VIRTU E3.json * Update Generic ASA VIRTU E3.json * Create Generic PCCF VIRTU E3.json * Create Generic PETG @VIRTU E3.json * Create Generic PLA VIRTU E3.json * Create Generic TPU VIRTU E3.json * Update Generic ASA VIRTU E3.json * Update Generic PETG VIRTU E3.json * Update 0.20mm SLOW VIRTU E3.json * Update 0.15mm STANDARD VIRTU E3.json * Rename VIRTU E3,json to VIRTU E3.json * Add files via upload * Update VIRTU E3 - 0.2 nozzle.json * Update E3NG v1.2S - 0.2 nozzle.json * Update E3NG v1.2S - 0.3 nozzle.json * Update E3NG v1.2S - 0.4 nozzle.json * Update E3NG v1.2S - 0.5 nozzle.json * Update E3NG v1.2S - 0.6 nozzle.json * Update 0.10mm STANDARD @E3NG v1.2S.json * Update 0.15mm STANDARD @E3NG v1.2S.json * Update 0.20mm STANDARD @E3NG v1.2S.json * Update 0.25mm STANDARD @E3NG v1.2S.json * Delete resources/profiles/RH3D/VIRTU-bed.stl * Update fdm_common_VIRTU E3.json * Add files via upload * Delete resources/profiles/RH3D/E3NG-bed-texture.svg * Add files via upload * Delete resources/profiles/RH3D/VIRTU E3_cover.png * Add files via upload * Add files via upload * Create process_STANDARD_E3NG.json * Create process_SLOW_E3NG.json * Update and rename process_STANDARD_E3NG.json to process_STANDARD_E3NG v1.2S.json * Update and rename process_SLOW_E3NG.json to process_SLOW_E3NG v1.2S.json * Create process_FAST_E3NG v1.2S.json * Update 0.25mm STANDARD @E3NG v1.2S.json * Update 0.20mm STANDARD @E3NG v1.2S.json * Update 0.15mm STANDARD @E3NG v1.2S.json * Update 0.10mm STANDARD @E3NG v1.2S.json * Update 0.20mm SLOW @E3NG v1.2S.json * Update 0.20mm FAST @E3NG v1.2S.json * Update 0.25mm FAST @E3NG v1.2S.json * Update 0.20mm STANDARD @E3NG v1.2S.json * Update 0.20mm STANDARD VIRTU E3.json * Delete resources/profiles/RH3D/process/process_common_E3NG v1.2S.json * Update RH3D.json * Update fdm_process_common.json * Update fdm_filament_common.json * Update fdm_filament_abs.json * Update fdm_filament_abs.json * Update fdm_filament_asa.json * Update fdm_filament_pccf.json * Update fdm_filament_petg.json * Update fdm_filament_pla.json * Update fdm_process_common.json * Update fdm_common_VIRTU E3.json update speeds * Update fdm_common_E3NG v1.2S.json update speeds * Update fdm_process_common.json fix accel_to_decel * Update fdm_machine_common.json fix speed profile output * Create 0.10mm SLOW @E3NG v1.2S.json * Create 0.10mm FAST @E3NG v1.2S.json * Create 0.15mm FAST @E3NG v1.2S.json * Create 0.15mm SLOW @E3NG v1.2S.json * Create 0.25mm SLOW @E3NG v1.2S.json * Create 0.10mm SLOW VIRTU E3.json * Create 0.10mm FAST VIRTU E3.json * Create 0.15mm SLOW VIRTU E3.json * Create 0.15mm FAST VIRTU E3.json * Create 0.25mm SLOW VIRTU E3.json * Update RH3D.json add more slow and fast profiles * Update 0.20mm FAST @E3NG v1.2S.json * Update 0.20mm SLOW @E3NG v1.2S.json * Update 0.20mm FAST @VIRTU E3.json * Update 0.20mm SLOW @VIRTU E3.json * Update fdm_process_common.json * Update fdm_process_common.json * Update Generic ABS @VIRTU E3.json * Update Generic ABS VIRTU E3.json * Update Generic PCCF VIRTU E3.json * Update Generic PETG VIRTU E3.json * Update Generic PLA VIRTU E3.json * Update Generic ASA VIRTU E3.json * Update Generic TPU VIRTU E3.json * Update 0.20mm SLOW @E3NG v1.2S.json * Update 0.25mm SLOW @E3NG v1.2S.json * Update 0.15mm FAST @VIRTU E3.json * Update 0.20mm FAST VIRTU E3.json * Update 0.20mm STANDARD @E3NG v1.2S.json * Update 0.15mm SLOW @E3NG v1.2S.json * Update 0.25mm STANDARD @VIRTU E3.json * Update 0.20mm STANDARD VIRTU E3.json * Update 0.20mm FAST @E3NG v1.2S.json * Update 0.25mm FAST VIRTU E3.json * Update 0.10mm FAST VIRTU E3.json * Update 0.10mm SLOW VIRTU E3.json * Update 0.15mm SLOW VIRTU E3.json * Update 0.20mm SLOW VIRTU E3.json * Update 0.25mm FAST @E3NG v1.2S.json * Update 0.10mm SLOW @E3NG v1.2S.json * Update 0.10mm STANDARD @E3NG v1.2S.json * Update 0.15mm STANDARD @VIRTU E3.json * Update 0.25mm STANDARD @E3NG v1.2S.json * Update 0.15mm STANDARD @E3NG v1.2S.json * Update 0.25mm SLOW @VIRTU E3.json * Update 0.10mm STANDARD VIRTU E3.json * Update 0.15mm FAST @E3NG v1.2S.json * Update 0.10mm FAST @E3NG v1.2S.json * Update VIRTU E3 - 0.4 nozzle.json * Update VIRTU E3 - 0.5 nozzle.json * Update VIRTU E3 - 0.6 nozzle.json * Update VIRTU E3 - 0.3 nozzle.json * Update VIRTU E3 - 0.2 nozzle.json * Replace cover PNGs for edge to edge images * Update 0.10mm STANDARD @E3NG v1.2S.json added alias with previous name * Update 0.10mm STANDARD @E3NG v1.2S.json update aliases * Update and rename 0.10mm STANDARD @E3NG v1.2S.json to 0.10mm Standard @E3NG v1.2S.json * Update RH3D.json update naming * Update and rename 0.10mm FAST @E3NG v1.2S.json to 0.10mm Fast @E3NG v1.2S.json * Update and rename 0.10mm FAST VIRTU E3.json to 0.10mm Fast VIRTU E3.json * Update and rename 0.15mm FAST @E3NG v1.2S.json to 0.15mm Fast @E3NG v1.2S.json * Update and rename 0.15mm FAST VIRTU E3.json to 0.15mm Fast VIRTU E3.json * Update and rename 0.20mm FAST @E3NG v1.2S.json to 0.20mm Fast @E3NG v1.2S.json * Update and rename 0.20mm FAST VIRTU E3.json to 0.20mm Fast VIRTU E3.json * Update and rename 0.25mm FAST @E3NG v1.2S.json to 0.25mm Fast @E3NG v1.2S.json * Update and rename 0.25mm FAST @VIRTU E3.json to 0.25mm Fast @VIRTU E3.json * Update and rename process_FAST_E3NG v1.2S.json to process_Fast_E3NG v1.2S.json * Update and rename process_FAST_VIRTU E3.json to process_Fast_VIRTU E3.json * Update and rename 0.10mm SLOW @E3NG v1.2S.json to 0.10mm Slow @E3NG v1.2S.json * Update and rename 0.10mm SLOW @VIRTU E3.json to 0.10mm Slow @VIRTU E3.json * Update and rename 0.15mm SLOW @E3NG v1.2S.json to 0.15mm Slow @E3NG v1.2S.json * Update and rename 0.20mm SLOW @E3NG v1.2S.json to 0.20mm Slow @E3NG v1.2S.json * Update and rename 0.15mm SLOW VIRTU E3.json to 0.15mm Slow VIRTU E3.json * Update and rename 0.20mm SLOW @VIRTU E3.json to 0.20mm Slow @VIRTU E3.json * Update and rename 0.25mm SLOW @E3NG v1.2S.json to 0.25mm Slow @E3NG v1.2S.json * Update and rename 0.25mm SLOW @VIRTU E3.json to 0.25mm Slow @VIRTU E3.json * Update and rename process_SLOW_E3NG v1.2S.json to process_Slow_E3NG v1.2S.json * Update and rename process_SLOW_VIRTU E3.json to process_Slow_VIRTU E3.json * Update and rename 0.10mm STANDARD @VIRTU E3.json to 0.10mm Standard @VIRTU E3.json * Update and rename 0.15mm STANDARD @E3NG v1.2S.json to 0.15mm Standard @E3NG v1.2S.json * Update and rename 0.20mm STANDARD @E3NG v1.2S.json to 0.20mm Standard @E3NG v1.2S.json * Update and rename 0.15mm STANDARD @VIRTU E3.json to 0.15mm Standard @VIRTU E3.json * Update and rename 0.20mm STANDARD @VIRTU E3.json to 0.20mm Standard @VIRTU E3.json * Update and rename 0.25mm STANDARD @E3NG v1.2S.json to 0.25mm Standard @E3NG v1.2S.json * Update and rename 0.25mm STANDARD VIRTU E3.json to 0.25mm Standard VIRTU E3.json * Update and rename process_STANDARD_E3NG v1.2S.json to process_Standard_E3NG v1.2S.json * Update and rename process_STANDARD_VIRTU E3.json to process_Standard_VIRTU E3.json * Update E3NG v1.2S - 0.2 nozzle.json * Update E3NG v1.2S - 0.3 nozzle.json * Update E3NG v1.2S - 0.4 nozzle.json * Update E3NG v1.2S - 0.5 nozzle.json * Update E3NG v1.2S - 0.6 nozzle.json * Update VIRTU E3 - 0.2 nozzle.json * Update VIRTU E3 - 0.3 nozzle.json * Update VIRTU E3 - 0.4 nozzle.json * Update VIRTU E3 - 0.5 nozzle.json * Update VIRTU E3 - 0.6 nozzle.json * Update 0.15mm Slow @E3NG v1.2S.json * Update 0.10mm Fast VIRTU E3.json * Update 0.20mm Slow VIRTU E3.json * Update 0.10mm Standard @E3NG v1.2S.json * Update 0.10mm Fast @E3NG v1.2S.json * Update 0.25mm Standard @E3NG v1.2S.json * Update 0.15mm Standard @E3NG v1.2S.json * Update 0.15mm Standard VIRTU E3.json * Update 0.20mm Standard VIRTU E3.json * Update 0.20mm Standard @E3NG v1.2S.json * Update 0.25mm Slow VIRTU E3.json * Update 0.25mm Fast @E3NG v1.2S.json * Update 0.20mm Slow @E3NG v1.2S.json * Update 0.10mm Slow VIRTU E3.json * Update 0.25mm Slow @E3NG v1.2S.json * Update 0.25mm Standard VIRTU E3.json * Update 0.10mm Standard VIRTU E3.json * Update 0.20mm Fast @E3NG v1.2S.json * Update 0.10mm Slow @E3NG v1.2S.json * Update 0.15mm Fast @E3NG v1.2S.json * Update 0.15mm Fast VIRTU E3.json * Update 0.15mm Slow VIRTU E3.json * Update 0.20mm Fast VIRTU E3.json * Update 0.25mm Fast VIRTU E3.json * Update fdm_machine_common.json * Profile verification/fix Fixing profiles with orca_profile_tool.py * bump version --------- Co-authored-by: yw4z Co-authored-by: SoftFever <103989404+SoftFever@users.noreply.github.com> Co-authored-by: SoftFever --- resources/profiles/RH3D.json | 170 ++++++- resources/profiles/RH3D/E3NG v1.2S_cover.png | Bin 55770 -> 93293 bytes resources/profiles/RH3D/E3NG-bed-texture.svg | 444 ++++++++++++++++- resources/profiles/RH3D/VIRTU E3_cover.png | Bin 0 -> 89595 bytes resources/profiles/RH3D/VIRTU-bed-texture.svg | 460 ++++++++++++++++++ resources/profiles/RH3D/VIRTU-bed.stl | Bin 0 -> 440684 bytes .../RH3D/filament/Generic ABS @VIRTU E3.json | 16 + .../RH3D/filament/Generic ASA @VIRTU E3.json | 16 + .../RH3D/filament/Generic PCCF @VIRTU E3.json | 13 + .../RH3D/filament/Generic PETG @VIRTU E3.json | 16 + .../RH3D/filament/Generic PLA @VIRTU E3.json | 16 + .../RH3D/filament/Generic TPU @VIRTU E3.json | 14 + .../RH3D/filament/fdm_filament_abs.json | 8 +- .../RH3D/filament/fdm_filament_asa.json | 10 +- .../RH3D/filament/fdm_filament_common.json | 17 +- .../RH3D/filament/fdm_filament_pccf.json | 6 +- .../RH3D/filament/fdm_filament_petg.json | 8 +- .../RH3D/filament/fdm_filament_pla.json | 4 +- .../RH3D/machine/VIRTU E3 - 0.2 nozzle.json | 14 + .../RH3D/machine/VIRTU E3 - 0.3 nozzle.json | 14 + .../RH3D/machine/VIRTU E3 - 0.4 nozzle.json | 14 + .../RH3D/machine/VIRTU E3 - 0.5 nozzle.json | 14 + .../RH3D/machine/VIRTU E3 - 0.6 nozzle.json | 14 + resources/profiles/RH3D/machine/VIRTU E3.json | 12 + .../RH3D/machine/fdm_common_E3NG v1.2S.json | 9 +- .../RH3D/machine/fdm_common_VIRTU E3.json | 71 +++ .../RH3D/machine/fdm_machine_common.json | 5 +- .../RH3D/process/0.10mm Fast @E3NG v1.2S.json | 15 + .../RH3D/process/0.10mm Fast @VIRTU E3.json | 15 + .../RH3D/process/0.10mm Slow @E3NG v1.2S.json | 15 + .../RH3D/process/0.10mm Slow @VIRTU E3.json | 15 + .../process/0.10mm Standard @E3NG v1.2S.json | 2 +- .../process/0.10mm Standard @VIRTU E3.json | 15 + .../RH3D/process/0.15mm Fast @E3NG v1.2S.json | 16 + .../RH3D/process/0.15mm Fast @VIRTU E3.json | 16 + .../RH3D/process/0.15mm Slow @E3NG v1.2S.json | 16 + .../RH3D/process/0.15mm Slow @VIRTU E3.json | 16 + .../process/0.15mm Standard @E3NG v1.2S.json | 2 +- .../process/0.15mm Standard @VIRTU E3.json | 16 + .../RH3D/process/0.20mm Fast @E3NG v1.2S.json | 39 +- .../RH3D/process/0.20mm Fast @VIRTU E3.json | 16 + .../RH3D/process/0.20mm Slow @E3NG v1.2S.json | 39 +- .../RH3D/process/0.20mm Slow @VIRTU E3.json | 16 + .../process/0.20mm Standard @E3NG v1.2S.json | 4 +- .../process/0.20mm Standard @VIRTU E3.json | 16 + .../RH3D/process/0.25mm Fast @E3NG v1.2S.json | 38 +- .../RH3D/process/0.25mm Fast @VIRTU E3.json | 15 + .../RH3D/process/0.25mm Slow @E3NG v1.2S.json | 15 + .../RH3D/process/0.25mm Slow @VIRTU E3.json | 15 + .../process/0.25mm Standard @E3NG v1.2S.json | 2 +- .../process/0.25mm Standard @VIRTU E3.json | 15 + .../RH3D/process/fdm_process_common.json | 9 +- .../RH3D/process/process_Fast_E3NG v1.2S.json | 42 ++ .../RH3D/process/process_Fast_VIRTU E3.json | 42 ++ .../RH3D/process/process_Slow_E3NG v1.2S.json | 42 ++ .../RH3D/process/process_Slow_VIRTU E3.json | 42 ++ .../process/process_Standard_E3NG v1.2S.json | 33 ++ .../process/process_Standard_VIRTU E3.json | 33 ++ .../process/process_common_E3NG v1.2S.json | 7 - 59 files changed, 1854 insertions(+), 170 deletions(-) create mode 100644 resources/profiles/RH3D/VIRTU E3_cover.png create mode 100644 resources/profiles/RH3D/VIRTU-bed-texture.svg create mode 100644 resources/profiles/RH3D/VIRTU-bed.stl create mode 100644 resources/profiles/RH3D/filament/Generic ABS @VIRTU E3.json create mode 100644 resources/profiles/RH3D/filament/Generic ASA @VIRTU E3.json create mode 100644 resources/profiles/RH3D/filament/Generic PCCF @VIRTU E3.json create mode 100644 resources/profiles/RH3D/filament/Generic PETG @VIRTU E3.json create mode 100644 resources/profiles/RH3D/filament/Generic PLA @VIRTU E3.json create mode 100644 resources/profiles/RH3D/filament/Generic TPU @VIRTU E3.json create mode 100644 resources/profiles/RH3D/machine/VIRTU E3 - 0.2 nozzle.json create mode 100644 resources/profiles/RH3D/machine/VIRTU E3 - 0.3 nozzle.json create mode 100644 resources/profiles/RH3D/machine/VIRTU E3 - 0.4 nozzle.json create mode 100644 resources/profiles/RH3D/machine/VIRTU E3 - 0.5 nozzle.json create mode 100644 resources/profiles/RH3D/machine/VIRTU E3 - 0.6 nozzle.json create mode 100644 resources/profiles/RH3D/machine/VIRTU E3.json create mode 100644 resources/profiles/RH3D/machine/fdm_common_VIRTU E3.json create mode 100644 resources/profiles/RH3D/process/0.10mm Fast @E3NG v1.2S.json create mode 100644 resources/profiles/RH3D/process/0.10mm Fast @VIRTU E3.json create mode 100644 resources/profiles/RH3D/process/0.10mm Slow @E3NG v1.2S.json create mode 100644 resources/profiles/RH3D/process/0.10mm Slow @VIRTU E3.json create mode 100644 resources/profiles/RH3D/process/0.10mm Standard @VIRTU E3.json create mode 100644 resources/profiles/RH3D/process/0.15mm Fast @E3NG v1.2S.json create mode 100644 resources/profiles/RH3D/process/0.15mm Fast @VIRTU E3.json create mode 100644 resources/profiles/RH3D/process/0.15mm Slow @E3NG v1.2S.json create mode 100644 resources/profiles/RH3D/process/0.15mm Slow @VIRTU E3.json create mode 100644 resources/profiles/RH3D/process/0.15mm Standard @VIRTU E3.json create mode 100644 resources/profiles/RH3D/process/0.20mm Fast @VIRTU E3.json create mode 100644 resources/profiles/RH3D/process/0.20mm Slow @VIRTU E3.json create mode 100644 resources/profiles/RH3D/process/0.20mm Standard @VIRTU E3.json create mode 100644 resources/profiles/RH3D/process/0.25mm Fast @VIRTU E3.json create mode 100644 resources/profiles/RH3D/process/0.25mm Slow @E3NG v1.2S.json create mode 100644 resources/profiles/RH3D/process/0.25mm Slow @VIRTU E3.json create mode 100644 resources/profiles/RH3D/process/0.25mm Standard @VIRTU E3.json create mode 100644 resources/profiles/RH3D/process/process_Fast_E3NG v1.2S.json create mode 100644 resources/profiles/RH3D/process/process_Fast_VIRTU E3.json create mode 100644 resources/profiles/RH3D/process/process_Slow_E3NG v1.2S.json create mode 100644 resources/profiles/RH3D/process/process_Slow_VIRTU E3.json create mode 100644 resources/profiles/RH3D/process/process_Standard_E3NG v1.2S.json create mode 100644 resources/profiles/RH3D/process/process_Standard_VIRTU E3.json delete mode 100644 resources/profiles/RH3D/process/process_common_E3NG v1.2S.json diff --git a/resources/profiles/RH3D.json b/resources/profiles/RH3D.json index dbf9500ca0..3e177c5efd 100644 --- a/resources/profiles/RH3D.json +++ b/resources/profiles/RH3D.json @@ -1,12 +1,16 @@ { "name": "RH3D", - "version": "02.04.00.03", + "version": "02.04.00.04", "force_update": "0", "description": "RH3D - printer profiles", "machine_model_list": [ { "name": "E3NG v1.2S", "sub_path": "machine/E3NG v1.2S.json" + }, + { + "name": "VIRTU E3", + "sub_path": "machine/VIRTU E3.json" } ], "machine_list": [ @@ -18,6 +22,10 @@ "name": "fdm_common_E3NG v1.2S", "sub_path": "machine/fdm_common_E3NG v1.2S.json" }, + { + "name": "fdm_common_VIRTU E3", + "sub_path": "machine/fdm_common_VIRTU E3.json" + }, { "name": "E3NG v1.2S - 0.2 nozzle", "sub_path": "machine/E3NG v1.2S - 0.2 nozzle.json" @@ -37,6 +45,26 @@ { "name": "E3NG v1.2S - 0.6 nozzle", "sub_path": "machine/E3NG v1.2S - 0.6 nozzle.json" + }, + { + "name": "VIRTU E3 - 0.2 nozzle", + "sub_path": "machine/VIRTU E3 - 0.2 nozzle.json" + }, + { + "name": "VIRTU E3 - 0.3 nozzle", + "sub_path": "machine/VIRTU E3 - 0.3 nozzle.json" + }, + { + "name": "VIRTU E3 - 0.4 nozzle", + "sub_path": "machine/VIRTU E3 - 0.4 nozzle.json" + }, + { + "name": "VIRTU E3 - 0.5 nozzle", + "sub_path": "machine/VIRTU E3 - 0.5 nozzle.json" + }, + { + "name": "VIRTU E3 - 0.6 nozzle", + "sub_path": "machine/VIRTU E3 - 0.6 nozzle.json" } ], "process_list": [ @@ -45,8 +73,92 @@ "sub_path": "process/fdm_process_common.json" }, { - "name": "process_common_E3NG v1.2S", - "sub_path": "process/process_common_E3NG v1.2S.json" + "name": "process_Fast_E3NG v1.2S", + "sub_path": "process/process_Fast_E3NG v1.2S.json" + }, + { + "name": "process_Fast_VIRTU E3", + "sub_path": "process/process_Fast_VIRTU E3.json" + }, + { + "name": "process_Slow_E3NG v1.2S", + "sub_path": "process/process_Slow_E3NG v1.2S.json" + }, + { + "name": "process_Slow_VIRTU E3", + "sub_path": "process/process_Slow_VIRTU E3.json" + }, + { + "name": "process_Standard_E3NG v1.2S", + "sub_path": "process/process_Standard_E3NG v1.2S.json" + }, + { + "name": "process_Standard_VIRTU E3", + "sub_path": "process/process_Standard_VIRTU E3.json" + }, + { + "name": "0.10mm Fast @E3NG v1.2S", + "sub_path": "process/0.10mm Fast @E3NG v1.2S.json" + }, + { + "name": "0.15mm Fast @E3NG v1.2S", + "sub_path": "process/0.15mm Fast @E3NG v1.2S.json" + }, + { + "name": "0.20mm Fast @E3NG v1.2S", + "sub_path": "process/0.20mm Fast @E3NG v1.2S.json" + }, + { + "name": "0.25mm Fast @E3NG v1.2S", + "sub_path": "process/0.25mm Fast @E3NG v1.2S.json" + }, + { + "name": "0.10mm Fast @VIRTU E3", + "sub_path": "process/0.10mm Fast @VIRTU E3.json" + }, + { + "name": "0.15mm Fast @VIRTU E3", + "sub_path": "process/0.15mm Fast @VIRTU E3.json" + }, + { + "name": "0.20mm Fast @VIRTU E3", + "sub_path": "process/0.20mm Fast @VIRTU E3.json" + }, + { + "name": "0.25mm Fast @VIRTU E3", + "sub_path": "process/0.25mm Fast @VIRTU E3.json" + }, + { + "name": "0.10mm Slow @E3NG v1.2S", + "sub_path": "process/0.10mm Slow @E3NG v1.2S.json" + }, + { + "name": "0.15mm Slow @E3NG v1.2S", + "sub_path": "process/0.15mm Slow @E3NG v1.2S.json" + }, + { + "name": "0.20mm Slow @E3NG v1.2S", + "sub_path": "process/0.20mm Slow @E3NG v1.2S.json" + }, + { + "name": "0.25mm Slow @E3NG v1.2S", + "sub_path": "process/0.25mm Slow @E3NG v1.2S.json" + }, + { + "name": "0.10mm Slow @VIRTU E3", + "sub_path": "process/0.10mm Slow @VIRTU E3.json" + }, + { + "name": "0.15mm Slow @VIRTU E3", + "sub_path": "process/0.15mm Slow @VIRTU E3.json" + }, + { + "name": "0.20mm Slow @VIRTU E3", + "sub_path": "process/0.20mm Slow @VIRTU E3.json" + }, + { + "name": "0.25mm Slow @VIRTU E3", + "sub_path": "process/0.25mm Slow @VIRTU E3.json" }, { "name": "0.10mm Standard @E3NG v1.2S", @@ -56,25 +168,29 @@ "name": "0.15mm Standard @E3NG v1.2S", "sub_path": "process/0.15mm Standard @E3NG v1.2S.json" }, - { - "name": "0.20mm Fast @E3NG v1.2S", - "sub_path": "process/0.20mm Fast @E3NG v1.2S.json" - }, - { - "name": "0.20mm Slow @E3NG v1.2S", - "sub_path": "process/0.20mm Slow @E3NG v1.2S.json" - }, { "name": "0.20mm Standard @E3NG v1.2S", "sub_path": "process/0.20mm Standard @E3NG v1.2S.json" }, - { - "name": "0.25mm Fast @E3NG v1.2S", - "sub_path": "process/0.25mm Fast @E3NG v1.2S.json" - }, { "name": "0.25mm Standard @E3NG v1.2S", "sub_path": "process/0.25mm Standard @E3NG v1.2S.json" + }, + { + "name": "0.10mm Standard @VIRTU E3", + "sub_path": "process/0.10mm Standard @VIRTU E3.json" + }, + { + "name": "0.15mm Standard @VIRTU E3", + "sub_path": "process/0.15mm Standard @VIRTU E3.json" + }, + { + "name": "0.20mm Standard @VIRTU E3", + "sub_path": "process/0.20mm Standard @VIRTU E3.json" + }, + { + "name": "0.25mm Standard @VIRTU E3", + "sub_path": "process/0.25mm Standard @VIRTU E3.json" } ], "filament_list": [ @@ -110,25 +226,49 @@ "name": "Generic ABS @E3NG v1.2S", "sub_path": "filament/Generic ABS @E3NG v1.2S.json" }, + { + "name": "Generic ABS @VIRTU E3", + "sub_path": "filament/Generic ABS @VIRTU E3.json" + }, { "name": "Generic ASA @E3NG v1.2S", "sub_path": "filament/Generic ASA @E3NG v1.2S.json" }, + { + "name": "Generic ASA @VIRTU E3", + "sub_path": "filament/Generic ASA @VIRTU E3.json" + }, { "name": "Generic PCCF @E3NG v1.2S", "sub_path": "filament/Generic PCCF @E3NG v1.2S.json" }, + { + "name": "Generic PCCF @VIRTU E3", + "sub_path": "filament/Generic PCCF @VIRTU E3.json" + }, { "name": "Generic PETG @E3NG v1.2S", "sub_path": "filament/Generic PETG @E3NG v1.2S.json" }, + { + "name": "Generic PETG @VIRTU E3", + "sub_path": "filament/Generic PETG @VIRTU E3.json" + }, { "name": "Generic PLA @E3NG v1.2S", "sub_path": "filament/Generic PLA @E3NG v1.2S.json" }, + { + "name": "Generic PLA @VIRTU E3", + "sub_path": "filament/Generic PLA @VIRTU E3.json" + }, { "name": "Generic TPU @E3NG v1.2S", "sub_path": "filament/Generic TPU @E3NG v1.2S.json" + }, + { + "name": "Generic TPU @VIRTU E3", + "sub_path": "filament/Generic TPU @VIRTU E3.json" } ] } diff --git a/resources/profiles/RH3D/E3NG v1.2S_cover.png b/resources/profiles/RH3D/E3NG v1.2S_cover.png index 03bb5a9e420d6ee748f14738c45fb07f3e39d0d6..f70e2ed35fb29a1f3f9ffebe306d9c85a7babe36 100644 GIT binary patch literal 93293 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 pGzjDXY^k#(?4Yan?gf|4^~Pd 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 literal 55770 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 diff --git a/resources/profiles/RH3D/E3NG-bed-texture.svg b/resources/profiles/RH3D/E3NG-bed-texture.svg index 2cc13e29ad..93e944d534 100644 --- a/resources/profiles/RH3D/E3NG-bed-texture.svg +++ b/resources/profiles/RH3D/E3NG-bed-texture.svg @@ -1 +1,443 @@ - \ No newline at end of file + + diff --git a/resources/profiles/RH3D/VIRTU E3_cover.png b/resources/profiles/RH3D/VIRTU E3_cover.png new file mode 100644 index 0000000000000000000000000000000000000000..085b853cc0e987698dff899750e36613a02cb7b9 GIT binary patch literal 89595 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 O0000 + diff --git a/resources/profiles/RH3D/VIRTU-bed.stl b/resources/profiles/RH3D/VIRTU-bed.stl new file mode 100644 index 0000000000000000000000000000000000000000..c26e99e4194bd82335f03a0be31f64908430d85d GIT binary patch literal 440684 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 OxbCWHqbpRcp8gNjR4+9E literal 0 HcmV?d00001 diff --git a/resources/profiles/Meltingplot/Meltingplot MBL 133_cover.png b/resources/profiles/Meltingplot/Meltingplot MBL 133_cover.png new file mode 100644 index 0000000000000000000000000000000000000000..eb9865c0cbdfeb2ff710db7a101c63c763ff82b5 GIT binary patch literal 42858 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%0D=N*S|v_+f22i;kT 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 Xtt-}#I6Wg@00000NkvXXu0mjfnwddW literal 0 HcmV?d00001 diff --git a/resources/profiles/Meltingplot/Meltingplot MBL 136_cover.png b/resources/profiles/Meltingplot/Meltingplot MBL 136_cover.png new file mode 100644 index 0000000000000000000000000000000000000000..746dfb1fbb2c536d060b43e8b13588615694226e GIT binary patch literal 32398 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 literal 0 HcmV?d00001 diff --git a/resources/profiles/Meltingplot/Meltingplot MBL 308_cover.png b/resources/profiles/Meltingplot/Meltingplot MBL 308_cover.png new file mode 100644 index 0000000000000000000000000000000000000000..cb4df7250e9fdf42d760246a57f121404868b0c5 GIT binary patch literal 36673 zcmb4K1y>wRu-(PogS)%CySrQw1lPCu-g!UZ?KzxT zc4m5Ns;jH+t*VYuSCvCWB18fJ0H_M`(wYDO5b_lWK!AfBjNK}&AqO}MB{^xx5%PJI z>Is4z5MAUA+yMYqs(*h#pE5Bo0Dv5zAT6Qovv&H;H_gPxlkRDKOTfFbOIueVLs&ll zlhL(<12nH0m>Ev5)t!l+{UGGv}l1Ig})x2=ZN0mY;NiG@+ zkTo|P3LMcM(5RhxqPez9k!N!!_wU*L7~k1Nt{=@jZiZs+tWtfoQOCK+eQwKr$G!9W zo%7=LE@jEb+v=6sea%~jO1*EN;nf?yEY)}cZma*F|JZ+MXcdLEIkd25x3{$hpg>75 zz!t9^tw6@IIsJ3rqyNzWsxw#-i=GmL!M3i*69`A8LWob0C!O;nvmf$2K`Pybt&!_% z%7t)t0gec2I}}9JVCD-;yWa>|A82XIlhFK}zRf(yc=B!k`Iy6ln?M?(8GdzTN1vX1 zxpn9pIZ`H2Y6rcyw@9uYAZZVIjiu&h;jzI%3T2R5$xnxOwtm%$mT)I$M6J{ov1I6~ zl|QCDl&zoR#fElwF_qQ6i!$xO2PY@Hf)c-Pk8c2RWIh&btO0+VwDP_&56zdzv5U0f zD!93MoywNP@GQ3QyOnxDwLw>|*!9E~gCRpq*BT&~sh%GwrQmRJov;VpV6?LSNi`7) z{*tE}m)+FJA2l(NU0_(BPt8C(YQruTgdvWKzJylzvEsX-u_1VToPOb^!l>Pz_p5E9 zvf0~l@>A)`zq3PsYytqVYjyKS`>(QcqX6rh7N>yge=n#-^2EkMHuA9g!~LmGON)#D z%MC)-iFV;XWm?&n^@Mua?+Y}{V>2i#*A5Ks8V6whn_aD@*5%`SU1j+|B;6h!D3g6p zyT*Tae5hGJ)87;GFmS*_j>Mm&kY`#^Pl5$7xrvRQ88%7uLA=#{ta~W z*|VDj6c5T@*xag%iLqm5A*o|iJOli>HLeTn5A*UnZRN+UAW`Rn`6uj=*?})w85TyK zC`-3x3AVm*ZAtJy^$H-oXU;pdsnuA1=3PI&@8MzlC;yWjtF^4yiP#D6R>3GCNuGGe zN)?;tzp)n$4f0Ep^Yb}P&h8MpHxHgD|LIVyZt296eSuVfC6Przll?>xwUR{qTcBYL z{geFSp`D-qcWa_=zZ3(C{t2G?t#ujTVp#Nkz_UOqRbeFbpCF|Tz2kGX+-fJ5$|*Q9 z8b9pBA&>KH))SjjH3G0JLKCv=^YC>3)6@i7;fhGz-=GVCq2tY$HhuYj7cSs(L6_=9 z@CLQaOXu6%%G5xfue!W2Ew4Lqsal4$-zNLtc-OibICLg|o-4W#wE5uwiB4yqjU;Zr zMC{zMB$=@!ZuW05P2J@S)Pg^LhPwdAPi>!F{{7~L+ahXL(w85X&P#ZFYft{)qzRw_ zP>Pq_6|mBM4lVv$yf!4j+CEF#;v7tUi0O&=?b!sYU62NcXo#l-cO^jm_x_D}^@Bw6 zWuAoU|E#l>-YmV2T7w7gKf@syRjXl#QD>~GfcsCn0a)?6!J48!ivNkvNeLil)3t;t zEVRe?C%_jkrYSBno(!M_Z4!aCvgqQ{b3Ew(hWoON0j}Ny@WZRG2SHxqw)QOO z)==YrFHOyWt8GUBkpIB{Z)hx#-K_~497Th#_&>XANi4BTC-wg5_uu6FJTI-mhcA43 z`fsv_>T5p!yJohMMB@zl-(w4Y=e4Q={}aIZtyPhws{Q?+aoMb<{6YCAM|Df)mw&gu zPw}=YKDMINyZ<+=jVE4NH`0Gv$j$TcgafwSHXNoeS8VUser$+ho&ryg|0TAxw6x{@ zDyD(dh}09J#~0QFc{abn<1?Mut%CpW8MdO8GmE!l;rgDtFTJ;Tzhdi*I`Zd+O|gNs zs#3*-FqI_W**}c2P~SeHo4#FVy54VkTY7lllvr9mEaZ9bDtZ5kS^0ME`7qM)M#<~E z=HVa*7SBJbnR{?uiw(^nVGIix9o!-MiwzxxMk1MUFxL$^JARE~kYVm-fpwJU{i~XA zGjMRl+1IrxVN2BovL^lS^Zn+2*A}jyl&qf>Zy5|OKBH}Oz279-@@Y8;D(z$+XfQJ~ zTe!Mno+b0jt~qX8mGkYzJNrP-h};`Dyrdopv@XxpHnp~bn5PN@rJ+bVVQCeTpv%d?=puvee+`dA8*bi+RJ+H_g{Ap7VzxBF#Z?;lz zV!eQgSqRh&pO~<&e=%MUk zgC_lZcz`nX@Yf@5gu?@()zM)&j^ome<}j5GkHqxbmm z7*@XzF8yO?>!zLcsgDKxOis2$4)2^($7>vWw&nTlm(FJ+Z_CYYPyH5al{0{9)NKjb zD?-ri)*BYYacy0cteh0nBYk=mC5(sr7`V=K*=%GQ`*(KhrdH00i|hR5IDwMx;pd~8Eth+BB$M_uwMnwgoFcVe^0n`+k0*keAzEbB4& zwN`998~*_x!RPZV>CJP1vFix$`!DKu>)@u0m75!G)~zqT2foztc~Qim0AUTJj$cn$ z&rv(_*=AJ8oEkaHJ`ZE)dw*)`M;}&w@}P46c+QI4Z{G*LzteB=(oVPFHLslPerR|Q z=>3!4FxXzV&Mqn{is2vU{I+Ta247Edir$I6qaD@S?KIyaYOf9FkI(T&_m& zAn+hqeEwC1vxB5L@qE353|;Jn{o`G8CYpfr!C4C9C=Z`lV(r#gx917t#pu}DK$#V1 zzDcWlZr-5()c(@!;+!D2KQ{Qyh+l`QHqNZncmu+XXjH8w2NLl4f6dbpjMDg49l8*EAR zsWY77F;v*xpLmaKyE3Y;3sfIYMNaw8?ph65O6?44f>)N$(z+jzZPI@>PEp z8T(U{p-J|J(OKW$gbjjg2w{2$o!eO|6~rZ)9&(F*Bf zF`n$3{CZ4GVU^6R=_x^FAN`WplTTwk@Cr@~Ir#1xCukTQsDfEVnr0d=(-6C?(kqML#xIq<+u+ zfL(xdUA@Qqef6E`TVIe!!dd;z7dn_hRKdzg1!?xq>$s%xqmon=Olz!zm-M5ou1M2| zLA<8U&S+`{@zTN#ILZ3;{Q%r{dy?u#_4nx47 zpbw`bwSU#j&Fo&U6p`g3lHk2ytG>T)=35=e8bmHE{F^SVF$QRpvs+Vyv-3FHk7#LG zvf69MrK_u(RL%g22ZrBqwTlap}C9D+anaEP#iHVbT;Y zPcGg(J#+X8cuafsjfBdZ`26CK+1PAA86QwS^Z zvvXAXG+ao?Oj6t7s=jAPF}*s@sC-@%u1v_r+oE9{N&ZOvtXW+$9&EF)T>cS#?8du^ z#*+=H`z#Z9c|f{sxX30$5rC{Sgh>b$*R0G`O_$Ltp|vks6$rc-C-=Y%e=al>7?dij!?jnBK= z0t5qyv-)#0GDtxsKqNo`G>_xGr3TKg?W)$l{MMz`@p(O7yZtZy?*tGCu4n3r%G!HO z*}BdGqi#wyi!6KzhVFbm?@2o9+UeMGi~ClD+_Pv;M(`=yu2)mh{L?2G`{mk!{nD!H zeHkEoZz^N!T{=vr#lG*kQov|cgomU(Dn`k;XXT--Y!R|)l%8UC<&fOYK|Uh%G$ukx z36;K(AMT9My)pNK2f(Jue{@ettB4t6WEcS|`ZvsA#~M(W&K^PsAae2O3Nq>I3&%DD zy|Qk+#jZELUeV2+cyfq{M9c>5#C6^-<5@a5)P}QYY~W~nA>iX(zto+G<_!0a=S#A_7Vr&{ z8AL*G+Tb8%_a<61vs{K1#KZykC(CtX$Hxdy1_{y(UlZ~8eYVLHNJV0)71+hZ5)TeO zK$wDv-<=P%7o0Xumzv{7-tw8(m3xCfkLVL0nMBJ^a1PJnGI^R=l@3*G0EA0z4-E0& zZ@4EN$ksH@Mc74BN~Yv!|E|q$X|$TcWo9L9`@r9v_SvZGvW(S|*U%o6n7Fqa$2JHt zXN*rH}*ubI-EzO} zIMj-qFfSe=lRK7X<>W_N$J2QW$3WJOxvw3;)YR0mhafp+sa-6!hAp=yeR?p$FL_|$ z(r0t0a|8%5{fD#5Mqn||8L4A9t5j3SRW#|#lFAXAl`R9`=&zZ_9#;8B$LM;^D->dr z=QZ9xMxl|0TE~CQe}~F-pXrjvvSP>4Z+jib|;dCA~MLb0?`9*6`##=Up;1VJp zF$b3C89jeQz26wLK(?A-v)P~d`QTR0TRnYlqYpof!pzFLJ&4R(WNuUqkJ&=cdWYKS zP53|?7o>o?NOZ4JHRB{?#kd?UJfudS&f0tP^|?m4&0n+u;!&yZtQ& z9Kll)uUi4dBoYd&W0-YI#1bw-t}9ybWaNxhQRioTm&s;^iE=YC&)vyj1%Sth+o{3|Y z^K|tJhL)DD(RoYMxY-Js)bBgcAp|V z0Fss#j!atRE}R=p{v;@sd_?}-$z&4!y4mKfa@yU&X%d;Gll?yO(Fk$!y5S%G9OD&}UNej&67cOZ03iDP5HelP~` zyO@a)#?z*7bEu9+9NT>!^z3mjk2w&hu5zXKx<9%7GM6)d=H>XhmVVM&*}j7k!k(4&7|p4KncT&tRt$|j-4ePhPBMn2R z6{~63qF*pHo0Omo9b3jzMLk2T?jy)!HG!o@RMeLFil>!ri%@Rvw}&nXic6#{z$%-b zkta6X|6+nf$n|)eg4;+%_+eYB^LmnL&Y``qO}1uJa!p=+pHOLPDyyIX-c0iQ)fGo= zUY<-!xx5y3WCtPQ)2k=~`-jkv=s5&-IkCiK|5l4-NeMj?wktOg!{`D^)S+Hu=f(&` zlOFwvO--&K5WbXin;`^yE6qFbpps`0;%puqK^BV4ud$aGOkxqiqba?~P>=i#XozdU zCnAC!I0bDbx$)R+y6~qJ_7P5T2Tw<%C9P&w-%7xPa$72+qOj z@je?Yl8R#gW=;5&&vEq4CVv!?TFSu9Y|N$S&SAm8ycU+K$)?nis2V5Opvg3LNb}52 zwjm((zof_w+JU*d*or!-??H29(mDY1dRum>n;eeyrIUD!I~U4UT#Uw39HrupF-`jt>K+3a6ix(ySoApQ;`Z+>jN z{tX?oLVxjN@^Dun#fM6bsOsAz!{=8TnfxEvhOHwUmD{ROy^vyer8NO& z*+AYh?NrXr!O2EfwNyutcA`ZO2Q$+D0swrzCj;M|B|@^Qkl@HV;CqyZmz&|D+N2Sg z7MgbbAvTNrQ~tk;j=IUn!W(6t zKxu*X?YlIm4tN=)cuQmqlJ`w)qW!i;8GrK6DTiQ*hpRg> zDf>~YOq1A&2?dBt;Qp#YZ+S*bS(K#tK-g1*My~F=d9E~wWl0sk813d+(i;X18j4EX z9wK`~h#kyLlq2=U>3{tCPBbbjS7LueYy#Vjog7)};fIBZ(BpMBSn&2cNIHdD-_UTd z-EqA!=v}n;A|NO@UrZOz)R3(e(Q(OWg}x^EVn3%Nqe0=aO~EpA5Ew?dIOP z6mq`ouVX666Wkdm5Zh7Ra_d^UOje-PN9LEa06@ui2y0Z1_GbH2uB?*?n@;64e6wyh zL;;_&2^6bNo4#~?Zo;mXev}V&Fsk8t;#Mit4t45?LJv3|I==lPp8_M~B^+ZKIJOR2 zw9lH9`1InXhyG_W0l9$@oWHRYKu;PIgh77XzrZoo?_Kg^>+i3vrUD5H1<>ASZo;?6 zgg;89)d56OpC9`k%&1yx>bsE)@g8Qp&m|zCadov5NcBqG=yNn1M;V-R7bf&eVn66~ zM|d4k8v>FEbO3fY%|siKCB7Qla|2<=9zCmF?s$g@(-I73*4Cq(YiV1KM2ZwGl`V=m zSoj9?9YcZ^s0L4U?UXc!-jPKsPHoIQtNZ{3A6KDHCMzog>ugWN1zBj{41z`#$~_!6 zUGG{(jePIzH%v@J$L+ie|0p&BUL%#`VsXD#k}`Pe$M-@_9CEU_R12F6jbpYasL=ic zq@wXQo&W0v$Xot4zOg}!Mk*ZbxZVzTYhvxcN3;coq@0te75U?b<%H3+T&+yKQSv91 znlLnS%6+y&;FG8kM@L65k4qBQkmS2k%=&)ceR&wB6OG~Pe^fE6YieGA=mz&2rm=?e zLXC?mn1BF?;y7XRPXiCP-tTbD%wrqLL$=&sAsNx(o~>85!W5Wz?ps+KuQixYF?_N< zIHJ?MJ-)k`Pt+>OM+8_#LEfVqw!FgdWb8D;(9s0Q3=T+1)G>5*H(x}ktn#h;+~-PW zW2Lj~ixK4n-Dd0{^b?YWS?%?0Nrb>Rwv~8Ux1PQYw)s z6$P11*x<8ww|$G(nc?(wZBqa$Es3T=sF73Gh+wlO+6+!e*a0^*y&gs=v|9j?-~IUr zBzxTGeep4lC@m)o&}zie`{vmo)ACcgV_m8wSvKBMl+YpzAtkq^mIVA;0|tYJl>x1) zZS?8(L_%6$pFcK^tq&iUs=3!S97{WV1%LYXK-C`Gc1-XHhK4SB5#&~k0|==3ybjCW&i#Uv;%9v1|~%5Yt1 znmxvbN{qk|(&A&Fs4XgqkCU4IBir8&Qymqya0hjjN1Dgz`@@GUh-w|OXEPD3rWzT` z$S*b4c~*?$A$2$RBh{NTjGrOb`*%2rYRapVv=HwYX{Rlirfi_B^D*8kn5!A3bK&xr|-#@ZWnnz)_KG)b{p9{AaeoFPwMB~A~ELn)o1Vp^}x8jr@}q>GkQ_bc64si>|Gt%O;A)7iJS2 zeS?n)nnK>LvBG2JDqq!cV9|*A&1fJw?hF@q7=M$EWYbv6wUAy{EifTeq?vnwO!|(2 zVpq~ScWtMre;GoKBQWp|sfNaWn3UKfo+n*cH2h(d0A>J{;7$p3 z1OSd1qqMtBLaMBMFvQZ|QOCOZ9jE@5@r!1`2lpG1&KY!UBP`Zxs5^opg15t3D?!l9 z*gGkpX#IELylvr6hvH3A27*@r9j$P3DhDzY1#_+*1PSBX`}-3cb$ld6mYQ_=UJt?K z4jY~Gv0t)uR|-96=UI=ujI=tOLp`?$>yUha2$No=6Th3ADHLcld5sQh+Gj<0YJ0gA z2CC4?#L9v;3Kat`CuihPtlY8kg2F1>EjlUVjCt35tJ3zydXX|l>Ac*< zVD-7}V3>pb`=uT|MXsXwO99PNND}dU+VbRIV5Ga|uf?OW0HCWYSBQDYY((#9k{cI6 zq36+#@F4gYrbE?aahZF3f`K3rN{tx!0ti79)uhQfBrMUud$=JDZn^cx@RuVnc&wpD z9VR{Gr@qN^%Sq;6&gGnssJU<9fxEv~NPz4t(`DY|*2WZT<7Oy`Ii$O^|I zcRJlyoD5lO!kFsEofe}tm95tbUaZ97k6x4jSlifKUA&!U94!E? z7ui#*wOiLC$A<~zvSG(i=;eA2z+b(qP!MhNUp|rPh@qlbn#|A#+2Y*70 zTshGELUHmyQz}k=R|F4LRv9~~iUhqj0-rz$*Blu6kCS)4-mL>LAfEAN7j8EExS-_j z7y^Xbdx8+;#zw~+?sbVE&N1H(@As_U&7m9FccNexiP=e&2%=TbB?jtP|Kmvq6yq@9 zLVn9^+1KTjCKFSYVqx5Ei?zxt+5IC-#F32BR_oQtlH9{1sr^Erc>1f_;l_cRp~H5# z&!>-`FpWZdAr5=FXfj1X2J3S&aH7rX`*~G*`w_x(_{Q6A+7e-(3gG1cc2py%e4^+O zl3`8PLJi zjIUya<9SMs9(SX3KukuP>1jK0x(pjJ`e82%pc@1K40ra>tVV&)FZr`sSd_^1oOtEJ zQ`?OyZWr1g$_x(~8@cTnDFb6&wd#{R2fS%1UYMoGqh#1)Zvr01A?h)(0jK}1`=>#J z(5h2Mtt@c3k`D{owvmxx;E%F9U>f`~?<@Q^oUoU0@fVz3xZ2&WU2&?!xSu~@fN#m< zfw@#@qEzWHMgwEgL+(za<6N@SGw(uTGmW*MdMcJpmg(;O6Orz_X3P9K+mxZN%iKYy zsASRPkNoQ!E3>3rUKvcO?3xogM=fH8LYPw>YvfqmQpH-moDHJT5Wp{i&+ca8)tWNH zFHF}^1y46(g)1jO>0=MS-EHVf6b?cMo_6R0S2TcGYYvMth|K6R#Jv1Fzq6BJAVZF< zl=zR+JsekI677}-1ED=;kDYjiUNnP8XQO*>P6LeuL&7x^C~^u#P)LhfI#Te^TAIC} zWDM`r?zeF4=yJbwYwwoIPvQLp8?2_J`5$uSb%ez7g@@<;)!v0dptXUMW)IpFXmj9e z6VUQv(v^d3$#(nt$4CgN4piMuP?!a}Fd#0GZ`)x5Th|J#G|nrvD2B^F ze*)CZoa9eU%M64!&Nl{JO&--ou=+zMCs%pxk_)1Vese<&L4uOc)*c}A(7=(c zVLO_mbs$P1UjLq1yBhv$I;Nm z5N3$H)^PfQJtW{k07|uk&WwNc2_yRMr>3Uj%V)mUA15BmD1gZtkJ>;LtkwFA4Z-_o zV*&T?b4ljROG}uR`+8Otv%v`62vS_!_GE)o`b!LtFwOCtgkQYa>5@-26P>xO$h>>1 z?odT{Wi6z+p7%vQNlxiEYNZ4c7s|DFZ0#Z5{k2QJ_zX1ezDE)gk?Ub|@7>db3S{jH zUBFN?eKwQz{p;26J>5_+%0JK2MIDXuU_o3nWsr?#jT;k{{(8h`n1g6cX>x)BHriEY z@DCMqUWk?W;98pvgwqjA)qnA50Y(bY5Ao40{FGm$Mi{Q}veSt3w(2$${-SEM6}=D@$f2pIIU=H2Z!@D zrKD~IJ{Wy&{`)k?IIEuxoHDHi+bTol01YTX=|dPN27L|Mher$BEq_rOVgxmbJ<*yDD%XWxD_1en)PShfXc%(Gzs(v z6e>ZQPA;m+F0x$KkG?u|$+62UNl{E9kyH_h&JKt47HM%H*dafMP`Cvn zu2%_D7|uhff4b_e=JP5Lc=OY4M9PFqa}`Y>MwGKsF{ne3GWsc17X~LwVox6J`qDfn zmyR~CTcc9}sMuJwv*p%jlB z*keU8Q*>YixL%RFyyQ`goURXifFg55P%NszVY2&O9o{yg6O5m=-#MW`ns_mf+G<0| zH{KGCe7U`FN$#r7xWp3XgCU~{58+_}E?`TpV0{mSwT0Z-0vUb6>rc>wRlOL*fp?a5 z{@eqEjCRtu){z9U3`%j-v6{66^5e7fC0Lv!kgS4#rb(B2Xi&Q%MkfG@4r5_$GBy>f z^jNN|AitO;7tZz~W|>qYo<3stV{vW-bX;~|A2k6Fl>l7Pi|8^s0%($dBwAe3w1!Um z_h|a=R#GLWGW}g|GG}mH;iJAKph6HppIKOCID;ru|DmH1PhZi+-l*li=fj8;T?+NB zmDqP{PDc%#c2@KOUaEo5$dZMe(w zkvM0PtoRHlK|rzS$g0&wUvZe=KSB?)rf#<3NVwZG*m~m%!i6bd4a=06dKe;CfPuFy zu!tBay}|~EP<8Y88Qvw9?|l-+Om+mpKRa&K{aGXgrRaSlbBVZeECti{s|!LOr8wZa z_tL{i7L2Xml2<8}k6!4B0qZHtHfA!lS*5(3%x$(MPHmWss$#IbUUODov`ps3%aT9a zj?LlZT<&vT4fD3IEa6;&1wFf5l-M;Z$mbAEpGu59PPigm3J$E$M6}gp8TKvrFo)nG$1DaXxqX<~u=2oqf_XD+jC{ z3Z4&4=9Gp zNwXpMhKjA(`9&ftO>6aqv^ip#>ly`9?(m%X^In4Dv{N+9`sEhTDS?lCn69{-I%#gu zyBlDkx?PyDO>so8*&^Y2Zy}V!oV$P(Z1@}PQ^BY_yK07t!L)5WBaEs9LkbHfgg<5% z0>2>&gZiT$+|x^tP$+yIUdp-b2^iu99>c!1qUCz3G7<$iMh9Ex z!|z5c;x&CGJjhFAMf+4pt09hfS;6Q0t*pI2I#OS)+qZ^7Q=wqJQFsy0M}z`z-7^LR z!eckUxZ6oVEys0;aDTwlmv12y^ny9XvgC+23PX4Jp~_22k3w=gzP3H6P~zN;LB;-( z!h0Gg17K*>8#1Yzx2jN?#>7AmNblzF^I5A>bd8V1Rf|Z}o2KH)TU@J|2otZT0{2C) z?Sm*d6pU319!60QQsfV$mbkXP)(R7B0v}jP`(z|y8Ry#AY@nk3mLskvNen}6ql3lf z6S?S7GB-h@;=2^St}*pSP>+=`mm|p&V7_?bx*Egr6T>(E4_`^aIN$DnkrghUK_M&= zC0edJ7k6Rj=$SBVqd35&l%h)4_OlO(q|Gb;Wb!#1KD;!?!BZT}&akrSxl+DSf1n>k zZRCa)J7rIlj3YtEJOaPQ_t-(Biz6QzS5f0ed@W8mpLBQG3E*k)94v6vpZV~UGbTsQ ziZ>x%!CgQ*>VhUIIg-g+Hd(4lKq2z>`Wpl1bTAh?TpLacn9?Jrl`42tVh^lTT$Y-O zt^4>Bl!Et>TbjBIl2P=6L`hU)k?!D;va+4Zgj_s29Gi65?F}^3nMA7H_~J?l8qezu z1P=`w+P%p>{|PP^?<779l0?{=$lnRHOxh608ZIX;rDxfKMX>LO3q9uL9yT(~p6yAz|7H!I8kg;!KOF45c}THh{h> zhK5El{nMa0aT!D|>UX;7*;z|-bD-37@99tkYi)R@Ly9Xx8wel9THH0Lo9;#)k^O@Z zS^<{NoiTs{^UN$E#J1Oy@K#dCys{%$NN_j8?T-0j-uq=b(RGAvI=$Nc^ zQ^B(=FksO4uYBn@e)ry75j>!! z7rAdqd}xP1ygq4&2q_=l3f1ME;DMq>{8G&TZo?R$@;9_?g`S1HQ-MlB_*fZnerc}2 zoTP1T`2)*34vbEBsArs*(&)PEy)+h1VFey~85Rved2J{JyGB8bbcSG{QBfsvmBtS9 zYG$PbSc?pRpj=g}O`zl=6lsdzib*Wv+mWd(yvUHH9n4ThpMsY9od%AMy)DQ)wGjjE zDuHrsiCps3Wv@E=NvW6(V3F1VSW;Yc=04#s#S5m6gmNl#%ft7=iYxrnc~&@$0}5Bz z^BvgES|oEmAcjsO4$H&BNLMj#l5p3aAsR>8bqmCh*KtbNo!bb}fWR+AEPcswspvy* zk*U$Yqb2dRr9FN`c2pJzzQ6jDrg^agLuCt@_Ask_=*WFjr(_B3@CAu0=>6>KWA$+I z13~of8I}XR^mrN*rQ0^|D}AKKIEv2GBR&27=T`S=N+5(< z!C@=VBGOw?^&6!aH>Fegyy%8Ejg)`ESe222E=N+Zm~$B;vVYRD zLoiF)$Exm4fBO9dY`mdM{gn+YA4AbW8XlBA%i4XiQ0mKEKpw3oQoI@ za3Me)^f|7K!w;2eBm}U=V$4J99U3DdwTy_Crd~>^!GQI4B*<~8B&bg@kz+?yRhn@k zido^)w(LpFE;qpD*E92T=!h_}*cjFbNaRUfDJNuXqDj)#`i88kWuGxF(@KJ@$fJtO z#S`2*9%waUkP6B7kJ%mnK2m!i8J3yZJW$ikDdr0sDO^qZ3*TMCpryGF$!%70vY!2s zX3Useka$;eyBZ27lg(zKkDrSlyfX~XDcK!J8ttK&;qekYFc3~RY1Oun;m#rESQh7~ zplZa_k>7#iPrB5{-yMMVdX{j9RiqLRFF8~X1nEZ^$A#txJ_ez<>#(+N#{U(*cLet# zVa&C$BmWYSBgBPetYvGUa3Xb6k${wW3BOaGwpk8+GtT6O3;zX(MGYSej%S!NZtfRf^Lp6O zW%H)%`{S!S-G-?hZ1e&J*Ey=_d5g_8JPde2GL_^%Q;kVYwDYm1!!UyP@HsT9pfL2* zOFNZKVEI{)f|tfDTnR|Qca~zuiz{_9&~ZdVG)v)aX9s#|U#?X3zYB3ukz*R6mC)lW zA`WPzB)}wv$VF?mk{no}(`rQ1dLdk?rVWcT2?j!arxl7LuRK+c5vY`Yl9+cQ`dL?C zE*~h}xlR#=8Y%dV*|b~7HePrZ3K2omapHt<+Tcg-?Z@I5B?Vk&0Dzvv z+Wd${k}ep^`ho^6t5anvF8%eC76x{FJ(Fx=dab-tT351J#-?chH8u5>CG3+TXttO? zjV_e@&uVtaP?kHfnjo!r{YV@xtmXar<^yC8QZ$KB{_x-+)YI#9YN>Il22R(5KhkR; znO%;Bg#|I5i3g@r_itIqjxO92e;sb^w(b!0i=Pz>xBc&Z&#texE0Bsiq1@piyC^Si z0h@`UY?dAg3BSmqG8q7}LBX$ce>cu$*}w*s`%A~Qa9om0GuFmT4E=DbXBfE+21YVN z_{owtI6w2coyXB4cHUMaFwWb6$g`7oH~L5o^XqKe2G)r9R}fS$Ho0Uzp1#3vGdDNR z9EZ~Z2%Kg@Y^z4Nd}rr$HU*XBK454^B!uR-+>f4TYGZ&wVNf9;AsLDJyk-|=jH&!t@k%{m*Y$G-s21-b`B0;@a5%D z;&#(m`(DOZ)9729200Demp!pSxYxifqPr>6H_lq44zz;jjibiS&Tye~AMCX=-hBUS z1^>I20;!yGNDBd^hZ|B|ODK4MT-mPg>5FObKd^r|dVg8@x94SBD(KZ*_-Yv2=XrfA za;oDa8b)JhW3bpmSWw)N*t_h@!g?U0bU38hcYCqm&F^I!{$9d99+hZj)M)Dox$|z# zelL=sCjaItF$inDLktZn$*C9WjL8&Ext?dHsRML+K?Wmko9j)Jqu2KXMG9kP<(P)E z5bJV7)T8eneH>jRMCjrL2~y)W{I@j;+dxC-DID%QnV71T*22V~8O8|=eS)z%7f>yc zbGy)<0MVMGWbv$U{4aTCgbq|y*8lYa=tnH9++)HB$urPv&dHb)24*Gme;}vCrlsDAOHrw1*M!$9R2cY-8we>W*udo)NZw1_UxZH1U4ZcCci)1}+hoSHI zZS~-xi`=l22HbF{sjmIK`RK6q)=4h{g)9?DcrdV&_=HG{MNgfMW>_;O_4J(C~iyK17xHg5R_L+~ zkVEzueSpp}gUkS$|B=u=0FZNJ5_X6D3q`pARgrMp?H3x<`XSS@z_wxiL2bnETYTRE zlETs$S*igO@6CgVkHspR?m`K6CsIz8`UWu+3jhtpi58Rz#;+LuqY9xUJ(bveFbBR) zw6C38f5;Kf^GhN!(wnscS0hJc)Z}IT0)v2&NEW1+NuzpV;x#vQrAi# zcRg3=1rI{P*W*+^vwnd@si~>feCiU?;q=qc{63c$qPJE3W9vbWj+k+nNT z^uvhh|Il=nF?Ds#0zMqv-QA(MYjKwrYmpXrcXxM(Qrw;5?(PmR?oiy_xw~I-6ZkddY57wMA>KlXpW zsR!V@IUIbUD`frrIU0yFPjqY(AW*hDU(R7UC_jH_QSDk*K+t=}5Fd?(%zc6=rwT%A zt&R_{hf)5||$>^?mfB75;|nN76QGyon8>1gYi2`^6i319K`Yh}b7@QQx;v z*#z2fvfoY*>~AJmB$Tlp-!?x!TdlU5CE>B&L%Wo0{ywQS&OO*LIGl8O?4KI$d&BzjZmHc3i#pN3V*z*& z2tw|R=+aVpr#52X3l*ivJi?^T+=YBbCh36h{$e#Y5Edn;u6E~OH{Q%5oEAk@a?5e9 z=*E7C*jB7+F`8&tk!KyQ5KHL3<|7=IL2q<7#&w7&zV z%UtXwP<- z0r@?@anx?n1E~qo(+9J~aI+L;0+`FOwx@IZ0MJ;ne7zUod60&-BLMuFyT)XKz(_L& zc(bFTqQI;SUx-?NRr+Q@0=aH8!BZ{uqKU9Huso z1DBm{H^#)X+XGA5--jx^leq`{<$rk%ayCG}UE%s(`RH=^_7UpDGE_E$gB?Q_LNux& zI!2Z-7|dY=Gx0a20Cb0>Fl}#unZ(2rGf?7ma zc45U*Y23_-@@kWq&D^ILSU5|FTV`Fx%fda(i)fchWS z?a%*J_5MxKg)z~)flj}QShc+wx|&Vdh{zijEkLSdWqJak3C6_U-uk0=tJ_ta=)-E%M zXY*C;r^|BT5)jnafu*>r z8lN~}^L(KDH)CRAc68sz9>gpM|IJvS`Xrh^(>)kXXs}gT){Zkp7AH3lkkT!F`~^7d zlN1CI91i1Gd7n+~O0u*wS&94 zqwGts^wdt6Wt#RI!%!kqCnf`4{inNRfiWxy*Q)d1cQ;`_ux?OLnwS7&VbA!u!r%5P z0Hv?1v)r}Zc2Vs2@I!CVtY=S8GlLviP9gVv7B%uD5i#6skm3GmR0d&!2bp6fiw43C zhPFu-e!x(2riVbU1|ry(h{MtZ=@+>N~X*9fV;lsYj>C?{ZBMX|#kC3b+z6P*Ts*ZKs>5BindQ2Qn zubpsOV4Jo-DooJ=v4G4S9i{)Fq53{PB&w=&&8M~U-dzKLf>Z;rh5qfBgM(7`cmJtN z5|+ez5ItX{y8j}V4caf{$#>h=XSH-Xe@2^MP7#g%f^QfaV<5=P4mr(CbSw9T2pJsS z0x}|2&7ZkU1876k-URCE;j9PJ$b!qV`e=?QxPC}N-%o!9d`JP!3=XGq^RfenD<@EO=rqfouJ z0s+`~Bb`E}5?oiIh$2mhZ8fa-I}GGoT+rQrn>rn_b3mDe$|e6Vv9hs%5hq2I_@ z=UWxcwBHDvE<&=br z6n{mJD}N^pD#Me)Bhz<%$YZTw(>>0QkoaX%S%S!i;$QG~oula~raL)7gC-;L>Lu3C z7Rz-myLR$30Vft(jH)g+srPh6^R?Xfu4{K8r4#Dq{%i=<_YpKoIk5f^ibC3}`}Uu& zc-3NGx$e!U*ZYfC8k?>+?0@3!bm%+5&5g7@pj~ZkzNY&|%d@P5L2ehGn}Iy-+jpIt zLnDiQT6FIp{3^w`c4YG1;=5G9S@MTV>ZbZP+#u?)nRNPOAc`e*y&r;Sa zx214>SBrZCJob9z{L_K;JZ&h24RpFq0aU`zAXzc7hrm2T$8ApZ)L;58U`iSfJB2PY zhpNx8Y5q0gY#F}qPjm>;RbEf!fCCd7r9&`!Kh$XG?hak$xo!zanC-+7aI1|rfhq|9 z%EGH9!`SVjbesPE{vcZpp@R%Zz#2W$43-OB)YU1*@~_m_(y-PeH^Xlehm_wQ-1sxYr^k6-c-iT#sMPV@cG zJ)8slOtdgRjYuxyN#K@qG220T^h|5XVLx=)|N;4Bxj zu<40MuJnOV9kLsEL76%Wim|q5$C#nf^*{U};nJY|eYc{-Bn3Fs)31IKY=u--i$5Sw zLL`Huxl5M8T+**ksz6g%g(_Sue+Fw(Ui$A+F5k2L?0uE@8zCU#nTn7(eg7_(V8BT> zUIB!wB!=Ch_NGMfTS zbOVa@e}17aAKpDHlZv>%= zaJ(CpGJ<3t)JHo4yKJ}}&bFH}77$Bje(3F**Kj3Ccm=vgc zBpY8K3eu~Myp9{;K~FxWxYp`b6MD#`Z`OPe&`aVn?-VPb{XpBt^#Xh<@1VZ?rQa zPDZIi?*z)Av|Bfbfj_K=Ev2(EjLWSklek6gZn(gZ!>%x^NPYRKk|!A9lSj{2M5|-W zAVbI@rmFPhn3E(12;1Hd>#!zU36U&-z1=VTVtUap?0sMNc;D0+4YV{R03hAEX+31s z))$%}x=6TVLJHDw*U(2I&8bf|VP}A)6Z&7@BbWD;ieLA|vYtmfyq(WtLzjAs0=5vj ze5HS*#UYD)^@T3NlmyISH-NqRuleLg+h()Q|L=kS+jzIT-dQ&;Ll$?RPpZV*00#&) zfQ%?|yNotLWAuLW+6qG00J-`(q_bj}rjhxIl>P#k93`w>zI-dI4+YQlRVR2aw`=tL43%yLLtX+n4X3jUIP}-%&Lz zm&2)I5@qy(FINPi9hF!>fOys}1%WvnuVEK3;F`UW=2az3}sX2TLpqMIu;z;iy$#Lt)scRJY8Z-YLE{XsJ{9Fl9 zL`DP_;2wjI3z5RdhDb=m9~E4Vbbl1ooPYnEKj||rq0D)hm>ORc9{uT5V1|rz6dXym z4OLd$njs7gjuF|VFM)&%nwddw-#^d|{9)UHeRFdY61m-i2JthoAPuO?xwyhdMn=Mp ze{e7SvnNxuUGVQomtw<5!iS^!$WTB1hY(U2k9SDK8}Zg>I8(n5G>Y@!{9+-|n)Un| z(CwU5rfhHR$N5`)&0bQfvH1IQ2k+ImN#$Jo(>uA>q5Zk4{`FiOP5 z<6{OohN zlqFn8swOu{$m%4%Ml^q7p%;E)>HlWWIO0-f@LA$JJ+pjNW?Vw4Qj(-dk{bj}6aKh@ zYj&MF$-VWTj)$Wo2vHP>3AK2T$Fsw8M%|*$3DC>#wCgK-7iRw~#IqRhH#aWMx{7=Y zB4cXkvC~(bT#??=z_C2bZ z{FG<>0%QueMDH2?yWvI%zSWOl<$*i1o`t-`+1lPmr1sCp6!*}OG(a?fiDTl7OT%OI zK2l3mq}(CLtXoTx?&gXno6NJ-^rxXKSPE4xQ;bZx-1jf2l zF8fH;e<5*X0gWO>(e5sd#lE>4=b*EL!?Z`&w-*cW&6zqz!>-J-Mr_h%}v|NdE&0Ji@+&eyTd3!|5f zp&rjxZyovM1;ZY6^p0g|X-TijnwEkh>^~&Ry{5F&oe22`Ml=0m2+L34MG7yfd^6hw zw%(-0Ue7XgnSF7ffb)myo1%(1?v&n?*JD$>4(1CT4pD3MRFUXAx|im=6f> z_4Aj#`FQ_L)J0lj#1?UuvQG@@PwSd@ z#L(W4NPTonG93O=kFHC2GGe`i1iS&uoS4J{kc`gt9?pJA$?z{9mDv&5h)S6bB?kk4 z*9?ko?Gjie!nf_bH$%!@=E9L0&O28(nU_Axw85N{Hr`_f2%&(52gHmIG!3HT3)NS% zgUnh~LMLEUfkws2TS?9AVln3}<;-Og-;V~w)e6(0ijRcD(Id?n*8eQn(IQbKl@-gE z5mcyQ>uegSFI5b$t~!DrWx>!bW^ciA*|jd&1j%HdB1EJL*SqniA*t4Dlo1qx+cZA)Z9kYL@6DMR({gx*miYZLKI-DRVtwj5VE# zncmx&K|$Q>MuO?L#cw9|uSm>gooO$of=8Lnk|%X_BbN|ZH+Eq z`xi!B0J?Vwl0J7jF|1$y_(%HS*0Sl;kO#i8ye8RD=h?vlD951WuE=lXL5O7mqjYPE+Zakpor zNgzOLp4TKZtkY!rI~sQ5D6x>;Gdq6HJ<MY*`Ip{#le0{VMlI0wYy4MkDlDcLK*qRj_3g-PE}b z3D0A_b_+UaT(sa!@^ckO<(gR?=k>_7gNd_t0$-?^*Qg&izmBbLSQO+GB6I8ksoNNlJ52wdN+<@ZWk=iBQvVaUf2 zKRvUK7D#{s*jAZ64)A?)OGc?xF*M(ZTL|zezLMKj+rZzDpEL8M>qjcc&HjJwK(Gv>Ue|!ldp8NefMlKOO+1c$v zBt{TM!c-q_A&+EOHizUulx%n808!!mcf{+bHiD!%_Zw*1HrNaoYxpz!qC9y6(Y$tE z52L06vN7#n@=};sPcqJQ{kkR0#~nz+RG;PX`2+c3AcRe@{npy9wHBV)R=0>v=YA!% zgZiUd6VK0gm6Vn=nO5QU<8zJZ0+51nCYwctMb53#2rq^rUvw4^!7N*h>&gMY$Ae$F z9c?7i1_N)>dF@bdi9{CUf|&W>TK`L#LMu6BJnEAmNcyYNrprKR`3mAny?T|#_^rY5 zQIY_!#sRs#+Kmtj=-j+*Jd z-OP8pf8~h}ms+JhDH-D!`Q?$+0pi(l?IVtC%RP-M%Hqik8dimc~&zR%s(+GWZdN zQ%p{N&1ng@6)(|}*x6(x8WJUMh>CXpH5rMb&P7)ZsUY449nT1+K%{pUWLF>AwE)K2 zv&LBm!LVk#!sG2yZK2=2@cs9y@4-3&(Y!7gg)ntcS8ta4%}OObmJ$wL6Q&w%NCJV8 zT_hMq%3@a&nqN-QkBIy$VhD$~7cp<&KEuy8JiVc(6)}B2uKWITBaf2WB(Jbt#a2sT zKZrncahbF|7j5n&RH;PAC!kRb*yCgQrq@U=2 zDD?(5q!A(7jPLChI~YGkQ$xeSK1=DByr8vv(o*Gc{}V#$3<(D2*LAmspM1I`ar<%b z!)d}vXzT5f^yXmLHs0+N@h?a?Z5n*Bal%5c*1hKytBF)de2|t(kijxR1*f0OD};jC zf`+2uSlQ9yY<5e38GBe-YARxd?4oMpq_P#>m&x89p~*NxD32(@sm2=kA&j9pe>%P% z&oGCz*R=7-I0POJ5<4jMO7;GMeT5bhjS%`X7q|$D*P9#7<*mqCFLj3DyS~WWXY8dE zbat_$hafq7=MEOv)Ph_VN!}Zmoaj6}tqhJY2ncuUc@0HmmDeAoZ^f>NcsOW~4= z^%+-r-ys$|<#D6HPeYUs_T5EIqsIb#&#mi!PWTmyRjrw5w0!K3r)XB~_uDgzpRO~) z6QpvKWc)@T@X<;KSiS`&k1`*+sK% zI917i#cj^YSBhkAuv2?c)wm`53f}{w0|t+KFJaR#VR=r(;KxK? zFQIhFblc@G2?nI!6=s4(HaVkl_hpVdyf^8YL?^Jn@$FjC_-A6_7KKu_Wr!Vx{?F-!1~Lq^JK zhIC6YI%02q9a77CrI(*y>9&YbSV=BV5b>4SBt?ZJ)`#yF%V#=)*q^g|H>s|m{Yy8O zId!lL(R4CK_iWT9T=iRXN<^N$IK`ze7M+GHs9tUA%l z<8{bBomH8l3O0tO5lCg0fypagEVSzf)4u5Rowufo(PJQ@I&C)}4m+MvJ@0ZZO-TnMtVwCH14Y8-$m~!g?1xJ( zI>?I|%suFJ2xu_9tqEcRWl)84$?7$@tN}GTkcE7;SDuWN>C3SwBsBzL2s!5xohe+% zt=C^hF+QGdkDdc+QF8Ejp9qH7s_N-$#$Xlp+scM!Z;or`=f~2Q^FE*-$x@LsDnZ72 zyQJmh9ou=b+kmQ~ql`p#PQu*Uw%#SW`C#ux%P28oOe@Z+uyx4y8%i7*UpT^Q25%QI zOJT^uhmZ<=y4Y5zdG!$BUCFM9Oq>2l*#uC;5A)ZPW(PN{U~w|yAiM`Ezba6ENSx}X z%b{yOBsNJe79#0&(3SR6Am!Q9&(`c;ocv(-xI%>dW=N+}BfAZWZJ(f!2pWIvLG^_* zM9T8M*Ia9^IinSdcY-M7B1HSUdGuW>21u~Z=pn-3Xt}@iM@leCsab=qDB@v*imc}; z%oQ*-jTJd}_e$1DYyGGDvL{S*#^;QYXYq&G^OMbUg)2Kx-jZ_0`l8fmLQaVAxOF7@ z`663$C|>S*)u(H5$FX2&vef!Tt$9igJ({$aTb;6edgL;0JtG|x127VC6$3Y5$vM10(N{@B}6Re&q>rm`b@{P$PI)+lbHesmL7x0D+u=w z5BlVOnz|bjV_Yl`F0?cL7wq5kw%#6Cw*OPt9RNCH2}+~R2;J&cx_$rV&p2s^%BL_J zy4s?8dV0FuzjDN9P`->0#??NZx1w0Dw&rGU?H>GTX{(e^SW|(A)#~Lx?bi2aUou9> zu&D?k@IR!a#}U;ENQKIZS0$klABbT&F}U_8dn8MXYDmE`(Ac8!NtZbGw^)_!R{Hd| zK-CrB@#QHl%nyehfq0#sQtHTBzyqn8wB#3Kcg4+Cr716No5!#2!SoC9{Ax2Sp^mQppiyE&DEB-(+GPJ7 zx2gEYnTGOdFL%{kv*qF!Qm2BphQD1xQF*K^{2#|!##n241AVE{RA@p(ObjMuo!#?A z#`Qhyg$&J17_cJ>YPxftnIn1Wz}OMv5RRf zhvURj1qY>9K6Lnu;aJbn3~lCMlY#P!%=6N|&fz)Vu>asJ`i2=g$SH@%!L(Cv2#Y0b z2d$S+VSxtvD-2M9##L;Zm6Vr*%FFVC*2(yp(weqeC%a@@! zFbT=`Z?d}G^R2np$4ix-qa!A&&?8xx-;~!rbiH+XMHe10WK#%V^({Ku`DY9NO>ep1 z2P6&wW5--8$dwpIX~3mF+UsnEidV8zv0N5v~f> zQDO0=Q?;y%sllG+^THB{An~+|sB-%8x~G>@(M$M#Net8k&ROOxcth6vnVEUlW3Zln z*S9_g_Dcyv#T> z|Fg8opcDUq6aO7CcGA2sh@rgv>cYZwsU z8@}_72OZi=*%jD0L&E8%%h%07Qav@K07IV<7gah$nfbX{8-@{?<=%9%f-U`A(Wt9N z>wJ$3EDl^OOiOabrtg@>aZP{x!q|e&#o!Fa34U`(44<_?n(JAfu*>CsRY~n{uv|2Z zR6RP1-}vvYT7@sKI8c3rb-qJJ4q~e717L;`(u#UEHb{J~6SI>Tw9KKYyrI9RE2JSL zLyCG?q59mCiP)@>VQVvTY&;FHTt@1?g2$uQ*R{##&TvFFooAMZU^MM~bJL6LUm=1v zUEu{p93J8^w!X+<9l7UCM$wRW4h&@F5&2R5T6@nC{Yn!bXl0OpG|!jnArUJ~iqy+& ztB|-i+1#(P2bF7d*U$FjgE|bZ_)F#|<4F!r7JMs2Sn{iOr}5Tr>a8fqf<<643=?D( zYnHCpRXxzZ7ck57oNpe+Lv3LgI~RQ+sc`AVR8J^-Q(0}RtsLqSH@~T4m5mxV$?s(< zqo?bs>4RYI2|XNLpy?v+Nv8G)Q@E9V0o*M=4MgJyu}=ABQdYvj87N6ULB z)Dgzxz!$ywhyRfAr`|aTzCG}yHXs?!Dy~0tXvrk`2RUa8mEwotRRk=G#;nN`L5O*N zJ)h0pBysf|TY>*Q!2AVD+(SL(?K-ZJP+W49#K(%UL++y23n)Nx;757T8=IPX77Q#c z5rMfcBNQmuI^^<4_FQpjT@lfrMo=yVU0{WFvYVKH_6H-{ZV#|{%clH7s`yj2+XNgw zuyVX_650Yyg)z5-bywE)?7Rnap9&M`ldtiiui4%g&ySZG0hJdbb`4!@lw9$+IM&S_ zR<@$nT2waijteO%gV{x#BWi7A-?Bm@*g_zbt6)O*PP=@BOW392GkRGu;_lvzuXR$> zV|jz2#$=#)&+x2Du-yNP5T`LB{$0qatrVb!TXPol3u0AWlcY)`%xb7*4~OIx-K#tCtoLb8 zd9C66%2)*udi@)2L-wTm=2C5Zkcm1P?e^zIF;P| z5!j>m;O!XkrK~aio2oT-l~mM5(Fp=2%#d<#-ousK)y@-qU?BFu5%ZE!?pVqaF~+F@ zQQo+z?wXBgA~GYS!=4A;oB8I1172zZZL&e--2_g8aI-=|8UBGuL;))<1xJXIxc>GZ zZ>IBaVzW(XVy5I)?6b|mu^fJ}URPr{7`Wev7zz&NOI2+SE|;ao$LoNgbX+`_b2 zg8c{{iX+ZFf2n_^G0bQ_fCA;5`~>}0EDre3lr4KAlT2pQ(AJk=M5ykFa}u)J`PJ{O z5gI>`LA|mhv)iaQ12mM`balO*KSOsOv+X+QiXH}6WKQ9;%^s$wbetU3&+D+n*VoG( zz53t!3mAxF28MDE8VF{2)+|L_cxnA@ZYg7g1dCI=h;Uvi(V@J?P(4~Hb(4G?`Ebyc8-`Y`N!7*RlHlZLKt-)`)OfC5co9@X&NhlWj%BNl|_#H;E_TEo2`5hTib z(KI452l)}+zqa5v&~TC-yW*SE2>d~o8@Q_Do`6|*Lu}Ex*~@*5g?AUK?8Ux5&MmW_Sw`md>h2?Mq&&ISFjzOlUJU8uNP&#glYqjL zTf`)y)^=s#MKzkr30WXwrnlG9nDg}{eEK`^?-Wvr{ zJ4~rPS_g_(H}Y~c5_=3$a;4rJ=VW0jKCx@oz9s7ge=&NTGsvV4U!?narFD$JL9LlJ z853FY3shtYIX>(_MINU#>yrlR)-VRh{7WI4<^+n<%!_088>7wI(%{z(FH9g$!F#G- zyT?f!iD1ATG;By0)9`7?SLVd97xYQNQT_Gn6Pf&JS{cqmBsJ1U)R5u0Nu3NU!r91^ zR}3MKjh?M7>bN#=!2BCRL}6WX%xo2=Zkfn*GNZ?cU0J5RA?nD96v+3pu1`OsN?B)o zpmMeMBlns%=3+~f@XI|+#>TH zt1E`=SE`~H)q2We0ECsVx}_99!_sStb4 zBIc>3e{=zBbN)&9hqm}?W2NtT4{I1%j+BfcyvXrQFS5XW zWDdNz(9R%=C?&}Arc&JZhDKpd&)FLJ%q*zmNT}5&3%eX1I(9Dn2Bqq4%Q-{Xm*nNe z)9nscxO*g#HdANYD#C>`VyWlvSc?7eJdKM>Wh7yC?L~sn_3?j}%|70Q|E|&kqyTe4 z-)mC+`9?Eo$~D((s)dDxwFfSkuYylT87@f?pSKbEE9eh#!N*VR)v(ybehfhl3|ka4 zhslYT=C%U1tHw3%9+;?~AIV^B;`2-kz@p#vi*|YsFigwsWTi9^l6pWf44>lsK=kVgZgoaYX5Xi z4V3G^#W~P|H{(@XGZXMM$h$jSv^KR(ZIQr*Bqz90yaouTM7`+S<-(@QJcS z{w|1X2K<=@Lav45KseN}r{-7_aw-PS3@hi5*F(L{K+Nm0yKrCttryMZ&=F8o{-LGW zm{>a}-%SmyVGk8ZnFa6IKX_V2TQgJ7+Zwo{z!99U%wTfgGMm3|~ zS!sk&4oo9}G|eOHAr!et``LUtyvV+I)RaqusvXs6J{=>47b_*kignD-pA&ukWernNy$o5WKD%I6K(%^1Son7~hdVuPWCUK#`#teDLbod=svja5 z4@#>Mt}c*MR>iiuG~nb{w-1VJ{b|sFSIU#+{dOU%tdAwTlje%S{M!{g z-h8K>n*Dyu)c)}9$@_At>5QDB2xswI8Xc-!jPB{=j)vEWnUJLGB*cG~PY?ehSdtUF zQLV)WFS0(4!Bx|_iP^y~BU!>&J7KDo`O!S8$H*8A!%7l6R~>Ja8$P}_@BN_f?M)oA zCiYe9Ltm)3WB-+7YHLQCbij&RoF{w8ga1|M87?S$#4W1PnvEpZaFq0Hr0-RXa8e?+i`7Io5{7LG_CJP(a4S)7*MykSo z&mS?a$GSlk3zj`=rBI~7j;!X)Y_NyE~h5Z&fvNf)f`}fMFqL-M)RB{hw2<}XjTwpDSi>d-qi>`qplU|H1m>gx z;m7~J`u`SPYl~Nv5K8my+cUy+frdq)SWTs?i(~LUjbQZIa*Y%`RGrQVyh6^CNwe>; zr4(sU2@x=d#N$dJbm=ha+zyaf1ur0^R#wC<{^gQ9X2&iq_A-xfva-~zo9rvjqodUR zCW-bn$fhh864DLvz%pAunbDmewx`jWKYe@Mb@NUup_d{4=figY=LbD+!_SSJvKe6% z)Tlj4^=AS{=u~KjkSs2eT88e5F>p{7g-v|D_^3Z8oLN4l@qvY4kmerDreAzMPv-~U zoim@h`mr)nj0LD2I5tqL?Y%L&4n3o&1=oD?cn;M2&4~DVZmGZZyOwC#Oe$l`izuab z;Kymb5M&q${LjSt;iT{Y8QI39xtK9`O;q#KT(CrRnP@|2gwVYg9H(!YPMG^ta1sVa z{Kf~1PJ0+2?(%hB22UB1HX>fm3-&fp^oSCcxwMFk|>UjGd&Wr zKg?wrhUc(S33S_2f-%_f*Vl~@3_td2sZr6tVGN~D7Y^jObq890?|$0sTfV&R$YMb8NWqw z5EU~kg6|yNO|TIy4R}u}EDF;zIk=$qcgbM-UawO%Wr~RMdNbvJm;65xsQJ(tUL1|$ zWFw@aAl06aH^nnI7>(n=@0y+JTG0?dZxMdY^P&U9G1&PRVQNZ4Q&V||cJ4@M<8dZ- zx-q|mg0oo%YoYGvgE$Eulk!0^a{V}YUgzIh2(kywMOwC$;8|zYt7lY2_T?tCN}ZnA zkGTuO#yVs~zpfkNjOWbFZp@EcUC?e~0+!#A)iIuHfh*3ay!e8X0R>h;!cReV<4*b+ zR0um$Q`mBU_VfYw(U*lJQwX&%(^0~<5X7PG4>xM^>3BvWuU_k>c19e( z>Io9$H+>%5MPFE4WXpCnTcP;{`fDJOIt%+#%8itH?Jq;BrV`cnzk$PEZe$FX3UXyW zzGV<96-+6!D&%J`IwBXO=rF@kC&E6MZL2)2rh{u*Oq%s0h!gO6FzY6c&9_b2 zO*K93CLipNt0l&Ap-|Um#3LGPs-t5$?Bl?&^oQ0wih}-B=GEb38ati7ufkrw|Fv9N z-jG^!g@;oXRb2d;QM^@gQfqK2Q?g4E1%-wp#BpjHkc*wC9m}~TiS5<%W@S}Tu9tL? zEOGsp>U}a9DQ32xt)A+8R#6Bry`&bbD8*Ouc@V*Ox|oc1{LnA{eCU?1t*z~oc%o(q z^NrJe(!Ff&X4ezVWY%XyH;n0Y+jl5n?+r_`YM4gR@T(l3jSXd1IO7t(z^)5SBRlTi zZ7M`A@ed}rwEKp7G6w>o)W}MRsx6(HIMb_5D^*I}-vPHQA0|%i?8o|mVDz)`Ur&Ym zNviZrZBZvykP-(KAA-|e5B5=j;@km}DnH(EJ(EAU$a-et;P=GA;meo#53TH&yw6QM zPn-ot&3&(Y<@{~qLD)KAl@q?gF8nUC{Pg3rS|o7A^G?OM`0ST*gc>*fo7Po**3w3I6@N$Zubh#l$0-W(f5{8!}4mE zv@0Bt#C^AEeLo(S1ifK^f-&6X8nK6uPo^N1dYB78^s>gnT}fYz1PZ4S_JN_UFA}8j zX2i1jvFD%l;9vwJ=?%r2-3Bd}h%IfK)Bx zU1xR=ky#W1NE?Qf&m*_BWUN=E3iW7lH*(CiXcgqbF7y?4A)~}kGo5~iGw~TB5wHxS zzmv>|8cb7AZcxfbm|ys<-S$Zc`HiT#25y_1Yvt8tK2MC{+b1ONJ+j`9VK2r!ziD04 zeG+UhF=-rYF^#r11!*CS5UqORA@8ee@r`j?EQZr_(g;hv|P1A7n0IxTg~ z(S%i{C&9!g*7?i8l{^~p&|{qXv2eT<@!MTgoh9cZBdLj(&tE?xm|J}X*_TAj78kA# zBR}wHtF#9SA2tRi?@{;>$J7u%F)i+Thu+9MHhnRos)F>k%eU+ePDt=N3Lbp zTe;-ootvI3>8ht^^Ffy9Og+>4&JSRg#zq#$-JyV0MU}pxH%WIOr!16KI3Z4x4(R)oA%)|z zUY0A=#$DH|_qS}pbB=C7!A3j3DcvY;qtN7V6Nef&_zFODOLLw_c)s!g%w`c{fC8cn zTR0x~&k}97@^k#}PMx`2tN1T}^hZ(CZhL3PkvFFMxOwv?X45%3+sB)z zX&ZdzH(tOCzy9l90&Ef&Y!J%~qn>h7FuL+`hIm`IfTA9s$OJ-AlINL(te4j4=NNFp z1q`aTK_)8(7ys|p+mLD1-9YWN@kTR@!jddy4S<31l4Vfd1bILtYKv=|eE57@9nM_7SYCuHdDYzJjNod=hJ`YZ#A5juuTOvm?`{D8mcB3;??OFq9o+ z?cSlxAbXA^MA4PYmwDk%KG4m}$qc;I@WW6r5r&U|;+>~GpR#g*Q9!^D$gB77bFC90 z?kHMTj#ob}(0E=T3Z60f#Bw2V* zKVT97rtn_Y+NinLb)8>0vL%#SO?}rp$t=Hv$2O2L4nJZ29fR_)`<{L5gNNgGpPAk# zSd)cw9h7=vAn;c?lq>Fi^dbq9cA+#;8&e1r*+!MRO-Zy=8i*Q`v>Ahl$?yH%KUdei zM#jnSiK|zy;`P^G$L6U`oIZUT_no{ClgT7{3r5>@BDI4{i!-%&V@=Q1G6B#-SSVVO z2NB~iNVqF70J%FA+cD=PIWAiKwOw30vamLvWQ}mgX)H0B7s+51-f*qFsWFAeY8qIevAuS%T| zh&wOH`Zs^`fAG$`?_qs?BjO!nKi&*D!LE`re7Dg#WDV<2balfa{dgk7*jb z@aa$Ex4!sAtgNgE&=V2(j04xQ3o@`sD@o@9qHIAgJ)lKfn<=TYQ|QX&OUz3z){2_V zfx1U|mot+#s$mAhgV{@o94s_v9Qqxh=&9FUqlT2Sdt1|0bE3&%7Zs}5N`6`w1E&XF zM}3lcfffOf2N6E7{ib{Hw8Zt`qV-j~R#cm(8rVT=HMDeR(lxjKQ#%(^VPaaR6b~^v zsoEjS*`Bq3FIr+mrJZ5UGm-0CWwivfxv^rto9ho=KrpB%o`ez3w9qNd!cYaEF#7rN zU=1C9=cQZt9W98$G!TRgq@JYG2P7Jf_`}hD;O1h=`syiw8bzQP2nbZN7PFC|%JEhf zK=H5Q4xjuuIODQ-c16t-Tk>q&@%T5UCgP0nA)1IOYUiI%*!CAmnEphU()8A)ll zrH(4GDbE5+upWzF7VK<#*06T zimLg?rK05WnM1(RJk=|kB0+8>wIIaC)0uHpqdOzjb}HqH)UZpf8=YoHz%8=0GR2z+V#)xN2S>u~-ebyuU7jmBCd`M(Qiv8~ zAn}^3Q$)jH-hszIyqIVK#z2QIZL&Zv@D$mNSS}-=Tk42#aSf<~?sK+AXkan(;?7wR ziV;J5B=|OM@v&J8j|@RcNwNU!{9ziH;^b-B;z}Kc`tO#NGrk>JcDkVk?sn2>yW8z# zH;a7Q&6Pz%S$eL~_PXTR2T2_ddAsKNbF$^QM2IM|v|?e?Enk>|Q-WNy@z$>*3W#Ka*NuvJ`li?J`1WP zNgr^54rezXIPh}~45Z4`U|ve*nL(z&oV{w%y;Z6MagoX^k{A-^k{jJtRnKZclDRQEmuj_h&J$fd_a0TF0t97hK_q8>ZF#uGZW+ zf?hL|913FPLtF=*swry;<=o01f^OVoeA?2DghxTMO>RPx6;e~+x^9^|Bp z>7;>q^u_lQ;bU9u@dwDZ4l{+xnOd>#4|pnx@=n)e0vri^DV5l+n7DvYDts-{C{_9Jd*XYiQ)hN002ov JPDHLkV1hb&_zVC5 literal 0 HcmV?d00001 diff --git a/resources/profiles/Meltingplot/Meltingplot MBL 480_cover.png b/resources/profiles/Meltingplot/Meltingplot MBL 480_cover.png new file mode 100644 index 0000000000000000000000000000000000000000..fb7e11d5b232838b4b3053164e302368ec482c59 GIT binary patch literal 36570 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 literal 0 HcmV?d00001 diff --git a/resources/profiles/Meltingplot/chx350-texture.svg b/resources/profiles/Meltingplot/chx350-texture.svg new file mode 100644 index 0000000000..130afe556e --- /dev/null +++ b/resources/profiles/Meltingplot/chx350-texture.svg @@ -0,0 +1,5 @@ + + +Meltingplot CHX350 build plate — 1C Navy HUD (outlined) + + \ No newline at end of file diff --git a/resources/profiles/Meltingplot/filament/Extrudr PLA NX2 Matt @0.4 nozzle.json b/resources/profiles/Meltingplot/filament/Extrudr PLA NX2 Matt @0.4 nozzle.json new file mode 100644 index 0000000000..1f759767fa --- /dev/null +++ b/resources/profiles/Meltingplot/filament/Extrudr PLA NX2 Matt @0.4 nozzle.json @@ -0,0 +1,21 @@ +{ + "type": "filament", + "name": "Extrudr PLA NX2 Matt @0.4 nozzle", + "inherits": "Extrudr PLA NX2 Matt", + "from": "system", + "setting_id": "AL4mb7soA7L0FKTb", + "instantiation": "true", + "filament_max_volumetric_speed": [ + "10" + ], + "slow_down_layer_time": [ + "9" + ], + "compatible_printers": [ + "Meltingplot MBL 133 0.4 nozzle", + "Meltingplot MBL 136 0.4 nozzle", + "Meltingplot MBL 308 0.4 nozzle", + "Meltingplot MBL 480 0.4 nozzle", + "Meltingplot CHX 350 0.4 nozzle" + ] +} diff --git a/resources/profiles/Meltingplot/filament/Extrudr PLA NX2 Matt @0.6 nozzle.json b/resources/profiles/Meltingplot/filament/Extrudr PLA NX2 Matt @0.6 nozzle.json new file mode 100644 index 0000000000..c7984aa06d --- /dev/null +++ b/resources/profiles/Meltingplot/filament/Extrudr PLA NX2 Matt @0.6 nozzle.json @@ -0,0 +1,21 @@ +{ + "type": "filament", + "name": "Extrudr PLA NX2 Matt @0.6 nozzle", + "inherits": "Extrudr PLA NX2 Matt", + "from": "system", + "setting_id": "OCnoqOQbcfgikNmA", + "instantiation": "true", + "filament_max_volumetric_speed": [ + "15" + ], + "slow_down_layer_time": [ + "20" + ], + "compatible_printers": [ + "Meltingplot MBL 133 0.6 nozzle", + "Meltingplot MBL 136 0.6 nozzle", + "Meltingplot MBL 308 0.6 nozzle", + "Meltingplot MBL 480 0.6 nozzle", + "Meltingplot CHX 350 0.6 nozzle" + ] +} diff --git a/resources/profiles/Meltingplot/filament/Extrudr PLA NX2 Matt @0.8 nozzle.json b/resources/profiles/Meltingplot/filament/Extrudr PLA NX2 Matt @0.8 nozzle.json new file mode 100644 index 0000000000..a28a1feca0 --- /dev/null +++ b/resources/profiles/Meltingplot/filament/Extrudr PLA NX2 Matt @0.8 nozzle.json @@ -0,0 +1,21 @@ +{ + "type": "filament", + "name": "Extrudr PLA NX2 Matt @0.8 nozzle", + "inherits": "Extrudr PLA NX2 Matt", + "from": "system", + "setting_id": "HO2NCV1i1l21mokh", + "instantiation": "true", + "filament_max_volumetric_speed": [ + "20" + ], + "slow_down_layer_time": [ + "38" + ], + "compatible_printers": [ + "Meltingplot MBL 133 0.8 nozzle", + "Meltingplot MBL 136 0.8 nozzle", + "Meltingplot MBL 308 0.8 nozzle", + "Meltingplot MBL 480 0.8 nozzle", + "Meltingplot CHX 350 0.8 nozzle" + ] +} diff --git a/resources/profiles/Meltingplot/filament/Extrudr PLA NX2 Matt @1.0 nozzle.json b/resources/profiles/Meltingplot/filament/Extrudr PLA NX2 Matt @1.0 nozzle.json new file mode 100644 index 0000000000..545acdf113 --- /dev/null +++ b/resources/profiles/Meltingplot/filament/Extrudr PLA NX2 Matt @1.0 nozzle.json @@ -0,0 +1,21 @@ +{ + "type": "filament", + "name": "Extrudr PLA NX2 Matt @1.0 nozzle", + "inherits": "Extrudr PLA NX2 Matt", + "from": "system", + "setting_id": "dRH4HfWHQPwo33cP", + "instantiation": "true", + "filament_max_volumetric_speed": [ + "25" + ], + "slow_down_layer_time": [ + "56" + ], + "compatible_printers": [ + "Meltingplot MBL 133 1.0 nozzle", + "Meltingplot MBL 136 1.0 nozzle", + "Meltingplot MBL 308 1.0 nozzle", + "Meltingplot MBL 480 1.0 nozzle", + "Meltingplot CHX 350 1.0 nozzle" + ] +} diff --git a/resources/profiles/Meltingplot/filament/Extrudr PLA NX2 Matt.json b/resources/profiles/Meltingplot/filament/Extrudr PLA NX2 Matt.json new file mode 100644 index 0000000000..b9f864f79f --- /dev/null +++ b/resources/profiles/Meltingplot/filament/Extrudr PLA NX2 Matt.json @@ -0,0 +1,79 @@ +{ + "type": "filament", + "name": "Extrudr PLA NX2 Matt", + "inherits": "Generic PLA Matte @System", + "from": "system", + "setting_id": "qmPRaTcPlmtk6zB2", + "filament_id": "OF1PznHI", + "instantiation": "true", + "filament_vendor": [ + "Extrudr" + ], + "nozzle_temperature_range_low": [ + "200" + ], + "nozzle_temperature_range_high": [ + "230" + ], + "filament_max_volumetric_speed": [ + "30" + ], + "filament_adaptive_volumetric_speed": [ + "1" + ], + "filament_density": [ + "1.3" + ], + "filament_cost": [ + "13" + ], + "temperature_vitrification": [ + "50" + ], + "full_fan_speed_layer": [ + "1" + ], + "overhang_fan_threshold": [ + "25%" + ], + "fan_cooling_layer_time": [ + "100" + ], + "slow_down_layer_time": [ + "83" + ], + "cool_plate_temp": [ + "60" + ], + "eng_plate_temp": [ + "60" + ], + "hot_plate_temp": [ + "60" + ], + "textured_plate_temp": [ + "60" + ], + "cool_plate_temp_initial_layer": [ + "60" + ], + "eng_plate_temp_initial_layer": [ + "60" + ], + "hot_plate_temp_initial_layer": [ + "60" + ], + "textured_plate_temp_initial_layer": [ + "60" + ], + "filament_diameter": [ + "2.85" + ], + "compatible_printers": [ + "Meltingplot MBL 133 1.2 nozzle", + "Meltingplot MBL 136 1.2 nozzle", + "Meltingplot MBL 308 1.2 nozzle", + "Meltingplot MBL 480 1.2 nozzle", + "Meltingplot CHX 350 1.2 nozzle" + ] +} diff --git a/resources/profiles/Meltingplot/filament/Meltingplot ABS @0.4 nozzle.json b/resources/profiles/Meltingplot/filament/Meltingplot ABS @0.4 nozzle.json new file mode 100644 index 0000000000..837e55a36f --- /dev/null +++ b/resources/profiles/Meltingplot/filament/Meltingplot ABS @0.4 nozzle.json @@ -0,0 +1,21 @@ +{ + "type": "filament", + "name": "Meltingplot ABS @0.4 nozzle", + "inherits": "Meltingplot ABS", + "from": "system", + "setting_id": "NjuuWYHSc7IlwWAy", + "instantiation": "true", + "filament_max_volumetric_speed": [ + "11" + ], + "slow_down_layer_time": [ + "5" + ], + "compatible_printers": [ + "Meltingplot MBL 133 0.4 nozzle", + "Meltingplot MBL 136 0.4 nozzle", + "Meltingplot MBL 308 0.4 nozzle", + "Meltingplot MBL 480 0.4 nozzle", + "Meltingplot CHX 350 0.4 nozzle" + ] +} diff --git a/resources/profiles/Meltingplot/filament/Meltingplot ABS @0.6 nozzle.json b/resources/profiles/Meltingplot/filament/Meltingplot ABS @0.6 nozzle.json new file mode 100644 index 0000000000..d73964b709 --- /dev/null +++ b/resources/profiles/Meltingplot/filament/Meltingplot ABS @0.6 nozzle.json @@ -0,0 +1,21 @@ +{ + "type": "filament", + "name": "Meltingplot ABS @0.6 nozzle", + "inherits": "Meltingplot ABS", + "from": "system", + "setting_id": "md24RPsRyxBhGRoW", + "instantiation": "true", + "filament_max_volumetric_speed": [ + "16" + ], + "slow_down_layer_time": [ + "11" + ], + "compatible_printers": [ + "Meltingplot MBL 133 0.6 nozzle", + "Meltingplot MBL 136 0.6 nozzle", + "Meltingplot MBL 308 0.6 nozzle", + "Meltingplot MBL 480 0.6 nozzle", + "Meltingplot CHX 350 0.6 nozzle" + ] +} diff --git a/resources/profiles/Meltingplot/filament/Meltingplot ABS @0.8 nozzle.json b/resources/profiles/Meltingplot/filament/Meltingplot ABS @0.8 nozzle.json new file mode 100644 index 0000000000..82c5ed8935 --- /dev/null +++ b/resources/profiles/Meltingplot/filament/Meltingplot ABS @0.8 nozzle.json @@ -0,0 +1,21 @@ +{ + "type": "filament", + "name": "Meltingplot ABS @0.8 nozzle", + "inherits": "Meltingplot ABS", + "from": "system", + "setting_id": "Y2LYeWL7Zxel3m0c", + "instantiation": "true", + "filament_max_volumetric_speed": [ + "22" + ], + "slow_down_layer_time": [ + "20" + ], + "compatible_printers": [ + "Meltingplot MBL 133 0.8 nozzle", + "Meltingplot MBL 136 0.8 nozzle", + "Meltingplot MBL 308 0.8 nozzle", + "Meltingplot MBL 480 0.8 nozzle", + "Meltingplot CHX 350 0.8 nozzle" + ] +} diff --git a/resources/profiles/Meltingplot/filament/Meltingplot ABS @1.0 nozzle.json b/resources/profiles/Meltingplot/filament/Meltingplot ABS @1.0 nozzle.json new file mode 100644 index 0000000000..a74a3a1925 --- /dev/null +++ b/resources/profiles/Meltingplot/filament/Meltingplot ABS @1.0 nozzle.json @@ -0,0 +1,21 @@ +{ + "type": "filament", + "name": "Meltingplot ABS @1.0 nozzle", + "inherits": "Meltingplot ABS", + "from": "system", + "setting_id": "G2UYPHTEWjun65jj", + "instantiation": "true", + "filament_max_volumetric_speed": [ + "27" + ], + "slow_down_layer_time": [ + "30" + ], + "compatible_printers": [ + "Meltingplot MBL 133 1.0 nozzle", + "Meltingplot MBL 136 1.0 nozzle", + "Meltingplot MBL 308 1.0 nozzle", + "Meltingplot MBL 480 1.0 nozzle", + "Meltingplot CHX 350 1.0 nozzle" + ] +} diff --git a/resources/profiles/Meltingplot/filament/Meltingplot ABS.json b/resources/profiles/Meltingplot/filament/Meltingplot ABS.json new file mode 100644 index 0000000000..c947cd55e9 --- /dev/null +++ b/resources/profiles/Meltingplot/filament/Meltingplot ABS.json @@ -0,0 +1,70 @@ +{ + "type": "filament", + "name": "Meltingplot ABS", + "inherits": "Generic ABS @System", + "from": "system", + "setting_id": "zVQixgSSn1jm1c7n", + "filament_id": "OFVIMei2", + "instantiation": "true", + "filament_vendor": [ + "Meltingplot" + ], + "filament_flow_ratio": [ + "0.93" + ], + "filament_shrink": [ + "99%" + ], + "filament_shrinkage_compensation_z": [ + "99%" + ], + "filament_density": [ + "1.1" + ], + "filament_cost": [ + "30" + ], + "default_filament_colour": [ + "#F8F8F8" + ], + "slow_down_layer_time": [ + "44" + ], + "cool_plate_temp": [ + "110" + ], + "eng_plate_temp": [ + "110" + ], + "hot_plate_temp": [ + "110" + ], + "textured_plate_temp": [ + "110" + ], + "cool_plate_temp_initial_layer": [ + "110" + ], + "eng_plate_temp_initial_layer": [ + "110" + ], + "hot_plate_temp_initial_layer": [ + "110" + ], + "textured_plate_temp_initial_layer": [ + "110" + ], + "filament_diameter": [ + "2.85" + ], + "filament_max_volumetric_speed": [ + "33" + ], + "compatible_printers": [ + "Meltingplot MBL 133 1.2 nozzle", + "Meltingplot MBL 136 1.2 nozzle", + "Meltingplot MBL 308 1.2 nozzle", + "Meltingplot MBL 480 1.2 nozzle", + "Meltingplot CHX 350 1.2 nozzle" + ] +} diff --git a/resources/profiles/Meltingplot/filament/Meltingplot ASA @0.4 nozzle.json b/resources/profiles/Meltingplot/filament/Meltingplot ASA @0.4 nozzle.json new file mode 100644 index 0000000000..f567231b8d --- /dev/null +++ b/resources/profiles/Meltingplot/filament/Meltingplot ASA @0.4 nozzle.json @@ -0,0 +1,21 @@ +{ + "type": "filament", + "name": "Meltingplot ASA @0.4 nozzle", + "inherits": "Meltingplot ASA", + "from": "system", + "setting_id": "4EBXMyiXoLrw5rLC", + "instantiation": "true", + "filament_max_volumetric_speed": [ + "11" + ], + "slow_down_layer_time": [ + "2" + ], + "compatible_printers": [ + "Meltingplot MBL 133 0.4 nozzle", + "Meltingplot MBL 136 0.4 nozzle", + "Meltingplot MBL 308 0.4 nozzle", + "Meltingplot MBL 480 0.4 nozzle", + "Meltingplot CHX 350 0.4 nozzle" + ] +} diff --git a/resources/profiles/Meltingplot/filament/Meltingplot ASA @0.6 nozzle.json b/resources/profiles/Meltingplot/filament/Meltingplot ASA @0.6 nozzle.json new file mode 100644 index 0000000000..96553662a8 --- /dev/null +++ b/resources/profiles/Meltingplot/filament/Meltingplot ASA @0.6 nozzle.json @@ -0,0 +1,21 @@ +{ + "type": "filament", + "name": "Meltingplot ASA @0.6 nozzle", + "inherits": "Meltingplot ASA", + "from": "system", + "setting_id": "2UdzXwYGT5nqtcdK", + "instantiation": "true", + "filament_max_volumetric_speed": [ + "16" + ], + "slow_down_layer_time": [ + "5" + ], + "compatible_printers": [ + "Meltingplot MBL 133 0.6 nozzle", + "Meltingplot MBL 136 0.6 nozzle", + "Meltingplot MBL 308 0.6 nozzle", + "Meltingplot MBL 480 0.6 nozzle", + "Meltingplot CHX 350 0.6 nozzle" + ] +} diff --git a/resources/profiles/Meltingplot/filament/Meltingplot ASA @0.8 nozzle.json b/resources/profiles/Meltingplot/filament/Meltingplot ASA @0.8 nozzle.json new file mode 100644 index 0000000000..9e6d846c7f --- /dev/null +++ b/resources/profiles/Meltingplot/filament/Meltingplot ASA @0.8 nozzle.json @@ -0,0 +1,21 @@ +{ + "type": "filament", + "name": "Meltingplot ASA @0.8 nozzle", + "inherits": "Meltingplot ASA", + "from": "system", + "setting_id": "4hk1aKrMkppVYH4z", + "instantiation": "true", + "filament_max_volumetric_speed": [ + "22" + ], + "slow_down_layer_time": [ + "10" + ], + "compatible_printers": [ + "Meltingplot MBL 133 0.8 nozzle", + "Meltingplot MBL 136 0.8 nozzle", + "Meltingplot MBL 308 0.8 nozzle", + "Meltingplot MBL 480 0.8 nozzle", + "Meltingplot CHX 350 0.8 nozzle" + ] +} diff --git a/resources/profiles/Meltingplot/filament/Meltingplot ASA @1.0 nozzle.json b/resources/profiles/Meltingplot/filament/Meltingplot ASA @1.0 nozzle.json new file mode 100644 index 0000000000..e8bc7d7a32 --- /dev/null +++ b/resources/profiles/Meltingplot/filament/Meltingplot ASA @1.0 nozzle.json @@ -0,0 +1,21 @@ +{ + "type": "filament", + "name": "Meltingplot ASA @1.0 nozzle", + "inherits": "Meltingplot ASA", + "from": "system", + "setting_id": "JRSnSdwkvrQx8uH8", + "instantiation": "true", + "filament_max_volumetric_speed": [ + "27" + ], + "slow_down_layer_time": [ + "15" + ], + "compatible_printers": [ + "Meltingplot MBL 133 1.0 nozzle", + "Meltingplot MBL 136 1.0 nozzle", + "Meltingplot MBL 308 1.0 nozzle", + "Meltingplot MBL 480 1.0 nozzle", + "Meltingplot CHX 350 1.0 nozzle" + ] +} diff --git a/resources/profiles/Meltingplot/filament/Meltingplot ASA.json b/resources/profiles/Meltingplot/filament/Meltingplot ASA.json new file mode 100644 index 0000000000..180ef14e39 --- /dev/null +++ b/resources/profiles/Meltingplot/filament/Meltingplot ASA.json @@ -0,0 +1,70 @@ +{ + "type": "filament", + "name": "Meltingplot ASA", + "inherits": "Generic ASA @System", + "from": "system", + "setting_id": "5VuPxdOXfTIidM4X", + "filament_id": "OFRdywGp", + "instantiation": "true", + "filament_vendor": [ + "Meltingplot" + ], + "nozzle_temperature": [ + "255" + ], + "nozzle_temperature_initial_layer": [ + "255" + ], + "filament_max_volumetric_speed": [ + "33" + ], + "filament_density": [ + "1.11" + ], + "filament_cost": [ + "46.65" + ], + "default_filament_colour": [ + "#123123" + ], + "slow_down_layer_time": [ + "22" + ], + "slow_down_min_speed": [ + "15" + ], + "cool_plate_temp": [ + "90" + ], + "eng_plate_temp": [ + "90" + ], + "hot_plate_temp": [ + "90" + ], + "textured_plate_temp": [ + "90" + ], + "cool_plate_temp_initial_layer": [ + "90" + ], + "eng_plate_temp_initial_layer": [ + "90" + ], + "hot_plate_temp_initial_layer": [ + "90" + ], + "textured_plate_temp_initial_layer": [ + "90" + ], + "filament_diameter": [ + "2.85" + ], + "compatible_printers": [ + "Meltingplot MBL 133 1.2 nozzle", + "Meltingplot MBL 136 1.2 nozzle", + "Meltingplot MBL 308 1.2 nozzle", + "Meltingplot MBL 480 1.2 nozzle", + "Meltingplot CHX 350 1.2 nozzle" + ] +} diff --git a/resources/profiles/Meltingplot/filament/Meltingplot PA6 CF HT @0.4 nozzle.json b/resources/profiles/Meltingplot/filament/Meltingplot PA6 CF HT @0.4 nozzle.json new file mode 100644 index 0000000000..5fd012ed93 --- /dev/null +++ b/resources/profiles/Meltingplot/filament/Meltingplot PA6 CF HT @0.4 nozzle.json @@ -0,0 +1,21 @@ +{ + "type": "filament", + "name": "Meltingplot PA6 CF HT @0.4 nozzle", + "inherits": "Meltingplot PA6 CF HT", + "from": "system", + "setting_id": "yUlzU6KMVx8bpxj1", + "instantiation": "true", + "filament_max_volumetric_speed": [ + "7" + ], + "slow_down_layer_time": [ + "4" + ], + "compatible_printers": [ + "Meltingplot MBL 133 0.4 nozzle", + "Meltingplot MBL 136 0.4 nozzle", + "Meltingplot MBL 308 0.4 nozzle", + "Meltingplot MBL 480 0.4 nozzle", + "Meltingplot CHX 350 0.4 nozzle" + ] +} diff --git a/resources/profiles/Meltingplot/filament/Meltingplot PA6 CF HT @0.6 nozzle.json b/resources/profiles/Meltingplot/filament/Meltingplot PA6 CF HT @0.6 nozzle.json new file mode 100644 index 0000000000..4ece916d20 --- /dev/null +++ b/resources/profiles/Meltingplot/filament/Meltingplot PA6 CF HT @0.6 nozzle.json @@ -0,0 +1,21 @@ +{ + "type": "filament", + "name": "Meltingplot PA6 CF HT @0.6 nozzle", + "inherits": "Meltingplot PA6 CF HT", + "from": "system", + "setting_id": "9XzYyYbJ4jnO4nhJ", + "instantiation": "true", + "filament_max_volumetric_speed": [ + "11" + ], + "slow_down_layer_time": [ + "8" + ], + "compatible_printers": [ + "Meltingplot MBL 133 0.6 nozzle", + "Meltingplot MBL 136 0.6 nozzle", + "Meltingplot MBL 308 0.6 nozzle", + "Meltingplot MBL 480 0.6 nozzle", + "Meltingplot CHX 350 0.6 nozzle" + ] +} diff --git a/resources/profiles/Meltingplot/filament/Meltingplot PA6 CF HT @0.8 nozzle.json b/resources/profiles/Meltingplot/filament/Meltingplot PA6 CF HT @0.8 nozzle.json new file mode 100644 index 0000000000..b1b4d489f8 --- /dev/null +++ b/resources/profiles/Meltingplot/filament/Meltingplot PA6 CF HT @0.8 nozzle.json @@ -0,0 +1,21 @@ +{ + "type": "filament", + "name": "Meltingplot PA6 CF HT @0.8 nozzle", + "inherits": "Meltingplot PA6 CF HT", + "from": "system", + "setting_id": "BMbLehqxegpSvMci", + "instantiation": "true", + "filament_max_volumetric_speed": [ + "15" + ], + "slow_down_layer_time": [ + "15" + ], + "compatible_printers": [ + "Meltingplot MBL 133 0.8 nozzle", + "Meltingplot MBL 136 0.8 nozzle", + "Meltingplot MBL 308 0.8 nozzle", + "Meltingplot MBL 480 0.8 nozzle", + "Meltingplot CHX 350 0.8 nozzle" + ] +} diff --git a/resources/profiles/Meltingplot/filament/Meltingplot PA6 CF HT @1.0 nozzle.json b/resources/profiles/Meltingplot/filament/Meltingplot PA6 CF HT @1.0 nozzle.json new file mode 100644 index 0000000000..b2ab6f3cf5 --- /dev/null +++ b/resources/profiles/Meltingplot/filament/Meltingplot PA6 CF HT @1.0 nozzle.json @@ -0,0 +1,21 @@ +{ + "type": "filament", + "name": "Meltingplot PA6 CF HT @1.0 nozzle", + "inherits": "Meltingplot PA6 CF HT", + "from": "system", + "setting_id": "7R3XuQlzD8IHq4PZ", + "instantiation": "true", + "filament_max_volumetric_speed": [ + "18" + ], + "slow_down_layer_time": [ + "22" + ], + "compatible_printers": [ + "Meltingplot MBL 133 1.0 nozzle", + "Meltingplot MBL 136 1.0 nozzle", + "Meltingplot MBL 308 1.0 nozzle", + "Meltingplot MBL 480 1.0 nozzle", + "Meltingplot CHX 350 1.0 nozzle" + ] +} diff --git a/resources/profiles/Meltingplot/filament/Meltingplot PA6 CF HT.json b/resources/profiles/Meltingplot/filament/Meltingplot PA6 CF HT.json new file mode 100644 index 0000000000..6b2852b4b2 --- /dev/null +++ b/resources/profiles/Meltingplot/filament/Meltingplot PA6 CF HT.json @@ -0,0 +1,94 @@ +{ + "type": "filament", + "name": "Meltingplot PA6 CF HT", + "inherits": "Generic PA-CF @System", + "from": "system", + "setting_id": "kzlYLTM6H5CgpQ8y", + "filament_id": "OFdPevOo", + "instantiation": "true", + "filament_vendor": [ + "Meltingplot" + ], + "nozzle_temperature": [ + "275" + ], + "nozzle_temperature_initial_layer": [ + "275" + ], + "filament_max_volumetric_speed": [ + "22" + ], + "filament_density": [ + "1.25" + ], + "filament_cost": [ + "89" + ], + "default_filament_colour": [ + "#858078" + ], + "filament_shrink": [ + "99.9%" + ], + "filament_shrinkage_compensation_z": [ + "99.9%" + ], + "fan_min_speed": [ + "40" + ], + "fan_max_speed": [ + "100" + ], + "reduce_fan_stop_start_freq": [ + "1" + ], + "overhang_fan_speed": [ + "100" + ], + "overhang_fan_threshold": [ + "95%" + ], + "additional_cooling_fan_speed": [ + "40" + ], + "close_fan_the_first_x_layers": [ + "1" + ], + "slow_down_layer_time": [ + "33" + ], + "cool_plate_temp": [ + "80" + ], + "eng_plate_temp": [ + "80" + ], + "hot_plate_temp": [ + "80" + ], + "textured_plate_temp": [ + "80" + ], + "cool_plate_temp_initial_layer": [ + "80" + ], + "eng_plate_temp_initial_layer": [ + "80" + ], + "hot_plate_temp_initial_layer": [ + "80" + ], + "textured_plate_temp_initial_layer": [ + "80" + ], + "filament_diameter": [ + "2.85" + ], + "compatible_printers": [ + "Meltingplot MBL 133 1.2 nozzle", + "Meltingplot MBL 136 1.2 nozzle", + "Meltingplot MBL 308 1.2 nozzle", + "Meltingplot MBL 480 1.2 nozzle", + "Meltingplot CHX 350 1.2 nozzle" + ] +} diff --git a/resources/profiles/Meltingplot/filament/Meltingplot PET-CF15 @0.4 nozzle.json b/resources/profiles/Meltingplot/filament/Meltingplot PET-CF15 @0.4 nozzle.json new file mode 100644 index 0000000000..f828906a7c --- /dev/null +++ b/resources/profiles/Meltingplot/filament/Meltingplot PET-CF15 @0.4 nozzle.json @@ -0,0 +1,21 @@ +{ + "type": "filament", + "name": "Meltingplot PET-CF15 @0.4 nozzle", + "inherits": "Meltingplot PET-CF15", + "from": "system", + "setting_id": "2fkQa1BwTGZbSi2z", + "instantiation": "true", + "filament_max_volumetric_speed": [ + "10" + ], + "slow_down_layer_time": [ + "1" + ], + "compatible_printers": [ + "Meltingplot MBL 133 0.4 nozzle", + "Meltingplot MBL 136 0.4 nozzle", + "Meltingplot MBL 308 0.4 nozzle", + "Meltingplot MBL 480 0.4 nozzle", + "Meltingplot CHX 350 0.4 nozzle" + ] +} diff --git a/resources/profiles/Meltingplot/filament/Meltingplot PET-CF15 @0.6 nozzle.json b/resources/profiles/Meltingplot/filament/Meltingplot PET-CF15 @0.6 nozzle.json new file mode 100644 index 0000000000..11b9bb2550 --- /dev/null +++ b/resources/profiles/Meltingplot/filament/Meltingplot PET-CF15 @0.6 nozzle.json @@ -0,0 +1,21 @@ +{ + "type": "filament", + "name": "Meltingplot PET-CF15 @0.6 nozzle", + "inherits": "Meltingplot PET-CF15", + "from": "system", + "setting_id": "PcNAj2kwuUNBAjQE", + "instantiation": "true", + "filament_max_volumetric_speed": [ + "16" + ], + "slow_down_layer_time": [ + "3" + ], + "compatible_printers": [ + "Meltingplot MBL 133 0.6 nozzle", + "Meltingplot MBL 136 0.6 nozzle", + "Meltingplot MBL 308 0.6 nozzle", + "Meltingplot MBL 480 0.6 nozzle", + "Meltingplot CHX 350 0.6 nozzle" + ] +} diff --git a/resources/profiles/Meltingplot/filament/Meltingplot PET-CF15 @0.8 nozzle.json b/resources/profiles/Meltingplot/filament/Meltingplot PET-CF15 @0.8 nozzle.json new file mode 100644 index 0000000000..20039024ce --- /dev/null +++ b/resources/profiles/Meltingplot/filament/Meltingplot PET-CF15 @0.8 nozzle.json @@ -0,0 +1,21 @@ +{ + "type": "filament", + "name": "Meltingplot PET-CF15 @0.8 nozzle", + "inherits": "Meltingplot PET-CF15", + "from": "system", + "setting_id": "70EwKatuncZBKgoD", + "instantiation": "true", + "filament_max_volumetric_speed": [ + "21" + ], + "slow_down_layer_time": [ + "5" + ], + "compatible_printers": [ + "Meltingplot MBL 133 0.8 nozzle", + "Meltingplot MBL 136 0.8 nozzle", + "Meltingplot MBL 308 0.8 nozzle", + "Meltingplot MBL 480 0.8 nozzle", + "Meltingplot CHX 350 0.8 nozzle" + ] +} diff --git a/resources/profiles/Meltingplot/filament/Meltingplot PET-CF15 @1.0 nozzle.json b/resources/profiles/Meltingplot/filament/Meltingplot PET-CF15 @1.0 nozzle.json new file mode 100644 index 0000000000..9913b5f812 --- /dev/null +++ b/resources/profiles/Meltingplot/filament/Meltingplot PET-CF15 @1.0 nozzle.json @@ -0,0 +1,21 @@ +{ + "type": "filament", + "name": "Meltingplot PET-CF15 @1.0 nozzle", + "inherits": "Meltingplot PET-CF15", + "from": "system", + "setting_id": "X2yhWBjK4j46bUYW", + "instantiation": "true", + "filament_max_volumetric_speed": [ + "26" + ], + "slow_down_layer_time": [ + "7" + ], + "compatible_printers": [ + "Meltingplot MBL 133 1.0 nozzle", + "Meltingplot MBL 136 1.0 nozzle", + "Meltingplot MBL 308 1.0 nozzle", + "Meltingplot MBL 480 1.0 nozzle", + "Meltingplot CHX 350 1.0 nozzle" + ] +} diff --git a/resources/profiles/Meltingplot/filament/Meltingplot PET-CF15.json b/resources/profiles/Meltingplot/filament/Meltingplot PET-CF15.json new file mode 100644 index 0000000000..f932be9d05 --- /dev/null +++ b/resources/profiles/Meltingplot/filament/Meltingplot PET-CF15.json @@ -0,0 +1,91 @@ +{ + "type": "filament", + "name": "Meltingplot PET-CF15", + "inherits": "Generic PETG-CF @System", + "from": "system", + "setting_id": "IdqfEh7xRXKTYmV3", + "filament_id": "OFJdf5nt", + "instantiation": "true", + "filament_vendor": [ + "Meltingplot" + ], + "filament_type": [ + "PET-CF" + ], + "nozzle_temperature": [ + "280" + ], + "nozzle_temperature_initial_layer": [ + "280" + ], + "nozzle_temperature_range_low": [ + "260" + ], + "nozzle_temperature_range_high": [ + "290" + ], + "filament_max_volumetric_speed": [ + "31" + ], + "filament_density": [ + "1.4" + ], + "filament_cost": [ + "77.5" + ], + "filament_shrink": [ + "99.9%" + ], + "filament_shrinkage_compensation_z": [ + "99.9%" + ], + "temperature_vitrification": [ + "125" + ], + "fan_min_speed": [ + "100" + ], + "fan_max_speed": [ + "100" + ], + "slow_down_layer_time": [ + "11" + ], + "cool_plate_temp": [ + "90" + ], + "eng_plate_temp": [ + "90" + ], + "hot_plate_temp": [ + "90" + ], + "textured_plate_temp": [ + "90" + ], + "cool_plate_temp_initial_layer": [ + "90" + ], + "eng_plate_temp_initial_layer": [ + "90" + ], + "hot_plate_temp_initial_layer": [ + "90" + ], + "textured_plate_temp_initial_layer": [ + "90" + ], + "filament_diameter": [ + "2.85" + ], + "close_fan_the_first_x_layers": [ + "1" + ], + "compatible_printers": [ + "Meltingplot MBL 133 1.2 nozzle", + "Meltingplot MBL 136 1.2 nozzle", + "Meltingplot MBL 308 1.2 nozzle", + "Meltingplot MBL 480 1.2 nozzle", + "Meltingplot CHX 350 1.2 nozzle" + ] +} diff --git a/resources/profiles/Meltingplot/filament/Meltingplot PETG @0.4 nozzle.json b/resources/profiles/Meltingplot/filament/Meltingplot PETG @0.4 nozzle.json new file mode 100644 index 0000000000..55df65bb99 --- /dev/null +++ b/resources/profiles/Meltingplot/filament/Meltingplot PETG @0.4 nozzle.json @@ -0,0 +1,21 @@ +{ + "type": "filament", + "name": "Meltingplot PETG @0.4 nozzle", + "inherits": "Meltingplot PETG", + "from": "system", + "setting_id": "2ohDGd34awK2DVbV", + "instantiation": "true", + "filament_max_volumetric_speed": [ + "9" + ], + "slow_down_layer_time": [ + "4" + ], + "compatible_printers": [ + "Meltingplot MBL 133 0.4 nozzle", + "Meltingplot MBL 136 0.4 nozzle", + "Meltingplot MBL 308 0.4 nozzle", + "Meltingplot MBL 480 0.4 nozzle", + "Meltingplot CHX 350 0.4 nozzle" + ] +} diff --git a/resources/profiles/Meltingplot/filament/Meltingplot PETG @0.6 nozzle.json b/resources/profiles/Meltingplot/filament/Meltingplot PETG @0.6 nozzle.json new file mode 100644 index 0000000000..5d77c69c8f --- /dev/null +++ b/resources/profiles/Meltingplot/filament/Meltingplot PETG @0.6 nozzle.json @@ -0,0 +1,21 @@ +{ + "type": "filament", + "name": "Meltingplot PETG @0.6 nozzle", + "inherits": "Meltingplot PETG", + "from": "system", + "setting_id": "DZe1WokuOM5byttU", + "instantiation": "true", + "filament_max_volumetric_speed": [ + "14" + ], + "slow_down_layer_time": [ + "8" + ], + "compatible_printers": [ + "Meltingplot MBL 133 0.6 nozzle", + "Meltingplot MBL 136 0.6 nozzle", + "Meltingplot MBL 308 0.6 nozzle", + "Meltingplot MBL 480 0.6 nozzle", + "Meltingplot CHX 350 0.6 nozzle" + ] +} diff --git a/resources/profiles/Meltingplot/filament/Meltingplot PETG @0.8 nozzle.json b/resources/profiles/Meltingplot/filament/Meltingplot PETG @0.8 nozzle.json new file mode 100644 index 0000000000..4e5f16b411 --- /dev/null +++ b/resources/profiles/Meltingplot/filament/Meltingplot PETG @0.8 nozzle.json @@ -0,0 +1,21 @@ +{ + "type": "filament", + "name": "Meltingplot PETG @0.8 nozzle", + "inherits": "Meltingplot PETG", + "from": "system", + "setting_id": "LwFY7N8Uisy6ivOV", + "instantiation": "true", + "filament_max_volumetric_speed": [ + "18" + ], + "slow_down_layer_time": [ + "15" + ], + "compatible_printers": [ + "Meltingplot MBL 133 0.8 nozzle", + "Meltingplot MBL 136 0.8 nozzle", + "Meltingplot MBL 308 0.8 nozzle", + "Meltingplot MBL 480 0.8 nozzle", + "Meltingplot CHX 350 0.8 nozzle" + ] +} diff --git a/resources/profiles/Meltingplot/filament/Meltingplot PETG @1.0 nozzle.json b/resources/profiles/Meltingplot/filament/Meltingplot PETG @1.0 nozzle.json new file mode 100644 index 0000000000..cdc4620078 --- /dev/null +++ b/resources/profiles/Meltingplot/filament/Meltingplot PETG @1.0 nozzle.json @@ -0,0 +1,21 @@ +{ + "type": "filament", + "name": "Meltingplot PETG @1.0 nozzle", + "inherits": "Meltingplot PETG", + "from": "system", + "setting_id": "kR8Vbizk0CPciCbD", + "instantiation": "true", + "filament_max_volumetric_speed": [ + "23" + ], + "slow_down_layer_time": [ + "22" + ], + "compatible_printers": [ + "Meltingplot MBL 133 1.0 nozzle", + "Meltingplot MBL 136 1.0 nozzle", + "Meltingplot MBL 308 1.0 nozzle", + "Meltingplot MBL 480 1.0 nozzle", + "Meltingplot CHX 350 1.0 nozzle" + ] +} diff --git a/resources/profiles/Meltingplot/filament/Meltingplot PETG.json b/resources/profiles/Meltingplot/filament/Meltingplot PETG.json new file mode 100644 index 0000000000..d6ed4e25cb --- /dev/null +++ b/resources/profiles/Meltingplot/filament/Meltingplot PETG.json @@ -0,0 +1,70 @@ +{ + "type": "filament", + "name": "Meltingplot PETG", + "inherits": "Generic PETG @System", + "from": "system", + "setting_id": "dsW7JrzWhKAY1fey", + "filament_id": "OFvlreVF", + "instantiation": "true", + "filament_vendor": [ + "Meltingplot" + ], + "nozzle_temperature": [ + "245" + ], + "nozzle_temperature_initial_layer": [ + "245" + ], + "filament_max_volumetric_speed": [ + "27" + ], + "filament_cost": [ + "35" + ], + "default_filament_colour": [ + "#123123" + ], + "fan_min_speed": [ + "50" + ], + "fan_cooling_layer_time": [ + "60" + ], + "slow_down_layer_time": [ + "33" + ], + "cool_plate_temp": [ + "90" + ], + "eng_plate_temp": [ + "90" + ], + "hot_plate_temp": [ + "90" + ], + "textured_plate_temp": [ + "90" + ], + "cool_plate_temp_initial_layer": [ + "90" + ], + "eng_plate_temp_initial_layer": [ + "90" + ], + "hot_plate_temp_initial_layer": [ + "90" + ], + "textured_plate_temp_initial_layer": [ + "90" + ], + "filament_diameter": [ + "2.85" + ], + "compatible_printers": [ + "Meltingplot MBL 133 1.2 nozzle", + "Meltingplot MBL 136 1.2 nozzle", + "Meltingplot MBL 308 1.2 nozzle", + "Meltingplot MBL 480 1.2 nozzle", + "Meltingplot CHX 350 1.2 nozzle" + ] +} diff --git a/resources/profiles/Meltingplot/filament/Meltingplot PLA @0.4 nozzle.json b/resources/profiles/Meltingplot/filament/Meltingplot PLA @0.4 nozzle.json new file mode 100644 index 0000000000..4ec8bc1fb5 --- /dev/null +++ b/resources/profiles/Meltingplot/filament/Meltingplot PLA @0.4 nozzle.json @@ -0,0 +1,21 @@ +{ + "type": "filament", + "name": "Meltingplot PLA @0.4 nozzle", + "inherits": "Meltingplot PLA", + "from": "system", + "setting_id": "T3OEfrhyZ6ISyv20", + "instantiation": "true", + "filament_max_volumetric_speed": [ + "11" + ], + "slow_down_layer_time": [ + "8" + ], + "compatible_printers": [ + "Meltingplot MBL 133 0.4 nozzle", + "Meltingplot MBL 136 0.4 nozzle", + "Meltingplot MBL 308 0.4 nozzle", + "Meltingplot MBL 480 0.4 nozzle", + "Meltingplot CHX 350 0.4 nozzle" + ] +} diff --git a/resources/profiles/Meltingplot/filament/Meltingplot PLA @0.6 nozzle.json b/resources/profiles/Meltingplot/filament/Meltingplot PLA @0.6 nozzle.json new file mode 100644 index 0000000000..054bc03ab6 --- /dev/null +++ b/resources/profiles/Meltingplot/filament/Meltingplot PLA @0.6 nozzle.json @@ -0,0 +1,21 @@ +{ + "type": "filament", + "name": "Meltingplot PLA @0.6 nozzle", + "inherits": "Meltingplot PLA", + "from": "system", + "setting_id": "hsgzwjPc26BJ4sQu", + "instantiation": "true", + "filament_max_volumetric_speed": [ + "16" + ], + "slow_down_layer_time": [ + "17" + ], + "compatible_printers": [ + "Meltingplot MBL 133 0.6 nozzle", + "Meltingplot MBL 136 0.6 nozzle", + "Meltingplot MBL 308 0.6 nozzle", + "Meltingplot MBL 480 0.6 nozzle", + "Meltingplot CHX 350 0.6 nozzle" + ] +} diff --git a/resources/profiles/Meltingplot/filament/Meltingplot PLA @0.8 nozzle.json b/resources/profiles/Meltingplot/filament/Meltingplot PLA @0.8 nozzle.json new file mode 100644 index 0000000000..7fa45fc182 --- /dev/null +++ b/resources/profiles/Meltingplot/filament/Meltingplot PLA @0.8 nozzle.json @@ -0,0 +1,21 @@ +{ + "type": "filament", + "name": "Meltingplot PLA @0.8 nozzle", + "inherits": "Meltingplot PLA", + "from": "system", + "setting_id": "cz6RkfsQ0hJE0hYG", + "instantiation": "true", + "filament_max_volumetric_speed": [ + "22" + ], + "slow_down_layer_time": [ + "30" + ], + "compatible_printers": [ + "Meltingplot MBL 133 0.8 nozzle", + "Meltingplot MBL 136 0.8 nozzle", + "Meltingplot MBL 308 0.8 nozzle", + "Meltingplot MBL 480 0.8 nozzle", + "Meltingplot CHX 350 0.8 nozzle" + ] +} diff --git a/resources/profiles/Meltingplot/filament/Meltingplot PLA @1.0 nozzle.json b/resources/profiles/Meltingplot/filament/Meltingplot PLA @1.0 nozzle.json new file mode 100644 index 0000000000..bbb19233db --- /dev/null +++ b/resources/profiles/Meltingplot/filament/Meltingplot PLA @1.0 nozzle.json @@ -0,0 +1,21 @@ +{ + "type": "filament", + "name": "Meltingplot PLA @1.0 nozzle", + "inherits": "Meltingplot PLA", + "from": "system", + "setting_id": "H3n0VPl3CymiK9VN", + "instantiation": "true", + "filament_max_volumetric_speed": [ + "27" + ], + "slow_down_layer_time": [ + "45" + ], + "compatible_printers": [ + "Meltingplot MBL 133 1.0 nozzle", + "Meltingplot MBL 136 1.0 nozzle", + "Meltingplot MBL 308 1.0 nozzle", + "Meltingplot MBL 480 1.0 nozzle", + "Meltingplot CHX 350 1.0 nozzle" + ] +} diff --git a/resources/profiles/Meltingplot/filament/Meltingplot PLA.json b/resources/profiles/Meltingplot/filament/Meltingplot PLA.json new file mode 100644 index 0000000000..60575e7aa6 --- /dev/null +++ b/resources/profiles/Meltingplot/filament/Meltingplot PLA.json @@ -0,0 +1,67 @@ +{ + "type": "filament", + "name": "Meltingplot PLA", + "inherits": "Generic PLA @System", + "from": "system", + "setting_id": "ONpaHlfJVJyh7Shb", + "filament_id": "OFwXRVbB", + "instantiation": "true", + "filament_vendor": [ + "Meltingplot" + ], + "nozzle_temperature": [ + "210" + ], + "nozzle_temperature_initial_layer": [ + "215" + ], + "filament_cost": [ + "34.9" + ], + "default_filament_colour": [ + "#F8F8F8" + ], + "slow_down_layer_time": [ + "66" + ], + "slow_down_min_speed": [ + "15" + ], + "cool_plate_temp": [ + "60" + ], + "eng_plate_temp": [ + "60" + ], + "hot_plate_temp": [ + "60" + ], + "textured_plate_temp": [ + "60" + ], + "cool_plate_temp_initial_layer": [ + "65" + ], + "eng_plate_temp_initial_layer": [ + "65" + ], + "hot_plate_temp_initial_layer": [ + "65" + ], + "textured_plate_temp_initial_layer": [ + "65" + ], + "filament_diameter": [ + "2.85" + ], + "filament_max_volumetric_speed": [ + "33" + ], + "compatible_printers": [ + "Meltingplot MBL 133 1.2 nozzle", + "Meltingplot MBL 136 1.2 nozzle", + "Meltingplot MBL 308 1.2 nozzle", + "Meltingplot MBL 480 1.2 nozzle", + "Meltingplot CHX 350 1.2 nozzle" + ] +} diff --git a/resources/profiles/Meltingplot/filament/Meltingplot TitanX @0.4 nozzle.json b/resources/profiles/Meltingplot/filament/Meltingplot TitanX @0.4 nozzle.json new file mode 100644 index 0000000000..6804806002 --- /dev/null +++ b/resources/profiles/Meltingplot/filament/Meltingplot TitanX @0.4 nozzle.json @@ -0,0 +1,21 @@ +{ + "type": "filament", + "name": "Meltingplot TitanX @0.4 nozzle", + "inherits": "Meltingplot TitanX", + "from": "system", + "setting_id": "i5ttRpqpqF3Kg8IF", + "instantiation": "true", + "filament_max_volumetric_speed": [ + "11" + ], + "slow_down_layer_time": [ + "4" + ], + "compatible_printers": [ + "Meltingplot MBL 133 0.4 nozzle", + "Meltingplot MBL 136 0.4 nozzle", + "Meltingplot MBL 308 0.4 nozzle", + "Meltingplot MBL 480 0.4 nozzle", + "Meltingplot CHX 350 0.4 nozzle" + ] +} diff --git a/resources/profiles/Meltingplot/filament/Meltingplot TitanX @0.6 nozzle.json b/resources/profiles/Meltingplot/filament/Meltingplot TitanX @0.6 nozzle.json new file mode 100644 index 0000000000..a80febac3f --- /dev/null +++ b/resources/profiles/Meltingplot/filament/Meltingplot TitanX @0.6 nozzle.json @@ -0,0 +1,21 @@ +{ + "type": "filament", + "name": "Meltingplot TitanX @0.6 nozzle", + "inherits": "Meltingplot TitanX", + "from": "system", + "setting_id": "Vbm6NJb4il6QAU6v", + "instantiation": "true", + "filament_max_volumetric_speed": [ + "16" + ], + "slow_down_layer_time": [ + "8" + ], + "compatible_printers": [ + "Meltingplot MBL 133 0.6 nozzle", + "Meltingplot MBL 136 0.6 nozzle", + "Meltingplot MBL 308 0.6 nozzle", + "Meltingplot MBL 480 0.6 nozzle", + "Meltingplot CHX 350 0.6 nozzle" + ] +} diff --git a/resources/profiles/Meltingplot/filament/Meltingplot TitanX @0.8 nozzle.json b/resources/profiles/Meltingplot/filament/Meltingplot TitanX @0.8 nozzle.json new file mode 100644 index 0000000000..3815b36da9 --- /dev/null +++ b/resources/profiles/Meltingplot/filament/Meltingplot TitanX @0.8 nozzle.json @@ -0,0 +1,21 @@ +{ + "type": "filament", + "name": "Meltingplot TitanX @0.8 nozzle", + "inherits": "Meltingplot TitanX", + "from": "system", + "setting_id": "jYrElhVPtK2Dpb9K", + "instantiation": "true", + "filament_max_volumetric_speed": [ + "22" + ], + "slow_down_layer_time": [ + "15" + ], + "compatible_printers": [ + "Meltingplot MBL 133 0.8 nozzle", + "Meltingplot MBL 136 0.8 nozzle", + "Meltingplot MBL 308 0.8 nozzle", + "Meltingplot MBL 480 0.8 nozzle", + "Meltingplot CHX 350 0.8 nozzle" + ] +} diff --git a/resources/profiles/Meltingplot/filament/Meltingplot TitanX @1.0 nozzle.json b/resources/profiles/Meltingplot/filament/Meltingplot TitanX @1.0 nozzle.json new file mode 100644 index 0000000000..51ccd444e2 --- /dev/null +++ b/resources/profiles/Meltingplot/filament/Meltingplot TitanX @1.0 nozzle.json @@ -0,0 +1,21 @@ +{ + "type": "filament", + "name": "Meltingplot TitanX @1.0 nozzle", + "inherits": "Meltingplot TitanX", + "from": "system", + "setting_id": "lQDEFxTsxFsT5A4n", + "instantiation": "true", + "filament_max_volumetric_speed": [ + "27" + ], + "slow_down_layer_time": [ + "22" + ], + "compatible_printers": [ + "Meltingplot MBL 133 1.0 nozzle", + "Meltingplot MBL 136 1.0 nozzle", + "Meltingplot MBL 308 1.0 nozzle", + "Meltingplot MBL 480 1.0 nozzle", + "Meltingplot CHX 350 1.0 nozzle" + ] +} diff --git a/resources/profiles/Meltingplot/filament/Meltingplot TitanX.json b/resources/profiles/Meltingplot/filament/Meltingplot TitanX.json new file mode 100644 index 0000000000..5082e6e19e --- /dev/null +++ b/resources/profiles/Meltingplot/filament/Meltingplot TitanX.json @@ -0,0 +1,61 @@ +{ + "type": "filament", + "name": "Meltingplot TitanX", + "inherits": "Generic ABS @System", + "from": "system", + "setting_id": "LDPRmxlvX97NXF0F", + "filament_id": "OFyYfgDM", + "instantiation": "true", + "filament_vendor": [ + "Meltingplot" + ], + "filament_flow_ratio": [ + "0.93" + ], + "filament_shrink": [ + "99.75%" + ], + "filament_density": [ + "1.07" + ], + "slow_down_layer_time": [ + "33" + ], + "cool_plate_temp": [ + "110" + ], + "eng_plate_temp": [ + "110" + ], + "hot_plate_temp": [ + "110" + ], + "textured_plate_temp": [ + "110" + ], + "cool_plate_temp_initial_layer": [ + "110" + ], + "eng_plate_temp_initial_layer": [ + "110" + ], + "hot_plate_temp_initial_layer": [ + "110" + ], + "textured_plate_temp_initial_layer": [ + "110" + ], + "filament_diameter": [ + "2.85" + ], + "filament_max_volumetric_speed": [ + "33" + ], + "compatible_printers": [ + "Meltingplot MBL 133 1.2 nozzle", + "Meltingplot MBL 136 1.2 nozzle", + "Meltingplot MBL 308 1.2 nozzle", + "Meltingplot MBL 480 1.2 nozzle", + "Meltingplot CHX 350 1.2 nozzle" + ] +} diff --git a/resources/profiles/Meltingplot/machine/Meltingplot CHX 350 0.4 nozzle.json b/resources/profiles/Meltingplot/machine/Meltingplot CHX 350 0.4 nozzle.json new file mode 100644 index 0000000000..c59db36162 --- /dev/null +++ b/resources/profiles/Meltingplot/machine/Meltingplot CHX 350 0.4 nozzle.json @@ -0,0 +1,30 @@ +{ + "type": "machine", + "name": "Meltingplot CHX 350 0.4 nozzle", + "inherits": "fdm_machine_meltingplot_chx", + "from": "system", + "setting_id": "gyTKYZ8qKgen4dOM", + "instantiation": "true", + "printer_model": "Meltingplot CHX 350", + "printer_variant": "0.4", + "nozzle_diameter": [ + "0.4" + ], + "min_layer_height": [ + "0.16" + ], + "max_layer_height": [ + "0.24" + ], + "printable_area": [ + "0x0", + "880x0", + "880x422", + "0x422" + ], + "printable_height": "943", + "default_print_profile": "0.18mm Fine 0.4 nozzle @Meltingplot CHX 350", + "default_filament_profile": [ + "Meltingplot PLA @0.4 nozzle" + ] +} diff --git a/resources/profiles/Meltingplot/machine/Meltingplot CHX 350 0.6 nozzle.json b/resources/profiles/Meltingplot/machine/Meltingplot CHX 350 0.6 nozzle.json new file mode 100644 index 0000000000..bddf34e56a --- /dev/null +++ b/resources/profiles/Meltingplot/machine/Meltingplot CHX 350 0.6 nozzle.json @@ -0,0 +1,30 @@ +{ + "type": "machine", + "name": "Meltingplot CHX 350 0.6 nozzle", + "inherits": "fdm_machine_meltingplot_chx", + "from": "system", + "setting_id": "OeqLbNEMEImXnJBz", + "instantiation": "true", + "printer_model": "Meltingplot CHX 350", + "printer_variant": "0.6", + "nozzle_diameter": [ + "0.6" + ], + "min_layer_height": [ + "0.24" + ], + "max_layer_height": [ + "0.36" + ], + "printable_area": [ + "0x0", + "880x0", + "880x422", + "0x422" + ], + "printable_height": "943", + "default_print_profile": "0.30mm Standard 0.6 nozzle @Meltingplot CHX 350", + "default_filament_profile": [ + "Meltingplot PLA @0.6 nozzle" + ] +} diff --git a/resources/profiles/Meltingplot/machine/Meltingplot CHX 350 0.8 nozzle.json b/resources/profiles/Meltingplot/machine/Meltingplot CHX 350 0.8 nozzle.json new file mode 100644 index 0000000000..bb3a56b5ce --- /dev/null +++ b/resources/profiles/Meltingplot/machine/Meltingplot CHX 350 0.8 nozzle.json @@ -0,0 +1,32 @@ +{ + "type": "machine", + "name": "Meltingplot CHX 350 0.8 nozzle", + "inherits": "fdm_machine_meltingplot_chx", + "from": "system", + "setting_id": "IlK23KWfTD7BLPpZ", + "instantiation": "true", + "printer_model": "Meltingplot CHX 350", + "printer_variant": "0.8", + "nozzle_diameter": [ + "0.8" + ], + "min_layer_height": [ + "0.32" + ], + "max_layer_height": [ + "0.48" + ], + "printable_area": [ + "0x0", + "880x0", + "880x422", + "0x422" + ], + "printable_height": "943", + "default_print_profile": "0.38mm Standard 0.8 nozzle @Meltingplot CHX 350", + "default_filament_profile": [ + "Meltingplot PLA @0.8 nozzle" + ], + "min_resonance_avoidance_speed": "55", + "max_resonance_avoidance_speed": "115" +} diff --git a/resources/profiles/Meltingplot/machine/Meltingplot CHX 350 1.0 nozzle.json b/resources/profiles/Meltingplot/machine/Meltingplot CHX 350 1.0 nozzle.json new file mode 100644 index 0000000000..0c2f656c94 --- /dev/null +++ b/resources/profiles/Meltingplot/machine/Meltingplot CHX 350 1.0 nozzle.json @@ -0,0 +1,33 @@ +{ + "type": "machine", + "name": "Meltingplot CHX 350 1.0 nozzle", + "inherits": "fdm_machine_meltingplot_chx", + "from": "system", + "setting_id": "AGIxh7arXUPLFcnj", + "instantiation": "true", + "printer_model": "Meltingplot CHX 350", + "printer_variant": "1.0", + "nozzle_diameter": [ + "1.0" + ], + "min_layer_height": [ + "0.40" + ], + "max_layer_height": [ + "0.60" + ], + "printable_area": [ + "0x0", + "880x0", + "880x422", + "0x422" + ], + "printable_height": "943", + "default_print_profile": "0.48mm Optimal 1.0 nozzle @Meltingplot CHX 350", + "default_filament_profile": [ + "Meltingplot PLA @1.0 nozzle" + ], + "nozzle_type": [ + "hardened_steel" + ] +} diff --git a/resources/profiles/Meltingplot/machine/Meltingplot CHX 350 1.2 nozzle.json b/resources/profiles/Meltingplot/machine/Meltingplot CHX 350 1.2 nozzle.json new file mode 100644 index 0000000000..fa511ee85a --- /dev/null +++ b/resources/profiles/Meltingplot/machine/Meltingplot CHX 350 1.2 nozzle.json @@ -0,0 +1,33 @@ +{ + "type": "machine", + "name": "Meltingplot CHX 350 1.2 nozzle", + "inherits": "fdm_machine_meltingplot_chx", + "from": "system", + "setting_id": "xcwkp9Kdund0y4Zh", + "instantiation": "true", + "printer_model": "Meltingplot CHX 350", + "printer_variant": "1.2", + "nozzle_diameter": [ + "1.2" + ], + "min_layer_height": [ + "0.48" + ], + "max_layer_height": [ + "0.72" + ], + "printable_area": [ + "0x0", + "880x0", + "880x422", + "0x422" + ], + "printable_height": "943", + "default_print_profile": "0.56mm Optimal 1.2 nozzle @Meltingplot CHX 350", + "default_filament_profile": [ + "Meltingplot PLA" + ], + "nozzle_type": [ + "hardened_steel" + ] +} diff --git a/resources/profiles/Meltingplot/machine/Meltingplot CHX 350.json b/resources/profiles/Meltingplot/machine/Meltingplot CHX 350.json new file mode 100644 index 0000000000..22d9b57d30 --- /dev/null +++ b/resources/profiles/Meltingplot/machine/Meltingplot CHX 350.json @@ -0,0 +1,12 @@ +{ + "type": "machine_model", + "name": "Meltingplot CHX 350", + "model_id": "Meltingplot-CHX-350", + "nozzle_diameter": "0.4;0.6;0.8;1.0;1.2", + "machine_tech": "FFF", + "family": "Meltingplot", + "bed_model": "chx350-printbed.stl", + "bed_texture": "chx350-texture.svg", + "hotend_model": "", + "default_materials": "Meltingplot PLA @0.4 nozzle;Meltingplot PLA @0.6 nozzle;Meltingplot PLA @0.8 nozzle;Meltingplot PLA @1.0 nozzle;Meltingplot PLA;Meltingplot PETG @0.4 nozzle;Meltingplot PETG @0.6 nozzle;Meltingplot PETG @0.8 nozzle;Meltingplot PETG @1.0 nozzle;Meltingplot PETG;Meltingplot ABS @0.4 nozzle;Meltingplot ABS @0.6 nozzle;Meltingplot ABS @0.8 nozzle;Meltingplot ABS @1.0 nozzle;Meltingplot ABS;Meltingplot ASA @0.4 nozzle;Meltingplot ASA @0.6 nozzle;Meltingplot ASA @0.8 nozzle;Meltingplot ASA @1.0 nozzle;Meltingplot ASA" +} diff --git a/resources/profiles/Meltingplot/machine/Meltingplot MBL 133 0.4 nozzle.json b/resources/profiles/Meltingplot/machine/Meltingplot MBL 133 0.4 nozzle.json new file mode 100644 index 0000000000..413b86a245 --- /dev/null +++ b/resources/profiles/Meltingplot/machine/Meltingplot MBL 133 0.4 nozzle.json @@ -0,0 +1,30 @@ +{ + "type": "machine", + "name": "Meltingplot MBL 133 0.4 nozzle", + "inherits": "fdm_machine_meltingplot_mbl", + "from": "system", + "setting_id": "wyroTvO4uFQPS3Se", + "instantiation": "true", + "printer_model": "Meltingplot MBL 133", + "printer_variant": "0.4", + "nozzle_diameter": [ + "0.4" + ], + "min_layer_height": [ + "0.16" + ], + "max_layer_height": [ + "0.24" + ], + "printable_area": [ + "0x0", + "835x0", + "835x405", + "0x405" + ], + "printable_height": "394", + "default_print_profile": "0.18mm Fine 0.4 nozzle @Meltingplot MBL", + "default_filament_profile": [ + "Meltingplot PLA @0.4 nozzle" + ] +} diff --git a/resources/profiles/Meltingplot/machine/Meltingplot MBL 133 0.6 nozzle.json b/resources/profiles/Meltingplot/machine/Meltingplot MBL 133 0.6 nozzle.json new file mode 100644 index 0000000000..1f6e02ec96 --- /dev/null +++ b/resources/profiles/Meltingplot/machine/Meltingplot MBL 133 0.6 nozzle.json @@ -0,0 +1,30 @@ +{ + "type": "machine", + "name": "Meltingplot MBL 133 0.6 nozzle", + "inherits": "fdm_machine_meltingplot_mbl", + "from": "system", + "setting_id": "QbxTZqa4I7jaXUzw", + "instantiation": "true", + "printer_model": "Meltingplot MBL 133", + "printer_variant": "0.6", + "nozzle_diameter": [ + "0.6" + ], + "min_layer_height": [ + "0.24" + ], + "max_layer_height": [ + "0.36" + ], + "printable_area": [ + "0x0", + "835x0", + "835x405", + "0x405" + ], + "printable_height": "394", + "default_print_profile": "0.30mm Standard 0.6 nozzle @Meltingplot MBL", + "default_filament_profile": [ + "Meltingplot PLA @0.6 nozzle" + ] +} diff --git a/resources/profiles/Meltingplot/machine/Meltingplot MBL 133 0.8 nozzle.json b/resources/profiles/Meltingplot/machine/Meltingplot MBL 133 0.8 nozzle.json new file mode 100644 index 0000000000..506acfdf6f --- /dev/null +++ b/resources/profiles/Meltingplot/machine/Meltingplot MBL 133 0.8 nozzle.json @@ -0,0 +1,30 @@ +{ + "type": "machine", + "name": "Meltingplot MBL 133 0.8 nozzle", + "inherits": "fdm_machine_meltingplot_mbl", + "from": "system", + "setting_id": "VXumP32DSNKwddyS", + "instantiation": "true", + "printer_model": "Meltingplot MBL 133", + "printer_variant": "0.8", + "nozzle_diameter": [ + "0.8" + ], + "min_layer_height": [ + "0.32" + ], + "max_layer_height": [ + "0.48" + ], + "printable_area": [ + "0x0", + "835x0", + "835x405", + "0x405" + ], + "printable_height": "394", + "default_print_profile": "0.38mm Standard 0.8 nozzle @Meltingplot MBL", + "default_filament_profile": [ + "Meltingplot PLA @0.8 nozzle" + ] +} diff --git a/resources/profiles/Meltingplot/machine/Meltingplot MBL 133 1.0 nozzle.json b/resources/profiles/Meltingplot/machine/Meltingplot MBL 133 1.0 nozzle.json new file mode 100644 index 0000000000..d4943d8642 --- /dev/null +++ b/resources/profiles/Meltingplot/machine/Meltingplot MBL 133 1.0 nozzle.json @@ -0,0 +1,30 @@ +{ + "type": "machine", + "name": "Meltingplot MBL 133 1.0 nozzle", + "inherits": "fdm_machine_meltingplot_mbl", + "from": "system", + "setting_id": "A2a4j8nclQxokoHn", + "instantiation": "true", + "printer_model": "Meltingplot MBL 133", + "printer_variant": "1.0", + "nozzle_diameter": [ + "1.0" + ], + "min_layer_height": [ + "0.40" + ], + "max_layer_height": [ + "0.60" + ], + "printable_area": [ + "0x0", + "835x0", + "835x405", + "0x405" + ], + "printable_height": "394", + "default_print_profile": "0.48mm Optimal 1.0 nozzle @Meltingplot MBL", + "default_filament_profile": [ + "Meltingplot PLA @1.0 nozzle" + ] +} diff --git a/resources/profiles/Meltingplot/machine/Meltingplot MBL 133 1.2 nozzle.json b/resources/profiles/Meltingplot/machine/Meltingplot MBL 133 1.2 nozzle.json new file mode 100644 index 0000000000..6107f64728 --- /dev/null +++ b/resources/profiles/Meltingplot/machine/Meltingplot MBL 133 1.2 nozzle.json @@ -0,0 +1,30 @@ +{ + "type": "machine", + "name": "Meltingplot MBL 133 1.2 nozzle", + "inherits": "fdm_machine_meltingplot_mbl", + "from": "system", + "setting_id": "wn8Ez4ZM1ubuftLv", + "instantiation": "true", + "printer_model": "Meltingplot MBL 133", + "printer_variant": "1.2", + "nozzle_diameter": [ + "1.2" + ], + "min_layer_height": [ + "0.48" + ], + "max_layer_height": [ + "0.72" + ], + "printable_area": [ + "0x0", + "835x0", + "835x405", + "0x405" + ], + "printable_height": "394", + "default_print_profile": "0.56mm Optimal 1.2 nozzle @Meltingplot MBL", + "default_filament_profile": [ + "Meltingplot PLA" + ] +} diff --git a/resources/profiles/Meltingplot/machine/Meltingplot MBL 133.json b/resources/profiles/Meltingplot/machine/Meltingplot MBL 133.json new file mode 100644 index 0000000000..5a8d76e344 --- /dev/null +++ b/resources/profiles/Meltingplot/machine/Meltingplot MBL 133.json @@ -0,0 +1,12 @@ +{ + "type": "machine_model", + "name": "Meltingplot MBL 133", + "model_id": "Meltingplot-MBL-133", + "nozzle_diameter": "0.8;0.4;0.6;1.0;1.2", + "machine_tech": "FFF", + "family": "Meltingplot", + "bed_model": "mbl133-printbed.stl", + "bed_texture": "mbl-133-texture.svg", + "hotend_model": "", + "default_materials": "Meltingplot PLA @0.4 nozzle;Meltingplot PLA @0.6 nozzle;Meltingplot PLA @0.8 nozzle;Meltingplot PLA @1.0 nozzle;Meltingplot PLA;Meltingplot PETG @0.4 nozzle;Meltingplot PETG @0.6 nozzle;Meltingplot PETG @0.8 nozzle;Meltingplot PETG @1.0 nozzle;Meltingplot PETG;Meltingplot ABS @0.4 nozzle;Meltingplot ABS @0.6 nozzle;Meltingplot ABS @0.8 nozzle;Meltingplot ABS @1.0 nozzle;Meltingplot ABS;Meltingplot ASA @0.4 nozzle;Meltingplot ASA @0.6 nozzle;Meltingplot ASA @0.8 nozzle;Meltingplot ASA @1.0 nozzle;Meltingplot ASA" +} diff --git a/resources/profiles/Meltingplot/machine/Meltingplot MBL 136 0.4 nozzle.json b/resources/profiles/Meltingplot/machine/Meltingplot MBL 136 0.4 nozzle.json new file mode 100644 index 0000000000..efcd27c2ec --- /dev/null +++ b/resources/profiles/Meltingplot/machine/Meltingplot MBL 136 0.4 nozzle.json @@ -0,0 +1,30 @@ +{ + "type": "machine", + "name": "Meltingplot MBL 136 0.4 nozzle", + "inherits": "fdm_machine_meltingplot_mbl", + "from": "system", + "setting_id": "Wv2F2INNahYnIP2n", + "instantiation": "true", + "printer_model": "Meltingplot MBL 136", + "printer_variant": "0.4", + "nozzle_diameter": [ + "0.4" + ], + "min_layer_height": [ + "0.16" + ], + "max_layer_height": [ + "0.24" + ], + "printable_area": [ + "0x0", + "850x0", + "850x405", + "0x405" + ], + "printable_height": "396", + "default_print_profile": "0.18mm Fine 0.4 nozzle @Meltingplot MBL", + "default_filament_profile": [ + "Meltingplot PLA @0.4 nozzle" + ] +} diff --git a/resources/profiles/Meltingplot/machine/Meltingplot MBL 136 0.6 nozzle.json b/resources/profiles/Meltingplot/machine/Meltingplot MBL 136 0.6 nozzle.json new file mode 100644 index 0000000000..2bf1e00ae6 --- /dev/null +++ b/resources/profiles/Meltingplot/machine/Meltingplot MBL 136 0.6 nozzle.json @@ -0,0 +1,30 @@ +{ + "type": "machine", + "name": "Meltingplot MBL 136 0.6 nozzle", + "inherits": "fdm_machine_meltingplot_mbl", + "from": "system", + "setting_id": "bmYfNrpRLtITsguf", + "instantiation": "true", + "printer_model": "Meltingplot MBL 136", + "printer_variant": "0.6", + "nozzle_diameter": [ + "0.6" + ], + "min_layer_height": [ + "0.24" + ], + "max_layer_height": [ + "0.36" + ], + "printable_area": [ + "0x0", + "850x0", + "850x405", + "0x405" + ], + "printable_height": "396", + "default_print_profile": "0.30mm Standard 0.6 nozzle @Meltingplot MBL", + "default_filament_profile": [ + "Meltingplot PLA @0.6 nozzle" + ] +} diff --git a/resources/profiles/Meltingplot/machine/Meltingplot MBL 136 0.8 nozzle.json b/resources/profiles/Meltingplot/machine/Meltingplot MBL 136 0.8 nozzle.json new file mode 100644 index 0000000000..922ec96fce --- /dev/null +++ b/resources/profiles/Meltingplot/machine/Meltingplot MBL 136 0.8 nozzle.json @@ -0,0 +1,30 @@ +{ + "type": "machine", + "name": "Meltingplot MBL 136 0.8 nozzle", + "inherits": "fdm_machine_meltingplot_mbl", + "from": "system", + "setting_id": "9fv3aEc4tAsdeaPI", + "instantiation": "true", + "printer_model": "Meltingplot MBL 136", + "printer_variant": "0.8", + "nozzle_diameter": [ + "0.8" + ], + "min_layer_height": [ + "0.32" + ], + "max_layer_height": [ + "0.48" + ], + "printable_area": [ + "0x0", + "850x0", + "850x405", + "0x405" + ], + "printable_height": "396", + "default_print_profile": "0.38mm Standard 0.8 nozzle @Meltingplot MBL", + "default_filament_profile": [ + "Meltingplot PLA @0.8 nozzle" + ] +} diff --git a/resources/profiles/Meltingplot/machine/Meltingplot MBL 136 1.0 nozzle.json b/resources/profiles/Meltingplot/machine/Meltingplot MBL 136 1.0 nozzle.json new file mode 100644 index 0000000000..0e1e6dadb7 --- /dev/null +++ b/resources/profiles/Meltingplot/machine/Meltingplot MBL 136 1.0 nozzle.json @@ -0,0 +1,30 @@ +{ + "type": "machine", + "name": "Meltingplot MBL 136 1.0 nozzle", + "inherits": "fdm_machine_meltingplot_mbl", + "from": "system", + "setting_id": "l45hlHUCFi1UcGpM", + "instantiation": "true", + "printer_model": "Meltingplot MBL 136", + "printer_variant": "1.0", + "nozzle_diameter": [ + "1.0" + ], + "min_layer_height": [ + "0.40" + ], + "max_layer_height": [ + "0.60" + ], + "printable_area": [ + "0x0", + "850x0", + "850x405", + "0x405" + ], + "printable_height": "396", + "default_print_profile": "0.48mm Optimal 1.0 nozzle @Meltingplot MBL", + "default_filament_profile": [ + "Meltingplot PLA @1.0 nozzle" + ] +} diff --git a/resources/profiles/Meltingplot/machine/Meltingplot MBL 136 1.2 nozzle.json b/resources/profiles/Meltingplot/machine/Meltingplot MBL 136 1.2 nozzle.json new file mode 100644 index 0000000000..1fb6101070 --- /dev/null +++ b/resources/profiles/Meltingplot/machine/Meltingplot MBL 136 1.2 nozzle.json @@ -0,0 +1,30 @@ +{ + "type": "machine", + "name": "Meltingplot MBL 136 1.2 nozzle", + "inherits": "fdm_machine_meltingplot_mbl", + "from": "system", + "setting_id": "LAAqt3v5IkT75PMJ", + "instantiation": "true", + "printer_model": "Meltingplot MBL 136", + "printer_variant": "1.2", + "nozzle_diameter": [ + "1.2" + ], + "min_layer_height": [ + "0.48" + ], + "max_layer_height": [ + "0.72" + ], + "printable_area": [ + "0x0", + "850x0", + "850x405", + "0x405" + ], + "printable_height": "396", + "default_print_profile": "0.56mm Optimal 1.2 nozzle @Meltingplot MBL", + "default_filament_profile": [ + "Meltingplot PLA" + ] +} diff --git a/resources/profiles/Meltingplot/machine/Meltingplot MBL 136.json b/resources/profiles/Meltingplot/machine/Meltingplot MBL 136.json new file mode 100644 index 0000000000..1afe141a6b --- /dev/null +++ b/resources/profiles/Meltingplot/machine/Meltingplot MBL 136.json @@ -0,0 +1,12 @@ +{ + "type": "machine_model", + "name": "Meltingplot MBL 136", + "model_id": "Meltingplot-MBL-136", + "nozzle_diameter": "0.8;0.4;0.6;1.0;1.2", + "machine_tech": "FFF", + "family": "Meltingplot", + "bed_model": "mbl136-printbed.stl", + "bed_texture": "mbl-136-texture.svg", + "hotend_model": "", + "default_materials": "Meltingplot PLA @0.4 nozzle;Meltingplot PLA @0.6 nozzle;Meltingplot PLA @0.8 nozzle;Meltingplot PLA @1.0 nozzle;Meltingplot PLA;Meltingplot PETG @0.4 nozzle;Meltingplot PETG @0.6 nozzle;Meltingplot PETG @0.8 nozzle;Meltingplot PETG @1.0 nozzle;Meltingplot PETG;Meltingplot ABS @0.4 nozzle;Meltingplot ABS @0.6 nozzle;Meltingplot ABS @0.8 nozzle;Meltingplot ABS @1.0 nozzle;Meltingplot ABS;Meltingplot ASA @0.4 nozzle;Meltingplot ASA @0.6 nozzle;Meltingplot ASA @0.8 nozzle;Meltingplot ASA @1.0 nozzle;Meltingplot ASA" +} diff --git a/resources/profiles/Meltingplot/machine/Meltingplot MBL 308 0.4 nozzle.json b/resources/profiles/Meltingplot/machine/Meltingplot MBL 308 0.4 nozzle.json new file mode 100644 index 0000000000..2e3f428374 --- /dev/null +++ b/resources/profiles/Meltingplot/machine/Meltingplot MBL 308 0.4 nozzle.json @@ -0,0 +1,30 @@ +{ + "type": "machine", + "name": "Meltingplot MBL 308 0.4 nozzle", + "inherits": "fdm_machine_meltingplot_mbl", + "from": "system", + "setting_id": "AbxDaZCTmysg7JTf", + "instantiation": "true", + "printer_model": "Meltingplot MBL 308", + "printer_variant": "0.4", + "nozzle_diameter": [ + "0.4" + ], + "min_layer_height": [ + "0.16" + ], + "max_layer_height": [ + "0.24" + ], + "printable_area": [ + "0x0", + "850x0", + "850x405", + "0x405" + ], + "printable_height": "896", + "default_print_profile": "0.18mm Fine 0.4 nozzle @Meltingplot MBL", + "default_filament_profile": [ + "Meltingplot PLA @0.4 nozzle" + ] +} diff --git a/resources/profiles/Meltingplot/machine/Meltingplot MBL 308 0.6 nozzle.json b/resources/profiles/Meltingplot/machine/Meltingplot MBL 308 0.6 nozzle.json new file mode 100644 index 0000000000..d21e5b08df --- /dev/null +++ b/resources/profiles/Meltingplot/machine/Meltingplot MBL 308 0.6 nozzle.json @@ -0,0 +1,30 @@ +{ + "type": "machine", + "name": "Meltingplot MBL 308 0.6 nozzle", + "inherits": "fdm_machine_meltingplot_mbl", + "from": "system", + "setting_id": "YRQhtucLD6iZRcY0", + "instantiation": "true", + "printer_model": "Meltingplot MBL 308", + "printer_variant": "0.6", + "nozzle_diameter": [ + "0.6" + ], + "min_layer_height": [ + "0.24" + ], + "max_layer_height": [ + "0.36" + ], + "printable_area": [ + "0x0", + "850x0", + "850x405", + "0x405" + ], + "printable_height": "896", + "default_print_profile": "0.30mm Standard 0.6 nozzle @Meltingplot MBL", + "default_filament_profile": [ + "Meltingplot PLA @0.6 nozzle" + ] +} diff --git a/resources/profiles/Meltingplot/machine/Meltingplot MBL 308 0.8 nozzle.json b/resources/profiles/Meltingplot/machine/Meltingplot MBL 308 0.8 nozzle.json new file mode 100644 index 0000000000..2feb7f2162 --- /dev/null +++ b/resources/profiles/Meltingplot/machine/Meltingplot MBL 308 0.8 nozzle.json @@ -0,0 +1,30 @@ +{ + "type": "machine", + "name": "Meltingplot MBL 308 0.8 nozzle", + "inherits": "fdm_machine_meltingplot_mbl", + "from": "system", + "setting_id": "3scvx4P2vXtmoMmI", + "instantiation": "true", + "printer_model": "Meltingplot MBL 308", + "printer_variant": "0.8", + "nozzle_diameter": [ + "0.8" + ], + "min_layer_height": [ + "0.32" + ], + "max_layer_height": [ + "0.48" + ], + "printable_area": [ + "0x0", + "850x0", + "850x405", + "0x405" + ], + "printable_height": "896", + "default_print_profile": "0.38mm Standard 0.8 nozzle @Meltingplot MBL", + "default_filament_profile": [ + "Meltingplot PLA @0.8 nozzle" + ] +} diff --git a/resources/profiles/Meltingplot/machine/Meltingplot MBL 308 1.0 nozzle.json b/resources/profiles/Meltingplot/machine/Meltingplot MBL 308 1.0 nozzle.json new file mode 100644 index 0000000000..dd54275283 --- /dev/null +++ b/resources/profiles/Meltingplot/machine/Meltingplot MBL 308 1.0 nozzle.json @@ -0,0 +1,30 @@ +{ + "type": "machine", + "name": "Meltingplot MBL 308 1.0 nozzle", + "inherits": "fdm_machine_meltingplot_mbl", + "from": "system", + "setting_id": "VpAHWQ6v3aZLUIs1", + "instantiation": "true", + "printer_model": "Meltingplot MBL 308", + "printer_variant": "1.0", + "nozzle_diameter": [ + "1.0" + ], + "min_layer_height": [ + "0.40" + ], + "max_layer_height": [ + "0.60" + ], + "printable_area": [ + "0x0", + "850x0", + "850x405", + "0x405" + ], + "printable_height": "896", + "default_print_profile": "0.48mm Optimal 1.0 nozzle @Meltingplot MBL", + "default_filament_profile": [ + "Meltingplot PLA @1.0 nozzle" + ] +} diff --git a/resources/profiles/Meltingplot/machine/Meltingplot MBL 308 1.2 nozzle.json b/resources/profiles/Meltingplot/machine/Meltingplot MBL 308 1.2 nozzle.json new file mode 100644 index 0000000000..eb56bc5da6 --- /dev/null +++ b/resources/profiles/Meltingplot/machine/Meltingplot MBL 308 1.2 nozzle.json @@ -0,0 +1,30 @@ +{ + "type": "machine", + "name": "Meltingplot MBL 308 1.2 nozzle", + "inherits": "fdm_machine_meltingplot_mbl", + "from": "system", + "setting_id": "WuT3Qj2xyAPfDsXW", + "instantiation": "true", + "printer_model": "Meltingplot MBL 308", + "printer_variant": "1.2", + "nozzle_diameter": [ + "1.2" + ], + "min_layer_height": [ + "0.48" + ], + "max_layer_height": [ + "0.72" + ], + "printable_area": [ + "0x0", + "850x0", + "850x405", + "0x405" + ], + "printable_height": "896", + "default_print_profile": "0.56mm Optimal 1.2 nozzle @Meltingplot MBL", + "default_filament_profile": [ + "Meltingplot PLA" + ] +} diff --git a/resources/profiles/Meltingplot/machine/Meltingplot MBL 308.json b/resources/profiles/Meltingplot/machine/Meltingplot MBL 308.json new file mode 100644 index 0000000000..7d43a425a7 --- /dev/null +++ b/resources/profiles/Meltingplot/machine/Meltingplot MBL 308.json @@ -0,0 +1,12 @@ +{ + "type": "machine_model", + "name": "Meltingplot MBL 308", + "model_id": "Meltingplot-MBL-308", + "nozzle_diameter": "0.8;0.4;0.6;1.0;1.2", + "machine_tech": "FFF", + "family": "Meltingplot", + "bed_model": "mbl308-printbed.stl", + "bed_texture": "mbl-308-texture.svg", + "hotend_model": "", + "default_materials": "Meltingplot PLA @0.4 nozzle;Meltingplot PLA @0.6 nozzle;Meltingplot PLA @0.8 nozzle;Meltingplot PLA @1.0 nozzle;Meltingplot PLA;Meltingplot PETG @0.4 nozzle;Meltingplot PETG @0.6 nozzle;Meltingplot PETG @0.8 nozzle;Meltingplot PETG @1.0 nozzle;Meltingplot PETG;Meltingplot ABS @0.4 nozzle;Meltingplot ABS @0.6 nozzle;Meltingplot ABS @0.8 nozzle;Meltingplot ABS @1.0 nozzle;Meltingplot ABS;Meltingplot ASA @0.4 nozzle;Meltingplot ASA @0.6 nozzle;Meltingplot ASA @0.8 nozzle;Meltingplot ASA @1.0 nozzle;Meltingplot ASA" +} diff --git a/resources/profiles/Meltingplot/machine/Meltingplot MBL 480 0.4 nozzle.json b/resources/profiles/Meltingplot/machine/Meltingplot MBL 480 0.4 nozzle.json new file mode 100644 index 0000000000..1638cf61e5 --- /dev/null +++ b/resources/profiles/Meltingplot/machine/Meltingplot MBL 480 0.4 nozzle.json @@ -0,0 +1,30 @@ +{ + "type": "machine", + "name": "Meltingplot MBL 480 0.4 nozzle", + "inherits": "fdm_machine_meltingplot_mbl", + "from": "system", + "setting_id": "14E0ywGwPgPzuR7q", + "instantiation": "true", + "printer_model": "Meltingplot MBL 480", + "printer_variant": "0.4", + "nozzle_diameter": [ + "0.4" + ], + "min_layer_height": [ + "0.16" + ], + "max_layer_height": [ + "0.24" + ], + "printable_area": [ + "0x0", + "850x0", + "850x405", + "0x405" + ], + "printable_height": "1396", + "default_print_profile": "0.18mm Fine 0.4 nozzle @Meltingplot MBL", + "default_filament_profile": [ + "Meltingplot PLA @0.4 nozzle" + ] +} diff --git a/resources/profiles/Meltingplot/machine/Meltingplot MBL 480 0.6 nozzle.json b/resources/profiles/Meltingplot/machine/Meltingplot MBL 480 0.6 nozzle.json new file mode 100644 index 0000000000..d727e6e540 --- /dev/null +++ b/resources/profiles/Meltingplot/machine/Meltingplot MBL 480 0.6 nozzle.json @@ -0,0 +1,30 @@ +{ + "type": "machine", + "name": "Meltingplot MBL 480 0.6 nozzle", + "inherits": "fdm_machine_meltingplot_mbl", + "from": "system", + "setting_id": "RntAZ9kYe1JiK9qL", + "instantiation": "true", + "printer_model": "Meltingplot MBL 480", + "printer_variant": "0.6", + "nozzle_diameter": [ + "0.6" + ], + "min_layer_height": [ + "0.24" + ], + "max_layer_height": [ + "0.36" + ], + "printable_area": [ + "0x0", + "850x0", + "850x405", + "0x405" + ], + "printable_height": "1396", + "default_print_profile": "0.30mm Standard 0.6 nozzle @Meltingplot MBL", + "default_filament_profile": [ + "Meltingplot PLA @0.6 nozzle" + ] +} diff --git a/resources/profiles/Meltingplot/machine/Meltingplot MBL 480 0.8 nozzle.json b/resources/profiles/Meltingplot/machine/Meltingplot MBL 480 0.8 nozzle.json new file mode 100644 index 0000000000..2ca80661af --- /dev/null +++ b/resources/profiles/Meltingplot/machine/Meltingplot MBL 480 0.8 nozzle.json @@ -0,0 +1,30 @@ +{ + "type": "machine", + "name": "Meltingplot MBL 480 0.8 nozzle", + "inherits": "fdm_machine_meltingplot_mbl", + "from": "system", + "setting_id": "3wnBTip16mjzuNaR", + "instantiation": "true", + "printer_model": "Meltingplot MBL 480", + "printer_variant": "0.8", + "nozzle_diameter": [ + "0.8" + ], + "min_layer_height": [ + "0.32" + ], + "max_layer_height": [ + "0.48" + ], + "printable_area": [ + "0x0", + "850x0", + "850x405", + "0x405" + ], + "printable_height": "1396", + "default_print_profile": "0.38mm Standard 0.8 nozzle @Meltingplot MBL", + "default_filament_profile": [ + "Meltingplot PLA @0.8 nozzle" + ] +} diff --git a/resources/profiles/Meltingplot/machine/Meltingplot MBL 480 1.0 nozzle.json b/resources/profiles/Meltingplot/machine/Meltingplot MBL 480 1.0 nozzle.json new file mode 100644 index 0000000000..95a2b7a7da --- /dev/null +++ b/resources/profiles/Meltingplot/machine/Meltingplot MBL 480 1.0 nozzle.json @@ -0,0 +1,30 @@ +{ + "type": "machine", + "name": "Meltingplot MBL 480 1.0 nozzle", + "inherits": "fdm_machine_meltingplot_mbl", + "from": "system", + "setting_id": "KXzVlZQpxRpoYCZC", + "instantiation": "true", + "printer_model": "Meltingplot MBL 480", + "printer_variant": "1.0", + "nozzle_diameter": [ + "1.0" + ], + "min_layer_height": [ + "0.40" + ], + "max_layer_height": [ + "0.60" + ], + "printable_area": [ + "0x0", + "850x0", + "850x405", + "0x405" + ], + "printable_height": "1396", + "default_print_profile": "0.48mm Optimal 1.0 nozzle @Meltingplot MBL", + "default_filament_profile": [ + "Meltingplot PLA @1.0 nozzle" + ] +} diff --git a/resources/profiles/Meltingplot/machine/Meltingplot MBL 480 1.2 nozzle.json b/resources/profiles/Meltingplot/machine/Meltingplot MBL 480 1.2 nozzle.json new file mode 100644 index 0000000000..2a992dc643 --- /dev/null +++ b/resources/profiles/Meltingplot/machine/Meltingplot MBL 480 1.2 nozzle.json @@ -0,0 +1,30 @@ +{ + "type": "machine", + "name": "Meltingplot MBL 480 1.2 nozzle", + "inherits": "fdm_machine_meltingplot_mbl", + "from": "system", + "setting_id": "FhIoFCxemK2Miw2J", + "instantiation": "true", + "printer_model": "Meltingplot MBL 480", + "printer_variant": "1.2", + "nozzle_diameter": [ + "1.2" + ], + "min_layer_height": [ + "0.48" + ], + "max_layer_height": [ + "0.72" + ], + "printable_area": [ + "0x0", + "850x0", + "850x405", + "0x405" + ], + "printable_height": "1396", + "default_print_profile": "0.56mm Optimal 1.2 nozzle @Meltingplot MBL", + "default_filament_profile": [ + "Meltingplot PLA" + ] +} diff --git a/resources/profiles/Meltingplot/machine/Meltingplot MBL 480.json b/resources/profiles/Meltingplot/machine/Meltingplot MBL 480.json new file mode 100644 index 0000000000..0360c5bcee --- /dev/null +++ b/resources/profiles/Meltingplot/machine/Meltingplot MBL 480.json @@ -0,0 +1,12 @@ +{ + "type": "machine_model", + "name": "Meltingplot MBL 480", + "model_id": "Meltingplot-MBL-480", + "nozzle_diameter": "0.8;0.4;0.6;1.0;1.2", + "machine_tech": "FFF", + "family": "Meltingplot", + "bed_model": "mbl480-printbed.stl", + "bed_texture": "mbl-480-texture.svg", + "hotend_model": "", + "default_materials": "Meltingplot PLA @0.4 nozzle;Meltingplot PLA @0.6 nozzle;Meltingplot PLA @0.8 nozzle;Meltingplot PLA @1.0 nozzle;Meltingplot PLA;Meltingplot PETG @0.4 nozzle;Meltingplot PETG @0.6 nozzle;Meltingplot PETG @0.8 nozzle;Meltingplot PETG @1.0 nozzle;Meltingplot PETG;Meltingplot ABS @0.4 nozzle;Meltingplot ABS @0.6 nozzle;Meltingplot ABS @0.8 nozzle;Meltingplot ABS @1.0 nozzle;Meltingplot ABS;Meltingplot ASA @0.4 nozzle;Meltingplot ASA @0.6 nozzle;Meltingplot ASA @0.8 nozzle;Meltingplot ASA @1.0 nozzle;Meltingplot ASA" +} diff --git a/resources/profiles/Meltingplot/machine/fdm_machine_common.json b/resources/profiles/Meltingplot/machine/fdm_machine_common.json new file mode 100644 index 0000000000..a27cc95405 --- /dev/null +++ b/resources/profiles/Meltingplot/machine/fdm_machine_common.json @@ -0,0 +1,68 @@ +{ + "type": "machine", + "name": "fdm_machine_common", + "from": "system", + "instantiation": "false", + "printer_technology": "FFF", + "gcode_flavor": "reprapfirmware", + "host_type": "duet", + "disable_m73": "1", + "emit_machine_limits_to_gcode": "0", + "extruder_colour": [ + "#FCE94F" + ], + "extruder_offset": [ + "0x0" + ], + "machine_min_extruding_rate": [ + "0" + ], + "machine_min_travel_rate": [ + "0" + ], + "machine_max_speed_e": [ + "60" + ], + "printer_settings_id": "", + "resonance_avoidance": "0", + "retraction_length": [ + "0" + ], + "use_firmware_retraction": "1", + "retract_when_changing_layer": [ + "1" + ], + "retract_before_wipe": [ + "0%" + ], + "retract_length_toolchange": [ + "0" + ], + "retract_restart_extra": [ + "0" + ], + "retract_restart_extra_toolchange": [ + "0" + ], + "wipe": [ + "0" + ], + "z_hop": [ + "0" + ], + "z_hop_types": [ + "Normal Lift" + ], + "travel_slope": [ + "1" + ], + "single_extruder_multi_material": "0", + "purge_in_prime_tower": "0", + "time_cost": "2", + "default_print_profile": "", + "change_filament_gcode": "", + "machine_pause_gcode": "M226", + "machine_end_gcode": "G90\nG1 Z{min(max_layer_z + 5, printable_height)} F600\nM98 P\"0:/sys/meltingplot/print_end\"", + "layer_change_gcode": ";AFTER_LAYER_CHANGE\n;[layer_z]", + "before_layer_change_gcode": ";BEFORE_LAYER_CHANGE\n;[layer_z]\n" +} diff --git a/resources/profiles/Meltingplot/machine/fdm_machine_meltingplot_chx.json b/resources/profiles/Meltingplot/machine/fdm_machine_meltingplot_chx.json new file mode 100644 index 0000000000..f68678716e --- /dev/null +++ b/resources/profiles/Meltingplot/machine/fdm_machine_meltingplot_chx.json @@ -0,0 +1,71 @@ +{ + "type": "machine", + "name": "fdm_machine_meltingplot_chx", + "inherits": "fdm_machine_common", + "from": "system", + "instantiation": "false", + "fan_kickstart": "0.5", + "fan_speedup_time": "1", + "machine_max_acceleration_e": [ + "3000" + ], + "machine_max_acceleration_extruding": [ + "6000" + ], + "machine_max_acceleration_retracting": [ + "3000" + ], + "machine_max_acceleration_travel": [ + "6000" + ], + "machine_max_acceleration_x": [ + "6000" + ], + "machine_max_acceleration_y": [ + "6000" + ], + "machine_max_acceleration_z": [ + "400" + ], + "machine_max_jerk_e": [ + "33.33" + ], + "machine_max_jerk_x": [ + "12" + ], + "machine_max_jerk_y": [ + "12" + ], + "machine_max_jerk_z": [ + "1.2" + ], + "machine_max_speed_x": [ + "833.33" + ], + "machine_max_speed_y": [ + "1000" + ], + "machine_max_speed_z": [ + "30" + ], + "extruder_clearance_radius": "65", + "extruder_clearance_height_to_rod": "20", + "extruder_clearance_height_to_lid": "150", + "nozzle_type": [ + "stainless_steel" + ], + "min_resonance_avoidance_speed": "40", + "max_resonance_avoidance_speed": "105", + "time_cost": "5", + "retraction_minimum_travel": [ + "2" + ], + "retraction_speed": [ + "60" + ], + "deretraction_speed": [ + "40" + ], + "printable_height": "943", + "machine_start_gcode": "M140 P0 S{first_layer_bed_temperature[0]} ; set bed temp\nG10 P0 S{first_layer_temperature[0]}\nM568 P0 R{first_layer_temperature[0] + standby_temperature_delta} S{first_layer_temperature[0]} A2\n\nM83 ; use relative distances for extrusion\nG90 ; use absolute coordinates\n\nM98 P\"0:/sys/meltingplot/print_start\"" +} diff --git a/resources/profiles/Meltingplot/machine/fdm_machine_meltingplot_mbl.json b/resources/profiles/Meltingplot/machine/fdm_machine_meltingplot_mbl.json new file mode 100644 index 0000000000..6d8f974073 --- /dev/null +++ b/resources/profiles/Meltingplot/machine/fdm_machine_meltingplot_mbl.json @@ -0,0 +1,69 @@ +{ + "type": "machine", + "name": "fdm_machine_meltingplot_mbl", + "inherits": "fdm_machine_common", + "from": "system", + "instantiation": "false", + "fan_kickstart": "0.5", + "fan_speedup_time": "0.5", + "machine_max_acceleration_e": [ + "2500" + ], + "machine_max_acceleration_extruding": [ + "800" + ], + "machine_max_acceleration_retracting": [ + "1250" + ], + "machine_max_acceleration_travel": [ + "1500" + ], + "machine_max_acceleration_x": [ + "1500" + ], + "machine_max_acceleration_y": [ + "1500" + ], + "machine_max_acceleration_z": [ + "72" + ], + "machine_max_jerk_e": [ + "3" + ], + "machine_max_jerk_x": [ + "9" + ], + "machine_max_jerk_y": [ + "9" + ], + "machine_max_jerk_z": [ + "0.3" + ], + "machine_max_speed_x": [ + "240" + ], + "machine_max_speed_y": [ + "240" + ], + "machine_max_speed_z": [ + "12" + ], + "extruder_clearance_radius": "75", + "extruder_clearance_height_to_rod": "30", + "extruder_clearance_height_to_lid": "30", + "retraction_minimum_travel": [ + "4" + ], + "retraction_speed": [ + "35" + ], + "deretraction_speed": [ + "0" + ], + "thumbnails": [ + "64x64", + "400x300" + ], + "thumbnails_format": "PNG", + "machine_start_gcode": "M140 P0 S{first_layer_bed_temperature[0]} ; set bed temp\nG10 P0 R{first_layer_temperature[0] + standby_temperature_delta} S{first_layer_temperature[0]}\n\nM83 ; use relative distances for extrusion\nG90 ; use absolute coordinates\n\nM98 P\"0:/sys/meltingplot/print_start\"" +} diff --git a/resources/profiles/Meltingplot/mbl-133-texture.svg b/resources/profiles/Meltingplot/mbl-133-texture.svg new file mode 100644 index 0000000000..d7572a5a2e --- /dev/null +++ b/resources/profiles/Meltingplot/mbl-133-texture.svg @@ -0,0 +1,158 @@ + + + + + + image/svg+xml + + MBL133 + + + + + + MBL133 + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/profiles/Meltingplot/mbl-136-texture.svg b/resources/profiles/Meltingplot/mbl-136-texture.svg new file mode 100644 index 0000000000..415bd0fdc0 --- /dev/null +++ b/resources/profiles/Meltingplot/mbl-136-texture.svg @@ -0,0 +1,158 @@ + + + + + + image/svg+xml + + MBL133 + + + + + + MBL133 + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/profiles/Meltingplot/mbl-308-texture.svg b/resources/profiles/Meltingplot/mbl-308-texture.svg new file mode 100644 index 0000000000..96ee77c84d --- /dev/null +++ b/resources/profiles/Meltingplot/mbl-308-texture.svg @@ -0,0 +1,158 @@ + + + + + + image/svg+xml + + MBL133 + + + + + + MBL133 + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/profiles/Meltingplot/mbl-480-texture.svg b/resources/profiles/Meltingplot/mbl-480-texture.svg new file mode 100644 index 0000000000..e76d969d72 --- /dev/null +++ b/resources/profiles/Meltingplot/mbl-480-texture.svg @@ -0,0 +1,158 @@ + + + + + + image/svg+xml + + MBL133 + + + + + + MBL133 + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/profiles/Meltingplot/mbl133-printbed.stl b/resources/profiles/Meltingplot/mbl133-printbed.stl new file mode 100644 index 0000000000000000000000000000000000000000..888491edeaa01f0dd422b657dfdb32dcbf119fea GIT binary patch literal 222284 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

|AcyE3W?5 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 P-?T>X?2^EFTQ2?&pk&*@ literal 0 HcmV?d00001 diff --git a/resources/profiles/Meltingplot/mbl308-printbed.stl b/resources/profiles/Meltingplot/mbl308-printbed.stl new file mode 100644 index 0000000000000000000000000000000000000000..ab252885915ab48e163d412f7ddb4491745ea73d GIT binary patch literal 160484 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 P-?T>X?2^EFTQ2?&pk&*@ literal 0 HcmV?d00001 diff --git a/resources/profiles/Meltingplot/mbl480-printbed.stl b/resources/profiles/Meltingplot/mbl480-printbed.stl new file mode 100644 index 0000000000000000000000000000000000000000..ab252885915ab48e163d412f7ddb4491745ea73d GIT binary patch literal 160484 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 P-?T>X?2^EFTQ2?&pk&*@ literal 0 HcmV?d00001 diff --git a/resources/profiles/Meltingplot/process/0.18mm Fine 0.4 nozzle @Meltingplot CHX 350.json b/resources/profiles/Meltingplot/process/0.18mm Fine 0.4 nozzle @Meltingplot CHX 350.json new file mode 100644 index 0000000000..29b161150e --- /dev/null +++ b/resources/profiles/Meltingplot/process/0.18mm Fine 0.4 nozzle @Meltingplot CHX 350.json @@ -0,0 +1,12 @@ +{ + "type": "process", + "name": "0.18mm Fine 0.4 nozzle @Meltingplot CHX 350", + "inherits": "fdm_process_meltingplot_chx_small_nozzle", + "from": "system", + "setting_id": "AbSOyKLL1fGceKJM", + "instantiation": "true", + "layer_height": "0.18", + "compatible_printers": [ + "Meltingplot CHX 350 0.4 nozzle" + ] +} diff --git a/resources/profiles/Meltingplot/process/0.18mm Fine 0.4 nozzle @Meltingplot MBL.json b/resources/profiles/Meltingplot/process/0.18mm Fine 0.4 nozzle @Meltingplot MBL.json new file mode 100644 index 0000000000..09624e8d1d --- /dev/null +++ b/resources/profiles/Meltingplot/process/0.18mm Fine 0.4 nozzle @Meltingplot MBL.json @@ -0,0 +1,15 @@ +{ + "type": "process", + "name": "0.18mm Fine 0.4 nozzle @Meltingplot MBL", + "inherits": "fdm_process_meltingplot_mbl_04_nozzle", + "from": "system", + "setting_id": "WF0wYUMc1HUHPyVQ", + "instantiation": "true", + "layer_height": "0.18", + "compatible_printers": [ + "Meltingplot MBL 133 0.4 nozzle", + "Meltingplot MBL 136 0.4 nozzle", + "Meltingplot MBL 308 0.4 nozzle", + "Meltingplot MBL 480 0.4 nozzle" + ] +} diff --git a/resources/profiles/Meltingplot/process/0.24mm Fine 0.6 nozzle @Meltingplot CHX 350.json b/resources/profiles/Meltingplot/process/0.24mm Fine 0.6 nozzle @Meltingplot CHX 350.json new file mode 100644 index 0000000000..b5114e1fee --- /dev/null +++ b/resources/profiles/Meltingplot/process/0.24mm Fine 0.6 nozzle @Meltingplot CHX 350.json @@ -0,0 +1,12 @@ +{ + "type": "process", + "name": "0.24mm Fine 0.6 nozzle @Meltingplot CHX 350", + "inherits": "fdm_process_meltingplot_chx_small_nozzle", + "from": "system", + "setting_id": "KrZSDq4Tsnlnu0Dm", + "instantiation": "true", + "layer_height": "0.24", + "compatible_printers": [ + "Meltingplot CHX 350 0.6 nozzle" + ] +} diff --git a/resources/profiles/Meltingplot/process/0.24mm Fine 0.6 nozzle @Meltingplot MBL.json b/resources/profiles/Meltingplot/process/0.24mm Fine 0.6 nozzle @Meltingplot MBL.json new file mode 100644 index 0000000000..c6ff710938 --- /dev/null +++ b/resources/profiles/Meltingplot/process/0.24mm Fine 0.6 nozzle @Meltingplot MBL.json @@ -0,0 +1,15 @@ +{ + "type": "process", + "name": "0.24mm Fine 0.6 nozzle @Meltingplot MBL", + "inherits": "fdm_process_meltingplot_mbl_06_nozzle", + "from": "system", + "setting_id": "9PDbCLSnBEocONzB", + "instantiation": "true", + "layer_height": "0.24", + "compatible_printers": [ + "Meltingplot MBL 133 0.6 nozzle", + "Meltingplot MBL 136 0.6 nozzle", + "Meltingplot MBL 308 0.6 nozzle", + "Meltingplot MBL 480 0.6 nozzle" + ] +} diff --git a/resources/profiles/Meltingplot/process/0.28mm Optimal 0.6 nozzle @Meltingplot CHX 350.json b/resources/profiles/Meltingplot/process/0.28mm Optimal 0.6 nozzle @Meltingplot CHX 350.json new file mode 100644 index 0000000000..476156be3a --- /dev/null +++ b/resources/profiles/Meltingplot/process/0.28mm Optimal 0.6 nozzle @Meltingplot CHX 350.json @@ -0,0 +1,12 @@ +{ + "type": "process", + "name": "0.28mm Optimal 0.6 nozzle @Meltingplot CHX 350", + "inherits": "fdm_process_meltingplot_chx_small_nozzle", + "from": "system", + "setting_id": "RrsJ1yXD61T1Sk2u", + "instantiation": "true", + "layer_height": "0.28", + "compatible_printers": [ + "Meltingplot CHX 350 0.6 nozzle" + ] +} diff --git a/resources/profiles/Meltingplot/process/0.28mm Optimal 0.6 nozzle @Meltingplot MBL.json b/resources/profiles/Meltingplot/process/0.28mm Optimal 0.6 nozzle @Meltingplot MBL.json new file mode 100644 index 0000000000..4187f5f899 --- /dev/null +++ b/resources/profiles/Meltingplot/process/0.28mm Optimal 0.6 nozzle @Meltingplot MBL.json @@ -0,0 +1,15 @@ +{ + "type": "process", + "name": "0.28mm Optimal 0.6 nozzle @Meltingplot MBL", + "inherits": "fdm_process_meltingplot_mbl_06_nozzle", + "from": "system", + "setting_id": "ewObaiyN5k5Jl17T", + "instantiation": "true", + "layer_height": "0.28", + "compatible_printers": [ + "Meltingplot MBL 133 0.6 nozzle", + "Meltingplot MBL 136 0.6 nozzle", + "Meltingplot MBL 308 0.6 nozzle", + "Meltingplot MBL 480 0.6 nozzle" + ] +} diff --git a/resources/profiles/Meltingplot/process/0.30mm Standard 0.6 nozzle @Meltingplot CHX 350.json b/resources/profiles/Meltingplot/process/0.30mm Standard 0.6 nozzle @Meltingplot CHX 350.json new file mode 100644 index 0000000000..90de66ee6e --- /dev/null +++ b/resources/profiles/Meltingplot/process/0.30mm Standard 0.6 nozzle @Meltingplot CHX 350.json @@ -0,0 +1,12 @@ +{ + "type": "process", + "name": "0.30mm Standard 0.6 nozzle @Meltingplot CHX 350", + "inherits": "fdm_process_meltingplot_chx_small_nozzle", + "from": "system", + "setting_id": "nHe2gihvCHahJ4Pw", + "instantiation": "true", + "layer_height": "0.30", + "compatible_printers": [ + "Meltingplot CHX 350 0.6 nozzle" + ] +} diff --git a/resources/profiles/Meltingplot/process/0.30mm Standard 0.6 nozzle @Meltingplot MBL.json b/resources/profiles/Meltingplot/process/0.30mm Standard 0.6 nozzle @Meltingplot MBL.json new file mode 100644 index 0000000000..6ef66db3bc --- /dev/null +++ b/resources/profiles/Meltingplot/process/0.30mm Standard 0.6 nozzle @Meltingplot MBL.json @@ -0,0 +1,15 @@ +{ + "type": "process", + "name": "0.30mm Standard 0.6 nozzle @Meltingplot MBL", + "inherits": "fdm_process_meltingplot_mbl_06_nozzle", + "from": "system", + "setting_id": "6exgbZxVLHjH3Bhd", + "instantiation": "true", + "layer_height": "0.30", + "compatible_printers": [ + "Meltingplot MBL 133 0.6 nozzle", + "Meltingplot MBL 136 0.6 nozzle", + "Meltingplot MBL 308 0.6 nozzle", + "Meltingplot MBL 480 0.6 nozzle" + ] +} diff --git a/resources/profiles/Meltingplot/process/0.32mm Fine 0.8 nozzle @Meltingplot CHX 350.json b/resources/profiles/Meltingplot/process/0.32mm Fine 0.8 nozzle @Meltingplot CHX 350.json new file mode 100644 index 0000000000..285d6594aa --- /dev/null +++ b/resources/profiles/Meltingplot/process/0.32mm Fine 0.8 nozzle @Meltingplot CHX 350.json @@ -0,0 +1,12 @@ +{ + "type": "process", + "name": "0.32mm Fine 0.8 nozzle @Meltingplot CHX 350", + "inherits": "fdm_process_meltingplot_chx_large_nozzle", + "from": "system", + "setting_id": "HSqTmgZq9mxKpWzq", + "instantiation": "true", + "layer_height": "0.32", + "compatible_printers": [ + "Meltingplot CHX 350 0.8 nozzle" + ] +} diff --git a/resources/profiles/Meltingplot/process/0.34mm Fine 0.8 nozzle @Meltingplot MBL.json b/resources/profiles/Meltingplot/process/0.34mm Fine 0.8 nozzle @Meltingplot MBL.json new file mode 100644 index 0000000000..1acc2ebb64 --- /dev/null +++ b/resources/profiles/Meltingplot/process/0.34mm Fine 0.8 nozzle @Meltingplot MBL.json @@ -0,0 +1,15 @@ +{ + "type": "process", + "name": "0.34mm Fine 0.8 nozzle @Meltingplot MBL", + "inherits": "fdm_process_meltingplot_mbl_08_nozzle", + "from": "system", + "setting_id": "XVRHVR0F8UrpWAeP", + "instantiation": "true", + "layer_height": "0.34", + "compatible_printers": [ + "Meltingplot MBL 133 0.8 nozzle", + "Meltingplot MBL 136 0.8 nozzle", + "Meltingplot MBL 308 0.8 nozzle", + "Meltingplot MBL 480 0.8 nozzle" + ] +} diff --git a/resources/profiles/Meltingplot/process/0.36mm Optimal 0.8 nozzle @Meltingplot CHX 350.json b/resources/profiles/Meltingplot/process/0.36mm Optimal 0.8 nozzle @Meltingplot CHX 350.json new file mode 100644 index 0000000000..fc6c41bd75 --- /dev/null +++ b/resources/profiles/Meltingplot/process/0.36mm Optimal 0.8 nozzle @Meltingplot CHX 350.json @@ -0,0 +1,12 @@ +{ + "type": "process", + "name": "0.36mm Optimal 0.8 nozzle @Meltingplot CHX 350", + "inherits": "fdm_process_meltingplot_chx_large_nozzle", + "from": "system", + "setting_id": "KLnV7sCKomrmvKxU", + "instantiation": "true", + "layer_height": "0.36", + "compatible_printers": [ + "Meltingplot CHX 350 0.8 nozzle" + ] +} diff --git a/resources/profiles/Meltingplot/process/0.36mm Optimal 0.8 nozzle @Meltingplot MBL.json b/resources/profiles/Meltingplot/process/0.36mm Optimal 0.8 nozzle @Meltingplot MBL.json new file mode 100644 index 0000000000..9694cff7d9 --- /dev/null +++ b/resources/profiles/Meltingplot/process/0.36mm Optimal 0.8 nozzle @Meltingplot MBL.json @@ -0,0 +1,15 @@ +{ + "type": "process", + "name": "0.36mm Optimal 0.8 nozzle @Meltingplot MBL", + "inherits": "fdm_process_meltingplot_mbl_08_nozzle", + "from": "system", + "setting_id": "WpPpQuf0jWaXQaPU", + "instantiation": "true", + "layer_height": "0.36", + "compatible_printers": [ + "Meltingplot MBL 133 0.8 nozzle", + "Meltingplot MBL 136 0.8 nozzle", + "Meltingplot MBL 308 0.8 nozzle", + "Meltingplot MBL 480 0.8 nozzle" + ] +} diff --git a/resources/profiles/Meltingplot/process/0.38mm Standard 0.8 nozzle @Meltingplot CHX 350.json b/resources/profiles/Meltingplot/process/0.38mm Standard 0.8 nozzle @Meltingplot CHX 350.json new file mode 100644 index 0000000000..40d74e2bb3 --- /dev/null +++ b/resources/profiles/Meltingplot/process/0.38mm Standard 0.8 nozzle @Meltingplot CHX 350.json @@ -0,0 +1,12 @@ +{ + "type": "process", + "name": "0.38mm Standard 0.8 nozzle @Meltingplot CHX 350", + "inherits": "fdm_process_meltingplot_chx_large_nozzle", + "from": "system", + "setting_id": "pKcgDKQM9IVmXiym", + "instantiation": "true", + "layer_height": "0.38", + "compatible_printers": [ + "Meltingplot CHX 350 0.8 nozzle" + ] +} diff --git a/resources/profiles/Meltingplot/process/0.38mm Standard 0.8 nozzle @Meltingplot MBL.json b/resources/profiles/Meltingplot/process/0.38mm Standard 0.8 nozzle @Meltingplot MBL.json new file mode 100644 index 0000000000..c555721f40 --- /dev/null +++ b/resources/profiles/Meltingplot/process/0.38mm Standard 0.8 nozzle @Meltingplot MBL.json @@ -0,0 +1,15 @@ +{ + "type": "process", + "name": "0.38mm Standard 0.8 nozzle @Meltingplot MBL", + "inherits": "fdm_process_meltingplot_mbl_08_nozzle", + "from": "system", + "setting_id": "IMZxMsLnd5IfiDFQ", + "instantiation": "true", + "layer_height": "0.38", + "compatible_printers": [ + "Meltingplot MBL 133 0.8 nozzle", + "Meltingplot MBL 136 0.8 nozzle", + "Meltingplot MBL 308 0.8 nozzle", + "Meltingplot MBL 480 0.8 nozzle" + ] +} diff --git a/resources/profiles/Meltingplot/process/0.44mm Fine 1.0 nozzle @Meltingplot CHX 350.json b/resources/profiles/Meltingplot/process/0.44mm Fine 1.0 nozzle @Meltingplot CHX 350.json new file mode 100644 index 0000000000..4f8e9487d5 --- /dev/null +++ b/resources/profiles/Meltingplot/process/0.44mm Fine 1.0 nozzle @Meltingplot CHX 350.json @@ -0,0 +1,12 @@ +{ + "type": "process", + "name": "0.44mm Fine 1.0 nozzle @Meltingplot CHX 350", + "inherits": "fdm_process_meltingplot_chx_large_nozzle", + "from": "system", + "setting_id": "QLMHgE0vHGQWiuz7", + "instantiation": "true", + "layer_height": "0.44", + "compatible_printers": [ + "Meltingplot CHX 350 1.0 nozzle" + ] +} diff --git a/resources/profiles/Meltingplot/process/0.44mm Fine 1.0 nozzle @Meltingplot MBL.json b/resources/profiles/Meltingplot/process/0.44mm Fine 1.0 nozzle @Meltingplot MBL.json new file mode 100644 index 0000000000..4f321f0192 --- /dev/null +++ b/resources/profiles/Meltingplot/process/0.44mm Fine 1.0 nozzle @Meltingplot MBL.json @@ -0,0 +1,15 @@ +{ + "type": "process", + "name": "0.44mm Fine 1.0 nozzle @Meltingplot MBL", + "inherits": "fdm_process_meltingplot_mbl_10_nozzle", + "from": "system", + "setting_id": "tjLfITsaMySQV6OC", + "instantiation": "true", + "layer_height": "0.44", + "compatible_printers": [ + "Meltingplot MBL 133 1.0 nozzle", + "Meltingplot MBL 136 1.0 nozzle", + "Meltingplot MBL 308 1.0 nozzle", + "Meltingplot MBL 480 1.0 nozzle" + ] +} diff --git a/resources/profiles/Meltingplot/process/0.48mm Fine 1.2 nozzle @Meltingplot CHX 350.json b/resources/profiles/Meltingplot/process/0.48mm Fine 1.2 nozzle @Meltingplot CHX 350.json new file mode 100644 index 0000000000..2df947e174 --- /dev/null +++ b/resources/profiles/Meltingplot/process/0.48mm Fine 1.2 nozzle @Meltingplot CHX 350.json @@ -0,0 +1,12 @@ +{ + "type": "process", + "name": "0.48mm Fine 1.2 nozzle @Meltingplot CHX 350", + "inherits": "fdm_process_meltingplot_chx_large_nozzle", + "from": "system", + "setting_id": "yzaZIGtEhvf2GGbl", + "instantiation": "true", + "layer_height": "0.48", + "compatible_printers": [ + "Meltingplot CHX 350 1.2 nozzle" + ] +} diff --git a/resources/profiles/Meltingplot/process/0.48mm Fine 1.2 nozzle @Meltingplot MBL.json b/resources/profiles/Meltingplot/process/0.48mm Fine 1.2 nozzle @Meltingplot MBL.json new file mode 100644 index 0000000000..7702399184 --- /dev/null +++ b/resources/profiles/Meltingplot/process/0.48mm Fine 1.2 nozzle @Meltingplot MBL.json @@ -0,0 +1,15 @@ +{ + "type": "process", + "name": "0.48mm Fine 1.2 nozzle @Meltingplot MBL", + "inherits": "fdm_process_meltingplot_mbl_12_nozzle", + "from": "system", + "setting_id": "erJDLPP5pRQnGwoJ", + "instantiation": "true", + "layer_height": "0.48", + "compatible_printers": [ + "Meltingplot MBL 133 1.2 nozzle", + "Meltingplot MBL 136 1.2 nozzle", + "Meltingplot MBL 308 1.2 nozzle", + "Meltingplot MBL 480 1.2 nozzle" + ] +} diff --git a/resources/profiles/Meltingplot/process/0.48mm Optimal 1.0 nozzle @Meltingplot CHX 350.json b/resources/profiles/Meltingplot/process/0.48mm Optimal 1.0 nozzle @Meltingplot CHX 350.json new file mode 100644 index 0000000000..d88e9a538c --- /dev/null +++ b/resources/profiles/Meltingplot/process/0.48mm Optimal 1.0 nozzle @Meltingplot CHX 350.json @@ -0,0 +1,12 @@ +{ + "type": "process", + "name": "0.48mm Optimal 1.0 nozzle @Meltingplot CHX 350", + "inherits": "fdm_process_meltingplot_chx_large_nozzle", + "from": "system", + "setting_id": "dZw2B5t8nN5lhyXI", + "instantiation": "true", + "layer_height": "0.48", + "compatible_printers": [ + "Meltingplot CHX 350 1.0 nozzle" + ] +} diff --git a/resources/profiles/Meltingplot/process/0.48mm Optimal 1.0 nozzle @Meltingplot MBL.json b/resources/profiles/Meltingplot/process/0.48mm Optimal 1.0 nozzle @Meltingplot MBL.json new file mode 100644 index 0000000000..2b20bba856 --- /dev/null +++ b/resources/profiles/Meltingplot/process/0.48mm Optimal 1.0 nozzle @Meltingplot MBL.json @@ -0,0 +1,15 @@ +{ + "type": "process", + "name": "0.48mm Optimal 1.0 nozzle @Meltingplot MBL", + "inherits": "fdm_process_meltingplot_mbl_10_nozzle", + "from": "system", + "setting_id": "5wtjDWniGYAAtn79", + "instantiation": "true", + "layer_height": "0.48", + "compatible_printers": [ + "Meltingplot MBL 133 1.0 nozzle", + "Meltingplot MBL 136 1.0 nozzle", + "Meltingplot MBL 308 1.0 nozzle", + "Meltingplot MBL 480 1.0 nozzle" + ] +} diff --git a/resources/profiles/Meltingplot/process/0.56mm Optimal 1.2 nozzle @Meltingplot CHX 350.json b/resources/profiles/Meltingplot/process/0.56mm Optimal 1.2 nozzle @Meltingplot CHX 350.json new file mode 100644 index 0000000000..c29d827b2e --- /dev/null +++ b/resources/profiles/Meltingplot/process/0.56mm Optimal 1.2 nozzle @Meltingplot CHX 350.json @@ -0,0 +1,12 @@ +{ + "type": "process", + "name": "0.56mm Optimal 1.2 nozzle @Meltingplot CHX 350", + "inherits": "fdm_process_meltingplot_chx_large_nozzle", + "from": "system", + "setting_id": "l6wYSAIFuyQFgT5X", + "instantiation": "true", + "layer_height": "0.56", + "compatible_printers": [ + "Meltingplot CHX 350 1.2 nozzle" + ] +} diff --git a/resources/profiles/Meltingplot/process/0.56mm Optimal 1.2 nozzle @Meltingplot MBL.json b/resources/profiles/Meltingplot/process/0.56mm Optimal 1.2 nozzle @Meltingplot MBL.json new file mode 100644 index 0000000000..f33064051a --- /dev/null +++ b/resources/profiles/Meltingplot/process/0.56mm Optimal 1.2 nozzle @Meltingplot MBL.json @@ -0,0 +1,15 @@ +{ + "type": "process", + "name": "0.56mm Optimal 1.2 nozzle @Meltingplot MBL", + "inherits": "fdm_process_meltingplot_mbl_12_nozzle", + "from": "system", + "setting_id": "i2aDrQXA45e6DpzC", + "instantiation": "true", + "layer_height": "0.56", + "compatible_printers": [ + "Meltingplot MBL 133 1.2 nozzle", + "Meltingplot MBL 136 1.2 nozzle", + "Meltingplot MBL 308 1.2 nozzle", + "Meltingplot MBL 480 1.2 nozzle" + ] +} diff --git a/resources/profiles/Meltingplot/process/fdm_process_common.json b/resources/profiles/Meltingplot/process/fdm_process_common.json new file mode 100644 index 0000000000..ae3651d8fd --- /dev/null +++ b/resources/profiles/Meltingplot/process/fdm_process_common.json @@ -0,0 +1,107 @@ +{ + "type": "process", + "name": "fdm_process_common", + "from": "system", + "instantiation": "false", + "reduce_crossing_wall": "0", + "max_travel_detour_distance": "0", + "bottom_surface_pattern": "monotonic", + "bottom_shell_thickness": "0", + "bridge_speed": "50", + "brim_width": "5", + "brim_object_gap": "0.1", + "compatible_printers": [], + "compatible_printers_condition": "", + "print_sequence": "by layer", + "default_acceleration": "1000", + "initial_layer_acceleration": "500", + "top_surface_acceleration": "1000", + "travel_acceleration": "1000", + "inner_wall_acceleration": "1000", + "outer_wall_acceleration": "700", + "bridge_no_support": "0", + "draft_shield": "disabled", + "elefant_foot_compensation": "0", + "enable_arc_fitting": "0", + "wall_infill_order": "inner wall/outer wall/infill", + "infill_direction": "45", + "sparse_infill_density": "15%", + "sparse_infill_pattern": "crosshatch", + "initial_layer_print_height": "0.2", + "infill_combination": "0", + "infill_wall_overlap": "25%", + "interface_shells": "0", + "ironing_flow": "10%", + "ironing_spacing": "0.15", + "ironing_speed": "30", + "ironing_type": "no ironing", + "reduce_infill_retraction": "1", + "filename_format": "{input_filename_base}_{layer_height}mm_{filament_type[initial_tool]}_{printer_model}_{print_time}.gcode", + "detect_overhang_wall": "1", + "slowdown_for_curled_perimeters": "1", + "overhang_1_4_speed": "0", + "overhang_2_4_speed": "50", + "overhang_3_4_speed": "30", + "overhang_4_4_speed": "10", + "line_width": "110%", + "inner_wall_line_width": "110%", + "outer_wall_line_width": "100%", + "precise_outer_wall": "0", + "top_surface_line_width": "93.75%", + "sparse_infill_line_width": "110%", + "initial_layer_line_width": "120%", + "internal_solid_infill_line_width": "120%", + "support_line_width": "96%", + "wall_loops": "3", + "print_settings_id": "", + "raft_layers": "0", + "seam_position": "aligned", + "skirt_distance": "2", + "skirt_height": "3", + "min_skirt_length": "4", + "skirt_loops": "0", + "minimum_sparse_infill_area": "15", + "spiral_mode": "0", + "standby_temperature_delta": "-5", + "enable_support": "0", + "resolution": "0.012", + "support_type": "normal(auto)", + "support_on_build_plate_only": "0", + "support_top_z_distance": "0.2", + "support_bottom_z_distance": "0.2", + "support_filament": "0", + "support_interface_loop_pattern": "0", + "support_interface_filament": "0", + "support_interface_top_layers": "2", + "support_interface_bottom_layers": "2", + "support_interface_spacing": "0.5", + "support_interface_speed": "80", + "support_base_pattern": "default", + "support_base_pattern_spacing": "2.5", + "support_speed": "150", + "support_threshold_angle": "30", + "support_object_xy_distance": "0.35", + "tree_support_branch_angle": "30", + "tree_support_wall_count": "0", + "detect_thin_wall": "0", + "top_surface_pattern": "monotonicline", + "top_shell_thickness": "0.8", + "enable_prime_tower": "1", + "wipe_tower_no_sparse_layers": "0", + "prime_tower_width": "60", + "xy_hole_compensation": "0", + "xy_contour_compensation": "0", + "layer_height": "0.2", + "bottom_shell_layers": "3", + "top_shell_layers": "4", + "bridge_flow": "1", + "initial_layer_speed": "45", + "initial_layer_infill_speed": "45", + "outer_wall_speed": "45", + "inner_wall_speed": "80", + "sparse_infill_speed": "150", + "internal_solid_infill_speed": "150", + "top_surface_speed": "50", + "gap_infill_speed": "30", + "travel_speed": "200" +} diff --git a/resources/profiles/Meltingplot/process/fdm_process_meltingplot_chx_common.json b/resources/profiles/Meltingplot/process/fdm_process_meltingplot_chx_common.json new file mode 100644 index 0000000000..2a27efcb54 --- /dev/null +++ b/resources/profiles/Meltingplot/process/fdm_process_meltingplot_chx_common.json @@ -0,0 +1,39 @@ +{ + "type": "process", + "name": "fdm_process_meltingplot_chx_common", + "inherits": "fdm_process_common", + "from": "system", + "instantiation": "false", + "filename_format": "{input_filename_base}_L{layer_height}mm_N{nozzle_diameter[0]}_{filament_type[initial_tool]}_{printer_model}_{print_time}.gcode", + "brim_object_gap": "0", + "brim_type": "outer_only", + "default_acceleration": "6000", + "slowdown_for_curled_perimeters": "0", + "enable_support": "1", + "extrusion_rate_smoothing_external_perimeter_only": "1", + "gap_infill_speed": "250", + "infill_wall_overlap": "15%", + "initial_layer_acceleration": "500", + "initial_layer_infill_speed": "30", + "initial_layer_line_width": "120%", + "initial_layer_speed": "20", + "inner_wall_line_width": "110%", + "inner_wall_speed": "300", + "internal_solid_infill_line_width": "115%", + "internal_solid_infill_speed": "250", + "line_width": "120%", + "reduce_infill_retraction": "0", + "seam_gap": "0", + "skirt_speed": "20", + "skirt_type": "perobject", + "slow_down_layers": "3", + "sparse_infill_line_width": "110%", + "support_line_width": "110%", + "support_type": "tree(auto)", + "top_shell_layers": "5", + "top_surface_acceleration": "2000", + "top_surface_line_width": "110%", + "top_surface_speed": "200", + "travel_speed": "1000", + "wall_generator": "classic" +} diff --git a/resources/profiles/Meltingplot/process/fdm_process_meltingplot_chx_large_nozzle.json b/resources/profiles/Meltingplot/process/fdm_process_meltingplot_chx_large_nozzle.json new file mode 100644 index 0000000000..63bf9517b0 --- /dev/null +++ b/resources/profiles/Meltingplot/process/fdm_process_meltingplot_chx_large_nozzle.json @@ -0,0 +1,26 @@ +{ + "type": "process", + "name": "fdm_process_meltingplot_chx_large_nozzle", + "inherits": "fdm_process_meltingplot_chx_common", + "from": "system", + "instantiation": "false", + "bottom_shell_layers": "4", + "initial_layer_print_height": "0.5", + "inner_wall_acceleration": "6000", + "max_volumetric_extrusion_rate_slope": "300", + "outer_wall_acceleration": "2000", + "outer_wall_line_width": "110%", + "outer_wall_speed": "80", + "sparse_infill_pattern": "cubic", + "sparse_infill_speed": "300", + "support_base_pattern_spacing": "7.5", + "support_interface_speed": "80", + "support_object_first_layer_gap": "0.5", + "support_object_xy_distance": "0.45", + "support_speed": "200", + "support_style": "tree_slim", + "support_threshold_angle": "22", + "top_shell_thickness": "0.6", + "travel_acceleration": "6000", + "tree_support_tip_diameter": "1.2" +} diff --git a/resources/profiles/Meltingplot/process/fdm_process_meltingplot_chx_small_nozzle.json b/resources/profiles/Meltingplot/process/fdm_process_meltingplot_chx_small_nozzle.json new file mode 100644 index 0000000000..95506dcd70 --- /dev/null +++ b/resources/profiles/Meltingplot/process/fdm_process_meltingplot_chx_small_nozzle.json @@ -0,0 +1,24 @@ +{ + "type": "process", + "name": "fdm_process_meltingplot_chx_small_nozzle", + "inherits": "fdm_process_meltingplot_chx_common", + "from": "system", + "instantiation": "false", + "bottom_shell_thickness": "2", + "default_jerk": "12", + "infill_jerk": "12", + "initial_layer_jerk": "5", + "initial_layer_print_height": "0.4", + "inner_wall_acceleration": "6000", + "outer_wall_acceleration": "3000", + "outer_wall_jerk": "6", + "outer_wall_line_width": "115%", + "outer_wall_speed": "220", + "sparse_infill_speed": "270", + "support_top_z_distance": "0.3", + "top_shell_thickness": "2", + "top_surface_jerk": "6", + "travel_acceleration": "6000", + "wall_sequence": "inner-outer-inner wall", + "wipe_before_external_loop": "1" +} diff --git a/resources/profiles/Meltingplot/process/fdm_process_meltingplot_mbl_04_nozzle.json b/resources/profiles/Meltingplot/process/fdm_process_meltingplot_mbl_04_nozzle.json new file mode 100644 index 0000000000..bef0abf7e6 --- /dev/null +++ b/resources/profiles/Meltingplot/process/fdm_process_meltingplot_mbl_04_nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "process", + "name": "fdm_process_meltingplot_mbl_04_nozzle", + "inherits": "fdm_process_meltingplot_mbl_common", + "from": "system", + "instantiation": "false", + "bridge_flow": "0.85", + "initial_layer_print_height": "0.3", + "line_width": "115%", + "inner_wall_line_width": "115%", + "outer_wall_line_width": "115%", + "sparse_infill_line_width": "115%", + "internal_solid_infill_line_width": "115%" +} diff --git a/resources/profiles/Meltingplot/process/fdm_process_meltingplot_mbl_06_nozzle.json b/resources/profiles/Meltingplot/process/fdm_process_meltingplot_mbl_06_nozzle.json new file mode 100644 index 0000000000..e35d4446c1 --- /dev/null +++ b/resources/profiles/Meltingplot/process/fdm_process_meltingplot_mbl_06_nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "process", + "name": "fdm_process_meltingplot_mbl_06_nozzle", + "inherits": "fdm_process_meltingplot_mbl_common", + "from": "system", + "instantiation": "false", + "bridge_flow": "0.65", + "initial_layer_print_height": "0.4", + "line_width": "120%", + "inner_wall_line_width": "120%", + "outer_wall_line_width": "110%", + "sparse_infill_line_width": "120%", + "internal_solid_infill_line_width": "120%" +} diff --git a/resources/profiles/Meltingplot/process/fdm_process_meltingplot_mbl_08_nozzle.json b/resources/profiles/Meltingplot/process/fdm_process_meltingplot_mbl_08_nozzle.json new file mode 100644 index 0000000000..7548418e1f --- /dev/null +++ b/resources/profiles/Meltingplot/process/fdm_process_meltingplot_mbl_08_nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "process", + "name": "fdm_process_meltingplot_mbl_08_nozzle", + "inherits": "fdm_process_meltingplot_mbl_common", + "from": "system", + "instantiation": "false", + "bridge_flow": "0.5", + "initial_layer_print_height": "0.5", + "line_width": "120%", + "inner_wall_line_width": "120%", + "outer_wall_line_width": "115%", + "sparse_infill_line_width": "115%", + "internal_solid_infill_line_width": "120%" +} diff --git a/resources/profiles/Meltingplot/process/fdm_process_meltingplot_mbl_10_nozzle.json b/resources/profiles/Meltingplot/process/fdm_process_meltingplot_mbl_10_nozzle.json new file mode 100644 index 0000000000..811916f197 --- /dev/null +++ b/resources/profiles/Meltingplot/process/fdm_process_meltingplot_mbl_10_nozzle.json @@ -0,0 +1,15 @@ +{ + "type": "process", + "name": "fdm_process_meltingplot_mbl_10_nozzle", + "inherits": "fdm_process_meltingplot_mbl_common", + "from": "system", + "instantiation": "false", + "bridge_flow": "0.4", + "initial_layer_print_height": "0.5", + "infill_wall_overlap": "15%", + "line_width": "120%", + "inner_wall_line_width": "120%", + "outer_wall_line_width": "110%", + "sparse_infill_line_width": "120%", + "internal_solid_infill_line_width": "120%" +} diff --git a/resources/profiles/Meltingplot/process/fdm_process_meltingplot_mbl_12_nozzle.json b/resources/profiles/Meltingplot/process/fdm_process_meltingplot_mbl_12_nozzle.json new file mode 100644 index 0000000000..02f4221eb9 --- /dev/null +++ b/resources/profiles/Meltingplot/process/fdm_process_meltingplot_mbl_12_nozzle.json @@ -0,0 +1,15 @@ +{ + "type": "process", + "name": "fdm_process_meltingplot_mbl_12_nozzle", + "inherits": "fdm_process_meltingplot_mbl_common", + "from": "system", + "instantiation": "false", + "bridge_flow": "0.4", + "initial_layer_print_height": "0.5", + "infill_wall_overlap": "15%", + "line_width": "120%", + "inner_wall_line_width": "120%", + "outer_wall_line_width": "110%", + "sparse_infill_line_width": "120%", + "internal_solid_infill_line_width": "120%" +} diff --git a/resources/profiles/Meltingplot/process/fdm_process_meltingplot_mbl_common.json b/resources/profiles/Meltingplot/process/fdm_process_meltingplot_mbl_common.json new file mode 100644 index 0000000000..0e94be6513 --- /dev/null +++ b/resources/profiles/Meltingplot/process/fdm_process_meltingplot_mbl_common.json @@ -0,0 +1,60 @@ +{ + "type": "process", + "name": "fdm_process_meltingplot_mbl_common", + "inherits": "fdm_process_common", + "from": "system", + "instantiation": "false", + "filename_format": "{input_filename_base}_L{layer_height}mm_N{nozzle_diameter[0]}_{filament_type[initial_tool]}_{printer_model}_{print_time}.gcode", + "bottom_shell_layers": "4", + "bottom_shell_thickness": "0.8", + "bridge_speed": "20", + "slowdown_for_curled_perimeters": "0", + "default_acceleration": "0", + "initial_layer_acceleration": "0", + "inner_wall_acceleration": "0", + "outer_wall_acceleration": "0", + "top_surface_acceleration": "0", + "travel_acceleration": "0", + "detect_thin_wall": "1", + "elefant_foot_compensation": "0.1", + "enable_prime_tower": "0", + "enable_support": "0", + "gap_infill_speed": "42", + "infill_wall_overlap": "20%", + "initial_layer_infill_speed": "30", + "initial_layer_line_width": "120%", + "initial_layer_speed": "20", + "inner_wall_speed": "45", + "internal_solid_infill_speed": "80", + "outer_wall_speed": "42", + "prime_tower_width": "60", + "resolution": "0.01", + "seam_position": "aligned", + "skirt_distance": "5", + "skirt_height": "1", + "skirt_loops": "3", + "small_perimeter_speed": "42", + "sparse_infill_density": "15%", + "sparse_infill_pattern": "cubic", + "sparse_infill_speed": "80", + "standby_temperature_delta": "-100", + "support_base_pattern": "rectilinear", + "support_base_pattern_spacing": "5", + "support_interface_spacing": "0.2", + "support_interface_speed": "40", + "support_interface_top_layers": "4", + "support_interface_bottom_layers": "4", + "support_line_width": "100%", + "support_object_xy_distance": "0.2", + "support_on_build_plate_only": "1", + "support_speed": "50", + "support_style": "snug", + "support_threshold_angle": "55", + "support_top_z_distance": "0.1", + "top_shell_layers": "5", + "top_shell_thickness": "1", + "top_surface_line_width": "110%", + "top_surface_speed": "42", + "travel_speed": "350", + "wall_loops": "2" +} From bfe458507bc05007c32f3e208501fdf471e89819 Mon Sep 17 00:00:00 2001 From: Ian Bassi Date: Mon, 21 Sep 2026 14:23:32 -0300 Subject: [PATCH 17/48] Add X-Ray view mode to 3D viewport (#15770) --- resources/shaders/110/xray.fs | 28 ++++++++++++++ resources/shaders/110/xray.vs | 31 +++++++++++++++ resources/shaders/140/xray.fs | 30 +++++++++++++++ resources/shaders/140/xray.vs | 31 +++++++++++++++ src/slic3r/GUI/3DScene.cpp | 6 ++- src/slic3r/GUI/GLCanvas3D.cpp | 60 +++++++++++++++++++++++++++++ src/slic3r/GUI/GLCanvas3D.hpp | 2 + src/slic3r/GUI/GLShadersManager.cpp | 2 + src/slic3r/GUI/Plater.cpp | 11 ++++++ src/slic3r/GUI/Plater.hpp | 3 ++ 10 files changed, 203 insertions(+), 1 deletion(-) create mode 100644 resources/shaders/110/xray.fs create mode 100644 resources/shaders/110/xray.vs create mode 100644 resources/shaders/140/xray.fs create mode 100644 resources/shaders/140/xray.vs diff --git a/resources/shaders/110/xray.fs b/resources/shaders/110/xray.fs new file mode 100644 index 0000000000..27bdb17044 --- /dev/null +++ b/resources/shaders/110/xray.fs @@ -0,0 +1,28 @@ +#version 110 + +// X-Ray view: each surface is a thin translucent layer of its own color, covering more the more +// edge-on it is seen. The caller draws it with depth writes off, so every surface a view ray crosses +// composites and overlapping geometry reads as denser. Source-alpha rather than additive blending: +// additive would saturate to white on the light theme's near-white background. +#define EDGE_FALLOFF 2.0 +// Coverage head-on and edge-on. +#define FACE_DENSITY 0.12 +#define EDGE_DENSITY 0.65 + +uniform vec4 uniform_color; + +varying vec3 eye_normal; +varying vec3 eye_position; +varying vec3 clipping_planes_dots; + +void main() +{ + if (any(lessThan(clipping_planes_dots, vec3(0.0)))) + discard; + + // abs(): back faces are drawn too, and there only the angle matters. + float facing = abs(dot(normalize(eye_normal), normalize(-eye_position))); + float density = mix(EDGE_DENSITY, FACE_DENSITY, pow(facing, EDGE_FALLOFF)); + + gl_FragColor = vec4(uniform_color.rgb, density * uniform_color.a); +} diff --git a/resources/shaders/110/xray.vs b/resources/shaders/110/xray.vs new file mode 100644 index 0000000000..85f932f2df --- /dev/null +++ b/resources/shaders/110/xray.vs @@ -0,0 +1,31 @@ +#version 110 + +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; +uniform mat3 view_normal_matrix; +uniform mat4 volume_world_matrix; + +// Clipping, as in gouraud.vs: the preview's top / bottom plane and the SLA gizmo's free one. +uniform vec2 z_range; +uniform vec4 clipping_plane; + +attribute vec3 v_position; +attribute vec3 v_normal; + +varying vec3 eye_normal; +varying vec3 eye_position; +varying vec3 clipping_planes_dots; + +void main() +{ + eye_normal = view_normal_matrix * v_normal; + + vec4 position = view_model_matrix * vec4(v_position, 1.0); + eye_position = position.xyz; + + // A component below zero means the fragment is clipped away. + vec4 world_pos = volume_world_matrix * vec4(v_position, 1.0); + clipping_planes_dots = vec3(dot(world_pos, clipping_plane), world_pos.z - z_range.x, z_range.y - world_pos.z); + + gl_Position = projection_matrix * position; +} diff --git a/resources/shaders/140/xray.fs b/resources/shaders/140/xray.fs new file mode 100644 index 0000000000..71c3569f8e --- /dev/null +++ b/resources/shaders/140/xray.fs @@ -0,0 +1,30 @@ +#version 140 + +// X-Ray view: each surface is a thin translucent layer of its own color, covering more the more +// edge-on it is seen. The caller draws it with depth writes off, so every surface a view ray crosses +// composites and overlapping geometry reads as denser. Source-alpha rather than additive blending: +// additive would saturate to white on the light theme's near-white background. +#define EDGE_FALLOFF 2.0 +// Coverage head-on and edge-on. +#define FACE_DENSITY 0.12 +#define EDGE_DENSITY 0.65 + +uniform vec4 uniform_color; + +in vec3 eye_normal; +in vec3 eye_position; +in vec3 clipping_planes_dots; + +out vec4 out_color; + +void main() +{ + if (any(lessThan(clipping_planes_dots, vec3(0.0)))) + discard; + + // abs(): back faces are drawn too, and there only the angle matters. + float facing = abs(dot(normalize(eye_normal), normalize(-eye_position))); + float density = mix(EDGE_DENSITY, FACE_DENSITY, pow(facing, EDGE_FALLOFF)); + + out_color = vec4(uniform_color.rgb, density * uniform_color.a); +} diff --git a/resources/shaders/140/xray.vs b/resources/shaders/140/xray.vs new file mode 100644 index 0000000000..9cb0d64b32 --- /dev/null +++ b/resources/shaders/140/xray.vs @@ -0,0 +1,31 @@ +#version 140 + +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; +uniform mat3 view_normal_matrix; +uniform mat4 volume_world_matrix; + +// Clipping, as in gouraud.vs: the preview's top / bottom plane and the SLA gizmo's free one. +uniform vec2 z_range; +uniform vec4 clipping_plane; + +in vec3 v_position; +in vec3 v_normal; + +out vec3 eye_normal; +out vec3 eye_position; +out vec3 clipping_planes_dots; + +void main() +{ + eye_normal = view_normal_matrix * v_normal; + + vec4 position = view_model_matrix * vec4(v_position, 1.0); + eye_position = position.xyz; + + // A component below zero means the fragment is clipped away. + vec4 world_pos = volume_world_matrix * vec4(v_position, 1.0); + clipping_planes_dots = vec3(dot(world_pos, clipping_plane), world_pos.z - z_range.x, z_range.y - world_pos.z); + + gl_Position = projection_matrix * position; +} diff --git a/src/slic3r/GUI/3DScene.cpp b/src/slic3r/GUI/3DScene.cpp index fd23337b44..bf3cdc5303 100644 --- a/src/slic3r/GUI/3DScene.cpp +++ b/src/slic3r/GUI/3DScene.cpp @@ -1157,6 +1157,10 @@ void GLVolumeCollection::render(GLVolumeCollection::ERenderType type, const float support_normal_z = get_selection_support_normal_z(); + // The outline passes below are driven by is_outline, which only the object shaders have; with an + // overlay one (wireframe, x-ray) bound they would just draw the volume again. + const bool shader_can_outline = shader->get_uniform_location("is_outline") >= 0; + // Prime depth_tex on every frame so non-outline draws do not keep the // default sampler unit 0, which can conflict with other sampler types. shader->set_uniform("depth_tex", OUTLINE_DEPTH_TEX_UNIT); @@ -1257,7 +1261,7 @@ void GLVolumeCollection::render(GLVolumeCollection::ERenderType type, const Matrix3d view_normal_matrix = view_matrix.matrix().block(0, 0, 3, 3) * model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose(); shader->set_uniform("view_normal_matrix", view_normal_matrix); //BBS: add outline related logic - if (volume.first->selected && GUI::wxGetApp().show_outline()) + if (volume.first->selected && shader_can_outline && GUI::wxGetApp().show_outline()) volume.first->render_with_outline(cnv_size); else volume.first->render(); diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 02ef95e2c6..19bc6eb98a 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -8758,6 +8758,15 @@ void GLCanvas3D::_render_objects(GLVolumeCollection::ERenderType type, bool with else m_volumes.set_show_sinking_contours(!m_gizmos.is_hiding_instances()); + // Orca: X-Ray replaces both shaded passes with a single one, driven from the opaque call, and + // reuses the volume state (print volume, z range, clipping plane) set up above. + if (_is_xray_view_active()) { + if (type == GLVolumeCollection::ERenderType::Opaque) + _render_xray_volumes(); + m_camera_clipping_plane = ClippingPlane::ClipsNothing(); + return; + } + const bool realistic_mode = wxGetApp().app_config != nullptr && wxGetApp().app_config->get_bool(SETTING_OPENGL_REALISTIC_MODE); const bool realistic_phong = wxGetApp().app_config != nullptr && wxGetApp().app_config->get_bool(SETTING_OPENGL_REALISTIC_PHONG); const std::string shader_name = (realistic_mode && realistic_phong) ? "phong" : "gouraud"; @@ -8894,6 +8903,51 @@ void GLCanvas3D::_render_objects(GLVolumeCollection::ERenderType type, bool with m_camera_clipping_plane = ClippingPlane::ClipsNothing(); } +bool GLCanvas3D::_is_xray_view_active() const +{ + if (m_canvas_type == ECanvasType::CanvasPreview || !wxGetApp().plater()->is_show_xray()) + return false; + + // A painting gizmo and the layer height editor draw the object through their own shaders, and + // would lose what they draw if X-Ray took the pass over. + if (dynamic_cast(m_gizmos.get_current()) != nullptr) + return false; + return !(m_picking_enabled && m_layers_editing.is_enabled() && m_layers_editing.last_object_id != -1 && + m_layers_editing.object_max_z() > 0.0f); +} + +void GLCanvas3D::_render_xray_volumes() +{ + if (m_volumes.empty()) + return; + + GLShaderProgram* shader = wxGetApp().get_shader("xray"); + if (shader == nullptr) + return; + + const Camera& camera = wxGetApp().plater()->get_camera(); + const ECanvasType canvas_type = m_canvas_type; + + // Depth writes off so every surface along a view ray composites, not just the nearest one, and + // back faces kept for the far wall of a hollow part. The low, near-uniform coverage the shader + // emits saturates towards the volume color whatever the order, so the volumes are not sorted. + glsafe(::glDepthMask(GL_FALSE)); + glsafe(::glEnable(GL_BLEND)); + glsafe(::glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)); + + shader->start_using(); + m_volumes.render(GLVolumeCollection::ERenderType::All, true, camera.get_view_matrix(), camera.get_projection_matrix(), + get_canvas_size(), [this, canvas_type](const GLVolume& volume) { + if (canvas_type == ECanvasType::CanvasAssembleView) + return !volume.is_modifier && !volume.is_wipe_tower; + return m_render_sla_auxiliaries || volume.composite_id.volume_id >= 0; + }); + shader->stop_using(); + + glsafe(::glDisable(GL_BLEND)); + glsafe(::glDepthMask(GL_TRUE)); +} + void GLCanvas3D::_render_wireframe_overlay() { if (!wxGetApp().plater()->is_show_wireframe()) @@ -10020,6 +10074,12 @@ void GLCanvas3D::_render_canvas_toolbar() [this, p]{p->toggle_show_wireframe(); m_dirty = true;} ); + create_menu_item( _utf8(L("X-Ray")), + m_canvas_type != ECanvasType::CanvasPreview, // not work on preview + p->is_show_xray(), + [this, p]{p->toggle_show_xray(); m_dirty = true;} + ); + create_menu_item( _utf8(L("Realistic View")), m_canvas_type != ECanvasType::CanvasPreview, // not work on preview cfg->get_bool(SETTING_OPENGL_REALISTIC_MODE), diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index fe6108d39f..9c78581f69 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -1333,6 +1333,8 @@ private: //BBS: add outline drawing logic void _render_objects(GLVolumeCollection::ERenderType type, bool with_outline = true); void _render_wireframe_overlay(); + bool _is_xray_view_active() const; + void _render_xray_volumes(); //BBS: GUI refactor: add canvas size as parameters void _render_gcode(int canvas_width, int canvas_height); void _render_gcode_overlay(int canvas_width, int canvas_height); diff --git a/src/slic3r/GUI/GLShadersManager.cpp b/src/slic3r/GUI/GLShadersManager.cpp index 2b8a0edf0a..b35d598829 100644 --- a/src/slic3r/GUI/GLShadersManager.cpp +++ b/src/slic3r/GUI/GLShadersManager.cpp @@ -90,6 +90,8 @@ std::pair GLShadersManager::init() , { "ENABLE_ENVIRONMENT_MAP"sv } #endif // ENABLE_ENVIRONMENT_MAP ); + // used to render objects as translucent, edge weighted surfaces in the X-Ray view + valid &= append_shader("xray", { prefix + "xray.vs", prefix + "xray.fs" }); // used to render variable layers heights in 3d editor valid &= append_shader("variable_layer_height", { prefix + "variable_layer_height.vs", prefix + "variable_layer_height.fs" }); // used to render highlight contour around selected triangles inside the multi-material gizmo diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 502265af00..d2196fefe6 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -6827,6 +6827,7 @@ struct Plater::priv bool show_render_statistic_dialog{ false }; bool show_wireframe{ false }; bool wireframe_enabled{ true }; + bool show_xray{ false }; static const std::regex pattern_bundle; static const std::regex pattern_3mf; @@ -22399,6 +22400,16 @@ bool Plater::is_wireframe_enabled() const return p->wireframe_enabled; } +void Plater::toggle_show_xray() +{ + p->show_xray = !p->show_xray; +} + +bool Plater::is_show_xray() const +{ + return p->show_xray; +} + /*Plater::TakeSnapshot::TakeSnapshot(Plater *plater, const std::string &snapshot_name) : TakeSnapshot(plater, from_u8(snapshot_name)) {} diff --git a/src/slic3r/GUI/Plater.hpp b/src/slic3r/GUI/Plater.hpp index 1474356e45..ae70a6a0bb 100644 --- a/src/slic3r/GUI/Plater.hpp +++ b/src/slic3r/GUI/Plater.hpp @@ -956,6 +956,9 @@ public: void enable_wireframe(bool status); bool is_wireframe_enabled() const; + void toggle_show_xray(); + bool is_show_xray() const; + // Wrapper around wxWindow::PopupMenu to suppress error messages popping out while tracking the popup menu. bool PopupMenu(wxMenu *menu, const wxPoint& pos = wxDefaultPosition); bool PopupMenu(wxMenu *menu, int x, int y) { return this->PopupMenu(menu, wxPoint(x, y)); } From 824b216f18232a0e25644e225c286746ee07cb5f Mon Sep 17 00:00:00 2001 From: Kris Austin Date: Mon, 21 Sep 2026 15:36:04 -0500 Subject: [PATCH 18/48] feat(gui): assignable keyboard shortcuts (#15706) --- docs/HLSD/keyboard-shortcuts.md | 132 +++ src/slic3r/CMakeLists.txt | 4 + src/slic3r/GUI/GLCanvas3D.cpp | 824 ++++++------------ src/slic3r/GUI/GLCanvas3D.hpp | 27 +- src/slic3r/GUI/GUI_App.cpp | 30 +- src/slic3r/GUI/GUI_App.hpp | 12 +- src/slic3r/GUI/GUI_Factories.cpp | 10 +- src/slic3r/GUI/GUI_ObjectList.cpp | 131 ++- src/slic3r/GUI/GUI_ObjectList.hpp | 9 +- src/slic3r/GUI/GUI_Preview.cpp | 24 - src/slic3r/GUI/GUI_Preview.hpp | 1 - src/slic3r/GUI/Gizmos/GLGizmoAdvancedCut.cpp | 1 - src/slic3r/GUI/Gizmos/GLGizmoAssembly.cpp | 3 +- src/slic3r/GUI/Gizmos/GLGizmoBase.cpp | 9 +- src/slic3r/GUI/Gizmos/GLGizmoBase.hpp | 9 +- src/slic3r/GUI/Gizmos/GLGizmoBrimEars.cpp | 3 +- src/slic3r/GUI/Gizmos/GLGizmoCut.cpp | 3 +- src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp | 3 +- src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp | 30 +- src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp | 3 +- src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp | 3 +- src/slic3r/GUI/Gizmos/GLGizmoFuzzySkin.cpp | 3 +- src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp | 1 - src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp | 3 +- src/slic3r/GUI/Gizmos/GLGizmoMeshBoolean.cpp | 3 +- .../GUI/Gizmos/GLGizmoMmuSegmentation.cpp | 37 +- .../GUI/Gizmos/GLGizmoMmuSegmentation.hpp | 2 +- src/slic3r/GUI/Gizmos/GLGizmoMove.cpp | 3 +- src/slic3r/GUI/Gizmos/GLGizmoPainterBase.hpp | 2 + src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp | 3 +- src/slic3r/GUI/Gizmos/GLGizmoScale.cpp | 3 +- src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp | 22 +- src/slic3r/GUI/Gizmos/GLGizmoSeam.hpp | 3 +- src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp | 1 - src/slic3r/GUI/Gizmos/GLGizmoText.cpp | 1 - src/slic3r/GUI/Gizmos/GLGizmosManager.cpp | 86 +- src/slic3r/GUI/Gizmos/GLGizmosManager.hpp | 5 +- src/slic3r/GUI/HintNotification.cpp | 4 +- src/slic3r/GUI/KBShortcutsDialog.cpp | 800 ++++++++++------- src/slic3r/GUI/KBShortcutsDialog.hpp | 123 ++- src/slic3r/GUI/KeyChord.cpp | 314 +++++++ src/slic3r/GUI/KeyChord.hpp | 64 ++ src/slic3r/GUI/MainFrame.cpp | 314 ++++--- src/slic3r/GUI/MainFrame.hpp | 26 + src/slic3r/GUI/NativeCommands.cpp | 3 +- src/slic3r/GUI/Plater.cpp | 12 +- src/slic3r/GUI/Preferences.cpp | 35 +- src/slic3r/GUI/Preferences.hpp | 6 + src/slic3r/GUI/Shortcuts.cpp | 377 ++++++++ src/slic3r/GUI/Shortcuts.hpp | 127 +++ tests/slic3rutils/CMakeLists.txt | 1 + tests/slic3rutils/test_shortcuts.cpp | 329 +++++++ 52 files changed, 2685 insertions(+), 1299 deletions(-) create mode 100644 docs/HLSD/keyboard-shortcuts.md create mode 100644 src/slic3r/GUI/KeyChord.cpp create mode 100644 src/slic3r/GUI/KeyChord.hpp create mode 100644 src/slic3r/GUI/Shortcuts.cpp create mode 100644 src/slic3r/GUI/Shortcuts.hpp create mode 100644 tests/slic3rutils/test_shortcuts.cpp diff --git a/docs/HLSD/keyboard-shortcuts.md b/docs/HLSD/keyboard-shortcuts.md new file mode 100644 index 0000000000..7cfc72c30f --- /dev/null +++ b/docs/HLSD/keyboard-shortcuts.md @@ -0,0 +1,132 @@ +# Keyboard Shortcuts + +## Why it exists + +Key events arrive in several windows (the main frame's char hook, the 3D canvases, the +gizmo manager and the object list), and the same keys are shown again in menu labels, +toolbar tooltips, gizmo names and the shortcuts dialog. The registry is the one table all +of them read. Each binding is defined once; dispatchers look key events up there, labels +are derived from it, and a change the user makes updates all of them. + +## Data model + +`KeyChord` (`src/slic3r/GUI/KeyChord.hpp`) is one key press: the key code as +`wxEVT_KEY_DOWN` reports it, plus the `wxMOD_*` modifiers held with it. It has two +text forms. The canonical one (`Ctrl+Shift+S`) is platform-neutral and doubles as the wx +accelerator string and the config format. The display one uses translated modifier +names and the command and option glyphs on macOS. `KeyChord::from_event()` turns any wx +key event into the same key code and modifiers, so a chord recorded in the dialog is +equal to the chord a dispatcher builds from the key press. + +`Shortcut` is the enum of every user-facing binding. `shortcut_table` in +`src/slic3r/GUI/Shortcuts.cpp` gives each one a config key, a description, a context +mask, a default chord, a `repeatable` flag and a `modifier_variants` flag, in the order +the dialog lists them; a `static_assert` keeps the table and the enum in step. + +`ShortcutRegistry` overlays the user's overrides on the defaults and keeps a +chord-to-shortcut index for lookups. It reads and writes the `shortcuts` section of +`AppConfig`. Only overrides are stored, so a default can change between releases +without touching anyone's config; `none` records a shortcut the user unbound. + +## Contexts + +A key press is looked up in the context of the window that received it. + +| Context | Dispatcher | Examples | +|--------------|-----------------------------------------------------------|-------------------------------| +| `Global` | `MainFrame`'s `wxEVT_CHAR_HOOK`, before any child sees it | New project, camera views | +| `Plater` | `GLCanvas3D` of the 3D and assembly views | Arrange, gizmo activation | +| `Preview` | `GLCanvas3D` of the G-code preview | One-layer mode, jump to layer | +| `ObjectList` | the object list | Copy, delete, auto drop | +| `Painting` | `GLGizmosManager` while a painting gizmo is open | Circle, sphere, fill tools | + +A shortcut can belong to several contexts, which is how copy and paste are a single +binding for the canvas and the object list. Two shortcuts can share a chord when their +contexts do not overlap; `C` is the cut gizmo in the 3D view, the G-code window in the +preview and the circle tool while painting. A Global chord is dispatched before every +other context, so the dialog treats it as conflicting with all of them. + +A Global shortcut has to include Ctrl or Alt or use a key that types nothing, since a +bare printable key in the frame hook would swallow that character in every text field. +The dialog refuses such chords and `ShortcutRegistry::load()` drops them from the config. +Space counts as typing. The speed dial's default is the one bare Space, and +`MainFrame` leaves it to a focused control that uses Space itself (text fields, buttons, +combo boxes), so it opens the dial from the canvases and the tab strip only. + +## Which event a chord matches + +Letters, digits and special keys match on `wxEVT_KEY_DOWN`. Its key codes do not depend +on the keyboard layout: the key labelled `Q` on an AZERTY keyboard and the key in the +same position under a Cyrillic layout both report `Q`. Numpad keys fold onto their main +keyboard equivalents, so `Ctrl+1` and `Ctrl+Numpad 1` are one binding. + +Punctuation matches on `wxEVT_CHAR`, because only the char event knows which character +a key produced under the active layout. `+` is Shift and `=` on a US keyboard and a key +of its own on a German one, and the binding means the character in both cases. The +canvas looks a key up on key-down first and, when nothing matched, once more on the char +event, for punctuation chords only. The dialog records chords the same way: a printable +non-alphanumeric key pressed with nothing but Shift is taken from the char event that +follows. + +wxGTK does not report key auto-repeat, so the canvases share one record of the keys +seen going down and swallow the repeats of every shortcut not marked `repeatable`. Zoom +and undo repeat, for example; a toggle such as Tab does not. The record is shared because +a shortcut can move the focus to another canvas while its key is still held; a key +released while no canvas had the focus is dropped on the next press. + +A few shortcuts have `modifier_variants`: Shift or Ctrl added to their binding selects a +step of the same action (1 mm and camera-space moves of the selection, five-step slider +moves). Only a binding without Shift or Ctrl of its own has steps, so no two bindings +share one. `ShortcutRegistry::match()` looks the exact chord up first and only then, when +nothing is bound to it, looks for such a shortcut whose binding is the chord minus those +modifiers, reporting which were added; a binding on Ctrl+Shift+key therefore wins over +the combined step. The Shift and Ctrl steps themselves are reserved. `step_owner()` names +the shortcut they belong to, the capture dialog refuses to assign them, and +`conflicts()` reports exact chords only. A binding made before its key became a stepping +key keeps its chord and shadows that one step. A move or rotation of the selection +started from the keyboard runs until the key that started it is released, or the +canvas loses focus, so a held key is one undo step. + +## Labels + +Menu labels, toolbar tooltips, gizmo names, the context menu and the shortcuts dialog +read the registry, so a rebinding shows up in all of them. Each tracked menu item keeps +its base label; `MainFrame::update_shortcut_labels()` appends the current binding +again after an edit, which also installs the new wx accelerator. + +A chord that is unsafe as a menu accelerator, meaning a bare printable key, is appended +to the label as plain text so the menu cannot take it away from text fields. The macOS +edit menu shows its clipboard and undo entries that way, because a system-menu key +equivalent for Cmd+C would run instead of the text field's own copy. + +On macOS the object list receives no key events at all, so its bindings are installed as +a `wxAcceleratorTable`, regenerated from the registry after each edit. + +## Editing + +The shortcuts dialog has a page per context, each opening with a line that says when its +keys apply. A page lists the shortcuts under the headings of `section_table`, with the +fixed keys that cannot change (mouse buttons, the step modifiers, Esc, the digit keys +that pick a filament) sorted into the same sections. The mouse drag rows describe the +camera actions chosen in Preferences; their button opens Preferences > Control with that +option scrolled into view and focused, instead of editing a key. +Editing a row opens a capture dialog that records the next chord, names the shortcuts it +would take the chord from, and on confirmation unbinds those and binds this one. +Resetting a row asks the same question when its default is now held by another +shortcut, so a reset cannot leave two shortcuts on one chord. Each change is written to +the config at once and pushed to the menus, tooltips and accelerator tables through +`GUI_App::on_shortcuts_changed()`. The dialog opens from the Help menu and Preferences > +Control on the Global page, and from the `?` key on the page of the view that received it. + +## Adding a shortcut + +1. Add the enum value to `Shortcut` and its row to `shortcut_table`, in the position + the dialog should list it; the row's section heading is the `section_table` entry + above it, so a new section needs an entry there too. Pick a default that does not + collide inside its contexts; the `[Shortcuts]` tests check every default against the + others. +2. Handle it in the dispatcher of its context: `MainFrame::handle_global_shortcut`, + `GLCanvas3D::handle_shortcut`, `ObjectList::dispatch_shortcut`, or a gizmo's + `on_tool_shortcut`. A gizmo that opens on a key sets `m_shortcut` in its constructor. +3. Where the UI shows the key, ask the registry (`display()` for tooltips, + `accelerator()` for menu labels); no label holds a literal key name. diff --git a/src/slic3r/CMakeLists.txt b/src/slic3r/CMakeLists.txt index d04e38086f..d925ca6333 100644 --- a/src/slic3r/CMakeLists.txt +++ b/src/slic3r/CMakeLists.txt @@ -123,6 +123,8 @@ set(SLIC3R_GUI_SOURCES GUI/PluginPickerDialog.hpp GUI/PluginsDialog.cpp GUI/PluginsDialog.hpp + GUI/Shortcuts.cpp + GUI/Shortcuts.hpp GUI/SpeedDialDialog.cpp GUI/SpeedDialDialog.hpp GUI/ActionRegistry.cpp @@ -335,6 +337,8 @@ set(SLIC3R_GUI_SOURCES GUI/Jobs/Worker.hpp GUI/KBShortcutsDialog.cpp GUI/KBShortcutsDialog.hpp + GUI/KeyChord.cpp + GUI/KeyChord.hpp GUI/LibVGCode/LibVGCodeWrapper.hpp GUI/LibVGCode/LibVGCodeWrapper.cpp GUI/LinuxDisplayBackend.cpp diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 19bc6eb98a..190eeedbb4 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -29,6 +29,7 @@ #include "MainFrame.hpp" #include "WipeTowerDialog.hpp" #include "GUI_App.hpp" +#include "Shortcuts.hpp" #include "GUI_ObjectList.hpp" #include "GUI_Colors.hpp" #include "Mouse3DController.hpp" @@ -77,6 +78,7 @@ #include #include #include +#include #ifndef IMGUI_DEFINE_MATH_OPERATORS #define IMGUI_DEFINE_MATH_OPERATORS @@ -1055,7 +1057,6 @@ wxDEFINE_EVENT(EVT_GLCANVAS_UPDATE_BED_SHAPE, SimpleEvent); wxDEFINE_EVENT(EVT_GLCANVAS_TAB, SimpleEvent); wxDEFINE_EVENT(EVT_GLCANVAS_RESETGIZMOS, SimpleEvent); wxDEFINE_EVENT(EVT_GLCANVAS_MOVE_SLIDERS, wxKeyEvent); -wxDEFINE_EVENT(EVT_GLCANVAS_EDIT_COLOR_CHANGE, wxKeyEvent); wxDEFINE_EVENT(EVT_GLCANVAS_JUMP_TO, wxKeyEvent); wxDEFINE_EVENT(EVT_GLCANVAS_UNDO, SimpleEvent); wxDEFINE_EVENT(EVT_GLCANVAS_REDO, SimpleEvent); @@ -1174,7 +1175,6 @@ GLCanvas3D::GLCanvas3D(wxGLCanvas* canvas, Bed3D &bed) , m_dynamic_background_enabled(false) , m_multisample_allowed(false) , m_moving(false) - , m_tab_down(false) , m_camera_movement(false) , m_cursor_type(Standard) , m_color_by("volume") @@ -3229,6 +3229,9 @@ void GLCanvas3D::bind_event_handlers() m_canvas->Bind(wxEVT_PAINT, &GLCanvas3D::on_paint, this); m_canvas->Bind(wxEVT_SET_FOCUS, &GLCanvas3D::on_set_focus, this); m_canvas->Bind(wxEVT_KILL_FOCUS, [this](wxFocusEvent& evt) { + // The key-up that would commit a keyboard edit goes to whatever took the focus. + if (m_selection_edit.kind != SelectionEdit::None) + finish_selection_edit(); ImGui::SetWindowFocus(nullptr); render(); evt.Skip(); @@ -3358,8 +3361,6 @@ void GLCanvas3D::on_char(wxKeyEvent& evt) // see include/wx/defs.h enum wxKeyCode int keyCode = evt.GetKeyCode(); - int ctrlMask = wxMOD_CONTROL; - int shiftMask = wxMOD_SHIFT; auto imgui = wxGetApp().imgui(); if (imgui->update_key_data(evt)) { @@ -3367,6 +3368,11 @@ void GLCanvas3D::on_char(wxKeyEvent& evt) return; } +#ifdef SLIC3R_CAD + const int ctrlMask = wxMOD_CONTROL; + const int shiftMask = wxMOD_SHIFT; +#endif + // Design tab: Delete/Backspace removes the selected sketch entities while a // sketch tool is active and the canvas has focus (dialog text fields are separate // wx controls, so this never eats their editing keys). @@ -3425,12 +3431,6 @@ void GLCanvas3D::on_char(wxKeyEvent& evt) } #endif - bool is_in_painting_mode = false; - GLGizmoPainterBase *current_gizmo_painter = dynamic_cast(get_gizmos_manager().get_current()); - if (current_gizmo_painter != nullptr) { - is_in_painting_mode = true; - } - //BBS: add orient deactivate logic if (keyCode == WXK_ESCAPE && (_deactivate_arrange_menu() || _deactivate_orient_menu())) @@ -3439,361 +3439,271 @@ void GLCanvas3D::on_char(wxKeyEvent& evt) if (m_gizmos.on_char(evt)) return; - if ((evt.GetModifiers() & ctrlMask) != 0) { - // CTRL is pressed - switch (keyCode) { -#ifdef __APPLE__ - case 'a': - case 'A': -#else /* __APPLE__ */ - case WXK_CONTROL_A: -#endif /* __APPLE__ */ - if (!is_in_painting_mode && !m_layers_editing.is_enabled()) { - if (evt.ShiftDown()) - post_event(SimpleEvent(EVT_GLCANVAS_SELECT_ALL)); - else - post_event(SimpleEvent(EVT_GLCANVAS_SELECT_CURR_PLATE_ALL)); - } + if (const KeyChord chord = KeyChord::from_event(evt); chord.is_punctuation() && handle_shortcut(chord)) + return; + + if (evt.HasModifiers()) { + evt.Skip(); + return; + } + + auto obj_list = wxGetApp().obj_list(); + switch (keyCode) + { + case WXK_ESCAPE: { deselect_all(); break; } + + // BBS: use keypad to change extruder + case '1': { + if (!m_timer_set_color.IsRunning()) { + m_timer_set_color.StartOnce(500); + break; + } + } + case '0': //Color logic for material 10 + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': { + if (m_timer_set_color.IsRunning()) { + if (keyCode < '7') keyCode += 10; + m_timer_set_color.Stop(); + } + if (m_gizmos.get_current_type() != GLGizmosManager::MmSegmentation) + obj_list->set_extruder_for_selected_items(keyCode - '0'); break; -#ifdef __APPLE__ - case 'c': - case 'C': -#else /* __APPLE__ */ - case WXK_CONTROL_C: -#endif /* __APPLE__ */ - if (!is_in_painting_mode) - post_event(SimpleEvent(EVT_GLTOOLBAR_COPY)); - break; -#ifdef __APPLE__ - case 'm': - case 'M': -#else /* __APPLE__ */ - case WXK_CONTROL_M: -#endif /* __APPLE__ */ - { -#ifdef _WIN32 - if (wxGetApp().app_config->get("use_legacy_3DConnexion") == "true") { -#endif //_WIN32 -#ifdef __APPLE__ - // On OSX use Cmd+Shift+M to "Show/Hide 3Dconnexion devices settings dialog" - if ((evt.GetModifiers() & shiftMask) != 0) { -#endif // __APPLE__ - Mouse3DController& controller = wxGetApp().plater()->get_mouse3d_controller(); - controller.show_settings_dialog(!controller.is_settings_dialog_shown()); - m_dirty = true; -#ifdef __APPLE__ - } - else - // and Cmd+M to minimize application - wxGetApp().mainframe->Iconize(); -#endif // __APPLE__ -#ifdef _WIN32 - } -#endif //_WIN32 - break; - } -#ifdef __APPLE__ - case 'v': - case 'V': -#else /* __APPLE__ */ - case WXK_CONTROL_V: -#endif /* __APPLE__ */ - if (!is_in_painting_mode) - post_event(SimpleEvent(EVT_GLTOOLBAR_PASTE)); - break; - -#ifdef __APPLE__ - case 'x': - case 'X': -#else /* __APPLE__ */ - case WXK_CONTROL_X: -#endif /* __APPLE__ */ - if (!is_in_painting_mode) - post_event(SimpleEvent(EVT_GLTOOLBAR_CUT)); - break; - -#ifdef __APPLE__ - case 'f': - case 'F': -#else /* __APPLE__ */ - case WXK_CONTROL_F: -#endif /* __APPLE__ */ - break; - - -#ifdef __APPLE__ - case 'y': - case 'Y': -#else /* __APPLE__ */ - case WXK_CONTROL_Y: -#endif /* __APPLE__ */ - if (m_canvas_type == CanvasView3D || m_canvas_type == CanvasAssembleView) { - post_event(SimpleEvent(EVT_GLCANVAS_REDO)); - } - break; -#ifdef __APPLE__ - case 'z': - case 'Z': -#else /* __APPLE__ */ - case WXK_CONTROL_Z: -#endif /* __APPLE__ */ - // only support redu/undo in CanvasView3D - if (m_canvas_type == CanvasView3D || m_canvas_type == CanvasAssembleView) { - post_event(SimpleEvent(EVT_GLCANVAS_UNDO)); - } - break; - - // BBS -#ifdef __APPLE__ - case 'E': - case 'e': -#else /* __APPLE__ */ - case WXK_CONTROL_E: -#endif /* __APPLE__ */ - { m_labels.show(!m_labels.is_shown()); m_dirty = true; break; } - case '0': { - select_view("plate"); - zoom_to_bed(); - break; } - case '1': { select_view("top"); break; } - case '2': { select_view("bottom"); break; } - case '3': { select_view("front"); break; } - case '4': { select_view("rear"); break; } - case '5': { select_view("left"); break; } - case '6': { select_view("right"); break; } - case '7': { select_plate(); break; } - - //case WXK_BACK: - //case WXK_DELETE: -#ifdef __APPLE__ - case 'd': - case 'D': -#else /* __APPLE__ */ - case WXK_CONTROL_D: -#endif /* __APPLE__ */ - post_event(SimpleEvent(EVT_GLTOOLBAR_DELETE_ALL)); - break; -#ifdef __APPLE__ - case 'k': - case 'K': -#else /* __APPLE__ */ - case WXK_CONTROL_K: -#endif /* __APPLE__ */ - post_event(SimpleEvent(EVT_GLTOOLBAR_CLONE)); - break; - default: evt.Skip(); - } - } else { - auto obj_list = wxGetApp().obj_list(); - switch (keyCode) - { - //case WXK_BACK: - case WXK_DELETE: { post_event(SimpleEvent(EVT_GLTOOLBAR_DELETE)); break; } - // BBS -#ifdef __APPLE__ - case WXK_BACK: { post_event(SimpleEvent(EVT_GLTOOLBAR_DELETE)); break; } -#endif - case WXK_ESCAPE: { deselect_all(); break; } - case WXK_F5: { - if (wxGetApp().mainframe->is_printer_view()) - wxGetApp().mainframe->load_printer_url(); - - //if ((wxGetApp().is_editor() && !wxGetApp().plater()->model().objects.empty()) || - // (wxGetApp().is_gcode_viewer() && !wxGetApp().plater()->get_last_loaded_gcode().empty())) - // post_event(SimpleEvent(EVT_GLCANVAS_RELOAD_FROM_DISK)); - break; - } - - // BBS: use keypad to change extruder - case '1': { - if (!m_timer_set_color.IsRunning()) { - m_timer_set_color.StartOnce(500); - break; - } - } - case '0': //Color logic for material 10 - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': { - if (m_timer_set_color.IsRunning()) { - if (keyCode < '7') keyCode += 10; - m_timer_set_color.Stop(); - } - if (m_gizmos.get_current_type() != GLGizmosManager::MmSegmentation) - obj_list->set_extruder_for_selected_items(keyCode - '0'); - break; - } - - case '+': { - if (dynamic_cast(m_canvas->GetParent()) != nullptr) - post_event(wxKeyEvent(EVT_GLCANVAS_EDIT_COLOR_CHANGE, evt)); - else - post_event(Event(EVT_GLCANVAS_INCREASE_INSTANCES, +1)); - break; - } - case '-': { - if (dynamic_cast(m_canvas->GetParent()) != nullptr) - post_event(wxKeyEvent(EVT_GLCANVAS_EDIT_COLOR_CHANGE, evt)); - else - post_event(Event(EVT_GLCANVAS_INCREASE_INSTANCES, -1)); - break; - } - case '?': { post_event(SimpleEvent(EVT_GLCANVAS_QUESTION_MARK)); break; } - case 'A': - case 'a': - { - if ((evt.GetModifiers() & shiftMask) != 0) - post_event(SimpleEvent(EVT_GLCANVAS_ARRANGE_PARTPLATE)); - else - post_event(SimpleEvent(EVT_GLCANVAS_ARRANGE)); - break; - } - //case 'B': - //case 'b': { zoom_to_bed(); break; } - case 'C': - case 'c': { wxGetApp().toggle_show_gcode_window(); m_dirty = true; request_extra_frame(); break; } - //case 'G': - //case 'g': { - // if ((evt.GetModifiers() & shiftMask) != 0) { - // if (dynamic_cast(m_canvas->GetParent()) != nullptr) - // post_event(wxKeyEvent(EVT_GLCANVAS_JUMP_TO, evt)); - // } - // break; - //} - case 'I': - case 'i': { _update_camera_zoom(1.0); break; } - //case 'K': - //case 'k': { wxGetApp().plater()->get_camera().select_next_type(); m_dirty = true; break; } - //case 'L': - //case 'l': { - //if (!m_main_toolbar.is_enabled()) { - // m_gcode_viewer.enable_legend(!m_gcode_viewer.is_legend_enabled()); - // m_dirty = true; - // wxGetApp().plater()->update_preview_bottom_toolbar(); - //} - //break; - //} - case 'O': - case 'o': { _update_camera_zoom(-1.0); break; } - case 'q': - case 'Q': - { - if ((evt.GetModifiers() & shiftMask) != 0) - post_event(SimpleEvent(EVT_GLCANVAS_ORIENT_PARTPLATE)); - else - post_event(SimpleEvent(EVT_GLCANVAS_ORIENT)); - break; - } - //case 'Z': - //case 'z': { - // if (!m_selection.is_empty()) - // zoom_to_selection(); - // else { - // if (!m_volumes.empty()) - // zoom_to_volumes(); - // else - // _zoom_to_box(m_gcode_viewer.get_paths_bounding_box()); - // } - // break; - //} - case 'v': - case 'V': { post_event(SimpleEvent(EVT_GLCANVAS_PRINTABLE)); break; } - default: { evt.Skip(); break; } - } + } + default: { evt.Skip(); break; } } } -class TranslationProcessor +bool GLCanvas3D::handle_shortcut(const KeyChord& chord) { - using UpAction = std::function; - using DownAction = std::function; + const ShortcutContext context = m_canvas_type == CanvasPreview ? ShortcutContext::Preview : ShortcutContext::Plater; + const std::optional match = wxGetApp().shortcuts().match(context, chord); + if (!match.has_value()) + return false; + const Shortcut shortcut = match->shortcut; + const int held = match->step_modifiers; + if (m_key_down.repeat && !shortcut_info(shortcut).repeatable) + return true; - UpAction m_up_action{ nullptr }; - DownAction m_down_action{ nullptr }; + const bool painting = dynamic_cast(m_gizmos.get_current()) != nullptr; + const bool can_edit = m_canvas_type == CanvasView3D || m_canvas_type == CanvasAssembleView; + auto edit_selection = [this](SelectionEdit::Kind kind, const Vec3d& direction) { + if (!m_gizmos.is_enabled() || m_selection.is_empty() || m_canvas_type == CanvasAssembleView) + return false; + m_selection_edit.kind = kind; + m_selection_edit.key = m_key_down.code; + m_selection_edit.direction = direction; + return true; + }; + auto move_selection = [&](const Vec3d& direction) { + if (edit_selection(SelectionEdit::Move, direction)) + apply_selection_move((held & wxMOD_SHIFT) != 0, (held & wxMOD_CONTROL) != 0); + }; + auto rotate_selection = [&](double angle_z_rad) { + if (edit_selection(SelectionEdit::Rotate, Vec3d::UnitZ())) + apply_selection_rotate(angle_z_rad); + }; + auto step_slider = [this, held](auto&& step) { + IMSlider* layers = get_gcode_viewer().get_layers_slider(); + IMSlider* moves = get_gcode_viewer().get_moves_slider(); + step(layers, moves, held != 0 ? 5 : 1); + if (layers->is_dirty() && layers->is_one_layer()) + layers->SetLowerValue(layers->GetHigherValue()); + m_dirty = true; + }; - bool m_running{ false }; - Vec3d m_direction{ Vec3d::UnitX() }; - -public: - TranslationProcessor(UpAction up_action, DownAction down_action) - : m_up_action(up_action), m_down_action(down_action) - { - } - - void process(wxKeyEvent& evt) - { - const int keyCode = evt.GetKeyCode(); - wxEventType type = evt.GetEventType(); - if (type == wxEVT_KEY_UP) { - switch (keyCode) - { - case WXK_NUMPAD_LEFT: case WXK_LEFT: - case WXK_NUMPAD_RIGHT: case WXK_RIGHT: - case WXK_NUMPAD_UP: case WXK_UP: - case WXK_NUMPAD_DOWN: case WXK_DOWN: - { - m_running = false; - m_up_action(); - break; - } - default: { break; } - } - } - else if (type == wxEVT_KEY_DOWN) { - bool apply = false; - - switch (keyCode) - { - case WXK_SHIFT: - { - if (m_running) - apply = true; - - break; - } - case WXK_NUMPAD_LEFT: - case WXK_LEFT: - { - m_direction = -Vec3d::UnitX(); - apply = true; - break; - } - case WXK_NUMPAD_RIGHT: - case WXK_RIGHT: - { - m_direction = Vec3d::UnitX(); - apply = true; - break; - } - case WXK_NUMPAD_UP: - case WXK_UP: - { - m_direction = Vec3d::UnitY(); - apply = true; - break; - } - case WXK_NUMPAD_DOWN: - case WXK_DOWN: - { - m_direction = -Vec3d::UnitY(); - apply = true; - break; - } - default: { break; } - } - - if (apply) { - m_running = true; - m_down_action(m_direction, evt.ShiftDown(), evt.CmdDown()); - } + switch (shortcut) { + case Shortcut::SelectAll: + if (!painting && !m_layers_editing.is_enabled()) + post_event(SimpleEvent(EVT_GLCANVAS_SELECT_CURR_PLATE_ALL)); + break; + case Shortcut::SelectAllPlates: + if (!painting && !m_layers_editing.is_enabled()) + post_event(SimpleEvent(EVT_GLCANVAS_SELECT_ALL)); + break; + case Shortcut::Copy: if (!painting) post_event(SimpleEvent(EVT_GLTOOLBAR_COPY)); break; + case Shortcut::Paste: if (!painting) post_event(SimpleEvent(EVT_GLTOOLBAR_PASTE)); break; + case Shortcut::Cut: if (!painting) post_event(SimpleEvent(EVT_GLTOOLBAR_CUT)); break; + case Shortcut::Undo: if (can_edit) post_event(SimpleEvent(EVT_GLCANVAS_UNDO)); break; + case Shortcut::Redo: if (can_edit) post_event(SimpleEvent(EVT_GLCANVAS_REDO)); break; + case Shortcut::DeleteSelected: + if (!m_gizmos.on_delete_key()) + post_event(SimpleEvent(EVT_GLTOOLBAR_DELETE)); + break; + case Shortcut::DeleteAll: post_event(SimpleEvent(EVT_GLTOOLBAR_DELETE_ALL)); break; + case Shortcut::CloneSelected: post_event(SimpleEvent(EVT_GLTOOLBAR_CLONE)); break; + case Shortcut::AddInstance: post_event(Event(EVT_GLCANVAS_INCREASE_INSTANCES, +1)); break; + case Shortcut::RemoveInstance: post_event(Event(EVT_GLCANVAS_INCREASE_INSTANCES, -1)); break; + case Shortcut::TogglePrintable: post_event(SimpleEvent(EVT_GLCANVAS_PRINTABLE)); break; + case Shortcut::Arrange: + if (!m_gizmos.is_running()) + post_event(SimpleEvent(EVT_GLCANVAS_ARRANGE)); + break; + case Shortcut::ArrangePlate: + if (!m_gizmos.is_running()) + post_event(SimpleEvent(EVT_GLCANVAS_ARRANGE_PARTPLATE)); + break; + case Shortcut::Orient: post_event(SimpleEvent(EVT_GLCANVAS_ORIENT)); break; + case Shortcut::OrientPlate: post_event(SimpleEvent(EVT_GLCANVAS_ORIENT_PARTPLATE)); break; + case Shortcut::RotateSelectionLeft: rotate_selection(0.25 * M_PI); break; + case Shortcut::RotateSelectionRight: rotate_selection(-0.25 * M_PI); break; + case Shortcut::MoveSelectionLeft: move_selection(-Vec3d::UnitX()); break; + case Shortcut::MoveSelectionRight: move_selection(Vec3d::UnitX()); break; + case Shortcut::MoveSelectionUp: move_selection(Vec3d::UnitY()); break; + case Shortcut::MoveSelectionDown: move_selection(-Vec3d::UnitY()); break; + case Shortcut::ZoomIn: _update_camera_zoom(1.0); break; + case Shortcut::ZoomOut: _update_camera_zoom(-1.0); break; + case Shortcut::SwitchView: post_event(SimpleEvent(EVT_GLCANVAS_TAB)); break; + case Shortcut::CollapseSidebar: + if (!wxGetApp().is_gcode_viewer()) + post_event(SimpleEvent(EVT_GLCANVAS_COLLAPSE_SIDEBAR)); + break; + case Shortcut::ShowWireframe: + wxGetApp().plater()->toggle_show_wireframe(); + m_dirty = true; + break; + case Shortcut::Mouse3DSettings: { +#ifdef _WIN32 + if (wxGetApp().app_config->get("use_legacy_3DConnexion") == "true") { +#endif //_WIN32 + Mouse3DController& controller = wxGetApp().plater()->get_mouse3d_controller(); + controller.show_settings_dialog(!controller.is_settings_dialog_shown()); + m_dirty = true; +#ifdef _WIN32 } +#endif //_WIN32 + break; } -}; + case Shortcut::ReloadDevicePage: + if (wxGetApp().mainframe->is_printer_view()) + wxGetApp().mainframe->load_printer_url(); + break; + case Shortcut::KeyboardShortcuts: post_event(SimpleEvent(EVT_GLCANVAS_QUESTION_MARK)); break; + case Shortcut::ToggleGcodeWindow: + wxGetApp().toggle_show_gcode_window(); + m_dirty = true; + request_extra_frame(); + break; + case Shortcut::ToggleOneLayerMode: + get_gcode_viewer().get_layers_slider()->switch_one_layer_mode(); + m_dirty = true; + break; + case Shortcut::GoToLayer: + if (!m_gizmos.is_enabled()) { + get_gcode_viewer().get_layers_slider()->show_go_to_layer(true); + m_dirty = true; + } + break; + case Shortcut::LayerSliderUp: + case Shortcut::LayerSliderDown: + step_slider([up = shortcut == Shortcut::LayerSliderUp](IMSlider* layers, IMSlider* moves, int increment) { + const int delta = up ? increment : -increment; + if (layers->GetSelection() == ssHigher) { + layers->SetHigherValue(layers->GetHigherValue() + delta); + moves->SetHigherValue(moves->GetMaxValue()); + } + else if (layers->GetSelection() == ssLower) + layers->SetLowerValue(layers->GetLowerValue() + delta); + }); + break; + case Shortcut::MovesSliderLeft: + step_slider([](IMSlider* layers, IMSlider* moves, int increment) { + if (moves->GetHigherValue() == moves->GetMinValue() && layers->GetHigherValue() > layers->GetMinValue()) { + layers->SetHigherValue(layers->GetHigherValue() - 1); + moves->SetHigherValue(moves->GetMaxValue()); + } + else + moves->SetHigherValue(moves->GetHigherValue() - increment); + }); + break; + case Shortcut::MovesSliderRight: + step_slider([](IMSlider* layers, IMSlider* moves, int increment) { + if (moves->GetHigherValue() == moves->GetMaxValue() && layers->GetHigherValue() < layers->GetMaxValue()) { + layers->SetHigherValue(layers->GetHigherValue() + 1); + moves->SetHigherValue(moves->GetMinValue()); + } + else + moves->SetHigherValue(moves->GetHigherValue() + increment); + }); + break; + case Shortcut::MovesSliderStart: + case Shortcut::MovesSliderEnd: + step_slider([start = shortcut == Shortcut::MovesSliderStart](IMSlider*, IMSlider* moves, int) { + moves->SetHigherValue(start ? moves->GetMinValue() : moves->GetMaxValue()); + moves->set_as_dirty(); + }); + break; + default: + if (!m_gizmos.open_gizmo_by_shortcut(shortcut)) + return false; + m_dirty = true; + break; + } + return true; +} + +void GLCanvas3D::apply_selection_move(bool slow, bool camera_space) +{ + m_selection.setup_cache(); + const double multiplier = slow ? 1.0 : 10.0; + + Vec3d displacement; + if (camera_space) { + Eigen::Matrix inv_view_3x3 = wxGetApp().plater()->get_camera().get_view_matrix().inverse().matrix().block(0, 0, 3, 3); + displacement = multiplier * (inv_view_3x3 * m_selection_edit.direction); + displacement.z() = 0.0; + } + else + displacement = multiplier * m_selection_edit.direction; + + TransformationType trafo_type; + trafo_type.set_relative(); + m_selection.translate(displacement, trafo_type); + m_dirty = true; +} + +void GLCanvas3D::apply_selection_rotate(double angle_z_rad) +{ + m_selection.setup_cache(); + m_selection.rotate(angle_z_rad * m_selection_edit.direction, TransformationType(TransformationType::World_Relative_Joint)); + m_dirty = true; +} + +void GLCanvas3D::finish_selection_edit() +{ + const SelectionEdit::Kind kind = m_selection_edit.kind; + m_selection_edit.kind = SelectionEdit::None; + if (kind == SelectionEdit::Move) + do_move(L("Tool move")); + else + do_rotate(L("Tool Rotate")); + m_gizmos.update_data(); + // Let the plater know that the dragging finished, so a delayed refresh + // of the scene with the background processing data should be performed. + post_event(SimpleEvent(EVT_GLCANVAS_MOUSE_DRAGGING_FINISHED)); + // updates camera target constraints + refresh_camera_scene_box(); + m_dirty = true; +} + +// Keys held since their last key-up, shared by every canvas because a shortcut can move the +// focus, and with it the key-up, to another one. +static std::set s_keys_down; + +static bool key_repeats(int key) +{ + for (auto it = s_keys_down.begin(); it != s_keys_down.end();) // drops keys released while no canvas had the focus + it = wxGetKeyState(wxKeyCode(*it)) ? std::next(it) : s_keys_down.erase(it); + return !s_keys_down.insert(key).second; +} + +static void key_released(int key) { s_keys_down.erase(key); } void GLCanvas3D::on_key(wxKeyEvent& evt) { @@ -3811,45 +3721,11 @@ void GLCanvas3D::on_key(wxKeyEvent& evt) } #endif - static GLCanvas3D const * thiz = nullptr; - static TranslationProcessor translationProcessor(nullptr, nullptr); - if (thiz != this) { - thiz = this; - translationProcessor = TranslationProcessor( - [this]() { - do_move(L("Tool move")); - m_gizmos.update_data(); - - // BBS - //wxGetApp().obj_manipul()->set_dirty(); - // Let the plater know that the dragging finished, so a delayed refresh - // of the scene with the background processing data should be performed. - post_event(SimpleEvent(EVT_GLCANVAS_MOUSE_DRAGGING_FINISHED)); - // updates camera target constraints - refresh_camera_scene_box(); - m_dirty = true; - }, - [this](const Vec3d& direction, bool slow, bool camera_space) { - m_selection.setup_cache(); - double multiplier = slow ? 1.0 : 10.0; - - Vec3d displacement; - if (camera_space) { - Eigen::Matrix inv_view_3x3 = wxGetApp().plater()->get_camera().get_view_matrix().inverse().matrix().block(0, 0, 3, 3); - displacement = multiplier * (inv_view_3x3 * direction); - displacement.z() = 0.0; - } - else - displacement = multiplier * direction; - - TransformationType trafo_type; - trafo_type.set_relative(); - m_selection.translate(displacement, trafo_type); - m_dirty = true; - } - );} - const int keyCode = evt.GetKeyCode(); + if (evt.GetEventType() == wxEVT_KEY_DOWN) + m_key_down = { keyCode, key_repeats(keyCode) }; + else if (evt.GetEventType() == wxEVT_KEY_UP) + key_released(keyCode); auto imgui = wxGetApp().imgui(); if (imgui->update_key_data(evt)) @@ -3863,23 +3739,8 @@ void GLCanvas3D::on_key(wxKeyEvent& evt) wxGetApp().plater()->toggle_render_statistic_dialog(); m_dirty = true; #endif - } else if ((evt.ShiftDown() && evt.ControlDown() && keyCode == WXK_RETURN) || - (evt.ShiftDown() && evt.AltDown() && keyCode == WXK_RETURN)) { - wxGetApp().plater()->toggle_show_wireframe(); - m_dirty = true; - } - else if (m_tab_down && keyCode == WXK_TAB && !evt.HasAnyModifiers()) { - // Enable switching between 3D and Preview with Tab - // m_canvas->HandleAsNavigationKey(evt); // XXX: Doesn't work in some cases / on Linux - post_event(SimpleEvent(EVT_GLCANVAS_TAB)); - } - else if (keyCode == WXK_TAB && evt.ShiftDown() && !evt.ControlDown() && ! wxGetApp().is_gcode_viewer()) { - // Collapse side-panel with Shift+Tab - post_event(SimpleEvent(EVT_GLCANVAS_COLLAPSE_SIDEBAR)); } else if (keyCode == WXK_SHIFT) { - translationProcessor.process(evt); - if (m_picking_enabled && m_rectangle_selection.is_dragging()) { _update_selection_from_hover(); m_rectangle_selection.stop_dragging(); @@ -3905,70 +3766,15 @@ void GLCanvas3D::on_key(wxKeyEvent& evt) } else if (keyCode == WXK_CONTROL) m_dirty = true; - else if (m_gizmos.is_enabled() && !m_selection.is_empty() && m_canvas_type != CanvasAssembleView) { - translationProcessor.process(evt); - - switch (keyCode) - { - case WXK_NUMPAD_PAGEUP: case WXK_PAGEUP: - case WXK_NUMPAD_PAGEDOWN: case WXK_PAGEDOWN: - { - do_rotate(L("Tool Rotate")); - m_gizmos.update_data(); - - // BBS - //wxGetApp().obj_manipul()->set_dirty(); - // Let the plater know that the dragging finished, so a delayed refresh - // of the scene with the background processing data should be performed. - post_event(SimpleEvent(EVT_GLCANVAS_MOUSE_DRAGGING_FINISHED)); - // updates camera target constraints - refresh_camera_scene_box(); - m_dirty = true; - - break; - } - default: { break; } - } - } - - // BBS: add select view logic - if (evt.ControlDown()) { - switch (keyCode) { - case '0': - case WXK_NUMPAD0: //0 on numpad - { select_view("plate"); - zoom_to_bed(); - break; - } - case '1': - case WXK_NUMPAD1: //1 on numpad - { select_view("top"); break; } - case '2': - case WXK_NUMPAD2: //2 on numpad - { select_view("bottom"); break; } - case '3': - case WXK_NUMPAD3: //3 on numpad - { select_view("front"); break; } - case '4': - case WXK_NUMPAD4: //4 on numpad - { select_view("rear"); break; } - case '5': - case WXK_NUMPAD5: //5 on numpad - { select_view("left"); break; } - case '6': - case WXK_NUMPAD6: //6 on numpad - { select_view("right"); break; } - case '7': - case WXK_NUMPAD7: //7 on numpad - { select_plate(); break; } - default: break; - } - } + else if (m_selection_edit.kind != SelectionEdit::None && keyCode == m_selection_edit.key) + finish_selection_edit(); } else if (evt.GetEventType() == wxEVT_KEY_DOWN) { - m_tab_down = keyCode == WXK_TAB && !evt.HasAnyModifiers(); + if (handle_shortcut(KeyChord::from_event(evt))) + return; if (keyCode == WXK_SHIFT) { - translationProcessor.process(evt); + if (m_selection_edit.kind == SelectionEdit::Move) + apply_selection_move(true, evt.CmdDown()); if (m_picking_enabled /*&& (m_gizmos.get_current_type() != GLGizmosManager::SlaSupports)*/) { @@ -3985,68 +3791,6 @@ void GLCanvas3D::on_key(wxKeyEvent& evt) } else if (keyCode == WXK_CONTROL) m_dirty = true; - else if (m_gizmos.is_enabled() && !m_selection.is_empty() && m_canvas_type != CanvasAssembleView) { - auto _do_rotate = [this](double angle_z_rad) { - m_selection.setup_cache(); - m_selection.rotate(Vec3d(0.0, 0.0, angle_z_rad), TransformationType(TransformationType::World_Relative_Joint)); - m_dirty = true; -// wxGetApp().obj_manipul()->set_dirty(); - }; - - translationProcessor.process(evt); - - switch (keyCode) - { - case WXK_NUMPAD_PAGEUP: case WXK_PAGEUP: { _do_rotate(0.25 * M_PI); break; } - case WXK_NUMPAD_PAGEDOWN: case WXK_PAGEDOWN: { _do_rotate(-0.25 * M_PI); break; } - default: { break; } - } - } else if (!m_gizmos.is_enabled()) { - // DoubleSlider navigation in Preview - if (m_canvas_type == CanvasPreview) { - IMSlider *m_layers_slider = get_gcode_viewer().get_layers_slider(); - IMSlider *m_moves_slider = get_gcode_viewer().get_moves_slider(); - int increment = (evt.CmdDown() || evt.ShiftDown()) ? 5 : 1; - if ((evt.CmdDown() || evt.ShiftDown()) && evt.GetKeyCode() == 'G') { - m_layers_slider->show_go_to_layer(true); - } - else if (keyCode == WXK_UP || keyCode == WXK_DOWN) { - int new_pos; - if (m_layers_slider->GetSelection() == ssHigher) { - new_pos = keyCode == WXK_UP ? m_layers_slider->GetHigherValue() + increment : m_layers_slider->GetHigherValue() - increment; - m_layers_slider->SetHigherValue(new_pos); - m_moves_slider->SetHigherValue(m_moves_slider->GetMaxValue()); - } - else if (m_layers_slider->GetSelection() == ssLower) { - new_pos = keyCode == WXK_UP ? m_layers_slider->GetLowerValue() + increment : m_layers_slider->GetLowerValue() - increment; - m_layers_slider->SetLowerValue(new_pos); - } - } else if (keyCode == WXK_LEFT) { - if (m_moves_slider->GetHigherValue() == m_moves_slider->GetMinValue() && (m_layers_slider->GetHigherValue() > m_layers_slider->GetMinValue())) { - m_layers_slider->SetHigherValue(m_layers_slider->GetHigherValue() - 1); - m_moves_slider->SetHigherValue(m_moves_slider->GetMaxValue()); - } else { - m_moves_slider->SetHigherValue(m_moves_slider->GetHigherValue() - increment); - } - } else if (keyCode == WXK_RIGHT) { - if (m_moves_slider->GetHigherValue() == m_moves_slider->GetMaxValue() && (m_layers_slider->GetHigherValue() < m_layers_slider->GetMaxValue())) { - m_layers_slider->SetHigherValue(m_layers_slider->GetHigherValue() + 1); - m_moves_slider->SetHigherValue(m_moves_slider->GetMinValue()); - } else { - m_moves_slider->SetHigherValue(m_moves_slider->GetHigherValue() + increment); - } - } else if (keyCode == WXK_HOME || keyCode == WXK_END) { - const int new_pos = keyCode == WXK_HOME ? m_moves_slider->GetMinValue() : m_moves_slider->GetMaxValue(); - m_moves_slider->SetHigherValue(new_pos); - m_moves_slider->set_as_dirty(); - } - - if (m_layers_slider->is_dirty() && m_layers_slider->is_one_layer()) - m_layers_slider->SetLowerValue(m_layers_slider->GetHigherValue()); - - m_dirty = true; - } - } } } else return; @@ -7115,7 +6859,6 @@ bool GLCanvas3D::_init_main_toolbar() item.name = "add"; item.icon_filename = m_is_dark ? "toolbar_open_dark.svg" : "toolbar_open.svg"; - item.tooltip = _utf8(L("Add")) + " [" + GUI::shortkey_ctrl_prefix() + "I]"; item.sprite_id = 0; item.left.action_callback = [this]() { if (m_canvas != nullptr) wxPostEvent(m_canvas, SimpleEvent(EVT_GLTOOLBAR_ADD)); }; item.enabling_callback = []()->bool {return wxGetApp().plater()->can_add_model(); }; @@ -7133,7 +6876,6 @@ bool GLCanvas3D::_init_main_toolbar() item.name = "orient"; item.icon_filename = m_is_dark ? "toolbar_orient_dark.svg" : "toolbar_orient.svg"; - item.tooltip = _utf8(L("Auto orient all/selected objects")) + " [Q]\n" + _utf8(L("Auto orient all objects on current plate")) + " [" + _utf8(L("Shift+")) + "Q]"; item.sprite_id++; item.left.render_callback = nullptr; item.enabling_callback = []()->bool { return wxGetApp().plater()->can_arrange(); }; @@ -7155,7 +6897,6 @@ bool GLCanvas3D::_init_main_toolbar() item.name = "arrange"; item.icon_filename = m_is_dark ? "toolbar_arrange_dark.svg" : "toolbar_arrange.svg"; - item.tooltip = _utf8(L("Arrange all objects")) + " [A]\n" + _utf8(L("Arrange objects on selected plates")) + " [" + _utf8(L("Shift+")) + "A]"; item.sprite_id++; item.left.action_callback = []() {}; item.enabling_callback = []()->bool { return wxGetApp().plater()->can_arrange(); }; @@ -7179,7 +6920,6 @@ bool GLCanvas3D::_init_main_toolbar() item.name = "more"; item.icon_filename = m_is_dark ? "instance_add_dark.svg" : "instance_add.svg"; - item.tooltip = _utf8(L("Add instance")) + " [+]"; item.sprite_id++; item.left.render_callback = nullptr; item.left.action_callback = [this]() { if (m_canvas != nullptr) wxPostEvent(m_canvas, SimpleEvent(EVT_GLTOOLBAR_MORE)); }; @@ -7191,7 +6931,6 @@ bool GLCanvas3D::_init_main_toolbar() item.name = "fewer"; item.icon_filename = m_is_dark ? "instance_remove_dark.svg" : "instance_remove.svg"; - item.tooltip = _utf8(L("Remove instance")) + " [-]"; item.sprite_id++; item.left.render_callback = nullptr; item.left.action_callback = [this]() { if (m_canvas != nullptr) wxPostEvent(m_canvas, SimpleEvent(EVT_GLTOOLBAR_FEWER)); }; @@ -7241,9 +6980,20 @@ bool GLCanvas3D::_init_main_toolbar() if (!m_main_toolbar.add_item(item)) return false; + update_shortcut_tooltips(); return true; } +void GLCanvas3D::update_shortcut_tooltips() +{ + const ShortcutRegistry& shortcuts = wxGetApp().shortcuts(); + m_main_toolbar.set_tooltip(m_main_toolbar.get_item_id("add"), shortcuts.with_key(_u8L("Add"), Shortcut::ImportModel)); + m_main_toolbar.set_tooltip(m_main_toolbar.get_item_id("orient"), shortcuts.with_key(_u8L("Auto orient all/selected objects"), Shortcut::Orient) + "\n" + shortcuts.with_key(_u8L("Auto orient all objects on current plate"), Shortcut::OrientPlate)); + m_main_toolbar.set_tooltip(m_main_toolbar.get_item_id("arrange"), shortcuts.with_key(_u8L("Arrange all objects"), Shortcut::Arrange) + "\n" + shortcuts.with_key(_u8L("Arrange objects on selected plates"), Shortcut::ArrangePlate)); + m_main_toolbar.set_tooltip(m_main_toolbar.get_item_id("more"), shortcuts.with_key(_u8L("Add instance"), Shortcut::AddInstance)); + m_main_toolbar.set_tooltip(m_main_toolbar.get_item_id("fewer"), shortcuts.with_key(_u8L("Remove instance"), Shortcut::RemoveInstance)); +} + //BBS: GUI refactor: GLToolbar bool GLCanvas3D::_init_select_plate_toolbar() { diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index 9c78581f69..ad5188f2f3 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -63,6 +63,7 @@ class PartPlateList; #ifdef SLIC3R_CAD class DesignSketchTool; // Design tab: interactive 2D sketch tool #endif +struct KeyChord; #if ENABLE_RETINA_GL class RetinaHelper; @@ -185,7 +186,6 @@ wxDECLARE_EVENT(EVT_GLCANVAS_UPDATE_BED_SHAPE, SimpleEvent); wxDECLARE_EVENT(EVT_GLCANVAS_TAB, SimpleEvent); wxDECLARE_EVENT(EVT_GLCANVAS_RESETGIZMOS, SimpleEvent); wxDECLARE_EVENT(EVT_GLCANVAS_MOVE_SLIDERS, wxKeyEvent); -wxDECLARE_EVENT(EVT_GLCANVAS_EDIT_COLOR_CHANGE, wxKeyEvent); wxDECLARE_EVENT(EVT_GLCANVAS_JUMP_TO, wxKeyEvent); wxDECLARE_EVENT(EVT_GLCANVAS_UNDO, SimpleEvent); wxDECLARE_EVENT(EVT_GLCANVAS_REDO, SimpleEvent); @@ -626,7 +626,23 @@ private: bool m_dynamic_background_enabled; bool m_multisample_allowed; bool m_moving; - bool m_tab_down; + // The key-down being dispatched, kept for the char event that may follow it. + struct KeyDown + { + int code = WXK_NONE; + bool repeat = false; + }; + KeyDown m_key_down; + // A keyboard move or rotation of the selection runs from the key-down that started it to + // that key's release, so a held key becomes one undo step. + struct SelectionEdit + { + enum Kind { None, Move, Rotate }; + Kind kind = None; + int key = WXK_NONE; // raw key code of the key-down, matched against the key-up + Vec3d direction{ Vec3d::UnitX() }; + }; + SelectionEdit m_selection_edit; bool m_camera_movement; //BBS: add toolpath outside bool m_toolpath_outside{ false }; @@ -1094,6 +1110,13 @@ public: void on_idle(wxIdleEvent& evt); void on_char(wxKeyEvent& evt); void on_key(wxKeyEvent& evt); + // Runs the Plater/Preview shortcut bound to chord, swallowing auto-repeats of one-shot + // shortcuts; false when nothing is bound. + bool handle_shortcut(const KeyChord& chord); + void apply_selection_move(bool slow, bool camera_space); + void apply_selection_rotate(double angle_z_rad); + void finish_selection_edit(); + void update_shortcut_tooltips(); void on_mouse_wheel(wxMouseEvent& evt); void on_timer(wxTimerEvent& evt); void on_render_timer(wxTimerEvent& evt); diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index ab53b773a2..48bd58b1a5 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -3,6 +3,7 @@ #include "libslic3r/Technologies.hpp" #include "libslic3r/Platform.hpp" #include "GUI_App.hpp" +#include "Shortcuts.hpp" #include "BindDialog.hpp" #include "DeviceManager.hpp" #include "HMS.hpp" @@ -1120,6 +1121,8 @@ GUI_App::GUI_App() { //app config initializes early becasuse it is used in instance checking in OrcaSlicer.cpp this->init_app_config(); + m_shortcuts = std::make_unique(); + m_shortcuts->load(*app_config); this->init_download_path(); // Note: the WebView2 runtime check (init_webview_runtime) used to run here, but // the constructor executes before wxWidgets is fully initialized and before the @@ -4677,12 +4680,28 @@ void GUI_App::system_info() //dlg.ShowModal(); } -void GUI_App::keyboard_shortcuts() +void GUI_App::keyboard_shortcuts(ShortcutContext page, wxWindow* parent) { - KBShortcutsDialog dlg; + KBShortcutsDialog dlg(parent != nullptr ? parent : mainframe, page); dlg.ShowModal(); } +void GUI_App::on_shortcuts_changed() +{ + m_shortcuts->save(*app_config); + app_config->save(); + if (mainframe == nullptr) + return; + mainframe->update_shortcut_labels(); + if (Plater* plater = this->plater(); plater != nullptr) { + if (GLCanvas3D* canvas = plater->get_view3D_canvas3D(); canvas != nullptr) + canvas->update_shortcut_tooltips(); +#ifdef __WXOSX__ + obj_list()->update_shortcut_accelerators(); +#endif + } +} + void GUI_App::troubleshoot() { TroubleshootDialog dlg; @@ -8465,7 +8484,9 @@ void GUI_App::open_exportpresetbundledialog(size_t open_on_tab, const std::strin } } -void GUI_App::open_preferences(size_t open_on_tab, const std::string& highlight_option) +void GUI_App::open_preferences() { open_preferences(PreferencesTab::General); } + +void GUI_App::open_preferences(PreferencesTab tab, const std::string& highlight_option) { // Render settings the canvas reads every frame; a change needs one redraw to show. static constexpr const char* opengl_render_setting_keys[] = { @@ -8482,7 +8503,8 @@ void GUI_App::open_preferences(size_t open_on_tab, const std::string& highlight_ // the dialog needs to be destroyed before the call to recreate_GUI() // or sometimes the application crashes into wxDialogBase() destructor // so we put it into an inner scope - PreferencesDialog dlg(mainframe, open_on_tab, highlight_option); + PreferencesDialog dlg(mainframe); + dlg.select_tab(tab, highlight_option); dlg.ShowModal(); need_recreate_gui = dlg.recreate_GUI(); pending_language = dlg.pending_language(); diff --git a/src/slic3r/GUI/GUI_App.hpp b/src/slic3r/GUI/GUI_App.hpp index 97213d170b..2d55c5e96c 100644 --- a/src/slic3r/GUI/GUI_App.hpp +++ b/src/slic3r/GUI/GUI_App.hpp @@ -70,6 +70,9 @@ namespace GUI{ class RemovableDriveManager; class OtherInstanceMessageHandler; +class ShortcutRegistry; +enum class ShortcutContext : uint8_t; +enum class PreferencesTab; class MainFrame; class Sidebar; class ObjectSettings; @@ -286,6 +289,7 @@ private: std::unique_ptr m_removable_drive_manager; std::unique_ptr m_imgui; + std::unique_ptr m_shortcuts; std::unique_ptr m_printhost_job_queue; std::unique_ptr m_other_instance_message_handler; std::unique_ptr m_single_instance_checker; @@ -483,7 +487,7 @@ public: void recreate_GUI(const wxString& message); void system_info(); - void keyboard_shortcuts(); + void keyboard_shortcuts(ShortcutContext page, wxWindow* parent = nullptr); // the main frame when null void troubleshoot(); void load_project(wxWindow *parent, wxString& input_file) const; void import_model(wxWindow *parent, wxArrayString& input_files) const; @@ -639,7 +643,8 @@ public: wxString current_language_code_safe() const; bool is_localized() const { return m_wxLocale->GetLocale() != "English"; } - void open_preferences(size_t open_on_tab = 0, const std::string& highlight_option = std::string()); + void open_preferences(); // on the General tab + void open_preferences(PreferencesTab tab, const std::string& highlight_option = std::string()); void open_presetbundledialog(size_t open_on_tab = 0, const std::string& highlight_option = std::string()); void open_plugins_dialog(size_t open_on_tab = 0, const std::string& highlight_option = std::string()); // Dialog-free plugin actions used by the speed dial: they never require the Plugins dialog to be open. @@ -737,6 +742,9 @@ public: size_t get_instance_hash_int () { return m_instance_hash_int; } ImGuiWrapper* imgui() { return m_imgui.get(); } + ShortcutRegistry& shortcuts() { return *m_shortcuts; } + // Saves the bindings and refreshes every menu label, tooltip and accelerator table that shows one. + void on_shortcuts_changed(); PrintHostJobQueue& printhost_job_queue() { return *m_printhost_job_queue.get(); } diff --git a/src/slic3r/GUI/GUI_Factories.cpp b/src/slic3r/GUI/GUI_Factories.cpp index d02922497e..ecca540aa9 100644 --- a/src/slic3r/GUI/GUI_Factories.cpp +++ b/src/slic3r/GUI/GUI_Factories.cpp @@ -6,6 +6,7 @@ #include "GUI_Factories.hpp" #include "GUI_ObjectList.hpp" #include "GUI_App.hpp" +#include "Shortcuts.hpp" #include "I18N.hpp" #include "Plater.hpp" #include "ObjectDataViewModel.hpp" @@ -2083,13 +2084,8 @@ wxMenu* MenuFactory::assemble_part_menu() void MenuFactory::append_menu_item_clone(wxMenu* menu) { -#ifdef __APPLE__ - static const wxString ctrl = ("Ctrl+"); -#else - // FIXME: maybe should be using GUI::shortkey_ctrl_prefix() or equivalent? - static const wxString ctrl = _L("Ctrl+"); -#endif - append_menu_item(menu, wxID_ANY, _L("Clone") + "\t" + ctrl + "K", "", + const std::string accel = wxGetApp().shortcuts().accelerator(Shortcut::CloneSelected); + append_menu_item(menu, wxID_ANY, _L("Clone") + (accel.empty() ? wxString() : "\t" + from_u8(accel)), "", [](wxCommandEvent&) { plater()->clone_selection(); }, "", nullptr, diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index 8067afd8df..2d77200eef 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -4,6 +4,7 @@ #include "GUI_Factories.hpp" //#include "GUI_ObjectLayers.hpp" #include "GUI_App.hpp" +#include "Shortcuts.hpp" #include "I18N.hpp" #include "Plater.hpp" #include "BitmapComboBox.hpp" @@ -245,56 +246,15 @@ ObjectList::ObjectList(wxWindow* parent) : // Key events are not correctly processed by the wxDataViewCtrl on OSX. // Our patched wxWidgets process the keyboard accelerators. // On the other hand, using accelerators will break in-place editing on Windows & Linux/GTK (there is no in-place editing working on OSX for wxDataViewCtrl for now). -// Bind(wxEVT_KEY_DOWN, &ObjectList::OnChar, this); - { - // Accelerators - // wxAcceleratorEntry entries[25]; - wxAcceleratorEntry entries[26]; - int index = 0; - entries[index++].Set(wxACCEL_CTRL, (int)'C', wxID_COPY); - entries[index++].Set(wxACCEL_CTRL, (int)'X', wxID_CUT); - entries[index++].Set(wxACCEL_CTRL, (int)'V', wxID_PASTE); - entries[index++].Set(wxACCEL_CTRL, (int)'M', wxID_DUPLICATE); - entries[index++].Set(wxACCEL_CTRL, (int)'A', wxID_SELECTALL); - entries[index++].Set(wxACCEL_CTRL, (int)'Z', wxID_UNDO); - entries[index++].Set(wxACCEL_CTRL, (int)'Y', wxID_REDO); - entries[index++].Set(wxACCEL_NORMAL, WXK_BACK, wxID_DELETE); - //entries[index++].Set(wxACCEL_NORMAL, int('+'), wxID_ADD); - //entries[index++].Set(wxACCEL_NORMAL, WXK_NUMPAD_ADD, wxID_ADD); - //entries[index++].Set(wxACCEL_NORMAL, int('-'), wxID_REMOVE); - //entries[index++].Set(wxACCEL_NORMAL, WXK_NUMPAD_SUBTRACT, wxID_REMOVE); - //entries[index++].Set(wxACCEL_NORMAL, int('p'), wxID_PRINT); - - int numbers_cnt = 0; - for (auto char_number : { '1', '2', '3', '4', '5', '6', '7', '8', '9' }) { - entries[index + numbers_cnt].Set(wxACCEL_NORMAL, int(char_number), wxID_LAST + numbers_cnt+1); - entries[index + 9 + numbers_cnt].Set(wxACCEL_NORMAL, WXK_NUMPAD0 + numbers_cnt - 1, wxID_LAST + numbers_cnt+1); - numbers_cnt++; - // index++; - } - wxAcceleratorTable accel(26, entries); - SetAcceleratorTable(accel); - - this->Bind(wxEVT_MENU, [this](wxCommandEvent &evt) { this->copy(); }, wxID_COPY); - this->Bind(wxEVT_MENU, [this](wxCommandEvent &evt) { this->paste(); }, wxID_PASTE); - this->Bind(wxEVT_MENU, [this](wxCommandEvent &evt) { this->select_item_all_children(); }, wxID_SELECTALL); - this->Bind(wxEVT_MENU, [this](wxCommandEvent &evt) { this->remove(); }, wxID_DELETE); - this->Bind(wxEVT_MENU, [this](wxCommandEvent &evt) { this->undo(); }, wxID_UNDO); - this->Bind(wxEVT_MENU, [this](wxCommandEvent &evt) { this->redo(); }, wxID_REDO); - this->Bind(wxEVT_MENU, [this](wxCommandEvent &evt) { this->cut(); }, wxID_CUT); - this->Bind(wxEVT_MENU, [this](wxCommandEvent &evt) { this->clone(); }, wxID_DUPLICATE); - //this->Bind(wxEVT_MENU, [this](wxCommandEvent &evt) { this->increase_instances(); }, wxID_ADD); - //this->Bind(wxEVT_MENU, [this](wxCommandEvent &evt) { this->decrease_instances(); }, wxID_REMOVE); - //this->Bind(wxEVT_MENU, [this](wxCommandEvent &evt) { this->toggle_printable_state(); }, wxID_PRINT); - - for (int i = 1; i < 10; i++) - this->Bind(wxEVT_MENU, [this, i](wxCommandEvent &evt) { - if (filaments_count() > 1 && i <= filaments_count()) - this->set_extruder_for_selected_items(i); - }, wxID_LAST+i); - - m_accel = accel; - } + m_shortcut_id_base = wxWindow::NewControlId(int(Shortcut::Count)); + for (size_t i = 0; i < size_t(Shortcut::Count); ++i) + this->Bind(wxEVT_MENU, [this, shortcut = Shortcut(i)](wxCommandEvent&) { dispatch_shortcut(shortcut); }, m_shortcut_id_base + int(i)); + for (int i = 1; i < 10; i++) + this->Bind(wxEVT_MENU, [this, i](wxCommandEvent &evt) { + if (filaments_count() > 1 && i <= filaments_count()) + this->set_extruder_for_selected_items(i); + }, wxID_LAST+i); + update_shortcut_accelerators(); #else //__WXOSX__ Bind(wxEVT_CHAR, [this](wxKeyEvent& event) { key_event(event); }); // doesn't work on OSX #endif @@ -1796,36 +1756,10 @@ void ObjectList::decrease_instances() #ifndef __WXOSX__ void ObjectList::key_event(wxKeyEvent& event) { - //if (event.GetKeyCode() == WXK_TAB) - // Navigate(event.ShiftDown() ? wxNavigationKeyEvent::IsBackward : wxNavigationKeyEvent::IsForward); - //else - if (event.GetKeyCode() == WXK_DELETE /*|| event.GetKeyCode() == WXK_BACK*/ ) - remove(); - //else if (event.GetKeyCode() == WXK_F5) - // wxGetApp().plater()->reload_all_from_disk(); - else if (wxGetKeyState(wxKeyCode('A')) && wxGetKeyState(WXK_CONTROL/*WXK_SHIFT*/)) - select_item_all_children(); - else if (wxGetKeyState(wxKeyCode('C')) && wxGetKeyState(WXK_CONTROL)) - copy(); - else if (wxGetKeyState(wxKeyCode('V')) && wxGetKeyState(WXK_CONTROL)) - paste(); - else if (wxGetKeyState(wxKeyCode('Y')) && wxGetKeyState(WXK_CONTROL)) - redo(); - else if (wxGetKeyState(wxKeyCode('Z')) && wxGetKeyState(WXK_CONTROL)) - undo(); - else if (wxGetKeyState(wxKeyCode('X')) && wxGetKeyState(WXK_CONTROL)) - cut(); - else if (wxGetKeyState(wxKeyCode('K')) && wxGetKeyState(WXK_CONTROL)) - clone(); - else if (event.GetUnicodeKey() == '+') - increase_instances(); - else if (event.GetUnicodeKey() == '-') - decrease_instances(); - else if (event.GetUnicodeKey() == 'p') - toggle_printable_state(); - else if (event.GetUnicodeKey() == 'd') - toggle_auto_drop(); - else if (filaments_count() > 1) { + const std::optional shortcut = wxGetApp().shortcuts().lookup(ShortcutContext::ObjectList, KeyChord::from_event(event)); + if (shortcut.has_value() && dispatch_shortcut(*shortcut)) + return; + if (filaments_count() > 1) { std::vector numbers = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' }; wxChar key_char = event.GetUnicodeKey(); if (std::find(numbers.begin(), numbers.end(), key_char) != numbers.end()) { @@ -1842,6 +1776,43 @@ void ObjectList::key_event(wxKeyEvent& event) } #endif /* __WXOSX__ */ +#ifdef __WXOSX__ +void ObjectList::update_shortcut_accelerators() +{ + std::vector entries; + const ShortcutRegistry& shortcuts = wxGetApp().shortcuts(); + for (Shortcut shortcut : shortcuts_in(ShortcutContext::ObjectList)) + if (const KeyChord chord = shortcuts.binding(shortcut); chord.valid()) + entries.push_back(chord.to_accelerator_entry(m_shortcut_id_base + int(shortcut))); + for (int i = 1; i < 10; ++i) { + entries.emplace_back(wxACCEL_NORMAL, '0' + i, wxID_LAST + i); + entries.emplace_back(wxACCEL_NORMAL, WXK_NUMPAD0 + i, wxID_LAST + i); + } + m_accel = wxAcceleratorTable(int(entries.size()), entries.data()); + SetAcceleratorTable(m_accel); +} +#endif /* __WXOSX__ */ + +bool ObjectList::dispatch_shortcut(Shortcut shortcut) +{ + switch (shortcut) { + case Shortcut::DeleteSelected: remove(); break; + case Shortcut::SelectAll: select_item_all_children(); break; + case Shortcut::Copy: copy(); break; + case Shortcut::Paste: paste(); break; + case Shortcut::Cut: cut(); break; + case Shortcut::Undo: undo(); break; + case Shortcut::Redo: redo(); break; + case Shortcut::CloneSelected: clone(); break; + case Shortcut::AddInstance: increase_instances(); break; + case Shortcut::RemoveInstance: decrease_instances(); break; + case Shortcut::TogglePrintable: toggle_printable_state(); break; + case Shortcut::ToggleAutoDrop: toggle_auto_drop(); break; + default: return false; + } + return true; +} + void ObjectList::OnBeginDrag(wxDataViewEvent &event) { const bool mult_sel = multiple_selection(); diff --git a/src/slic3r/GUI/GUI_ObjectList.hpp b/src/slic3r/GUI/GUI_ObjectList.hpp index cab78b6adc..5705aa2c8b 100644 --- a/src/slic3r/GUI/GUI_ObjectList.hpp +++ b/src/slic3r/GUI/GUI_ObjectList.hpp @@ -40,6 +40,9 @@ typedef std::map t_layer_config_ranges; #define FIX_THROUGH_CGAL_ALWAYS 1 namespace GUI { + +enum class Shortcut : uint8_t; + struct ObjectVolumeID { ModelObject* object{ nullptr }; ModelVolume* volume{ nullptr }; @@ -270,7 +273,11 @@ public: void extruder_editing(); #ifndef __WXOSX__ void key_event(wxKeyEvent& event); +#else + // wxDataViewCtrl never sees key events on macOS, so the bindings are installed as accelerators. + void update_shortcut_accelerators(); #endif /* __WXOSX__ */ + bool dispatch_shortcut(Shortcut shortcut); void copy(); void paste(); @@ -482,8 +489,8 @@ public: private: #ifdef __WXOSX__ -// void OnChar(wxKeyEvent& event); wxAcceleratorTable m_accel; + wxWindowID m_shortcut_id_base; #endif /* __WXOSX__ */ void OnContextMenu(wxDataViewEvent &event); void list_manipulation(const wxPoint& mouse_pos, bool evt_context_menu = false); diff --git a/src/slic3r/GUI/GUI_Preview.cpp b/src/slic3r/GUI/GUI_Preview.cpp index ea3ae5d21d..2c44202876 100644 --- a/src/slic3r/GUI/GUI_Preview.cpp +++ b/src/slic3r/GUI/GUI_Preview.cpp @@ -280,8 +280,6 @@ bool Preview::init(wxWindow* parent, Bed3D& bed, Model* model) m_canvas->enable_assemble_view_toolbar(false); // sizer, m_canvas_widget - m_canvas_widget->Bind(wxEVT_KEY_DOWN, &Preview::update_layers_slider_from_canvas, this); - wxBoxSizer *main_sizer = new wxBoxSizer(wxVERTICAL); main_sizer->Add(m_canvas_widget, 1, wxALL | wxEXPAND, 0); @@ -505,28 +503,6 @@ void Preview::update_layers_slider_mode() m_layers_slider->SetModeAndOnlyExtruder(one_extruder_printed_model, only_extruder, can_change_color); } -void Preview::update_layers_slider_from_canvas(wxKeyEvent &event) -{ - if (event.HasModifiers()) { - event.Skip(); - return; - } - - const auto key = event.GetKeyCode(); - - IMSlider *m_layers_slider = m_canvas->get_gcode_viewer().get_layers_slider(); - IMSlider *m_moves_slider = m_canvas->get_gcode_viewer().get_moves_slider(); - if (key == 'L') { - if(!m_layers_slider->switch_one_layer_mode()) - event.Skip(); - m_canvas->set_as_dirty(); - } - /*else if (key == WXK_SHIFT) - m_layers_slider->UseDefaultColors(false);*/ - else - event.Skip(); -} - void Preview::update_layers_slider(const std::vector& layers_z, bool keep_z_range) { IMSlider *m_layers_slider = m_canvas->get_gcode_viewer().get_layers_slider(); diff --git a/src/slic3r/GUI/GUI_Preview.hpp b/src/slic3r/GUI/GUI_Preview.hpp index 5469e32b71..fdfe364fb8 100644 --- a/src/slic3r/GUI/GUI_Preview.hpp +++ b/src/slic3r/GUI/GUI_Preview.hpp @@ -171,7 +171,6 @@ private: void update_layers_slider(const std::vector& layers_z, bool keep_z_range = false); void update_layers_slider_mode(); - void update_layers_slider_from_canvas(wxKeyEvent &event); //BBS: add only gcode mode void load_print_as_fff(bool keep_z_range = false, bool only_gcode = false); }; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoAdvancedCut.cpp b/src/slic3r/GUI/Gizmos/GLGizmoAdvancedCut.cpp index 99ad00fe55..09bb92dddf 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoAdvancedCut.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoAdvancedCut.cpp @@ -354,7 +354,6 @@ bool GLGizmoAdvancedCut::on_init() if (!GLGizmoRotate3D::on_init()) return false; - m_shortcut_key = WXK_CONTROL_C; // initiate info shortcuts const wxString ctrl = GUI::shortkey_ctrl_prefix(); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoAssembly.cpp b/src/slic3r/GUI/Gizmos/GLGizmoAssembly.cpp index e686d5bb8f..9560078cb2 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoAssembly.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoAssembly.cpp @@ -1,6 +1,7 @@ #include "GLGizmoAssembly.hpp" #include "slic3r/GUI/GLCanvas3D.hpp" #include "slic3r/GUI/GUI_App.hpp" +#include "slic3r/GUI/Shortcuts.hpp" #include "slic3r/GUI/Plater.hpp" #include "slic3r/GUI/Gizmos/GizmoObjectManipulation.hpp" #include "slic3r/Utils/UndoRedo.hpp" @@ -46,7 +47,7 @@ bool GLGizmoAssembly::on_init() { GLGizmoMeasure::on_init(); - m_shortcut_key = WXK_CONTROL_Y; + m_shortcut = Shortcut::GizmoAssembly; return true; } diff --git a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp index 1aaac99d40..6ff2c8213d 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp @@ -4,6 +4,7 @@ #include #include "slic3r/GUI/GUI_App.hpp" +#include "slic3r/GUI/Shortcuts.hpp" #include "slic3r/GUI/Plater.hpp" #include "slic3r/GUI/GUI_Colors.hpp" @@ -299,7 +300,6 @@ GLGizmoBase::GLGizmoBase(GLCanvas3D &parent, const std::string &icon_filename, u : m_parent(parent) , m_group_id(-1) , m_state(Off) - , m_shortcut_key(NO_SHORTCUT_KEY_VALUE) , m_icon_filename(icon_filename) , m_sprite_id(sprite_id) , m_imgui(wxGetApp().imgui()) @@ -515,11 +515,8 @@ void GLGizmoBase::render_input_window(float x, float y, float bottom_limit) std::string GLGizmoBase::get_name(bool include_shortcut) const { - int key = get_shortcut_key(); - std::string out = on_get_name(); - if (include_shortcut && key >= WXK_CONTROL_A && key <= WXK_CONTROL_Z) - out += std::string(" [") + char(int('A') + key - int(WXK_CONTROL_A)) + "]"; - return out; + const std::string name = on_get_name(); + return include_shortcut && m_shortcut.has_value() ? wxGetApp().shortcuts().with_key(name, *m_shortcut) : name; } } // namespace GUI diff --git a/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp b/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp index 92491d0d44..47e8f832a6 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp @@ -11,6 +11,7 @@ #include "slic3r/GUI/3DScene.hpp" #include +#include #include @@ -29,6 +30,7 @@ namespace GUI { class ImGuiWrapper; +enum class Shortcut : uint8_t; class GLCanvas3D; enum class CommonGizmosDataID; class CommonGizmosDataPool; @@ -72,9 +74,6 @@ public: NegZ = 1 << 5, }; - // Represents NO key(button on keyboard) value - static const int NO_SHORTCUT_KEY_VALUE = 0; - protected: struct Grabber { @@ -138,7 +137,7 @@ protected: int m_group_id; // TODO: remove only for rotate EState m_state; - int m_shortcut_key; + std::optional m_shortcut; // the registry entry that opens this gizmo std::string m_icon_filename; unsigned int m_sprite_id; int m_hover_id{ -1 }; @@ -169,7 +168,7 @@ public: EState get_state() const { return m_state; } void set_state(EState state) { m_state = state; on_set_state(); } - int get_shortcut_key() const { return m_shortcut_key; } + std::optional shortcut() const { return m_shortcut; } const std::string& get_icon_filename() const { return m_icon_filename; } diff --git a/src/slic3r/GUI/Gizmos/GLGizmoBrimEars.cpp b/src/slic3r/GUI/Gizmos/GLGizmoBrimEars.cpp index 6d9e810815..750e5fe6cb 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoBrimEars.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoBrimEars.cpp @@ -5,6 +5,7 @@ #include "slic3r/GUI/Camera.hpp" #include "slic3r/GUI/Gizmos/GLGizmosCommon.hpp" #include "slic3r/GUI/GUI_App.hpp" +#include "slic3r/GUI/Shortcuts.hpp" #include "slic3r/GUI/Plater.hpp" #include "libslic3r/ClipperUtils.hpp" #include "libslic3r/ExPolygon.hpp" @@ -46,7 +47,7 @@ bool GLGizmoBrimEars::on_init() { m_new_point_head_radius = get_brim_default_radius(); - m_shortcut_key = WXK_CONTROL_E; + m_shortcut = Shortcut::GizmoBrimEars; const wxString ctrl = GUI::shortkey_ctrl_prefix(); const wxString alt = GUI::shortkey_alt_prefix(); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp b/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp index 273bb94b90..2100b1fca7 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp @@ -6,6 +6,7 @@ #include #include "slic3r/GUI/GUI_App.hpp" +#include "slic3r/GUI/Shortcuts.hpp" #include "slic3r/GUI/Plater.hpp" #include "slic3r/GUI/Gizmos/GizmoObjectManipulation.hpp" #include "slic3r/GUI/format.hpp" @@ -1310,7 +1311,7 @@ void GLGizmoCut3D::render_cut_line() bool GLGizmoCut3D::on_init() { m_grabbers.emplace_back(); - m_shortcut_key = WXK_CONTROL_C; + m_shortcut = Shortcut::GizmoCut; // initiate info shortcuts const wxString ctrl = GUI::shortkey_ctrl_prefix(); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp b/src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp index ecf465afe7..1009a6e89b 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp @@ -1,6 +1,7 @@ #include "GLGizmoEmboss.hpp" #include "slic3r/GUI/GLCanvas3D.hpp" #include "slic3r/GUI/GUI_App.hpp" +#include "slic3r/GUI/Shortcuts.hpp" #include "slic3r/GUI/GUI_ObjectList.hpp" #include "slic3r/GUI/Gizmos/GizmoObjectManipulation.hpp" #include "slic3r/GUI/MainFrame.hpp" // to update title when add text @@ -727,7 +728,7 @@ bool GLGizmoEmboss::on_init() m_rotate_gizmo.set_highlight_color(gray_color); // NOTE: It has special handling in GLGizmosManager::handle_shortcut - m_shortcut_key = WXK_CONTROL_T; + m_shortcut = Shortcut::GizmoEmboss; m_shortcuts = { {_L("Drag"), _L("Position on surface")} diff --git a/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp index 035fb895aa..06d69c3e82 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp @@ -8,6 +8,7 @@ //#include "slic3r/GUI/3DScene.hpp" #include "slic3r/GUI/GLCanvas3D.hpp" #include "slic3r/GUI/GUI_App.hpp" +#include "slic3r/GUI/Shortcuts.hpp" #include "slic3r/GUI/ImGuiWrapper.hpp" #include "slic3r/GUI/Plater.hpp" #include "slic3r/GUI/GUI_ObjectList.hpp" @@ -78,7 +79,7 @@ std::string GLGizmoFdmSupports::on_get_name() const bool GLGizmoFdmSupports::on_init() { // BBS - m_shortcut_key = WXK_CONTROL_L; + m_shortcut = Shortcut::GizmoFdmSupports; m_desc["perform"] = _L("Apply"); m_desc["on_overhangs_only"] = _L("On highlighted overhangs only"); @@ -149,25 +150,14 @@ void GLGizmoFdmSupports::render_painter_gizmo() glsafe(::glDisable(GL_BLEND)); } -// BBS -bool GLGizmoFdmSupports::on_key_down_select_tool_type(int keyCode) { - switch (keyCode) - { - case 'F': - m_current_tool = ImGui::FillButtonIcon; - break; - case 'S': - m_current_tool = ImGui::SphereButtonIcon; - break; - case 'C': - m_current_tool = ImGui::CircleButtonIcon; - break; - case 'G': - m_current_tool = ImGui::GapFillIcon; - break; - default: - return false; - break; +bool GLGizmoFdmSupports::on_tool_shortcut(Shortcut shortcut) +{ + switch (shortcut) { + case Shortcut::PaintToolFill: m_current_tool = ImGui::FillButtonIcon; break; + case Shortcut::PaintToolSphere: m_current_tool = ImGui::SphereButtonIcon; break; + case Shortcut::PaintToolCircle: m_current_tool = ImGui::CircleButtonIcon; break; + case Shortcut::PaintToolGapFill: m_current_tool = ImGui::GapFillIcon; break; + default: return false; } return true; } diff --git a/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp b/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp index 57a6cc1981..d282a06b65 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp @@ -26,8 +26,7 @@ public: state_ready }; - //BBS - bool on_key_down_select_tool_type(int keyCode); + bool on_tool_shortcut(Shortcut shortcut) override; protected: void on_render_input_window(float x, float y, float bottom_limit) override; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp b/src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp index e9d8598423..54dbd96ba7 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp @@ -1,6 +1,7 @@ #include "GLGizmoFlatten.hpp" #include "slic3r/GUI/GLCanvas3D.hpp" #include "slic3r/GUI/GUI_App.hpp" +#include "slic3r/GUI/Shortcuts.hpp" #include "slic3r/GUI/Plater.hpp" #include "slic3r/GUI/Gizmos/GLGizmosCommon.hpp" @@ -54,7 +55,7 @@ void GLGizmoFlatten::data_changed(bool is_serializing) bool GLGizmoFlatten::on_init() { - m_shortcut_key = WXK_CONTROL_F; + m_shortcut = Shortcut::GizmoFlatten; return true; } diff --git a/src/slic3r/GUI/Gizmos/GLGizmoFuzzySkin.cpp b/src/slic3r/GUI/Gizmos/GLGizmoFuzzySkin.cpp index d807e466c8..8938e8a264 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoFuzzySkin.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoFuzzySkin.cpp @@ -6,6 +6,7 @@ #include "slic3r/GUI/GLCanvas3D.hpp" #include "slic3r/GUI/GUI.hpp" #include "slic3r/GUI/GUI_App.hpp" +#include "slic3r/GUI/Shortcuts.hpp" #include "slic3r/GUI/GUI_ObjectList.hpp" #include "slic3r/GUI/ImGuiWrapper.hpp" #include "slic3r/GUI/MsgDialog.hpp" @@ -31,7 +32,7 @@ std::string GLGizmoFuzzySkin::on_get_name() const bool GLGizmoFuzzySkin::on_init() { - m_shortcut_key = WXK_CONTROL_H; + m_shortcut = Shortcut::GizmoFuzzySkin; const wxString ctrl = GUI::shortkey_ctrl_prefix(); const wxString alt = GUI::shortkey_alt_prefix(); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp index 843a4b45fe..e5c6502452 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp @@ -25,7 +25,6 @@ GLGizmoHollow::GLGizmoHollow(GLCanvas3D& parent, const std::string& icon_filenam bool GLGizmoHollow::on_init() { - m_shortcut_key = WXK_CONTROL_H; m_desc["enable"] = _(L("Hollow this object")); m_desc["preview"] = _(L("Preview hollowed and drilled model")); m_desc["offset"] = _(L("Offset")) + ": "; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp b/src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp index ba2f54d5c5..8ec564e5b4 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp @@ -2,6 +2,7 @@ #include "slic3r/GUI/GUI.hpp" #include "slic3r/GUI/GLCanvas3D.hpp" #include "slic3r/GUI/GUI_App.hpp" +#include "slic3r/GUI/Shortcuts.hpp" #include "slic3r/GUI/Plater.hpp" #include "slic3r/GUI/Gizmos/GizmoObjectManipulation.hpp" #include "slic3r/Utils/UndoRedo.hpp" @@ -449,7 +450,7 @@ bool GLGizmoMeasure::gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_po bool GLGizmoMeasure::on_init() { - m_shortcut_key = WXK_CONTROL_U; + m_shortcut = Shortcut::GizmoMeasure; const wxString shift = GUI::shortkey_shift_prefix(); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoMeshBoolean.cpp b/src/slic3r/GUI/Gizmos/GLGizmoMeshBoolean.cpp index 8b12da14f9..b91f0a9468 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoMeshBoolean.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoMeshBoolean.cpp @@ -1,5 +1,6 @@ #include "GLGizmoMeshBoolean.hpp" #include "slic3r/GUI/GLCanvas3D.hpp" +#include "slic3r/GUI/Shortcuts.hpp" #include "slic3r/GUI/ImGuiWrapper.hpp" #include "slic3r/GUI/GUI.hpp" #include "libslic3r/MeshBoolean.hpp" @@ -104,7 +105,7 @@ bool GLGizmoMeshBoolean::on_mouse(const wxMouseEvent &mouse_event) bool GLGizmoMeshBoolean::on_init() { - m_shortcut_key = WXK_CONTROL_B; + m_shortcut = Shortcut::GizmoMeshBoolean; return true; } diff --git a/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp b/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp index 3d4af75cde..2e741fa5e5 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp @@ -2,6 +2,7 @@ #include "slic3r/GUI/GLCanvas3D.hpp" #include "slic3r/GUI/GUI_App.hpp" +#include "slic3r/GUI/Shortcuts.hpp" #include "slic3r/GUI/ImGuiWrapper.hpp" #include "slic3r/GUI/Camera.hpp" #include "slic3r/GUI/Plater.hpp" @@ -90,7 +91,7 @@ void GLGizmoMmuSegmentation::init_extruders_data() bool GLGizmoMmuSegmentation::on_init() { // BBS - m_shortcut_key = WXK_CONTROL_N; + m_shortcut = Shortcut::GizmoMmuSegmentation; const wxString ctrl = GUI::shortkey_ctrl_prefix(); const wxString alt = GUI::shortkey_alt_prefix(); @@ -209,30 +210,16 @@ bool GLGizmoMmuSegmentation::on_number_key_down(int number) return true; } -bool GLGizmoMmuSegmentation::on_key_down_select_tool_type(int keyCode) { - switch (keyCode) - { - case 'F': - m_current_tool = ImGui::FillButtonIcon; - break; - case 'T': - m_current_tool = ImGui::TriangleButtonIcon; - break; - case 'S': - m_current_tool = ImGui::SphereButtonIcon; - break; - case 'C': - m_current_tool = ImGui::CircleButtonIcon; - break; - case 'H': - m_current_tool = ImGui::HeightRangeIcon; - break; - case 'G': - m_current_tool = ImGui::GapFillIcon; - break; - default: - return false; - break; +bool GLGizmoMmuSegmentation::on_tool_shortcut(Shortcut shortcut) +{ + switch (shortcut) { + case Shortcut::PaintToolFill: m_current_tool = ImGui::FillButtonIcon; break; + case Shortcut::PaintToolTriangle: m_current_tool = ImGui::TriangleButtonIcon; break; + case Shortcut::PaintToolSphere: m_current_tool = ImGui::SphereButtonIcon; break; + case Shortcut::PaintToolCircle: m_current_tool = ImGui::CircleButtonIcon; break; + case Shortcut::PaintToolHeightRange: m_current_tool = ImGui::HeightRangeIcon; break; + case Shortcut::PaintToolGapFill: m_current_tool = ImGui::GapFillIcon; break; + default: return false; } return true; } diff --git a/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.hpp b/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.hpp index 70cfde5aed..b2b04acdbe 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.hpp @@ -82,7 +82,7 @@ public: // BBS bool on_number_key_down(int number); - bool on_key_down_select_tool_type(int keyCode); + bool on_tool_shortcut(Shortcut shortcut) override; protected: // BBS diff --git a/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp b/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp index 2f3195620a..4bee1a6cfc 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp @@ -1,6 +1,7 @@ #include "GLGizmoMove.hpp" #include "slic3r/GUI/GLCanvas3D.hpp" #include "slic3r/GUI/GUI_App.hpp" +#include "slic3r/GUI/Shortcuts.hpp" //BBS: GUI refactor #include "slic3r/GUI/Plater.hpp" #include "libslic3r/AppConfig.hpp" @@ -61,7 +62,7 @@ bool GLGizmoMove3D::on_init() m_grabbers[0].angles = { 0.0, 0.5 * double(PI), 0.0 }; m_grabbers[1].angles = { -0.5 * double(PI), 0.0, 0.0 }; - m_shortcut_key = WXK_CONTROL_M; + m_shortcut = Shortcut::GizmoMove; return true; } diff --git a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.hpp b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.hpp index 63e9d3f436..9ba6065458 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.hpp @@ -192,6 +192,8 @@ public: ~GLGizmoPainterBase() override; void data_changed(bool is_serializing) override; virtual bool gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_position, bool shift_down, bool alt_down, bool control_down); + // Switches the painting tool a Painting-context shortcut names; false when this gizmo has no such tool. + virtual bool on_tool_shortcut(Shortcut shortcut) { return false; } // Following function renders the triangles and cursor. Having this separated // from usual on_render method allows to render them before transparent diff --git a/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp b/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp index 5521640eee..835b97f072 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp @@ -3,6 +3,7 @@ #include "slic3r/GUI/ImGuiWrapper.hpp" #include "slic3r/GUI/GUI_App.hpp" +#include "slic3r/GUI/Shortcuts.hpp" #include "slic3r/GUI/GUI.hpp" #include "slic3r/GUI/Plater.hpp" #include "slic3r/GUI/Jobs/RotoptimizeJob.hpp" @@ -555,7 +556,7 @@ bool GLGizmoRotate3D::on_init() for (unsigned int i = 0; i < 3; ++i) m_gizmos[i].set_highlight_color(AXES_COLOR[i]); - m_shortcut_key = WXK_CONTROL_R; + m_shortcut = Shortcut::GizmoRotate; return true; } diff --git a/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp b/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp index 88e744c2b8..c30acba386 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp @@ -1,6 +1,7 @@ #include "GLGizmoScale.hpp" #include "slic3r/GUI/GLCanvas3D.hpp" #include "slic3r/GUI/GUI_App.hpp" +#include "slic3r/GUI/Shortcuts.hpp" #include "slic3r/GUI/Plater.hpp" #include @@ -135,7 +136,7 @@ bool GLGizmoScale3D::on_init() // BBS m_grabbers[4].enabled = false; - m_shortcut_key = WXK_CONTROL_S; + m_shortcut = Shortcut::GizmoScale; return true; } diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp index b211a18fb2..f36a47c8ec 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp @@ -5,6 +5,7 @@ //#include "slic3r/GUI/3DScene.hpp" #include "slic3r/GUI/GLCanvas3D.hpp" #include "slic3r/GUI/GUI_App.hpp" +#include "slic3r/GUI/Shortcuts.hpp" #include "slic3r/GUI/ImGuiWrapper.hpp" #include "slic3r/GUI/Plater.hpp" #include "slic3r/GUI/GUI_ObjectList.hpp" @@ -28,7 +29,7 @@ void GLGizmoSeam::on_shutdown() bool GLGizmoSeam::on_init() { - m_shortcut_key = WXK_CONTROL_P; + m_shortcut = Shortcut::GizmoSeam; const wxString ctrl = GUI::shortkey_ctrl_prefix(); const wxString alt = GUI::shortkey_alt_prefix(); @@ -86,19 +87,12 @@ void GLGizmoSeam::render_painter_gizmo() glsafe(::glDisable(GL_BLEND)); } -// BBS -bool GLGizmoSeam::on_key_down_select_tool_type(int keyCode) { - switch (keyCode) - { - case 'S': - m_current_tool = ImGui::SphereButtonIcon; - break; - case 'C': - m_current_tool = ImGui::CircleButtonIcon; - break; - default: - return false; - break; +bool GLGizmoSeam::on_tool_shortcut(Shortcut shortcut) +{ + switch (shortcut) { + case Shortcut::PaintToolSphere: m_current_tool = ImGui::SphereButtonIcon; break; + case Shortcut::PaintToolCircle: m_current_tool = ImGui::CircleButtonIcon; break; + default: return false; } return true; } diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSeam.hpp b/src/slic3r/GUI/Gizmos/GLGizmoSeam.hpp index 5b143dc32c..f1c48a12d6 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSeam.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSeam.hpp @@ -12,8 +12,7 @@ public: void render_painter_gizmo() override; - //BBS - bool on_key_down_select_tool_type(int keyCode); + bool on_tool_shortcut(Shortcut shortcut) override; protected: // BBS diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp index ca22b14d99..49818e8e11 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp @@ -34,7 +34,6 @@ GLGizmoSlaSupports::GLGizmoSlaSupports(GLCanvas3D& parent, const std::string& ic bool GLGizmoSlaSupports::on_init() { - m_shortcut_key = WXK_CONTROL_L; m_desc["head_diameter"] = _L("Head diameter") + ": "; m_desc["lock_supports"] = _L("Lock supports under new islands"); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoText.cpp b/src/slic3r/GUI/Gizmos/GLGizmoText.cpp index df3e9be584..9ae979eeef 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoText.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoText.cpp @@ -261,7 +261,6 @@ bool GLGizmoText::on_init() //m_avail_font_names = init_occt_fonts(); update_font_texture(); m_scale = m_imgui->get_font_size(); - m_shortcut_key = WXK_CONTROL_T; m_grabbers.push_back(Grabber()); diff --git a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp index 17a7b769c3..dc51518acc 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp @@ -4,6 +4,7 @@ #include "slic3r/GUI/3DScene.hpp" #include "slic3r/GUI/Camera.hpp" #include "slic3r/GUI/GUI_App.hpp" +#include "slic3r/GUI/Shortcuts.hpp" #include "slic3r/GUI/GUI_ObjectList.hpp" #include "slic3r/GUI/Plater.hpp" #include "slic3r/Utils/UndoRedo.hpp" @@ -486,15 +487,13 @@ bool GLGizmosManager::is_running() const return m_current != Undefined; } -bool GLGizmosManager::handle_shortcut(int key) +bool GLGizmosManager::open_gizmo_by_shortcut(Shortcut shortcut) { if (!m_enabled) return false; - auto is_key = [pressed_key = key](int gizmo_key) { return (gizmo_key == pressed_key - 64) || (gizmo_key == pressed_key - 96); }; - // allowe open shortcut even when selection is empty - if (GLGizmoBase* gizmo_emboss = m_gizmos[Emboss].get(); - is_key(gizmo_emboss->get_shortcut_key())) { + // The text tool opens without a selection because it creates its own object. + if (GLGizmoBase* gizmo_emboss = m_gizmos[Emboss].get(); gizmo_emboss->shortcut() == shortcut) { dynamic_cast(gizmo_emboss)->on_shortcut_key(); return true; } @@ -502,16 +501,21 @@ bool GLGizmosManager::handle_shortcut(int key) if (m_parent.get_selection().is_empty()) return false; - auto is_gizmo = [is_key](const std::unique_ptr &gizmo) { - return gizmo->is_activable() && is_key(gizmo->get_shortcut_key()); - }; - auto it = std::find_if(m_gizmos.begin(), m_gizmos.end(), is_gizmo); - + auto it = std::find_if(m_gizmos.begin(), m_gizmos.end(), [shortcut](const std::unique_ptr &gizmo) { + return gizmo->is_activable() && gizmo->shortcut() == shortcut; + }); if (it == m_gizmos.end()) return false; - EType gizmo_type = EType(it - m_gizmos.begin()); - return open_gizmo(gizmo_type); + return open_gizmo(EType(it - m_gizmos.begin())); +} + +bool GLGizmosManager::on_delete_key() +{ + const bool processed = (m_current == Cut || m_current == Measure || m_current == Assembly) && gizmo_event(SLAGizmoEventType::Delete); + if (processed) + m_parent.set_as_dirty(); + return processed; } bool GLGizmosManager::is_dragging() const @@ -856,15 +860,6 @@ bool GLGizmosManager::on_char(wxKeyEvent& evt) } break; } - //skip some keys when gizmo - case 'A': - case 'a': - { - if (is_running()) { - processed = true; - } - break; - } //case WXK_RETURN: //{ // if ((m_current == SlaSupports) && gizmo_event(SLAGizmoEventType::ApplyChanges)) @@ -883,12 +878,6 @@ bool GLGizmosManager::on_char(wxKeyEvent& evt) //} - case WXK_BACK: - case WXK_DELETE: { - if ((m_current == Cut || m_current == Measure || m_current == Assembly) && gizmo_event(SLAGizmoEventType::Delete)) - processed = true; - break; - } //case 'A': //case 'a': //{ @@ -932,11 +921,6 @@ bool GLGizmosManager::on_char(wxKeyEvent& evt) } } - if (!processed && !evt.HasModifiers()) { - if (handle_shortcut(keyCode)) - processed = true; - } - if (processed) m_parent.set_as_dirty(); @@ -1077,40 +1061,24 @@ bool GLGizmosManager::on_key(wxKeyEvent& evt) processed = select(digit); } } - else if (keyCode == 'F' || keyCode == 'T' || keyCode == 'S' || keyCode == 'C' || keyCode == 'H' || keyCode == 'G') { - processed = mmu_seg->on_key_down_select_tool_type(keyCode); - if (processed) { - // force extra frame to automatically update window size - wxGetApp().imgui()->set_requires_extra_frame(); - } - } } } - else if (m_current == FdmSupports) { - GLGizmoFdmSupports* fdm_support = dynamic_cast(get_current()); - if (fdm_support != nullptr && (keyCode == 'F' || keyCode == 'S' || keyCode == 'C' || keyCode == 'G')) { - processed = fdm_support->on_key_down_select_tool_type(keyCode); - } - if (processed) { - // force extra frame to automatically update window size - wxGetApp().imgui()->set_requires_extra_frame(); - } - } - else if (m_current == Seam) { - GLGizmoSeam* seam = dynamic_cast(get_current()); - if (seam != nullptr && (keyCode == 'S' || keyCode == 'C')) { - processed = seam->on_key_down_select_tool_type(keyCode); - } - if (processed) { - // force extra frame to automatically update window size - wxGetApp().imgui()->set_requires_extra_frame(); - } - } else if (m_current == Measure || m_current == Assembly) { + else if (m_current == Measure || m_current == Assembly) { if (keyCode == WXK_CONTROL) gizmo_event(SLAGizmoEventType::CtrlDown, Vec2d::Zero(), evt.ShiftDown(), evt.AltDown(), evt.CmdDown()); else if (keyCode == WXK_SHIFT) gizmo_event(SLAGizmoEventType::ShiftDown, Vec2d::Zero(), evt.ShiftDown(), evt.AltDown(), evt.CmdDown()); } + + if (!processed) { + if (auto painter = dynamic_cast(get_current()); painter != nullptr) { + const std::optional shortcut = wxGetApp().shortcuts().lookup(ShortcutContext::Painting, KeyChord::from_event(evt)); + processed = shortcut.has_value() && painter->on_tool_shortcut(*shortcut); + if (processed) + // force extra frame to automatically update window size + wxGetApp().imgui()->set_requires_extra_frame(); + } + } } if (processed) diff --git a/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp b/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp index 5f249d2ef7..2a4afac16d 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp @@ -263,7 +263,10 @@ public: EType get_gizmo_from_name(const std::string& gizmo_name) const; bool is_running() const; - bool handle_shortcut(int key); + // Opens the gizmo bound to a Plater-context shortcut; false when no gizmo has it or it cannot open now. + bool open_gizmo_by_shortcut(Shortcut shortcut); + // Lets the current gizmo consume the delete key; false when it did not. + bool on_delete_key(); bool is_dragging() const; diff --git a/src/slic3r/GUI/HintNotification.cpp b/src/slic3r/GUI/HintNotification.cpp index c08a447e1e..de5f12e07e 100644 --- a/src/slic3r/GUI/HintNotification.cpp +++ b/src/slic3r/GUI/HintNotification.cpp @@ -5,6 +5,7 @@ #include "GUI_ObjectList.hpp" #include "GLCanvas3D.hpp" #include "MainFrame.hpp" +#include "Preferences.hpp" #include "Tab.hpp" #include "libslic3r/AppConfig.hpp" #include "libslic3r/Utils.hpp" @@ -444,9 +445,8 @@ void HintDatabase::load_hints_from_file(const boost::filesystem::path& path) // open preferences } else if (dict["hypertext_type"] == "preferences") { - std::string page = dict["hypertext_preferences_page"]; std::string item = dict["hypertext_preferences_item"]; - HintData hint_data{ id_string, text1, weight, was_displayed, hypertext_text, follow_text, disabled_tags, enabled_tags, false, documentation_link, img_url, [page, item]() { wxGetApp().open_preferences(1, page); } };// 1 is to modify + HintData hint_data{ id_string, text1, weight, was_displayed, hypertext_text, follow_text, disabled_tags, enabled_tags, false, documentation_link, img_url, [item]() { wxGetApp().open_preferences(PreferencesTab::Control, item); } }; m_loaded_hints.emplace_back(hint_data); } else if (dict["hypertext_type"] == "plater") { diff --git a/src/slic3r/GUI/KBShortcutsDialog.cpp b/src/slic3r/GUI/KBShortcutsDialog.cpp index be1f53ef97..c03d331627 100644 --- a/src/slic3r/GUI/KBShortcutsDialog.cpp +++ b/src/slic3r/GUI/KBShortcutsDialog.cpp @@ -6,359 +6,319 @@ #include "Notebook.hpp" #include #include +#include +#include #include "GUI_App.hpp" #include "wxExtensions.hpp" #include "MainFrame.hpp" +#include "MsgDialog.hpp" +#include "Preferences.hpp" +#include "Widgets/Button.hpp" +#include "Widgets/DialogButtons.hpp" +#include "Widgets/Label.hpp" +#include "Widgets/StaticBox.hpp" +#include "Widgets/StaticLine.hpp" +#include "Widgets/TabCtrl.hpp" #include namespace Slic3r { namespace GUI { -wxDEFINE_EVENT(EVT_PREFERENCES_SELECT_TAB, wxCommandEvent); +namespace { -KBShortcutsDialog::KBShortcutsDialog() - : DPIDialog(static_cast(wxGetApp().mainframe), wxID_ANY,_L("Keyboard Shortcuts"), - wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE) +wxString shortcut_names(const std::vector& shortcuts) { - // fonts - const wxFont& font = wxGetApp().normal_font(); - const wxFont& bold_font = wxGetApp().bold_font(); - SetFont(font); - - this->SetSizeHints(wxDefaultSize, wxDefaultSize); - this->SetBackgroundColour(wxColour(255, 255, 255)); - - wxBoxSizer *m_sizer_top = new wxBoxSizer(wxVERTICAL); - - auto m_top_line = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxSize(-1, 1), wxTAB_TRAVERSAL); - m_top_line->SetBackgroundColour(wxColour(166, 169, 170)); - - m_sizer_top->Add(m_top_line, 0, wxEXPAND, 0); - m_sizer_body = new wxBoxSizer(wxHORIZONTAL); - - m_panel_selects = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL); - m_panel_selects->SetBackgroundColour(wxColour(248, 248, 248)); - wxBoxSizer *m_sizer_left = new wxBoxSizer(wxVERTICAL); - - m_sizer_left->Add(0, 0, 0, wxEXPAND | wxTOP, FromDIP(20)); - - m_sizer_left->Add(create_button(0, _L("Global")), 0, wxEXPAND, 0); - m_sizer_left->Add(create_button(1, _L("Prepare")), 0, wxEXPAND, 0); - m_sizer_left->Add(create_button(2, _L("Toolbar")), 0, wxEXPAND, 0); - m_sizer_left->Add(create_button(3, _L("Objects list")), 0, wxEXPAND, 0); - m_sizer_left->Add(create_button(4, _L("Preview")), 0, wxEXPAND, 0); - - m_panel_selects->SetSizer(m_sizer_left); - m_panel_selects->Layout(); - m_sizer_left->Fit(m_panel_selects); - m_sizer_body->Add(m_panel_selects, 0, wxEXPAND, 0); - - m_sizer_right = new wxBoxSizer(wxHORIZONTAL); - - m_sizer_right->Add(0, 0, 0, wxEXPAND | wxLEFT, FromDIP(12)); - - m_simplebook = new wxSimplebook(this, wxID_ANY, wxDefaultPosition, wxSize(FromDIP(870), FromDIP(500)), 0); - - m_sizer_right->Add(m_simplebook, 1, wxEXPAND, 0); - m_sizer_body->Add(m_sizer_right, 1, wxEXPAND, 0); - m_sizer_top->Add(m_sizer_body, 1, wxEXPAND, 0); - - fill_shortcuts(); - for (size_t i = 0; i < m_full_shortcuts.size(); ++i) { - wxPanel *page = create_page(m_simplebook, m_full_shortcuts[i], font, bold_font); - m_pages.push_back(page); - m_simplebook->AddPage(page, m_full_shortcuts[i].first.first, i == 0); + wxString names; + for (Shortcut shortcut : shortcuts) { + if (!names.empty()) + names += ", "; + names += _(shortcut_info(shortcut).name); } + return names; +} - Bind(EVT_PREFERENCES_SELECT_TAB, &KBShortcutsDialog::OnSelectTabel, this); +const wxColour ERROR_COLOUR("#D01B1B"); - SetSizer(m_sizer_top); - Layout(); - Fit(); +// The camera action a mouse button drags, as set in Preferences > Control. +const char* mouse_action(const char* preference) +{ + const std::string action = wxGetApp().app_config->get(preference); + return action == "1" ? L("Pan View") : action == "2" ? L("Rotate View") : L("None"); +} + +// Page layout in DIPs; titles and rows are indented as in the Preferences dialog. +constexpr int PAGE_WIDTH = 640; +constexpr int TITLE_MARGIN = DESIGN_LEFT_MARGIN - 10; +constexpr int ROW_MARGIN = DESIGN_LEFT_MARGIN; +constexpr int ROW_GAP = 16; + +template struct overloaded : Ts... { using Ts::operator()...; }; +template overloaded(Ts...) -> overloaded; + +std::vector to_wx(const std::vector& parts) +{ + std::vector out; + for (const std::string& part : parts) + out.push_back(from_u8(part)); + return out; +} + +// The keys a Global shortcut can use, the second line of its hint and of a rejection. +wxString global_key_advice() +{ + return wxString::Format(_L("Use %s or %s, or a key that does not type a character."), + from_u8(KeyChord::modifier_name(wxMOD_CONTROL)), from_u8(KeyChord::modifier_name(wxMOD_ALT))); +} + +// The pieces of a chord, spaced out for the dialog: "Ctrl + Shift + A". +wxString join_keys(const std::vector& parts) +{ + wxString out; + for (const wxString& part : parts) + out += (out.empty() ? "" : " + ") + part; + return out; +} + +} // namespace + +KBShortcutsDialog::KBShortcutsDialog(wxWindow* parent, ShortcutContext page) + : DPIDialog(parent, wxID_ANY, _L("Keyboard Shortcuts"), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE) +{ + SetFont(wxGetApp().normal_font()); + SetBackgroundColour(*wxWHITE); + + fill_pages(); + + ScalableButton* probe = new ScalableButton(this, wxID_ANY, "edit"); + m_edit_size = probe->GetBestSize(); + probe->Destroy(); + m_buttons_width = 2 * m_edit_size.x + FromDIP(6); + m_row_text_width = FromDIP(PAGE_WIDTH) - FromDIP(ROW_MARGIN) - FromDIP(TITLE_MARGIN) - 2 * FromDIP(ROW_GAP) - m_buttons_width; + GetTextExtent("W", &m_key_slot, nullptr, nullptr, nullptr, &Label::Head_14); + + // The page tabs follow the Preferences dialog. + m_tabs = new TabCtrl(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTR_NO_BUTTONS | wxTR_HIDE_ROOT | wxTR_SINGLE | wxTR_NO_LINES | wxBORDER_NONE | wxWANTS_CHARS | wxTR_FULL_ROW_HIGHLIGHT); + m_tabs->Bind(wxEVT_RIGHT_DOWN, [](auto&) {}); + m_tabs->SetFont(Label::Body_14); + m_simplebook = new wxSimplebook(this, wxID_ANY, wxDefaultPosition, wxSize(FromDIP(660), FromDIP(500))); + for (const Page& page : m_pages) { + m_tabs->AppendItem(page.title); + m_simplebook->AddPage(create_page(m_simplebook, page), page.title); + } + const StateColor tab_colour(std::make_pair(wxColour("#6B6B6C"), (int) StateColor::NotChecked), std::make_pair(wxColour("#363636"), (int) StateColor::Normal)); + for (size_t i = 0; i < m_tabs->GetCount(); ++i) + m_tabs->SetItemTextColour(i, tab_colour); + m_tabs->Bind(wxEVT_TAB_SEL_CHANGED, [this](wxCommandEvent& e) { + for (size_t i = 0; i < m_tabs->GetCount(); ++i) + m_tabs->SetItemBold(i, int(i) == e.GetSelection()); + m_simplebook->SetSelection(e.GetSelection()); + }); + const auto shown = std::find_if(m_pages.begin(), m_pages.end(), [page](const Page& entry) { return entry.context == page; }); + m_tabs->SelectItem(shown == m_pages.end() ? 0 : int(shown - m_pages.begin())); + + wxBoxSizer* sizer = new wxBoxSizer(wxVERTICAL); + sizer->Add(m_tabs, 0, wxEXPAND | wxTOP | wxBOTTOM, FromDIP(5)); + sizer->Add(m_simplebook, 1, wxEXPAND); + SetSizerAndFit(sizer); CenterOnParent(); - - // select first - auto event = wxCommandEvent(EVT_PREFERENCES_SELECT_TAB); - event.SetInt(0); - event.SetEventObject(this); - wxPostEvent(this, event); wxGetApp().UpdateDlgDarkUI(this); } -void KBShortcutsDialog::OnSelectTabel(wxCommandEvent &event) -{ - auto id = event.GetInt(); - SelectHash::iterator i = m_hash_selector.begin(); - while (i != m_hash_selector.end()) { - Select *sel = i->second; - if (id == sel->m_index) { - sel->m_tab_button->SetBackgroundColour(StateColor::darkModeColorFor(wxColour("#BFE1DE"))); // ORCA color for selected tab background - sel->m_tab_text->SetBackgroundColour(StateColor::darkModeColorFor(wxColour("#BFE1DE"))); // ORCA color for selected tab background - sel->m_tab_text->SetFont(::Label::Head_13); - sel->m_tab_button->Refresh(); - sel->m_tab_text->Refresh(); - - m_simplebook->SetSelection(id); - } else { - sel->m_tab_button->SetBackgroundColour(StateColor::darkModeColorFor(wxColour("#F8F8F8"))); - sel->m_tab_text->SetBackgroundColour(StateColor::darkModeColorFor(wxColour("#F8F8F8"))); - sel->m_tab_text->SetFont(::Label::Body_13); - sel->m_tab_button->Refresh(); - sel->m_tab_text->Refresh(); - } - i++; - } - wxGetApp().UpdateDlgDarkUI(this); -} - -wxWindow *KBShortcutsDialog::create_button(int id, wxString text) -{ - auto tab_button = new wxWindow(m_panel_selects, wxID_ANY, wxDefaultPosition, wxSize( FromDIP(150), FromDIP(28)), wxTAB_TRAVERSAL); - - wxBoxSizer *sizer = new wxBoxSizer(wxHORIZONTAL); - - sizer->Add(0, 0, 0, wxEXPAND | wxLEFT, FromDIP(22)); - - auto stext = new wxStaticText(tab_button, wxID_ANY, text, wxDefaultPosition, wxDefaultSize, 0); - stext->SetFont(::Label::Body_13); - stext->SetForegroundColour(wxColour(38, 46, 48)); - stext->Wrap(-1); - sizer->Add(stext, 1, wxALIGN_CENTER, 0); - - tab_button->Bind(wxEVT_LEFT_DOWN, [this, id](auto &e) { - auto event = wxCommandEvent(EVT_PREFERENCES_SELECT_TAB); - event.SetInt(id); - event.SetEventObject(this); - wxPostEvent(this, event); - }); - - stext->Bind(wxEVT_LEFT_DOWN, [this, id](wxMouseEvent &e) { - auto event = wxCommandEvent(EVT_PREFERENCES_SELECT_TAB); - event.SetInt(id); - event.SetEventObject(this); - wxPostEvent(this, event); - }); - - Select *sel = new Select; - sel->m_index = id; - sel->m_tab_button = tab_button; - sel->m_tab_text = stext; - m_hash_selector[sel->m_index] = sel; - - tab_button->SetSizer(sizer); - tab_button->Layout(); - return tab_button; -} - void KBShortcutsDialog::on_dpi_changed(const wxRect& suggested_rect) { - m_logo_bmp.msw_rescale(); - m_header_bitmap->SetBitmap(m_logo_bmp.bmp()); - msw_buttons_rescale(this, em_unit(), { wxID_OK }); - + m_tabs->Rescale(); Layout(); Fit(); Refresh(); } -void KBShortcutsDialog::fill_shortcuts() +void KBShortcutsDialog::fill_pages() { - const std::string ctrl = GUI::shortkey_ctrl_prefix(); - const std::string alt = GUI::shortkey_alt_prefix(); - const std::string shift = L("Shift+"); + // A fixed row is listed in the section of the shortcuts it belongs with. + auto fixed = [](ShortcutSection section, std::vector keys, const char* description) { return Row{ FixedKey{ std::move(keys), description }, section }; }; + auto mouse = [](ShortcutSection section, const wxString& button, const char* preference) { return Row{ MouseAction{ button, preference }, section }; }; + auto key = [](const std::string& key) { return _L_CONTEXT(key, "Keyboard Shortcut"); }; + auto page = [this](const wxString& title, const wxString& caption, ShortcutContext context, std::vector fixed_rows) { + Page entry{ title, caption, context, {} }; + for (Shortcut shortcut : shortcuts_in(context)) + entry.rows.push_back({ shortcut, shortcut_section(shortcut) }); + entry.rows.insert(entry.rows.end(), fixed_rows.begin(), fixed_rows.end()); + std::stable_sort(entry.rows.begin(), entry.rows.end(), [](const Row& a, const Row& b) { return a.section < b.section; }); + m_pages.push_back(std::move(entry)); + }; + + const wxString ctrl = from_u8(KeyChord::modifier_name(wxMOD_CONTROL)); + const wxString alt = from_u8(KeyChord::modifier_name(wxMOD_ALT)); + const wxString shift = from_u8(KeyChord::modifier_name(wxMOD_SHIFT)); + const wxString shift_ctrl = shift + "/" + ctrl; // either one + const wxString any_key = key(L_CONTEXT("Key", "Keyboard Shortcut")); // the key the row's shortcut is bound to + const wxString esc = key(L_CONTEXT("Esc", "Keyboard Shortcut")); + const wxString left_button = _L("Left mouse"); + const wxString wheel = _L("Mouse wheel"); + using Section = ShortcutSection; if (wxGetApp().is_editor()) { - Shortcuts global_shortcuts = { - // File - { ctrl + "N", L("New Project") }, - { ctrl + "O", L("Open Project") }, - { ctrl + "S", L("Save Project") }, - { ctrl + shift + "S", L("Save Project as")}, - { ctrl + shift + "E", L("Publish 3MF") }, - // File>Import - { ctrl + "I", L("Import geometry data from STL/STEP/3MF/OBJ/AMF files") }, - // File>Export - { ctrl + "G", L("Export plate sliced file")}, - // Slice plate - { ctrl + "R", L("Slice plate")}, - // Send to Print - { ctrl + shift + "G", L("Print plate")}, - // Edit - { ctrl + "X", L("Cut") }, - { ctrl + "C", L("Copy to clipboard") }, - { ctrl + "V", L("Paste from clipboard") }, - // Configuration - { ctrl + "P", L("Preferences") }, - //3D control -#ifdef __APPLE__ - { ctrl + shift + "M", L("Show/Hide 3Dconnexion devices settings dialog") }, -#else - { ctrl + "M", L("Show/Hide 3Dconnexion devices settings dialog") }, -#endif // __APPLE + page(_L("Global"), _L("Available anywhere in the window, even while typing in a text field."), ShortcutContext::Global, { + fixed(Section::Application, { alt, "1-9, 0" }, L("Run a speed dial favorite while the dial is open")), + fixed(Section::Application, { ctrl, key(L_CONTEXT("Tab", "Keyboard Shortcut")) }, L("Switch to the next main tab")), + }); - // Switch table page - { ctrl + L("Tab"), L("Switch table page")}, - // Open speed dial - { L_CONTEXT("Space", "Keyboard Shortcut"), L("Open speed dial") }, - { alt + "1..9,0", L("Run a Speed Dial favourite (while the Speed Dial is open)") }, - //DEL - #ifdef __APPLE__ - {"fn+⌫", L("Delete Selected")}, - #else - {L_CONTEXT("Del", "Keyboard Shortcut"), L("Delete Selected")}, - #endif - // Help - { "?", L("Show keyboard shortcuts list") } - }; - m_full_shortcuts.push_back({{_L("Global shortcuts"), ""}, global_shortcuts}); + page(_L("Prepare"), _L("Available while the 3D view on the Prepare tab has focus."), ShortcutContext::Plater, { + fixed(Section::Selection, { alt, left_button }, L("Select a part")), + fixed(Section::Selection, { ctrl, left_button }, L("Select multiple objects")), + fixed(Section::Selection, { shift, left_button }, L("Select objects by rectangle")), + fixed(Section::Selection, { esc }, L("Deselect All")), + fixed(Section::Objects, { "1-9" }, L("Keyboard 1-9: set filament for object/part")), + fixed(Section::Placement, { shift, any_key }, L("Movement step set to 1mm")), + fixed(Section::Placement, { ctrl, any_key }, L("Movement in camera space")), + mouse(Section::Camera, left_button, "left_mouse_drag_action"), + mouse(Section::Camera, _L("Middle mouse"), "middle_mouse_drag_action"), + mouse(Section::Camera, _L("Right mouse"), "right_mouse_drag_action"), + fixed(Section::Camera, { wheel }, L("Zoom View")), + }); - - // Retrieve mouse actions from config and map to MouseAction - std::map mouse_actions; - mouse_actions["0"] = L("None"); - mouse_actions["1"] = L("Pan View"); - mouse_actions["2"] = L("Rotate View"); + page(_L("Painting"), _L("Available while a painting gizmo is open: supports, seam, fuzzy skin or color painting."), ShortcutContext::Painting, { + fixed(Section::Gizmos, { esc }, L("Deselect All")), + fixed(Section::Gizmos, { shift, left_button }, L("Move: press to snap by 1mm")), + fixed(Section::PaintingTools, { ctrl, wheel }, L("Support/Color Painting: adjust pen radius")), + fixed(Section::PaintingTools, { alt, wheel }, L("Support/Color Painting: adjust section position")), + }); - Shortcuts plater_shortcuts = { - { L("Left mouse button"), mouse_actions[wxGetApp().app_config->get("left_mouse_drag_action").c_str()]}, - { L("Middle mouse button"), mouse_actions[wxGetApp().app_config->get("middle_mouse_drag_action").c_str()]}, - { L("Right mouse button"), mouse_actions[wxGetApp().app_config->get("right_mouse_drag_action").c_str()]}, - { L("Mouse wheel"), L("Zoom View") }, - { "A", L("Arrange all objects") }, - { shift + "A", L("Arrange objects on selected plates") }, - - { "Q", L("Auto orients selected objects or all objects. If there are selected objects, it just orients the selected ones. Otherwise, it will orient all objects in the current project.") }, - { shift + "Q", L("Auto orients all objects on the active plate.") }, - - {shift + L("Tab"), L("Collapse/Expand the sidebar")}, - {ctrl + L("Any arrow"), L("Movement in camera space")}, - {alt + L("Left mouse button"), L("Select a part")}, - {ctrl + L("Left mouse button"), L("Select multiple objects")}, - {shift + L("Left mouse button"), L("Select objects by rectangle")}, - {L_CONTEXT("Arrow Up", "Keyboard Shortcut"), L("Move selection 10mm in positive Y direction")}, - {L_CONTEXT("Arrow Down", "Keyboard Shortcut"), L("Move selection 10mm in negative Y direction")}, - {L_CONTEXT("Arrow Left", "Keyboard Shortcut"), L("Move selection 10mm in negative X direction")}, - {L_CONTEXT("Arrow Right", "Keyboard Shortcut"), L("Move selection 10mm in positive X direction")}, - {shift + L("Any arrow"), L("Movement step set to 1mm")}, - {L_CONTEXT("Esc", "Keyboard Shortcut"), L("Deselect All")}, - {"1-9", L("Keyboard 1-9: set filament for object/part")}, - {ctrl + "0", L("Camera view - Default")}, - {ctrl + "1", L("Camera view - Top")}, - {ctrl + "2", L("Camera view - Bottom")}, - {ctrl + "3", L("Camera view - Front")}, - {ctrl + "4", L("Camera view - Behind")}, - {ctrl + "5", L("Camera Angle - Left side")}, - {ctrl + "6", L("Camera Angle - Right side")}, - - {ctrl + "A", L("Select all objects")}, - {ctrl + "D", L("Delete All")}, - {ctrl + "Z", L("Undo")}, - {ctrl + "Y", L("Redo")}, - { "M", L("Gizmo move") }, - { "R", L("Gizmo rotate") }, - { "S", L("Gizmo scale") }, - { "F", L("Gizmo place face on bed") }, - { "C", L("Gizmo cut") }, - { "B", L("Gizmo mesh boolean") }, - { "H", L("Gizmo FDM paint-on fuzzy skin") }, - { "L", L("Gizmo SLA support points") }, - { "P", L("Gizmo FDM paint-on seam") }, - { "T", L("Gizmo text emboss/engrave") }, - { "U", L("Gizmo measure") }, - { "Y", L("Gizmo assemble") }, - { "E", L("Gizmo brim ears") }, - { "I", L("Zoom in") }, - { "O", L("Zoom out") }, - { "V", L("Toggle printable for object/part") }, - { L_CONTEXT("Tab", "Keyboard Shortcut"), L("Switch between Prepare/Preview") }, - }; - m_full_shortcuts.push_back({ { _L("Plater"), "" }, plater_shortcuts }); - - Shortcuts gizmos_shortcuts = { - {L_CONTEXT("Esc", "Keyboard Shortcut"), L("Deselect All")}, - {shift, L("Move: press to snap by 1mm")}, - {ctrl + L("Mouse wheel"), L("Support/Color Painting: adjust pen radius")}, - {alt + L("Mouse wheel"), L("Support/Color Painting: adjust section position")}, - }; - m_full_shortcuts.push_back({{_L("Gizmo"), ""}, gizmos_shortcuts}); - - Shortcuts object_list_shortcuts = { - {"1-9", L("Set extruder number for the objects and parts") }, - {L_CONTEXT("Del", "Keyboard Shortcut"), L("Delete objects, parts, modifiers")}, - {L_CONTEXT("Esc", "Keyboard Shortcut"), L("Deselect All")}, - {ctrl + "C", L("Copy to clipboard")}, - {ctrl + "V", L("Paste from clipboard")}, - {ctrl + "X", L("Cut")}, - {ctrl + "A", L("Select all objects")}, - {ctrl + "K", L("Clone Selected")}, - {ctrl + "Z", L("Undo")}, - {ctrl + "Y", L("Redo")}, - {L_CONTEXT("Space", "Keyboard Shortcut"), L("Select the object/part and press space to change the name")}, - {L("Mouse click"), L("Select the object/part and mouse click to change the name")}, - }; - m_full_shortcuts.push_back({ { _L("Objects List"), "" }, object_list_shortcuts }); + page(_L("Objects list"), _L("Available while the object list has focus."), ShortcutContext::ObjectList, { + fixed(Section::Selection, { esc }, L("Deselect All")), + fixed(Section::Objects, { "1-9" }, L("Set extruder number for the objects and parts")), + fixed(Section::Objects, { key(L_CONTEXT("Space", "Keyboard Shortcut")) }, L("Select the object/part and press space to change the name")), + fixed(Section::Objects, { _L("Mouse click") }, L("Select the object/part and mouse click to change the name")), + }); } - Shortcuts preview_shortcuts = { - { L_CONTEXT("Arrow Up", "Keyboard Shortcut"), L("Vertical slider - Move active thumb Up")}, - { L_CONTEXT("Arrow Down", "Keyboard Shortcut"), L("Vertical slider - Move active thumb Down")}, - { L_CONTEXT("Arrow Left", "Keyboard Shortcut"), L("Horizontal slider - Move active thumb Left")}, - { L_CONTEXT("Arrow Right", "Keyboard Shortcut"), L("Horizontal slider - Move active thumb Right")}, - { "L", L("On/Off one layer mode of the vertical slider")}, - { "C", L("On/Off G-code window")}, - { L_CONTEXT("Tab", "Keyboard Shortcut"), L("Switch between Prepare/Preview")}, - {shift + L("Any arrow"), L("Move slider 5x faster")}, - {shift + L("Mouse wheel"), L("Move slider 5x faster")}, - {ctrl + L("Any arrow"), L("Move slider 5x faster")}, - {ctrl + L("Mouse wheel"), L("Move slider 5x faster")}, - { L_CONTEXT("Home", "Keyboard Shortcut"), L("Horizontal slider - Move to start position")}, - { L_CONTEXT("End", "Keyboard Shortcut"), L("Horizontal slider - Move to last position")}, - }; - m_full_shortcuts.push_back({ { _L("Preview"), "" }, preview_shortcuts }); + page(_L("Preview"), _L("Available while the 3D view on the Preview tab has focus."), ShortcutContext::Preview, { + fixed(Section::Sliders, { shift_ctrl, any_key }, L("Move slider 5x faster")), + fixed(Section::Sliders, { shift_ctrl, wheel }, L("Scroll slider 5x faster")), + }); } -wxPanel* KBShortcutsDialog::create_page(wxWindow* parent, const ShortcutsItem& shortcuts, const wxFont& font, const wxFont& bold_font) +wxPanel* KBShortcutsDialog::create_page(wxWindow* parent, const Page& page) { wxPanel* main_page = new wxPanel(parent); wxBoxSizer* main_sizer = new wxBoxSizer(wxVERTICAL); - if (!shortcuts.first.second.empty()) { - main_sizer->AddSpacer(FromDIP(10)); - wxBoxSizer* info_sizer = new wxBoxSizer(wxHORIZONTAL); - info_sizer->AddStretchSpacer(); - info_sizer->Add(new wxStaticText(main_page, wxID_ANY, shortcuts.first.second), 0); - info_sizer->AddStretchSpacer(); - main_sizer->Add(info_sizer, 0, wxEXPAND); - main_sizer->AddSpacer(FromDIP(10)); - } - - int items_count = (int) shortcuts.second.size(); wxScrolledWindow *scrollable_panel = new wxScrolledWindow(main_page); wxGetApp().UpdateDarkUI(scrollable_panel); - scrollable_panel->SetScrollbars(20, 20, 50, 50); - scrollable_panel->SetInitialSize(wxSize(FromDIP(850), FromDIP(450))); + const wxColour page_colour = StateColor::darkModeColorFor(*wxWHITE); + scrollable_panel->SetBackgroundColour(page_colour); + scrollable_panel->SetScrollRate(0, 20); + const int page_width = FromDIP(PAGE_WIDTH); + scrollable_panel->SetInitialSize(wxSize(page_width, FromDIP(450))); - wxBoxSizer * scrollable_panel_sizer = new wxBoxSizer(wxVERTICAL); - wxFlexGridSizer *grid_sizer = new wxFlexGridSizer(items_count, 2, FromDIP(10), FromDIP(20)); + const int title_margin = FromDIP(TITLE_MARGIN); + const int row_margin = FromDIP(ROW_MARGIN); + const int gap = FromDIP(ROW_GAP); - for (int i = 0; i < items_count; ++i) { - const auto &[shortcut, description] = shortcuts.second[i]; - // Keyboard keys carry a "Keyboard Shortcut" context so translators keep them in English; - // mouse-input labels are ordinary phrases and use the plain lookup. - const bool is_mouse = shortcut.find("Mouse") != std::string::npos || shortcut.find("mouse") != std::string::npos; - auto key = new wxStaticText(scrollable_panel, wxID_ANY, is_mouse ? _(shortcut) : _L_CONTEXT(shortcut, "Keyboard Shortcut")); - key->SetForegroundColour(wxColour(50, 58, 61)); - key->SetFont(bold_font); - grid_sizer->Add(key, 0, wxALIGN_CENTRE_VERTICAL); + wxBoxSizer* scrollable_panel_sizer = new wxBoxSizer(wxVERTICAL); - auto desc = new wxStaticText(scrollable_panel, wxID_ANY, _(description)); - desc->SetFont(font); - desc->SetForegroundColour(wxColour(50, 58, 61)); - desc->Wrap(FromDIP(600)); - grid_sizer->Add(desc, 0, wxALIGN_CENTRE_VERTICAL); + const wxColour note_colour = StateColor::darkModeColorFor(wxColour("#F8F8F8")); + const wxColour note_text = StateColor::darkModeColorFor(wxColour("#6B6B6A")); + StaticBox* note = new StaticBox(scrollable_panel); + note->SetCornerRadius(FromDIP(4)); + note->SetBorderWidth(0); + note->SetBackgroundColor(note_colour); + note->SetBackgroundColour(note_colour); + auto note_icon = new wxStaticBitmap(note, wxID_ANY, ScalableBitmap(note, "help", 16).bmp()); + auto note_text_ctrl = new wxStaticText(note, wxID_ANY, page.caption); + note_text_ctrl->SetFont(Label::Body_13); + note_text_ctrl->SetForegroundColour(note_text); + note_text_ctrl->SetBackgroundColour(note_colour); + note_text_ctrl->Wrap(page_width - 2 * title_margin - FromDIP(10 + 16 + 8 + 10)); + wxBoxSizer* note_sizer = new wxBoxSizer(wxHORIZONTAL); + note_sizer->Add(note_icon, 0, wxALIGN_CENTRE_VERTICAL | wxLEFT, FromDIP(10)); + note_sizer->Add(note_text_ctrl, 1, wxALIGN_CENTRE_VERTICAL | wxALL, FromDIP(8)); + note->SetSizer(note_sizer); + scrollable_panel_sizer->Add(note, 0, wxEXPAND | wxLEFT | wxRIGHT | wxTOP, title_margin); + + auto key_parts = [](const Row& row) { + return std::visit(overloaded{ + [](Shortcut shortcut) { return to_wx(wxGetApp().shortcuts().binding(shortcut).display_parts()); }, + [](const FixedKey& fixed) { return fixed.keys; }, + [](const MouseAction& mouse) { return std::vector{ mouse.button }; }, + }, row.content); + }; + auto description = [](const Row& row) { + return std::visit(overloaded{ + [](Shortcut shortcut) { return _(shortcut_info(shortcut).name); }, + [](const FixedKey& fixed) { return _(fixed.description); }, + [](const MouseAction& mouse) { return _(mouse_action(mouse.preference)); }, + }, row.content); + }; + auto icon_button = [&](const char* icon, const wxString& tooltip) { + auto button = new ScalableButton(scrollable_panel, wxID_ANY, icon); + button->SetBackgroundColour(page_colour); + button->SetToolTip(tooltip); + return button; + }; + + std::optional section; + for (const Row& row : page.rows) { + if (section != row.section) { + auto heading = new StaticLine(scrollable_panel, false, _(section_name(row.section))); + heading->SetFont(Label::Head_14); + heading->SetForegroundColour(DESIGN_GRAY900_COLOR); + wxBoxSizer* heading_sizer = new wxBoxSizer(wxHORIZONTAL); + heading_sizer->AddSpacer(title_margin); + heading_sizer->Add(heading, 1, wxEXPAND | wxTOP | wxBOTTOM, FromDIP(6)); + heading_sizer->AddSpacer(title_margin); + scrollable_panel_sizer->Add(heading_sizer, 0, wxEXPAND | wxTOP, FromDIP(section.has_value() ? 10 : 6)); + section = row.section; + } + auto desc = new wxStaticText(scrollable_panel, wxID_ANY, description(row)); + desc->SetFont(Label::Body_14); + desc->SetForegroundColour(DESIGN_GRAY900_COLOR); + auto chord_label = [&](long style) { + auto label = new wxStaticText(scrollable_panel, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, style); + label->SetFont(Label::Head_14); + label->SetForegroundColour(DESIGN_GRAY900_COLOR); + return label; + }; + wxStaticText* modifiers = chord_label(0); + wxStaticText* key = chord_label(wxALIGN_CENTRE_HORIZONTAL); // a single key is centred in its column + desc->Wrap(m_row_text_width - set_chord_labels(modifiers, key, key_parts(row))); + + wxBoxSizer* buttons = new wxBoxSizer(wxHORIZONTAL); + if (const MouseAction* mouse = std::get_if(&row.content)) { + auto settings = icon_button("settings", _L("Preferences")); + settings->Bind(wxEVT_BUTTON, [this, preference = mouse->preference](wxCommandEvent&) { open_mouse_preferences(preference); }); + buttons->Add(settings, 0, wxALIGN_CENTRE_VERTICAL); + m_preference_rows.push_back({ mouse->preference, desc }); + } else if (const Shortcut* editable = std::get_if(&row.content)) { + const Shortcut shortcut = *editable; + auto change = icon_button("edit", _L("Edit")); + change->Bind(wxEVT_BUTTON, [this, shortcut](wxCommandEvent&) { edit_shortcut(shortcut); }); + auto reset = icon_button("undo", _L("Reset")); + reset->Bind(wxEVT_BUTTON, [this, shortcut](wxCommandEvent&) { reset_shortcut(shortcut); }); + reset->Show(wxGetApp().shortcuts().is_customized(shortcut)); + buttons->Add(change, 0, wxALIGN_CENTRE_VERTICAL | wxRIGHT, FromDIP(6)); + buttons->Add(reset, 0, wxALIGN_CENTRE_VERTICAL | wxRESERVE_SPACE_EVEN_IF_HIDDEN); + m_editable_rows.push_back({ shortcut, desc, modifiers, key, reset }); + } else { + auto lock = new wxStaticBitmap(scrollable_panel, wxID_ANY, ScalableBitmap(scrollable_panel, "printer_status_lock", 16).bmp()); + lock->SetToolTip(_L("Not customizable")); + buttons->Add((m_edit_size.x - lock->GetBestSize().x) / 2, m_edit_size.y); // centred under the edit icons, at their height + buttons->Add(lock, 0, wxALIGN_CENTRE_VERTICAL); + } + if (const int used = buttons->GetMinSize().x; used < m_buttons_width) // a box sizer recomputes its own min size, so pad it + buttons->AddSpacer(m_buttons_width - used); + + wxBoxSizer* row_sizer = new wxBoxSizer(wxHORIZONTAL); + row_sizer->AddSpacer(row_margin); + row_sizer->Add(desc, 1, wxALIGN_CENTRE_VERTICAL); + row_sizer->AddSpacer(gap); + row_sizer->Add(modifiers, 0, wxALIGN_CENTRE_VERTICAL); + row_sizer->Add(key, 0, wxALIGN_CENTRE_VERTICAL); + row_sizer->Add(buttons, 0, wxALIGN_CENTRE_VERTICAL | wxLEFT, gap); + row_sizer->AddSpacer(title_margin); + scrollable_panel_sizer->Add(row_sizer, 0, wxEXPAND | wxTOP, FromDIP(4)); } - - scrollable_panel_sizer->Add(grid_sizer, 1, wxEXPAND | wxALL, FromDIP(20)); + scrollable_panel_sizer->AddSpacer(title_margin); scrollable_panel->SetSizer(scrollable_panel_sizer); main_sizer->Add(scrollable_panel, 1, wxEXPAND); @@ -367,5 +327,227 @@ wxPanel* KBShortcutsDialog::create_page(wxWindow* parent, const ShortcutsItem& s return main_page; } +void KBShortcutsDialog::edit_shortcut(Shortcut shortcut) +{ + ShortcutCaptureDialog dlg(this, shortcut); + if (dlg.ShowModal() != wxID_OK) + return; + const wxString question = wxString::Format(_L("%s is assigned to %s. Reassign it to %s?"), + join_keys(to_wx(dlg.chord().display_parts())), shortcut_names(dlg.conflicts()), _(shortcut_info(shortcut).name)); + if (!take_chord_from(shortcut, dlg.conflicts(), question)) + return; + wxGetApp().shortcuts().bind(shortcut, dlg.chord()); + apply_bindings(); +} + +void KBShortcutsDialog::reset_shortcut(Shortcut shortcut) +{ + const std::vector conflicts = wxGetApp().shortcuts().conflicts(shortcut, shortcut_info(shortcut).default_chord); + const wxString question = wxString::Format(_L("The default %s is assigned to %s. Reassign it to %s?"), + join_keys(to_wx(shortcut_info(shortcut).default_chord.display_parts())), shortcut_names(conflicts), _(shortcut_info(shortcut).name)); + if (!take_chord_from(shortcut, conflicts, question)) + return; + wxGetApp().shortcuts().reset(shortcut); + apply_bindings(); +} + +bool KBShortcutsDialog::take_chord_from(Shortcut shortcut, const std::vector& conflicts, const wxString& question) +{ + if (conflicts.empty()) + return true; + MessageDialog confirm(this, question, _(shortcut_info(shortcut).name), wxICON_QUESTION | wxOK | wxCANCEL); + if (confirm.ShowModal() != wxID_OK) + return false; + for (Shortcut other : conflicts) + wxGetApp().shortcuts().bind(other, KeyChord{}); + return true; +} + +void KBShortcutsDialog::apply_bindings() +{ + const ShortcutRegistry& shortcuts = wxGetApp().shortcuts(); + std::set pages; + for (const EditableRow& row : m_editable_rows) { + const int chord_width = set_chord_labels(row.modifiers, row.key, to_wx(shortcuts.binding(row.shortcut).display_parts())); + row.description->SetLabel(_(shortcut_info(row.shortcut).name)); + row.description->Wrap(m_row_text_width - chord_width); + row.reset->Show(shortcuts.is_customized(row.shortcut)); + pages.insert(row.key->GetParent()); + } + for (wxWindow* page : pages) + page->Layout(); + wxGetApp().on_shortcuts_changed(); +} + +int KBShortcutsDialog::set_chord_labels(wxStaticText* modifiers, wxStaticText* key, std::vector parts) +{ + const wxString last = parts.empty() ? wxString() : parts.back(); + if (!parts.empty()) + parts.pop_back(); + modifiers->SetLabel(parts.empty() ? wxString() : join_keys(parts) + " + "); + modifiers->Show(!parts.empty()); + key->SetLabel(last); + const int key_width = last.length() == 1 ? m_key_slot : key->GetBestSize().x; + key->SetMinSize(wxSize(key_width, -1)); + return (parts.empty() ? 0 : modifiers->GetBestSize().x) + key_width; +} + +void KBShortcutsDialog::open_mouse_preferences(const char* preference) +{ + // Opened from Preferences > Control, the settings are right behind this dialog. + if (auto preferences = dynamic_cast(GetParent()); preferences != nullptr) { + // Runs once this dialog has closed and the focus is back in Preferences. + preferences->CallAfter([preferences, preference] { preferences->select_tab(PreferencesTab::Control, preference); }); + EndModal(wxID_OK); + return; + } + wxGetApp().open_preferences(PreferencesTab::Control, preference); + // A language change rebuilds the main frame, taking this dialog with it. + if (GetParent() != wxGetApp().mainframe) { + EndModal(wxID_CANCEL); + return; + } + for (const PreferenceRow& row : m_preference_rows) + row.description->SetLabel(_(mouse_action(row.preference))); +} + +ShortcutCaptureDialog::ShortcutCaptureDialog(wxWindow* parent, Shortcut shortcut) + : DPIDialog(parent, wxID_ANY, _(shortcut_info(shortcut).name), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE) + , m_shortcut(shortcut) +{ + SetBackgroundColour(*wxWHITE); + wxBoxSizer* sizer = new wxBoxSizer(wxVERTICAL); + + // A Global shortcut also runs while a text field has the focus, so its hint names the keys it can use. + const bool global = (shortcut_info(shortcut).contexts & context_bit(ShortcutContext::Global)) != 0; + const wxString advice = global_key_advice(); + const wxString typing = _L("Global shortcuts also apply while typing."); + const wxString rule = _L("A key that types a character cannot be a global shortcut."); + m_hint = global ? typing + "\n" + advice : _L("Esc cancels, Enter confirms."); + m_rejection = rule + "\n" + advice; + + // Wide enough for each sentence on a line of its own where the translation allows, within limits. + int width = FromDIP(450); + for (const wxString& sentence : { typing, rule, advice }) { + int extent = 0; + GetTextExtent(sentence, &extent, nullptr, nullptr, nullptr, &wxGetApp().normal_font()); + width = std::max(width, extent); + } + width = std::min(width, FromDIP(550)); + + auto prompt = new Label(this, wxGetApp().normal_font(), wxString::Format(_L("Press the new shortcut for\n\"%s\""), _(shortcut_info(shortcut).name)), LB_AUTO_WRAP); + prompt->SetMinSize(wxSize(width, -1)); + sizer->Add(prompt, 0, wxALL, FromDIP(20)); + + // Keyboard focus stays on this box so the buttons never receive the key presses. + const wxColour box_colour = StateColor::darkModeColorFor(*wxWHITE); + StaticBox* capture = new StaticBox(this, wxID_ANY, wxDefaultPosition, wxSize(width, FromDIP(60)), wxWANTS_CHARS); + capture->SetCornerRadius(FromDIP(4)); + capture->SetBorderColorNormal(StateColor::darkModeColorFor(wxColour("#009688"))); // the focused-input colour, since the box always has the focus + capture->SetBackgroundColorNormal(box_colour); + capture->SetBackgroundColour(box_colour); + wxBoxSizer* capture_sizer = new wxBoxSizer(wxVERTICAL); + m_chord_label = new wxStaticText(capture, wxID_ANY, join_keys(to_wx(wxGetApp().shortcuts().binding(shortcut).display_parts()))); + m_chord_label->SetFont(::Label::Head_14); + m_chord_label->SetBackgroundColour(box_colour); + capture_sizer->AddStretchSpacer(); + capture_sizer->Add(m_chord_label, 0, wxALIGN_CENTER); + capture_sizer->AddStretchSpacer(); + capture->SetSizer(capture_sizer); + capture->Bind(wxEVT_KEY_DOWN, &ShortcutCaptureDialog::on_key, this); + capture->Bind(wxEVT_CHAR, &ShortcutCaptureDialog::on_char, this); + capture->Bind(wxEVT_LEFT_DOWN, [capture](wxMouseEvent&) { capture->SetFocus(); }); + sizer->Add(capture, 0, wxLEFT | wxRIGHT | wxEXPAND, FromDIP(20)); + + m_status = new Label(this, wxGetApp().normal_font(), m_hint, LB_AUTO_WRAP); + m_status->SetMinSize(wxSize(width, 3 * m_status->GetCharHeight())); // room for three lines, so the dialog keeps its size while keys are tried + m_status_colour = m_status->GetForegroundColour(); + sizer->Add(m_status, 0, wxLEFT | wxRIGHT | wxTOP, FromDIP(20)); + + auto dlg_btns = new DialogButtons(this, {"Unbind", "OK", "Cancel"}, "", 1 /*left_aligned*/); + dlg_btns->GetFIRST()->Bind(wxEVT_BUTTON, [this](wxCommandEvent&) { + m_chord = KeyChord{}; + m_conflicts.clear(); + EndModal(wxID_OK); + }); + dlg_btns->GetCANCEL()->Bind(wxEVT_BUTTON, [this](wxCommandEvent&) { EndModal(wxID_CANCEL); }); + m_ok = dlg_btns->GetOK(); + m_ok->Bind(wxEVT_BUTTON, [this](wxCommandEvent&) { EndModal(wxID_OK); }); + m_ok->Enable(false); + sizer->Add(dlg_btns, 0, wxEXPAND | wxTOP, FromDIP(10)); + + SetSizerAndFit(sizer); + CenterOnParent(); + wxGetApp().UpdateDlgDarkUI(this); + capture->CallAfter([capture]() { capture->SetFocus(); }); +} + +void ShortcutCaptureDialog::on_dpi_changed(const wxRect& suggested_rect) +{ + Layout(); + Fit(); +} + +void ShortcutCaptureDialog::on_key(wxKeyEvent& evt) +{ + if (!evt.HasAnyModifiers()) { + if (evt.GetKeyCode() == WXK_ESCAPE) { + EndModal(wxID_CANCEL); + return; + } + if (evt.GetKeyCode() == WXK_RETURN || evt.GetKeyCode() == WXK_NUMPAD_ENTER) { + if (m_ok->IsEnabled()) + EndModal(wxID_OK); + return; + } + } + const KeyChord chord = KeyChord::from_event(evt); + if (!chord.valid()) + return; + if (chord.needs_char_event()) { + evt.Skip(); + return; + } + record(chord); +} + +void ShortcutCaptureDialog::on_char(wxKeyEvent& evt) +{ + const KeyChord chord = KeyChord::from_event(evt); + if (chord.is_punctuation()) + record(chord); +} + +void ShortcutCaptureDialog::record(const KeyChord& chord) +{ + m_chord = chord; + m_chord_label->SetLabel(join_keys(to_wx(chord.display_parts()))); + m_chord_label->GetParent()->Layout(); + + auto reject = [this](const wxString& reason) { + m_status->SetForegroundColour(ERROR_COLOUR); + m_status->SetLabel(reason); + m_conflicts.clear(); + m_ok->Enable(false); + }; + const bool global = (shortcut_info(m_shortcut).contexts & context_bit(ShortcutContext::Global)) != 0; + if (global && !chord.is_menu_accelerator()) { + reject(m_rejection); + } else if (const std::optional owner = wxGetApp().shortcuts().step_owner(m_shortcut, chord); owner.has_value()) { + reject(wxString::Format(_L("Already used as a step of %s."), _(shortcut_info(*owner).name))); + } else { + m_conflicts = wxGetApp().shortcuts().conflicts(m_shortcut, chord); + m_status->SetForegroundColour(m_status_colour); + if (m_conflicts.empty()) + m_status->SetLabel(m_hint); + else + m_status->SetLabel(wxString::Format(_L("Already assigned to %s. Press OK to reassign it."), shortcut_names(m_conflicts))); + m_ok->Enable(true); + } + m_status->Refresh(); // a colour change alone does not repaint + Layout(); + Fit(); +} + } // namespace GUI } // namespace Slic3r diff --git a/src/slic3r/GUI/KBShortcutsDialog.hpp b/src/slic3r/GUI/KBShortcutsDialog.hpp index 9d49cd35c5..3091726147 100644 --- a/src/slic3r/GUI/KBShortcutsDialog.hpp +++ b/src/slic3r/GUI/KBShortcutsDialog.hpp @@ -3,53 +3,120 @@ #include #include +#include #include #include "GUI_Utils.hpp" +#include "Shortcuts.hpp" #include "wxExtensions.hpp" #include +class Button; +class Label; +class TabCtrl; + namespace Slic3r { namespace GUI { -class Select -{ -public: - int m_index; - wxWindow *m_tab_button; - wxWindow *m_tab_text; -}; -WX_DECLARE_HASH_MAP(int, Select *, wxIntegerHash, wxIntegerEqual, SelectHash); - +// Lists every shortcut per context and lets the user rebind the assignable ones. class KBShortcutsDialog : public DPIDialog { - typedef std::pair Shortcut; - typedef std::vector Shortcuts; - typedef std::pair, Shortcuts> ShortcutsItem; - typedef std::vector ShortcutsVec; + // A key the user cannot rebind. + struct FixedKey + { + std::vector keys; // modifier names and the key, shown joined with "+" + const char* description; // untranslated + }; + // A mouse button whose camera action is chosen in Preferences. + struct MouseAction + { + wxString button; + const char* preference; // AppConfig key of the action + }; + struct Row + { + std::variant content; + ShortcutSection section; + }; + struct Page + { + wxString title; + wxString caption; // when the page's keys apply + ShortcutContext context; + std::vector rows; + }; + struct EditableRow + { + Shortcut shortcut; + wxStaticText* description; + wxStaticText* modifiers; + wxStaticText* key; + ScalableButton* reset; + }; + struct PreferenceRow + { + const char* preference; + wxStaticText* description; + }; - ShortcutsVec m_full_shortcuts; - ScalableBitmap m_logo_bmp; - wxStaticBitmap* m_header_bitmap; - std::vector m_pages; + std::vector m_pages; + std::vector m_editable_rows; + std::vector m_preference_rows; + // Row geometry, measured once and shared by every page. + wxSize m_edit_size; // an edit or reset icon + int m_buttons_width = 0; // every row's buttons column, so the right-aligned keys share an edge + int m_row_text_width = 0; // what a description and its chord share; the description wraps at the rest + int m_key_slot = 0; // width of the widest single key, the column single keys line up in + + TabCtrl* m_tabs; + wxSimplebook* m_simplebook; public: - KBShortcutsDialog(); - wxWindow* create_button(int id, wxString text); - void OnSelectTabel(wxCommandEvent &event); - wxPanel *m_panel_selects; - wxBoxSizer *m_sizer_right; - wxSimplebook *m_simplebook; - wxBoxSizer * m_sizer_body; - SelectHash m_hash_selector; + KBShortcutsDialog(wxWindow* parent, ShortcutContext page); // opens on the page of that context protected: void on_dpi_changed(const wxRect &suggested_rect) override; private: - void fill_shortcuts(); - wxPanel* create_header(wxWindow* parent, const wxFont& bold_font); - wxPanel* create_page(wxWindow* parent, const ShortcutsItem& shortcuts, const wxFont& font, const wxFont& bold_font); + void fill_pages(); + wxPanel* create_page(wxWindow* parent, const Page& page); + void edit_shortcut(Shortcut shortcut); + void reset_shortcut(Shortcut shortcut); + // Asks question before unbinding conflicts; false when the user declined. + bool take_chord_from(Shortcut shortcut, const std::vector& conflicts, const wxString& question); + void apply_bindings(); // refreshes the rows and pushes the change to the rest of the app + // Puts a chord on a row's two labels, a single key in the shared column, and returns the width the chord takes. + int set_chord_labels(wxStaticText* modifiers, wxStaticText* key, std::vector parts); + void open_mouse_preferences(const char* preference); +}; + +// Records one key chord for a shortcut, warning about the shortcuts it would take the chord from. +class ShortcutCaptureDialog : public DPIDialog +{ +public: + ShortcutCaptureDialog(wxWindow* parent, Shortcut shortcut); + + // Valid after ShowModal() returned wxID_OK; an invalid chord means "unbind". + const KeyChord& chord() const { return m_chord; } + const std::vector& conflicts() const { return m_conflicts; } + +protected: + void on_dpi_changed(const wxRect& suggested_rect) override; + +private: + void on_key(wxKeyEvent& evt); + void on_char(wxKeyEvent& evt); + void record(const KeyChord& chord); + + Shortcut m_shortcut; + KeyChord m_chord; + std::vector m_conflicts; + wxStaticText* m_chord_label; + wxString m_hint; // what m_status shows while there is nothing to warn about + wxString m_rejection; // what it shows for a key a Global shortcut cannot use + Label* m_status; + wxColour m_status_colour; + Button* m_ok; }; } // namespace GUI diff --git a/src/slic3r/GUI/KeyChord.cpp b/src/slic3r/GUI/KeyChord.cpp new file mode 100644 index 0000000000..cd746d2f92 --- /dev/null +++ b/src/slic3r/GUI/KeyChord.cpp @@ -0,0 +1,314 @@ +#include "KeyChord.hpp" + +#include "GUI.hpp" +#include "I18N.hpp" + +#include + +#include +#include +#include + +namespace Slic3r { namespace GUI { + +namespace { + +constexpr int BINDABLE_MODIFIERS = wxMOD_CONTROL | wxMOD_SHIFT | wxMOD_ALT | wxMOD_RAW_CONTROL; + +struct KeyName +{ + int key; + const char* name; // canonical name, as wx parses it + const char* alias; // accepted when parsing; nullptr when there is none + const char* label; // translation key for KeyChord::display(); nullptr when name is it +}; + +constexpr std::array special_keys{{ + { WXK_BACK, L_CONTEXT("Backspace", "Keyboard Shortcut"), "Back", nullptr }, + { WXK_TAB, L_CONTEXT("Tab", "Keyboard Shortcut"), nullptr, nullptr }, + { WXK_RETURN, L_CONTEXT("Enter", "Keyboard Shortcut"), "Return", nullptr }, + { WXK_ESCAPE, L_CONTEXT("Esc", "Keyboard Shortcut"), "Escape", nullptr }, + { WXK_SPACE, L_CONTEXT("Space", "Keyboard Shortcut"), nullptr, nullptr }, + { WXK_DELETE, L_CONTEXT("Del", "Keyboard Shortcut"), "Delete", nullptr }, + { WXK_INSERT, L_CONTEXT("Ins", "Keyboard Shortcut"), "Insert", nullptr }, + { WXK_HOME, L_CONTEXT("Home", "Keyboard Shortcut"), nullptr, nullptr }, + { WXK_END, L_CONTEXT("End", "Keyboard Shortcut"), nullptr, nullptr }, + { WXK_PAGEUP, L_CONTEXT("PgUp", "Keyboard Shortcut"), "PageUp", nullptr }, + { WXK_PAGEDOWN, L_CONTEXT("PgDn", "Keyboard Shortcut"), "PageDown", nullptr }, + // Displayed as "Arrow Left" and so on, which is what the catalogs translate. + { WXK_LEFT, "Left", nullptr, L_CONTEXT("Arrow Left", "Keyboard Shortcut") }, + { WXK_RIGHT, "Right", nullptr, L_CONTEXT("Arrow Right", "Keyboard Shortcut") }, + { WXK_UP, "Up", nullptr, L_CONTEXT("Arrow Up", "Keyboard Shortcut") }, + { WXK_DOWN, "Down", nullptr, L_CONTEXT("Arrow Down", "Keyboard Shortcut") }, +}}; + +bool equals_ignoring_case(const std::string& a, const char* b) +{ + if (b == nullptr) + return false; + size_t i = 0; + for (; i < a.size() && b[i] != '\0'; ++i) + if (std::tolower(static_cast(a[i])) != std::tolower(static_cast(b[i]))) + return false; + return i == a.size() && b[i] == '\0'; +} + +bool is_letter(int key) { return key >= 'A' && key <= 'Z'; } +bool is_digit(int key) { return key >= '0' && key <= '9'; } +bool is_printable(int key) { return key > ' ' && key < 127; } +bool is_symbol(int key) { return is_printable(key) && !std::isalnum(key); } +bool is_function_key(int key) { return key >= WXK_F1 && key <= WXK_F24; } + +bool is_special(int key) +{ + if (is_function_key(key)) + return true; + return std::any_of(special_keys.begin(), special_keys.end(), [key](const KeyName& k) { return k.key == key; }); +} + +std::string special_key_name(int key) +{ + if (is_function_key(key)) + return "F" + std::to_string(key - WXK_F1 + 1); + for (const KeyName& k : special_keys) + if (k.key == key) + return k.name; + return {}; +} + +std::string special_key_label(int key) +{ + for (const KeyName& k : special_keys) + if (k.key == key) + return _u8L_CONTEXT(k.label != nullptr ? k.label : k.name, "Keyboard Shortcut"); + return special_key_name(key); +} + +int parse_key(const std::string& text) +{ + if (text.size() == 1) { + const int key = static_cast(text[0]); + return is_printable(key) ? std::toupper(key) : WXK_NONE; + } + for (const KeyName& k : special_keys) + if (equals_ignoring_case(text, k.name) || equals_ignoring_case(text, k.alias)) + return k.key; + if ((text[0] == 'F' || text[0] == 'f') && text.size() <= 3 && std::all_of(text.begin() + 1, text.end(), [](char c) { return std::isdigit(static_cast(c)); })) { + const int n = std::stoi(text.substr(1)); + if (n >= 1 && n <= 24) + return WXK_F1 + n - 1; + } + return WXK_NONE; +} + +int parse_modifier(const std::string& text) +{ + if (equals_ignoring_case(text, "Ctrl") || equals_ignoring_case(text, "Control") || equals_ignoring_case(text, "Cmd") || equals_ignoring_case(text, "Command")) + return wxMOD_CONTROL; + if (equals_ignoring_case(text, "Shift")) + return wxMOD_SHIFT; + if (equals_ignoring_case(text, "Alt") || equals_ignoring_case(text, "Option")) + return wxMOD_ALT; + if (equals_ignoring_case(text, "RawCtrl")) + return wxMOD_RAW_CONTROL; + return wxMOD_NONE; +} + +// Numpad keys act as their main-keyboard counterparts, so one binding covers both. +int fold_numpad(int key) +{ + if (key >= WXK_NUMPAD0 && key <= WXK_NUMPAD9) + return '0' + (key - WXK_NUMPAD0); + switch (key) { + case WXK_NUMPAD_ENTER: return WXK_RETURN; + case WXK_NUMPAD_SPACE: return WXK_SPACE; + case WXK_NUMPAD_TAB: return WXK_TAB; + case WXK_NUMPAD_HOME: return WXK_HOME; + case WXK_NUMPAD_END: return WXK_END; + case WXK_NUMPAD_PAGEUP: return WXK_PAGEUP; + case WXK_NUMPAD_PAGEDOWN: return WXK_PAGEDOWN; + case WXK_NUMPAD_LEFT: return WXK_LEFT; + case WXK_NUMPAD_RIGHT: return WXK_RIGHT; + case WXK_NUMPAD_UP: return WXK_UP; + case WXK_NUMPAD_DOWN: return WXK_DOWN; + case WXK_NUMPAD_INSERT: return WXK_INSERT; + case WXK_NUMPAD_DELETE: return WXK_DELETE; + case WXK_NUMPAD_ADD: return '+'; + case WXK_NUMPAD_SUBTRACT: return '-'; + case WXK_NUMPAD_MULTIPLY: return '*'; + case WXK_NUMPAD_DIVIDE: return '/'; + case WXK_NUMPAD_DECIMAL: return '.'; + case WXK_NUMPAD_EQUAL: return '='; + default: return key; + } +} + +// Modifiers in the order the text forms list them; wxMOD_RAW_CONTROL is wxMOD_CONTROL off macOS. +#ifdef __APPLE__ +constexpr std::array MODIFIER_ORDER{ wxMOD_CONTROL, wxMOD_SHIFT, wxMOD_ALT, wxMOD_RAW_CONTROL }; +#else +constexpr std::array MODIFIER_ORDER{ wxMOD_CONTROL, wxMOD_SHIFT, wxMOD_ALT }; +#endif + +const char* canonical_modifier_prefix(int modifier) +{ + if (modifier == wxMOD_CONTROL) + return "Ctrl+"; + if (modifier == wxMOD_SHIFT) + return "Shift+"; + if (modifier == wxMOD_ALT) + return "Alt+"; + return "RawCtrl+"; +} + +template +std::string join_modifiers(int modifiers, Prefix prefix) +{ + std::string out; + for (int modifier : MODIFIER_ORDER) + if (modifiers & modifier) + out += prefix(modifier); + return out; +} + +} // namespace + +bool KeyChord::is_punctuation() const { return is_symbol(key) && modifiers == wxMOD_NONE; } + +bool KeyChord::needs_char_event() const { return is_symbol(key) && (modifiers & ~wxMOD_SHIFT) == 0; } + +bool KeyChord::is_menu_accelerator() const +{ + return valid() && ((modifiers & (wxMOD_CONTROL | wxMOD_ALT | wxMOD_RAW_CONTROL)) != 0 || (!is_printable(key) && key != WXK_SPACE)); +} + +std::string KeyChord::to_string() const +{ + if (!valid()) + return {}; + std::string out = join_modifiers(modifiers, canonical_modifier_prefix); + if (is_printable(key)) + out += char(key); + else + out += special_key_name(key); + return out; +} + +std::optional KeyChord::parse(const std::string& text) +{ + if (text.empty()) + return std::nullopt; + + // The key is whatever follows the last separator; a trailing '+' is the '+' key itself. + size_t key_start = text.size() - 1; + if (text.back() != '+') { + const size_t sep = text.rfind('+'); + key_start = sep == std::string::npos ? 0 : sep + 1; + } + KeyChord chord; + chord.key = parse_key(text.substr(key_start)); + if (chord.key == WXK_NONE) + return std::nullopt; + + const std::string prefix = key_start == 0 ? std::string() : text.substr(0, key_start - 1); + size_t begin = 0; + while (begin < prefix.size()) { + size_t end = prefix.find('+', begin); + if (end == std::string::npos) + end = prefix.size(); + const int modifier = parse_modifier(prefix.substr(begin, end - begin)); + if (modifier == wxMOD_NONE) + return std::nullopt; + chord.modifiers |= modifier; + begin = end + 1; + } + if (is_letter(chord.key) || is_digit(chord.key) || !is_printable(chord.key) || chord.modifiers == wxMOD_NONE) + return chord; + // Shift is folded into the character for punctuation, so "Shift+/" is not accepted. + return (chord.modifiers & wxMOD_SHIFT) ? std::nullopt : std::optional(chord); +} + +std::string KeyChord::display() const +{ + std::string out; + for (const std::string& part : display_parts()) + out += (out.empty() ? "" : "+") + part; + return out; +} + +std::vector KeyChord::display_parts() const +{ + std::vector parts; + if (!valid()) + return parts; + for (int modifier : MODIFIER_ORDER) + if (modifiers & modifier) + parts.push_back(modifier_name(modifier)); + parts.push_back(is_printable(key) ? std::string(1, char(key)) : special_key_label(key)); + return parts; +} + +std::string KeyChord::modifier_prefix(int modifier) +{ + if (modifier == wxMOD_CONTROL) + return shortkey_ctrl_prefix(); + if (modifier == wxMOD_SHIFT) + return _u8L("Shift+"); + if (modifier == wxMOD_ALT) + return shortkey_alt_prefix(); +#ifdef __APPLE__ + if (modifier == wxMOD_RAW_CONTROL) + return u8"⌃+"; +#endif + return {}; +} + +// The catalogue holds the "Ctrl+" prefixes, so the bare name is the prefix without its "+" +// and any space before it ("Strg +" in German). +std::string KeyChord::modifier_name(int modifier) +{ + std::string name = modifier_prefix(modifier); + if (!name.empty() && name.back() == '+') + name.pop_back(); + while (!name.empty() && name.back() == ' ') + name.pop_back(); + return name; +} + +wxAcceleratorEntry KeyChord::to_accelerator_entry(int command) const +{ + int flags = wxACCEL_NORMAL; + if (modifiers & wxMOD_CONTROL) + flags |= wxACCEL_CTRL; + if (modifiers & wxMOD_SHIFT) + flags |= wxACCEL_SHIFT; + if (modifiers & wxMOD_ALT) + flags |= wxACCEL_ALT; +#ifdef __APPLE__ + if (modifiers & wxMOD_RAW_CONTROL) + flags |= wxACCEL_RAW_CTRL; +#endif + return wxAcceleratorEntry(flags, key, command); +} + +KeyChord KeyChord::from_event(const wxKeyEvent& evt) +{ + KeyChord chord; + chord.modifiers = evt.GetModifiers() & BINDABLE_MODIFIERS; + int key = fold_numpad(evt.GetKeyCode()); + + if (evt.GetEventType() == wxEVT_CHAR) { + if (key >= 1 && key <= 26 && evt.ControlDown()) + key = 'A' + key - 1; // Ctrl+letter arrives as the control character + else if (is_symbol(key)) + chord.modifiers &= ~wxMOD_SHIFT; // the character already reflects Shift + } + if (key >= 'a' && key <= 'z') + key -= 'a' - 'A'; + + if (is_printable(key) || is_special(key)) + chord.key = key; + return chord; +} + +}} // namespace Slic3r::GUI diff --git a/src/slic3r/GUI/KeyChord.hpp b/src/slic3r/GUI/KeyChord.hpp new file mode 100644 index 0000000000..c7884409eb --- /dev/null +++ b/src/slic3r/GUI/KeyChord.hpp @@ -0,0 +1,64 @@ +#pragma once + +#include +#include + +#include +#include +#include +#include + +class wxKeyEvent; + +namespace Slic3r { namespace GUI { + +// One key press: a key code as wxEVT_KEY_DOWN reports it (letters upper-case, numpad keys +// folded onto their main-keyboard equivalents) plus the wxMOD_* modifiers held with it. +// Printable punctuation is stored as the character it produces, so "+" means the key that +// types "+" on the user's layout. +struct KeyChord +{ + int key = WXK_NONE; + int modifiers = wxMOD_NONE; + + bool valid() const { return key != WXK_NONE; } + bool operator==(const KeyChord& other) const { return key == other.key && modifiers == other.modifiers; } + bool operator!=(const KeyChord& other) const { return !(*this == other); } + + // Bare printable keys other than letters and digits are matched on wxEVT_CHAR, because + // only the char event knows which character a key produces under the active layout. + bool is_punctuation() const; + // True for a printable non-alphanumeric key pressed with nothing but Shift, which only the + // char event that follows can resolve. + bool needs_char_event() const; + // True when Ctrl or Alt is held or the key is non-printable, the chords a menu can own without + // swallowing typing in text fields. + bool is_menu_accelerator() const; + + // Platform-neutral text ("Ctrl+Shift+S") for persistence and wx accelerator strings. + std::string to_string() const; + static std::optional parse(const std::string& text); + + // Text for menus, tooltips and the shortcuts dialog, with translated modifier names and the + // command and option glyphs on macOS. + std::string display() const; + // The pieces display() joins with "+": the modifier names, then the key name. + std::vector display_parts() const; + // Translated text of one wxMOD_* modifier, as a "Ctrl+" prefix or the bare "Ctrl" name. + static std::string modifier_prefix(int modifier); + static std::string modifier_name(int modifier); + + wxAcceleratorEntry to_accelerator_entry(int command) const; + + // Builds the chord a key event describes, or an invalid chord for pure modifier presses and + // keys outside the bindable set. wxEVT_CHAR events are normalized to the key codes + // wxEVT_KEY_DOWN reports for letters, digits and special keys. + static KeyChord from_event(const wxKeyEvent& evt); +}; + +struct KeyChordHash +{ + size_t operator()(const KeyChord& chord) const { return std::hash()((static_cast(chord.modifiers) << 32) | unsigned(chord.key)); } +}; + +}} // namespace Slic3r::GUI diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index 288a666901..38ef3141d6 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -56,6 +56,7 @@ #include "../Utils/PrintHost.hpp" #include "GUI_App.hpp" +#include "Shortcuts.hpp" #include "UnsavedChangesDialog.hpp" #include "PublishSettingsDialog.hpp" #include "MsgDialog.hpp" @@ -310,17 +311,6 @@ static wxIcon main_frame_icon(GUI_App::EAppMode app_mode) wxDEFINE_EVENT(EVT_SYNC_CLOUD_PRESET, SimpleEvent); -#ifdef __APPLE__ -static const wxString ctrl = ("Ctrl+"); -// FIXME: maybe should be using GUI::shortkey_ctrl_prefix() or equivalent? -static const std::string ctrl_t = u8"\u2318+"; // "⌘" (Mac Command) -#else -static const wxString ctrl = _L("Ctrl+"); -// FIXME: maybe should be using GUI::shortkey_ctrl_prefix() or equivalent? -static const wxString ctrl_t = ctrl; -#endif -static const wxString shift = _L("Shift+"); - MainFrame::MainFrame() : DPIFrame(NULL, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, BORDERLESS_FRAME_STYLE, "mainframe") , m_printhost_queue_dlg(new PrintHostQueueDialog(this)) @@ -730,69 +720,8 @@ DPIFrame(NULL, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, BORDERLESS_FRAME_ } return;} #endif - // Orca: open the speed dial from any page with a bare Space. Only when no modifier is held (so - // editing shortcuts like Ctrl+Shift+Space in the canvas still reach it) and the focused window - // doesn't use Space to activate itself (buttons, checkboxes, list/choice controls, text fields), - // so a bare Space there still clicks/toggles instead of being hijacked. Gated by a preference - // (default on) so users can hand Space back to the focused control entirely. - if (wxGetApp().app_config->get_bool("enable_speed_dial") && !evt.CmdDown() && !evt.ShiftDown() && - !evt.AltDown() && evt.GetKeyCode() == WXK_SPACE) { - if (focus_keeps_space(wxWindow::FindFocus())) { - evt.Skip(); // let the focused control keep Space - return; - } - // Defer out of the native key-event stack: open_speed_dial() may create a WebView and - // run script, the same window work the codebase avoids doing on native callbacks. - this->CallAfter([] { wxGetApp().open_speed_dial(); }); - return; - } - if (evt.CmdDown() && evt.GetKeyCode() == 'R') { if (m_slice_enable) { wxGetApp().plater()->update(true, true); wxPostEvent(m_plater, SimpleEvent(EVT_GLTOOLBAR_SLICE_PLATE)); this->m_tabpanel->SelectPageByName(TAB_ID_PREVIEW); } return; } - if (evt.CmdDown() && evt.ShiftDown() && evt.GetKeyCode() == 'G') { - m_plater->apply_background_progress(); - m_print_enable = get_enable_print_status(); - m_print_btn->Enable(m_print_enable); - if (m_print_enable) { - if (wxGetApp().preset_bundle->use_bbl_network() || wxGetApp().app_config->get_bool("use_printer_agents")) - wxPostEvent(m_plater, SimpleEvent(EVT_GLTOOLBAR_PRINT_PLATE)); - else - wxPostEvent(m_plater, SimpleEvent(EVT_GLTOOLBAR_SEND_GCODE)); - } + if (!handle_global_shortcut(KeyChord::from_event(evt))) evt.Skip(); - return; - } - else if (evt.CmdDown() && evt.GetKeyCode() == 'G') { if (can_export_gcode()) { wxPostEvent(m_plater, SimpleEvent(EVT_GLTOOLBAR_EXPORT_SLICED_FILE)); } evt.Skip(); return; } - if (evt.CmdDown() && evt.GetKeyCode() == 'J') { m_printhost_queue_dlg->Show(); return; } - if (evt.CmdDown() && evt.GetKeyCode() == 'N') { m_plater->new_project(); return;} - if (evt.CmdDown() && evt.GetKeyCode() == 'O') { m_plater->load_project(); return;} - if (evt.CmdDown() && evt.ShiftDown() && evt.GetKeyCode() == 'S') { if (can_save_as()) m_plater->save_project(true); return;} - else if (evt.CmdDown() && evt.GetKeyCode() == 'S') { if (can_save()) m_plater->save_project(); return;} - if (evt.CmdDown() && evt.GetKeyCode() == 'F') { - if (m_plater && is_prepare_or_preview_tab()) { - m_plater->sidebar().can_search(); - } - } -#ifdef __APPLE__ - if (evt.CmdDown() && evt.GetKeyCode() == ',') -#else - if (evt.CmdDown() && evt.GetKeyCode() == 'P') -#endif - { - // Orca: Use GUI_App::open_preferences instead of direct call so windows associations are updated on exit - wxGetApp().open_preferences(); - plater()->get_current_canvas3D()->force_set_focus(); - return; - } - - if (evt.CmdDown() && evt.GetKeyCode() == 'I' && !evt.ShiftDown()) { - if (!can_add_models()) return; - if (m_plater) { m_plater->add_file(); } - return; - } - if (evt.CmdDown() && evt.ShiftDown() && evt.GetKeyCode() == 'E') { - if (can_export_model()) publish_project(); - return; - } - evt.Skip(); }); Bind(wxEVT_SHOW, [](wxShowEvent &evt) { @@ -813,6 +742,96 @@ DPIFrame(NULL, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, BORDERLESS_FRAME_ bind_diff_dialog(); } +bool MainFrame::handle_global_shortcut(const KeyChord& chord) +{ + const std::optional shortcut = wxGetApp().shortcuts().lookup(ShortcutContext::Global, chord); + if (!shortcut.has_value()) + return false; + + switch (*shortcut) { + case Shortcut::SlicePlate: + if (m_slice_enable) { + wxGetApp().plater()->update(true, true); + wxPostEvent(m_plater, SimpleEvent(EVT_GLTOOLBAR_SLICE_PLATE)); + m_tabpanel->SelectPageByName(TAB_ID_PREVIEW); + } + break; + case Shortcut::PrintPlate: + m_plater->apply_background_progress(); + m_print_enable = get_enable_print_status(); + m_print_btn->Enable(m_print_enable); + if (m_print_enable) { + if (wxGetApp().preset_bundle->use_bbl_network() || wxGetApp().app_config->get_bool("use_printer_agents")) + wxPostEvent(m_plater, SimpleEvent(EVT_GLTOOLBAR_PRINT_PLATE)); + else + wxPostEvent(m_plater, SimpleEvent(EVT_GLTOOLBAR_SEND_GCODE)); + } + return false; + case Shortcut::ExportSlicedFile: + if (can_export_gcode()) + wxPostEvent(m_plater, SimpleEvent(EVT_GLTOOLBAR_EXPORT_SLICED_FILE)); + return false; + case Shortcut::PrintHostQueue: m_printhost_queue_dlg->Show(); break; + case Shortcut::SpeedDial: + if (!wxGetApp().app_config->get_bool("enable_speed_dial") || (chord == KeyChord{ WXK_SPACE } && focus_keeps_space(wxWindow::FindFocus()))) + return false; + // Deferred out of the native key-event stack: open_speed_dial() may create a WebView and run script. + CallAfter([] { wxGetApp().open_speed_dial(); }); + break; + case Shortcut::NewProject: m_plater->new_project(); break; + case Shortcut::OpenProject: m_plater->load_project(); break; + case Shortcut::SaveProjectAs: + if (can_save_as()) + m_plater->save_project(true); + break; + case Shortcut::SaveProject: + if (can_save()) + m_plater->save_project(); + break; + case Shortcut::Search: + if (m_plater && is_prepare_or_preview_tab()) + m_plater->sidebar().can_search(); + return false; + case Shortcut::Preferences: + // Orca: Use GUI_App::open_preferences instead of direct call so windows associations are updated on exit + wxGetApp().open_preferences(); + plater()->get_current_canvas3D()->force_set_focus(); + break; + case Shortcut::ImportModel: + if (can_add_models() && m_plater) + m_plater->add_file(); + break; + case Shortcut::Publish3mf: + if (can_export_model()) + publish_project(); + break; + case Shortcut::ShowLabels: + if (m_plater && m_plater->is_view3D_shown()) { + m_plater->show_view3D_labels(!m_plater->are_view3D_labels_shown()); + m_plater->get_current_canvas3D()->post_event(SimpleEvent(wxEVT_PAINT)); + } + break; + case Shortcut::ViewDefault: + if (m_plater) { + select_view("plate"); + m_plater->get_current_canvas3D()->zoom_to_bed(); + } + break; + case Shortcut::ViewTop: select_view("top"); break; + case Shortcut::ViewBottom: select_view("bottom"); break; + case Shortcut::ViewFront: select_view("front"); break; + case Shortcut::ViewRear: select_view("rear"); break; + case Shortcut::ViewLeft: select_view("left"); break; + case Shortcut::ViewRight: select_view("right"); break; + case Shortcut::ViewPlate: + if (m_plater) + m_plater->get_current_canvas3D()->select_plate(); + break; + default: return false; + } + return true; +} + void MainFrame::bind_diff_dialog() { auto get_tab = [](Preset::Type type) { @@ -2766,13 +2785,31 @@ static const wxString sep = " - "; static const wxString sep = "\t"; #endif -static wxMenu* generate_help_menu() +wxString MainFrame::shortcut_label(const wxString& label, Shortcut shortcut, bool accelerator) +{ + const ShortcutRegistry& shortcuts = wxGetApp().shortcuts(); + if (accelerator) { + const std::string accel = shortcuts.accelerator(shortcut); + if (!accel.empty()) + return label + " " + from_u8(accel); + } + const std::string text = shortcuts.display(shortcut); + return text.empty() ? label : label + sep + from_u8(text); +} + +void MainFrame::update_shortcut_labels() +{ + for (const ShortcutMenuItem& entry : m_shortcut_menu_items) + entry.item->SetItemLabel(shortcut_label(entry.label, entry.shortcut, entry.accelerator)); +} + +wxMenu* MainFrame::generate_help_menu() { wxMenu* helpMenu = new wxMenu(); // shortcut key - append_menu_item(helpMenu, wxID_ANY, _L("Keyboard Shortcuts") + sep + "&?", _L("Show the list of keyboard shortcuts"), - [](wxCommandEvent&) { wxGetApp().keyboard_shortcuts(); }); + append_shortcut_item(helpMenu, Shortcut::KeyboardShortcuts, false, _L("Keyboard Shortcuts"), _L("Show the list of keyboard shortcuts"), + [](wxCommandEvent&) { wxGetApp().keyboard_shortcuts(ShortcutContext::Global); }); // Show Beginner's Tutorial append_menu_item(helpMenu, wxID_ANY, _L("Setup Wizard"), _L("Setup Wizard"), [](wxCommandEvent &) {wxGetApp().ShowUserGuide();}); @@ -2854,29 +2891,28 @@ static void add_common_publish_menu_items(wxMenu* publish_menu, MainFrame* mainF #endif } -static void add_common_view_menu_items(wxMenu* view_menu, MainFrame* mainFrame, std::function can_change_view) +void MainFrame::add_common_view_menu_items(wxMenu* view_menu, std::function can_change_view) { - // The camera control accelerators are captured by GLCanvas3D::on_char(). - append_menu_item(view_menu, wxID_ANY, _L("Default View") + "\t" + ctrl + "0", _L("Default View"), [mainFrame](wxCommandEvent&) { - mainFrame->select_view("plate"); - mainFrame->plater()->get_current_canvas3D()->zoom_to_bed(); + append_shortcut_item(view_menu, Shortcut::ViewDefault, true, _L("Default View"), _L("Default View"), [this](wxCommandEvent&) { + select_view("plate"); + plater()->get_current_canvas3D()->zoom_to_bed(); }, - "", nullptr, [can_change_view]() { return can_change_view(); }, mainFrame); + "", nullptr, [can_change_view]() { return can_change_view(); }, this); //view_menu->AppendSeparator(); //TRN To be shown in the main menu View->Top - append_menu_item(view_menu, wxID_ANY, _L_CONTEXT("Top", "Camera View") + "\t" + ctrl + "1", _L("Top View"), [mainFrame](wxCommandEvent&) { mainFrame->select_view("top"); }, - "", nullptr, [can_change_view]() { return can_change_view(); }, mainFrame); + append_shortcut_item(view_menu, Shortcut::ViewTop, true, _L_CONTEXT("Top", "Camera View"), _L("Top View"), [this](wxCommandEvent&) { select_view("top"); }, + "", nullptr, [can_change_view]() { return can_change_view(); }, this); //TRN To be shown in the main menu View->Bottom - append_menu_item(view_menu, wxID_ANY, _L_CONTEXT("Bottom", "Camera View") + "\t" + ctrl + "2", _L("Bottom View"), [mainFrame](wxCommandEvent&) { mainFrame->select_view("bottom"); }, - "", nullptr, [can_change_view]() { return can_change_view(); }, mainFrame); - append_menu_item(view_menu, wxID_ANY, _L_CONTEXT("Front", "Camera View") + "\t" + ctrl + "3", _L("Front View"), [mainFrame](wxCommandEvent&) { mainFrame->select_view("front"); }, - "", nullptr, [can_change_view]() { return can_change_view(); }, mainFrame); - append_menu_item(view_menu, wxID_ANY, _L_CONTEXT("Rear", "Camera View") + "\t" + ctrl + "4", _L("Rear View"), [mainFrame](wxCommandEvent&) { mainFrame->select_view("rear"); }, - "", nullptr, [can_change_view]() { return can_change_view(); }, mainFrame); - append_menu_item(view_menu, wxID_ANY, _L_CONTEXT("Left", "Camera View") + "\t" + ctrl + "5", _L("Left View"),[mainFrame](wxCommandEvent &) {mainFrame->select_view("left"); }, - "", nullptr, [can_change_view]() { return can_change_view(); }, mainFrame); - append_menu_item(view_menu, wxID_ANY, _L_CONTEXT("Right", "Camera View") + "\t" + ctrl + "6", _L("Right View"),[mainFrame](wxCommandEvent &) { mainFrame->select_view("right"); }, - "", nullptr, [can_change_view]() { return can_change_view(); }, mainFrame); + append_shortcut_item(view_menu, Shortcut::ViewBottom, true, _L_CONTEXT("Bottom", "Camera View"), _L("Bottom View"), [this](wxCommandEvent&) { select_view("bottom"); }, + "", nullptr, [can_change_view]() { return can_change_view(); }, this); + append_shortcut_item(view_menu, Shortcut::ViewFront, true, _L_CONTEXT("Front", "Camera View"), _L("Front View"), [this](wxCommandEvent&) { select_view("front"); }, + "", nullptr, [can_change_view]() { return can_change_view(); }, this); + append_shortcut_item(view_menu, Shortcut::ViewRear, true, _L_CONTEXT("Rear", "Camera View"), _L("Rear View"), [this](wxCommandEvent&) { select_view("rear"); }, + "", nullptr, [can_change_view]() { return can_change_view(); }, this); + append_shortcut_item(view_menu, Shortcut::ViewLeft, true, _L_CONTEXT("Left", "Camera View"), _L("Left View"), [this](wxCommandEvent &) { select_view("left"); }, + "", nullptr, [can_change_view]() { return can_change_view(); }, this); + append_shortcut_item(view_menu, Shortcut::ViewRight, true, _L_CONTEXT("Right", "Camera View"), _L("Right View"), [this](wxCommandEvent &) { select_view("right"); }, + "", nullptr, [can_change_view]() { return can_change_view(); }, this); } void MainFrame::init_menubar_as_editor() @@ -2895,17 +2931,17 @@ void MainFrame::init_menubar_as_editor() [this] { return m_plater != nullptr && wxGetApp().app_config->get("app", "single_instance") == "false"; }, this); #endif // New Project - append_menu_item(fileMenu, wxID_ANY, _L("New Project") + "\t" + ctrl + "N", _L("Start a new project"), + append_shortcut_item(fileMenu, Shortcut::NewProject, true, _L("New Project"), _L("Start a new project"), [this](wxCommandEvent&) { if (m_plater) m_plater->new_project(); }, "", nullptr, [this](){return can_start_new_project(); }, this); // Open Project #ifndef __APPLE__ - append_menu_item(fileMenu, wxID_ANY, _L("Open Project") + dots + "\t" + ctrl + "O", _L("Open a project file"), + append_shortcut_item(fileMenu, Shortcut::OpenProject, true, _L("Open Project") + dots, _L("Open a project file"), [this](wxCommandEvent&) { if (m_plater) m_plater->load_project(); }, "menu_open", nullptr, [this](){return can_open_project(); }, this); #else - append_menu_item(fileMenu, wxID_ANY, _L("Open Project") + dots + "\t" + ctrl + "O", _L("Open a project file"), + append_shortcut_item(fileMenu, Shortcut::OpenProject, true, _L("Open Project") + dots, _L("Open a project file"), [this](wxCommandEvent&) { if (m_plater) m_plater->load_project(); }, "", nullptr, [this](){return can_open_project(); }, this); #endif @@ -2932,21 +2968,21 @@ void MainFrame::init_menubar_as_editor() // BBS: close save project #ifndef __APPLE__ - append_menu_item(fileMenu, wxID_ANY, _L("Save Project") + "\t" + ctrl + "S", _L("Save current project to file"), + append_shortcut_item(fileMenu, Shortcut::SaveProject, true, _L("Save Project"), _L("Save current project to file"), [this](wxCommandEvent&) { if (m_plater) m_plater->save_project(); }, "menu_save", nullptr, [this](){return m_plater != nullptr && can_save(); }, this); #else - append_menu_item(fileMenu, wxID_ANY, _L("Save Project") + "\t" + ctrl + "S", _L("Save current project to file"), + append_shortcut_item(fileMenu, Shortcut::SaveProject, true, _L("Save Project"), _L("Save current project to file"), [this](wxCommandEvent&) { if (m_plater) m_plater->save_project(); }, "", nullptr, [this](){return m_plater != nullptr && can_save(); }, this); #endif #ifndef __APPLE__ - append_menu_item(fileMenu, wxID_ANY, _L("Save Project as") + dots + "\t" + ctrl + shift + "S", _L("Save current project as"), + append_shortcut_item(fileMenu, Shortcut::SaveProjectAs, true, _L("Save Project as") + dots, _L("Save current project as"), [this](wxCommandEvent&) { if (m_plater) m_plater->save_project(true); }, "menu_save", nullptr, [this](){return m_plater != nullptr && can_save_as(); }, this); #else - append_menu_item(fileMenu, wxID_ANY, _L("Save Project as") + dots + "\t" + ctrl + shift + "S", _L("Save current project as"), + append_shortcut_item(fileMenu, Shortcut::SaveProjectAs, true, _L("Save Project as") + dots, _L("Save current project as"), [this](wxCommandEvent&) { if (m_plater) m_plater->save_project(true); }, "", nullptr, [this](){return m_plater != nullptr && can_save_as(); }, this); #endif @@ -2956,11 +2992,11 @@ void MainFrame::init_menubar_as_editor() auto publish_handler = [this](wxCommandEvent&) { publish_project(); }; #ifndef __APPLE__ - append_menu_item(fileMenu, wxID_ANY, _L("Publish 3MF") + dots + "\t" + ctrl + shift + "E", _L("Export a 3MF file with the selected settings embedded"), + append_shortcut_item(fileMenu, Shortcut::Publish3mf, true, _L("Publish 3MF") + dots, _L("Export a 3MF file with the selected settings embedded"), publish_handler, "menu_publish", nullptr, [this](){return can_export_model(); }, this); #else - append_menu_item(fileMenu, wxID_ANY, _L("Publish 3MF") + dots + "\t" + ctrl + shift + "E", _L("Export a 3MF file with the selected settings embedded"), + append_shortcut_item(fileMenu, Shortcut::Publish3mf, true, _L("Publish 3MF") + dots, _L("Export a 3MF file with the selected settings embedded"), publish_handler, "", nullptr, [this](){return can_export_model(); }, this); #endif @@ -2971,13 +3007,13 @@ void MainFrame::init_menubar_as_editor() // BBS wxMenu *import_menu = new wxMenu(); #ifndef __APPLE__ - append_menu_item(import_menu, wxID_ANY, _L("Import 3MF/STL/STEP/SVG/OBJ/AMF") + dots + "\t" + ctrl + "I", _L("Load a model"), + append_shortcut_item(import_menu, Shortcut::ImportModel, true, _L("Import 3MF/STL/STEP/SVG/OBJ/AMF") + dots, _L("Load a model"), [this](wxCommandEvent&) { if (m_plater) { m_plater->add_file(); } }, "menu_import", nullptr, [this](){return can_add_models(); }, this); #else - append_menu_item(import_menu, wxID_ANY, _L("Import 3MF/STL/STEP/SVG/OBJ/AMF") + dots + "\t" + ctrl + "I", _L("Load a model"), + append_shortcut_item(import_menu, Shortcut::ImportModel, true, _L("Import 3MF/STL/STEP/SVG/OBJ/AMF") + dots, _L("Load a model"), [this](wxCommandEvent&) { if (m_plater) { m_plater->add_model(); } }, "", nullptr, [this](){return can_add_models(); }, this); #endif @@ -3009,7 +3045,7 @@ void MainFrame::init_menubar_as_editor() [this](wxCommandEvent&) { if (m_plater) m_plater->export_core_3mf(); }, "menu_export_sliced_file", nullptr, [this](){return can_export_model(); }, this); // BBS export .gcode.3mf - append_menu_item(export_menu, wxID_ANY, _L("Export plate sliced file") + dots + "\t" + ctrl + "G", _L("Export current sliced file"), + append_shortcut_item(export_menu, Shortcut::ExportSlicedFile, true, _L("Export plate sliced file") + dots, _L("Export current sliced file"), [this](wxCommandEvent&) { if (m_plater) wxPostEvent(m_plater, SimpleEvent(EVT_GLTOOLBAR_EXPORT_SLICED_FILE)); }, "menu_export_sliced_file", nullptr, [this](){return can_export_gcode(); }, this); @@ -3059,37 +3095,37 @@ void MainFrame::init_menubar_as_editor() }; #ifndef __APPLE__ // BBS undo - append_menu_item(editMenu, wxID_ANY, _L("Undo") + "\t" + ctrl + "Z", + append_shortcut_item(editMenu, Shortcut::Undo, true, _L("Undo"), _L("Undo"), [this](wxCommandEvent&) { m_plater->undo(); }, "menu_undo", nullptr, [this](){return m_plater->can_undo(); }, this); // BBS redo - append_menu_item(editMenu, wxID_ANY, _L("Redo") + "\t" + ctrl + "Y", + append_shortcut_item(editMenu, Shortcut::Redo, true, _L("Redo"), _L("Redo"), [this](wxCommandEvent&) { m_plater->redo(); }, "menu_redo", nullptr, [this](){return m_plater->can_redo(); }, this); editMenu->AppendSeparator(); // BBS Cut TODO - append_menu_item(editMenu, wxID_ANY, _L("Cut") + "\t" + ctrl + "X", + append_shortcut_item(editMenu, Shortcut::Cut, true, _L("Cut"), _L("Cut selection to clipboard"), [this](wxCommandEvent&) {m_plater->cut_selection_to_clipboard(); }, "menu_cut", nullptr, [this]() {return m_plater->can_copy_to_clipboard(); }, this); // BBS Copy - append_menu_item(editMenu, wxID_ANY, _L("Copy") + "\t" + ctrl + "C", + append_shortcut_item(editMenu, Shortcut::Copy, true, _L("Copy"), _L("Copy selection to clipboard"), [this](wxCommandEvent&) { m_plater->copy_selection_to_clipboard(); }, "menu_copy", nullptr, [this](){return m_plater->can_copy_to_clipboard(); }, this); // BBS Paste - append_menu_item(editMenu, wxID_ANY, _L("Paste") + "\t" + ctrl + "V", + append_shortcut_item(editMenu, Shortcut::Paste, true, _L("Paste"), _L("Paste clipboard"), [this](wxCommandEvent&) { m_plater->paste_from_clipboard(); }, "menu_paste", nullptr, [this](){return m_plater->can_paste_from_clipboard(); }, this); // BBS Delete selected - append_menu_item(editMenu, wxID_ANY, _L("Delete Selected") + "\t" + _L_CONTEXT("Del", "Keyboard Shortcut"), + append_shortcut_item(editMenu, Shortcut::DeleteSelected, true, _L("Delete Selected"), _L("Deletes the current selection"),[this](wxCommandEvent&) { m_plater->remove_selected(); }, "menu_remove", nullptr, [this](){return can_delete(); }, this); //BBS: delete all - append_menu_item(editMenu, wxID_ANY, _L("Delete All") + "\t" + ctrl + "D", + append_shortcut_item(editMenu, Shortcut::DeleteAll, true, _L("Delete All"), _L("Deletes all objects"),[this](wxCommandEvent&) { m_plater->delete_all_objects_from_model(); }, "menu_remove", nullptr, [this](){return can_delete_all(); }, this); editMenu->AppendSeparator(); // BBS Clone Selected - append_menu_item(editMenu, wxID_ANY, _L("Clone Selected") /*+ "\t" + ctrl + "M"*/, + append_shortcut_item(editMenu, Shortcut::CloneSelected, true, _L("Clone Selected"), _L("Clone copies of selections"),[this](wxCommandEvent&) { m_plater->clone_selection(); }, @@ -3103,7 +3139,7 @@ void MainFrame::init_menubar_as_editor() editMenu->AppendSeparator(); #else // BBS undo - append_menu_item(editMenu, wxID_ANY, _L("Undo") + sep + ctrl_t + "Z", + append_shortcut_item(editMenu, Shortcut::Undo, false, _L("Undo"), _L("Undo"), [this, handle_key_event](wxCommandEvent&) { wxKeyEvent e; e.SetEventType(wxEVT_KEY_DOWN); @@ -3115,7 +3151,7 @@ void MainFrame::init_menubar_as_editor() m_plater->undo(); }, "", nullptr, [this](){return m_plater->can_undo(); }, this); // BBS redo - append_menu_item(editMenu, wxID_ANY, _L("Redo") + sep + ctrl_t + "Y", + append_shortcut_item(editMenu, Shortcut::Redo, false, _L("Redo"), _L("Redo"), [this, handle_key_event](wxCommandEvent&) { wxKeyEvent e; e.SetEventType(wxEVT_KEY_DOWN); @@ -3128,7 +3164,7 @@ void MainFrame::init_menubar_as_editor() "", nullptr, [this](){return m_plater->can_redo(); }, this); editMenu->AppendSeparator(); // BBS Cut TODO - append_menu_item(editMenu, wxID_ANY, _L("Cut") + sep + ctrl_t + "X", + append_shortcut_item(editMenu, Shortcut::Cut, false, _L("Cut"), _L("Cut selection to clipboard"), [this, handle_key_event](wxCommandEvent&) { wxKeyEvent e; e.SetEventType(wxEVT_KEY_DOWN); @@ -3140,7 +3176,7 @@ void MainFrame::init_menubar_as_editor() m_plater->cut_selection_to_clipboard(); }, "", nullptr, [this]() {return m_plater->can_copy_to_clipboard(); }, this); // BBS Copy - append_menu_item(editMenu, wxID_ANY, _L("Copy") + sep + ctrl_t + "C", + append_shortcut_item(editMenu, Shortcut::Copy, false, _L("Copy"), _L("Copy selection to clipboard"), [this, handle_key_event](wxCommandEvent&) { wxKeyEvent e; e.SetEventType(wxEVT_KEY_DOWN); @@ -3152,7 +3188,7 @@ void MainFrame::init_menubar_as_editor() m_plater->copy_selection_to_clipboard(); }, "", nullptr, [this](){return m_plater->can_copy_to_clipboard(); }, this); // BBS Paste - append_menu_item(editMenu, wxID_ANY, _L("Paste") + sep + ctrl_t + "V", + append_shortcut_item(editMenu, Shortcut::Paste, false, _L("Paste"), _L("Paste clipboard"), [this, handle_key_event](wxCommandEvent&) { wxKeyEvent e; e.SetEventType(wxEVT_KEY_DOWN); @@ -3165,14 +3201,14 @@ void MainFrame::init_menubar_as_editor() "", nullptr, [this](){return m_plater->can_paste_from_clipboard(); }, this); #if 0 // BBS Delete selected - append_menu_item(editMenu, wxID_ANY, _L("Delete Selected") + "\t" + _L_CONTEXT("Backspace", "Keyboard Shortcut"), + append_shortcut_item(editMenu, Shortcut::DeleteSelected, true, _L("Delete Selected"), _L("Deletes the current selection"),[this](wxCommandEvent&) { m_plater->remove_selected(); }, "", nullptr, [this](){return can_delete(); }, this); #endif //BBS: delete all - append_menu_item(editMenu, wxID_ANY, _L("Delete All") + "\t" + ctrl + "D", + append_shortcut_item(editMenu, Shortcut::DeleteAll, true, _L("Delete All"), _L("Deletes all objects"),[this, handle_key_event](wxCommandEvent&) { wxKeyEvent e; e.SetEventType(wxEVT_KEY_DOWN); @@ -3185,7 +3221,7 @@ void MainFrame::init_menubar_as_editor() "", nullptr, [this](){return can_delete_all(); }, this); editMenu->AppendSeparator(); // BBS Clone Selected - append_menu_item(editMenu, wxID_ANY, _L("Clone Selected") + "\t" + ctrl + "K", + append_shortcut_item(editMenu, Shortcut::CloneSelected, true, _L("Clone Selected"), _L("Clone copies of selections"),[this, handle_key_event](wxCommandEvent&) { wxKeyEvent e; e.SetEventType(wxEVT_KEY_DOWN); @@ -3208,7 +3244,7 @@ void MainFrame::init_menubar_as_editor() #endif // BBS Select All - append_menu_item(editMenu, wxID_ANY, _L("Select All") + sep + ctrl_t + "A", + append_shortcut_item(editMenu, Shortcut::SelectAll, false, _L("Select All"), _L("Selects all objects"), [this, handle_key_event](wxCommandEvent&) { wxKeyEvent e; e.SetEventType(wxEVT_KEY_DOWN); @@ -3260,7 +3296,7 @@ void MainFrame::init_menubar_as_editor() wxMenu* viewMenu = nullptr; if (m_plater) { viewMenu = new wxMenu(); - add_common_view_menu_items(viewMenu, this, std::bind(&MainFrame::can_change_view, this)); + add_common_view_menu_items(viewMenu, std::bind(&MainFrame::can_change_view, this)); viewMenu->AppendSeparator(); //BBS perspective view @@ -3291,13 +3327,14 @@ void MainFrame::init_menubar_as_editor() []() { return wxGetApp().app_config->get_bool("auto_perspective"); }, this); viewMenu->AppendSeparator(); - append_menu_check_item(viewMenu, wxID_ANY, _L("Show &G-code Window") + sep + "C", _L("Show G-code window in Preview scene."), + wxMenuItem* gcode_window = append_menu_check_item(viewMenu, wxID_ANY, shortcut_label(_L("Show &G-code Window"), Shortcut::ToggleGcodeWindow, true), _L("Show G-code window in Preview scene."), [this](wxCommandEvent &) { wxGetApp().toggle_show_gcode_window(); m_plater->get_current_canvas3D()->post_event(SimpleEvent(wxEVT_PAINT)); }, this, [this]() { return m_tabpanel->GetSelectedPageName() == TAB_ID_PREVIEW; }, []() { return wxGetApp().show_gcode_window(); }, this); + m_shortcut_menu_items.push_back({ gcode_window, Shortcut::ToggleGcodeWindow, _L("Show &G-code Window"), true }); append_menu_check_item( viewMenu, wxID_ANY, _L("Show 3D Navigator"), _L("Show 3D navigator in Prepare and Preview scene."), @@ -3325,9 +3362,10 @@ void MainFrame::init_menubar_as_editor() this); viewMenu->AppendSeparator(); - append_menu_check_item(viewMenu, wxID_ANY, _L("Show &Labels") + "\t" + ctrl + "E", _L("Show object labels in 3D scene."), + wxMenuItem* show_labels = append_menu_check_item(viewMenu, wxID_ANY, shortcut_label(_L("Show &Labels"), Shortcut::ShowLabels, true), _L("Show object labels in 3D scene."), [this](wxCommandEvent&) { m_plater->show_view3D_labels(!m_plater->are_view3D_labels_shown()); m_plater->get_current_canvas3D()->post_event(SimpleEvent(wxEVT_PAINT)); }, this, [this]() { return m_plater->is_view3D_shown(); }, [this]() { return m_plater->are_view3D_labels_shown(); }, this); + m_shortcut_menu_items.push_back({ show_labels, Shortcut::ShowLabels, _L("Show &Labels"), true }); append_menu_check_item(viewMenu, wxID_ANY, _L("Show &Overhang"), _L("Show object overhang highlight in 3D scene."), [this](wxCommandEvent &) { @@ -3372,8 +3410,6 @@ void MainFrame::init_menubar_as_editor() //auto preference_item = new wxMenuItem(parent_menu, OrcaSlicerMenuPreferences + bambu_studio_id_base, _L("Preferences") + "\t" + ctrl + ",", ""); #else wxMenu* parent_menu = m_topbar->GetTopMenu(); - auto preference_item = new wxMenuItem(parent_menu, ConfigMenuPreferences + config_id_base, _L("Preferences") + "\t" + ctrl + "P", ""); - #endif #ifdef __APPLE__ @@ -3382,15 +3418,15 @@ void MainFrame::init_menubar_as_editor() parent_menu, wxID_ANY, _L(about_title), "", [](wxCommandEvent &) { Slic3r::GUI::about();}, "", nullptr, []() { return true; }, this, 0); - append_menu_item( - parent_menu, wxID_ANY, _L("Preferences") + "\t" + ctrl + ",", "", + append_shortcut_item( + parent_menu, Shortcut::Preferences, true, _L("Preferences"), "", [](wxCommandEvent &) { wxGetApp().open_preferences(); }, "", nullptr, []() { return true; }, this, 1); parent_menu->AppendSeparator(); - append_menu_item( - parent_menu, wxID_ANY, _L("Open speed dial...") + sep + "Space", "", + append_shortcut_item( + parent_menu, Shortcut::SpeedDial, false, _L("Open speed dial..."), "", [](wxCommandEvent &) { wxGetApp().open_speed_dial(); }, "", nullptr, []() { return true; }, this); //parent_menu->Insert(1, preference_item); @@ -3406,8 +3442,8 @@ void MainFrame::init_menubar_as_editor() m_topbar->AddDropDownSubMenu(viewMenu, _L("View")); //BBS add Preference - append_menu_item( - m_topbar->GetTopMenu(), wxID_ANY, _L("Preferences") + "\t" + ctrl + "P", "", + append_shortcut_item( + m_topbar->GetTopMenu(), Shortcut::Preferences, true, _L("Preferences"), "", [](wxCommandEvent &) { // Orca: Use GUI_App::open_preferences instead of direct call so windows associations are updated on exit wxGetApp().open_preferences(); @@ -3417,8 +3453,8 @@ void MainFrame::init_menubar_as_editor() auto top_menu = m_topbar->GetTopMenu(); top_menu->AppendSeparator(); - append_menu_item( - top_menu, wxID_ANY, _L("Open speed dial...") + "\t" + "Space", "", + append_shortcut_item( + top_menu, Shortcut::SpeedDial, false, _L("Open speed dial..."), "", [](wxCommandEvent &) { wxGetApp().open_speed_dial(); }, "", nullptr, []() { return true; }, this); top_menu->AppendSeparator(); @@ -3524,8 +3560,8 @@ void MainFrame::init_menubar_as_editor() #else // On Mac, the Apple menu ignores non-standard custom items, so add Preset Bundle to the File menu fileMenu->AppendSeparator(); - append_menu_item( - fileMenu, wxID_ANY, _L("Open speed dial...") + sep + "Space", "", + append_shortcut_item( + fileMenu, Shortcut::SpeedDial, false, _L("Open speed dial..."), "", [](wxCommandEvent&) { wxGetApp().open_speed_dial(); }, "", nullptr, []() { return true; }, this); append_menu_item( @@ -3728,7 +3764,7 @@ void MainFrame::init_menubar_as_gcodeviewer() wxMenu* viewMenu = nullptr; if (m_plater != nullptr) { viewMenu = new wxMenu(); - add_common_view_menu_items(viewMenu, this, std::bind(&MainFrame::can_change_view, this)); + add_common_view_menu_items(viewMenu, std::bind(&MainFrame::can_change_view, this)); } // helpmenu diff --git a/src/slic3r/GUI/MainFrame.hpp b/src/slic3r/GUI/MainFrame.hpp index 6851935059..66f3b31263 100644 --- a/src/slic3r/GUI/MainFrame.hpp +++ b/src/slic3r/GUI/MainFrame.hpp @@ -74,6 +74,8 @@ class DesignPanel; class MainFrame; class WebViewPanel; class ParamsDialog; +enum class Shortcut : uint8_t; +struct KeyChord; #ifdef __WXGTK__ class ResizeEdgePanel; #endif @@ -195,6 +197,29 @@ class MainFrame : public DPIFrame // vector of a MenuBar items changeable in respect to printer technology std::vector m_changeable_menu_items; + // Menu items whose label shows a key binding; update_shortcut_labels() rewrites them. + struct ShortcutMenuItem + { + wxMenuItem* item; + Shortcut shortcut; + wxString label; + bool accelerator; // false keeps the binding display-only on macOS, where the menu bar's accelerators are live + }; + std::vector m_shortcut_menu_items; + + wxString shortcut_label(const wxString& label, Shortcut shortcut, bool accelerator); + template + wxMenuItem* append_shortcut_item(wxMenu* menu, Shortcut shortcut, bool accelerator, const wxString& label, Args&&... args) + { + wxMenuItem* item = append_menu_item(menu, wxID_ANY, shortcut_label(label, shortcut, accelerator), std::forward(args)...); + m_shortcut_menu_items.push_back({ item, shortcut, label, accelerator }); + return item; + } + // Runs the Global shortcut bound to chord; false when the focused control should see the key as well. + bool handle_global_shortcut(const KeyChord& chord); + void add_common_view_menu_items(wxMenu* view_menu, std::function can_change_view); + wxMenu* generate_help_menu(); + struct FileHistory : wxFileHistory { FileHistory(int max) : wxFileHistory(max) {} @@ -354,6 +379,7 @@ public: void request_select_tab(const wxString& id); int get_calibration_curr_tab(); void select_view(const std::string& direction); + void update_shortcut_labels(); // Propagate changed configuration from the Tab to the Plater and save changes to the AppConfig void on_config_changed(DynamicPrintConfig* cfg) const ; void set_print_button_to_default(PrintSelectType select_type); diff --git a/src/slic3r/GUI/NativeCommands.cpp b/src/slic3r/GUI/NativeCommands.cpp index 2e24f14326..1297cd4a24 100644 --- a/src/slic3r/GUI/NativeCommands.cpp +++ b/src/slic3r/GUI/NativeCommands.cpp @@ -10,6 +10,7 @@ #include "GUI_Factories.hpp" #include "GUI_ObjectList.hpp" #include "I18N.hpp" +#include "Shortcuts.hpp" #include "IMSlider.hpp" #include "MainFrame.hpp" #include "NetworkTestDialog.hpp" @@ -563,7 +564,7 @@ std::vector build_command_catalog() // ---- Help ---- (mirrors the top-bar Help menu, plus the wiki/YouTube links) add("help_keyboard_shortcuts", _u8L("Keyboard Shortcuts"), _u8L("Help"), [](const std::string&) { - wxGetApp().keyboard_shortcuts(); + wxGetApp().keyboard_shortcuts(ShortcutContext::Global); return AppActionRunResult{AppActionRunResult::Level::Success}; }); add("help_setup_wizard", _u8L("Setup Wizard"), _u8L("Help"), [](const std::string&) { diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index d2196fefe6..6258cf19af 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -82,6 +82,7 @@ #include "GUI.hpp" #include "GUI_App.hpp" +#include "Shortcuts.hpp" #include "GUI_ObjectList.hpp" #ifdef __WXGTK__ #include "LinuxDisplayBackend.hpp" @@ -7595,7 +7596,9 @@ Plater::priv::priv(Plater *q, MainFrame *main_frame) view3D_canvas->Bind(EVT_GLCANVAS_PRINTABLE, [this](SimpleEvent& evt) { this->sidebar->obj_list()->toggle_printable_state(); }); view3D_canvas->Bind(EVT_GLCANVAS_SELECT_ALL, [this](SimpleEvent&) { this->q->select_all(); }); - view3D_canvas->Bind(EVT_GLCANVAS_QUESTION_MARK, [](SimpleEvent&) { wxGetApp().keyboard_shortcuts(); }); + view3D_canvas->Bind(EVT_GLCANVAS_QUESTION_MARK, [this](SimpleEvent&) { + wxGetApp().keyboard_shortcuts(view3D->get_canvas3d()->get_gizmos_manager().is_paint_gizmo() ? ShortcutContext::Painting : ShortcutContext::Plater); + }); view3D_canvas->Bind(EVT_GLCANVAS_INCREASE_INSTANCES, [this](Event& evt) { if (evt.data == 1) this->q->increase_instances(); else if (this->can_decrease_instances()) this->q->decrease_instances(); }); view3D_canvas->Bind(EVT_GLCANVAS_INSTANCE_MOVED, [this](SimpleEvent&) { update(); }); @@ -7672,7 +7675,7 @@ Plater::priv::priv(Plater *q, MainFrame *main_frame) view3D_canvas->Bind(EVT_GLCANVAS_UPDATE_BED_SHAPE, [q](SimpleEvent&) { q->set_bed_shape(); }); // Preview events: - preview->get_wxglcanvas()->Bind(EVT_GLCANVAS_QUESTION_MARK, [](SimpleEvent&) { wxGetApp().keyboard_shortcuts(); }); + preview->get_wxglcanvas()->Bind(EVT_GLCANVAS_QUESTION_MARK, [](SimpleEvent&) { wxGetApp().keyboard_shortcuts(ShortcutContext::Preview); }); preview->get_wxglcanvas()->Bind(EVT_GLCANVAS_UPDATE_BED_SHAPE, [q](SimpleEvent&) { q->set_bed_shape(); }); preview->get_wxglcanvas()->Bind(EVT_GLCANVAS_UPDATE, [this](SimpleEvent &) { preview->get_canvas3d()->set_as_dirty(); @@ -8133,10 +8136,7 @@ void Plater::priv::collapse_sidebar(bool collapse) sidebar_layout.is_collapsed = collapse; // Now update the tooltip in the toolbar. - std::string new_tooltip = collapse - ? _u8L("Expand sidebar") - : _u8L("Collapse sidebar"); - new_tooltip += " [" + _u8L("Shift+") + _u8L("Tab") + "]"; + const std::string new_tooltip = wxGetApp().shortcuts().with_key(collapse ? _u8L("Expand sidebar") : _u8L("Collapse sidebar"), Shortcut::CollapseSidebar); int id = collapse_toolbar.get_item_id("collapse_sidebar"); collapse_toolbar.set_tooltip(id, new_tooltip); diff --git a/src/slic3r/GUI/Preferences.cpp b/src/slic3r/GUI/Preferences.cpp index adda0edd74..be4bfcfa63 100644 --- a/src/slic3r/GUI/Preferences.cpp +++ b/src/slic3r/GUI/Preferences.cpp @@ -18,6 +18,7 @@ #include "NetworkTestDialog.hpp" #include "Widgets/StaticLine.hpp" #include "Widgets/RadioGroup.hpp" +#include "Shortcuts.hpp" #include "slic3r/Utils/bambu_networking.hpp" #include "slic3r/Utils/NetworkAgent.hpp" #include "NetworkPluginDialog.hpp" @@ -285,6 +286,7 @@ std::tuple PreferencesDialog::create_item_combobox_base( auto combobox = new ::ComboBox(m_parent, wxID_ANY, wxEmptyString, wxDefaultPosition, DESIGN_LARGE_COMBOBOX_SIZE, 0, nullptr, wxCB_READONLY); combobox->GetDropDown().SetUseContentWidth(true); combobox->SetToolTip(tip); + combobox->SetName(param); // select_tab() finds the row by this name std::vector::iterator iter; for (iter = vlist.begin(); iter != vlist.end(); iter++) { @@ -1522,6 +1524,19 @@ PreferencesDialog::~PreferencesDialog() { } +void PreferencesDialog::select_tab(PreferencesTab tab, const std::string& option) +{ + if (const auto index = m_tab_index.find(tab); index != m_tab_index.end()) + m_pref_tabs->SelectItem(index->second); + wxWindow* control = option.empty() ? nullptr : m_parent->FindWindow(wxString(option)); + if (control == nullptr) + return; + int unit = 1; + m_parent->GetScrollPixelsPerUnit(nullptr, &unit); + m_parent->Scroll(wxDefaultCoord, (m_parent->CalcUnscrolledPosition(control->GetPosition()).y - FromDIP(10)) / unit); + control->SetFocus(); // the focused tint marks the row +} + void PreferencesDialog::on_dpi_changed(const wxRect &suggested_rect) { m_pref_tabs->Rescale(); @@ -1599,7 +1614,7 @@ void PreferencesDialog::create_items() ////////////////////////// //// GENERAL TAB ///////////////////////////////////// - m_pref_tabs->AppendItem(_L("General")); + m_tab_index[PreferencesTab::General] = m_pref_tabs->AppendItem(_L("General")); f_sizers.push_back(new wxFlexGridSizer(1, 1, v_gap, 0)); g_sizer = f_sizers.back(); g_sizer->AddGrowableCol(0, 1); @@ -1730,8 +1745,8 @@ void PreferencesDialog::create_items() auto item_multi_machine = create_item_checkbox(_L("Multi device management"), _L("With this option enabled, you can send a task to multiple devices at the same time and manage multiple devices."), "enable_multi_machine", _L("(Requires restart)")); g_sizer->Add(item_multi_machine); - auto item_speed_dial = create_item_checkbox(_L("Open the Speed Dial with the Space key"), - _L("When enabled, pressing Space (with no other key held) opens the Speed Dial action search from any page."), + auto item_speed_dial = create_item_checkbox(_L("Open the Speed Dial from the keyboard"), + _L("When enabled, the Speed Dial keyboard shortcut (Space by default) opens the action search from any page."), "enable_speed_dial"); g_sizer->Add(item_speed_dial); @@ -1789,7 +1804,7 @@ void PreferencesDialog::create_items() ////////////////////////// //// CONTROL TAB ///////////////////////////////////// - m_pref_tabs->AppendItem(_L("Control")); + m_tab_index[PreferencesTab::Control] = m_pref_tabs->AppendItem(_L("Control")); f_sizers.push_back(new wxFlexGridSizer(1, 1, v_gap, 0)); g_sizer = f_sizers.back(); g_sizer->AddGrowableCol(0, 1); @@ -1859,6 +1874,14 @@ void PreferencesDialog::create_items() auto item_right_mouse_drag = create_item_combobox(_L("Right Mouse Drag"), _L("Set the action that dragging the right mouse button should perform."), "right_mouse_drag_action", ButtonDragActions); g_sizer->Add(item_right_mouse_drag); + //// CONTROL > Keyboard + g_sizer->Add(create_item_title(_L("Keyboard")), 1, wxEXPAND); + + auto item_shortcuts = create_item_button(_L("Keyboard shortcuts"), _L("Edit") + dots, "", _L("Choose the key for each action."), [this]() { + wxGetApp().keyboard_shortcuts(ShortcutContext::Global, this); + }); + g_sizer->Add(item_shortcuts); + //// CONTROL > Clear my choice on ... g_sizer->Add(create_item_title(_L("Clear my choice on...")), 1, wxEXPAND); @@ -1883,7 +1906,7 @@ void PreferencesDialog::create_items() ////////////////////////// //// GRAPHICS TAB ///////////////////////////////////// - m_pref_tabs->AppendItem(_L("Graphics")); + m_tab_index[PreferencesTab::Graphics] = m_pref_tabs->AppendItem(_L("Graphics")); f_sizers.push_back(new wxFlexGridSizer(1, 1, v_gap, 0)); g_sizer = f_sizers.back(); g_sizer->AddGrowableCol(0, 1); @@ -2031,7 +2054,7 @@ void PreferencesDialog::create_items() ////////////////////////// //// ONLINE TAB ///////////////////////////////////// - m_pref_tabs->AppendItem(_L("Online")); + m_tab_index[PreferencesTab::Online] = m_pref_tabs->AppendItem(_L("Online")); f_sizers.push_back(new wxFlexGridSizer(1, 1, v_gap, 0)); g_sizer = f_sizers.back(); g_sizer->AddGrowableCol(0, 1); diff --git a/src/slic3r/GUI/Preferences.hpp b/src/slic3r/GUI/Preferences.hpp index 5ab7fb1919..e3b6ffdc7d 100644 --- a/src/slic3r/GUI/Preferences.hpp +++ b/src/slic3r/GUI/Preferences.hpp @@ -29,6 +29,9 @@ namespace Slic3r { namespace GUI { #define DESIGN_INPUT_SIZE wxSize(FromDIP(120), -1) #define DESIGN_LEFT_MARGIN 25 +// The tabs other dialogs open Preferences on. +enum class PreferencesTab { General, Control, Graphics, Online }; + class PreferencesDialog : public DPIDialog { private: @@ -38,6 +41,7 @@ protected: wxBoxSizer * m_sizer_body; wxScrolledWindow* m_parent; TabCtrl* m_pref_tabs; + std::map m_tab_index; // position of each tab in m_pref_tabs // bool m_settings_layout_changed {false}; bool m_seq_top_layer_only_changed{false}; @@ -60,6 +64,8 @@ public: ~PreferencesDialog(); + void select_tab(PreferencesTab tab, const std::string& option = {}); // and scrolls a combobox option's row into view, focused + wxString m_backup_interval_time; wxTimer m_filament_height_timer; diff --git a/src/slic3r/GUI/Shortcuts.cpp b/src/slic3r/GUI/Shortcuts.cpp new file mode 100644 index 0000000000..0bcf0ccef9 --- /dev/null +++ b/src/slic3r/GUI/Shortcuts.cpp @@ -0,0 +1,377 @@ +#include "Shortcuts.hpp" + +#include "I18N.hpp" +#include "libslic3r/AppConfig.hpp" + +#include +#include +#include + +namespace Slic3r { namespace GUI { + +namespace { + +constexpr uint8_t GLOBAL = context_bit(ShortcutContext::Global); +constexpr uint8_t PLATER = context_bit(ShortcutContext::Plater); +constexpr uint8_t PREVIEW = context_bit(ShortcutContext::Preview); +constexpr uint8_t OBJECT_LIST = context_bit(ShortcutContext::ObjectList); +constexpr uint8_t PAINTING = context_bit(ShortcutContext::Painting); +constexpr uint8_t CANVAS = PLATER | PREVIEW; + +constexpr int CTRL = wxMOD_CONTROL; +constexpr int SHIFT = wxMOD_SHIFT; +constexpr int CTRL_SHIFT = wxMOD_CONTROL | wxMOD_SHIFT; + +#ifdef __APPLE__ +constexpr KeyChord PREFERENCES_CHORD{ ',', CTRL }; +constexpr KeyChord DELETE_CHORD{ WXK_BACK }; +constexpr KeyChord MOUSE3D_CHORD{ 'M', CTRL_SHIFT }; +#else +constexpr KeyChord PREFERENCES_CHORD{ 'P', CTRL }; +constexpr KeyChord DELETE_CHORD{ WXK_DELETE }; +constexpr KeyChord MOUSE3D_CHORD{ 'M', CTRL }; +#endif + +// Each row: enum value, AppConfig key, description shown in the dialog, contexts the key is +// looked up in, and the default chord. Rows are in the order the dialog lists them, within +// the sections of the Shortcut enum. +// SHORTCUT runs once per key press. +// REPEATING runs again on every auto-repeat of a held key. +// STEPPING repeats, and Shift or Ctrl held with its key select a step variant of it instead +// of another shortcut (ShortcutInfo::modifier_variants). +#define SHORTCUT(id, key, name, contexts, ...) ShortcutInfo{ Shortcut::id, key, name, contexts, __VA_ARGS__, false, false } +#define REPEATING(id, key, name, contexts, ...) ShortcutInfo{ Shortcut::id, key, name, contexts, __VA_ARGS__, true, false } +#define STEPPING(id, key, name, contexts, ...) ShortcutInfo{ Shortcut::id, key, name, contexts, __VA_ARGS__, true, true } + +constexpr std::array shortcut_table = {{ + // Project + SHORTCUT(NewProject, "new_project", L("New Project"), GLOBAL, { 'N', CTRL }), + SHORTCUT(OpenProject, "open_project", L("Open Project"), GLOBAL, { 'O', CTRL }), + SHORTCUT(SaveProject, "save_project", L("Save Project"), GLOBAL, { 'S', CTRL }), + SHORTCUT(SaveProjectAs, "save_project_as", L("Save Project as"), GLOBAL, { 'S', CTRL_SHIFT }), + SHORTCUT(ImportModel, "import_model", L("Import geometry data from STL/STEP/3MF/OBJ/AMF files"), GLOBAL, { 'I', CTRL }), + SHORTCUT(Publish3mf, "publish_3mf", L("Publish 3MF"), GLOBAL, { 'E', CTRL_SHIFT }), + + // Slicing and printing + SHORTCUT(SlicePlate, "slice_plate", L("Slice plate"), GLOBAL, { 'R', CTRL }), + SHORTCUT(ExportSlicedFile, "export_sliced_file", L("Export plate sliced file"), GLOBAL, { 'G', CTRL }), + SHORTCUT(PrintPlate, "print_plate", L("Print plate"), GLOBAL, { 'G', CTRL_SHIFT }), + SHORTCUT(PrintHostQueue, "print_host_queue", L("Print host upload queue"), GLOBAL, { 'J', CTRL }), + + // Selection + SHORTCUT(SelectAll, "select_all", L("Select all objects"), PLATER | OBJECT_LIST, { 'A', CTRL }), + SHORTCUT(SelectAllPlates, "select_all_plates", L("Select all objects on all plates"), PLATER, { 'A', CTRL_SHIFT }), + + // Editing + REPEATING(Undo, "undo", L("Undo"), PLATER | OBJECT_LIST, { 'Z', CTRL }), + REPEATING(Redo, "redo", L("Redo"), PLATER | OBJECT_LIST, { 'Y', CTRL }), + SHORTCUT(Cut, "cut", L("Cut"), PLATER | OBJECT_LIST, { 'X', CTRL }), + SHORTCUT(Copy, "copy", L("Copy to clipboard"), PLATER | OBJECT_LIST, { 'C', CTRL }), + SHORTCUT(Paste, "paste", L("Paste from clipboard"), PLATER | OBJECT_LIST, { 'V', CTRL }), + SHORTCUT(DeleteSelected, "delete_selected", L("Delete Selected"), PLATER | OBJECT_LIST, DELETE_CHORD), + SHORTCUT(DeleteAll, "delete_all", L("Delete All"), PLATER, { 'D', CTRL }), + SHORTCUT(CloneSelected, "clone_selected", L("Clone Selected"), PLATER | OBJECT_LIST, { 'K', CTRL }), + + // Objects + REPEATING(AddInstance, "add_instance", L("Add instance"), PLATER | OBJECT_LIST, { '+' }), + REPEATING(RemoveInstance, "remove_instance", L("Remove instance"), PLATER | OBJECT_LIST, { '-' }), + SHORTCUT(TogglePrintable, "toggle_printable", L("Toggle printable for object/part"), PLATER | OBJECT_LIST, { 'V' }), + SHORTCUT(ToggleAutoDrop, "toggle_auto_drop", L("Auto Drop"), OBJECT_LIST, { 'D' }), + + // Placement + SHORTCUT(Arrange, "arrange", L("Arrange all objects"), PLATER, { 'A' }), + SHORTCUT(ArrangePlate, "arrange_plate", L("Arrange objects on selected plates"), PLATER, { 'A', SHIFT }), + SHORTCUT(Orient, "orient", L("Auto orient all/selected objects"), PLATER, { 'Q' }), + SHORTCUT(OrientPlate, "orient_plate", L("Auto orient all objects on current plate"), PLATER, { 'Q', SHIFT }), + STEPPING(MoveSelectionLeft, "move_selection_left", L("Move selection 10mm in negative X direction"), PLATER, { WXK_LEFT }), + STEPPING(MoveSelectionRight, "move_selection_right", L("Move selection 10mm in positive X direction"), PLATER, { WXK_RIGHT }), + STEPPING(MoveSelectionUp, "move_selection_up", L("Move selection 10mm in positive Y direction"), PLATER, { WXK_UP }), + STEPPING(MoveSelectionDown, "move_selection_down", L("Move selection 10mm in negative Y direction"), PLATER, { WXK_DOWN }), + REPEATING(RotateSelectionLeft, "rotate_selection_left", L("Rotate selection 45 degrees counterclockwise"), PLATER, { WXK_PAGEUP }), + REPEATING(RotateSelectionRight, "rotate_selection_right", L("Rotate selection 45 degrees clockwise"), PLATER, { WXK_PAGEDOWN }), + + // Gizmos + SHORTCUT(GizmoMove, "gizmo_move", L("Gizmo move"), PLATER, { 'M' }), + SHORTCUT(GizmoRotate, "gizmo_rotate", L("Gizmo rotate"), PLATER, { 'R' }), + SHORTCUT(GizmoScale, "gizmo_scale", L("Gizmo scale"), PLATER, { 'S' }), + SHORTCUT(GizmoFlatten, "gizmo_flatten", L("Gizmo place face on bed"), PLATER, { 'F' }), + SHORTCUT(GizmoCut, "gizmo_cut", L("Gizmo cut"), PLATER, { 'C' }), + SHORTCUT(GizmoMeshBoolean, "gizmo_mesh_boolean", L("Gizmo mesh boolean"), PLATER, { 'B' }), + SHORTCUT(GizmoFdmSupports, "gizmo_fdm_supports", L("Gizmo FDM paint-on supports"), PLATER, { 'L' }), + SHORTCUT(GizmoSeam, "gizmo_seam", L("Gizmo FDM paint-on seam"), PLATER, { 'P' }), + SHORTCUT(GizmoFuzzySkin, "gizmo_fuzzy_skin", L("Gizmo FDM paint-on fuzzy skin"), PLATER, { 'H' }), + SHORTCUT(GizmoMmuSegmentation, "gizmo_mmu_segmentation", L("Gizmo multi-material painting"), PLATER, { 'N' }), + SHORTCUT(GizmoEmboss, "gizmo_emboss", L("Gizmo text emboss/engrave"), PLATER, { 'T' }), + SHORTCUT(GizmoMeasure, "gizmo_measure", L("Gizmo measure"), PLATER, { 'U' }), + SHORTCUT(GizmoAssembly, "gizmo_assembly", L("Gizmo assemble"), PLATER, { 'Y' }), + SHORTCUT(GizmoBrimEars, "gizmo_brim_ears", L("Gizmo brim ears"), PLATER, { 'E' }), + + // Sliders + SHORTCUT(GoToLayer, "go_to_layer", L("Jump to layer"), PREVIEW, { 'G', SHIFT }), + STEPPING(LayerSliderUp, "layer_slider_up", L("Vertical slider - Move active thumb Up"), PREVIEW, { WXK_UP }), + STEPPING(LayerSliderDown, "layer_slider_down", L("Vertical slider - Move active thumb Down"), PREVIEW, { WXK_DOWN }), + STEPPING(MovesSliderLeft, "moves_slider_left", L("Horizontal slider - Move active thumb Left"), PREVIEW, { WXK_LEFT }), + STEPPING(MovesSliderRight, "moves_slider_right", L("Horizontal slider - Move active thumb Right"), PREVIEW, { WXK_RIGHT }), + REPEATING(MovesSliderStart, "moves_slider_start", L("Horizontal slider - Move to start position"), PREVIEW, { WXK_HOME }), + REPEATING(MovesSliderEnd, "moves_slider_end", L("Horizontal slider - Move to last position"), PREVIEW, { WXK_END }), + + // Painting tools + SHORTCUT(PaintToolCircle, "paint_tool_circle", L("Circle"), PAINTING, { 'C' }), + SHORTCUT(PaintToolSphere, "paint_tool_sphere", L("Sphere"), PAINTING, { 'S' }), + SHORTCUT(PaintToolFill, "paint_tool_fill", L("Fill"), PAINTING, { 'F' }), + SHORTCUT(PaintToolGapFill, "paint_tool_gap_fill", L("Gap Fill"), PAINTING, { 'G' }), + SHORTCUT(PaintToolTriangle, "paint_tool_triangle", L("Triangle"), PAINTING, { 'T' }), + SHORTCUT(PaintToolHeightRange, "paint_tool_height_range", L("Height Range"), PAINTING, { 'H' }), + + // Camera + SHORTCUT(ViewDefault, "view_default", L("Camera view - Default"), GLOBAL, { '0', CTRL }), + SHORTCUT(ViewTop, "view_top", L("Camera view - Top"), GLOBAL, { '1', CTRL }), + SHORTCUT(ViewBottom, "view_bottom", L("Camera view - Bottom"), GLOBAL, { '2', CTRL }), + SHORTCUT(ViewFront, "view_front", L("Camera view - Front"), GLOBAL, { '3', CTRL }), + SHORTCUT(ViewRear, "view_rear", L("Camera view - Behind"), GLOBAL, { '4', CTRL }), + SHORTCUT(ViewLeft, "view_left", L("Camera Angle - Left side"), GLOBAL, { '5', CTRL }), + SHORTCUT(ViewRight, "view_right", L("Camera Angle - Right side"), GLOBAL, { '6', CTRL }), + SHORTCUT(ViewPlate, "view_plate", L("Camera view - Current plate"), GLOBAL, { '7', CTRL }), + REPEATING(ZoomIn, "zoom_in", L("Zoom in"), CANVAS, { 'I' }), + REPEATING(ZoomOut, "zoom_out", L("Zoom out"), CANVAS, { 'O' }), + SHORTCUT(Mouse3DSettings, "mouse3d_settings", L("Show/Hide 3Dconnexion devices settings dialog"), CANVAS, MOUSE3D_CHORD), + + // Display + SHORTCUT(ShowLabels, "show_labels", L("Show object labels in 3D scene."), GLOBAL, { 'E', CTRL }), + SHORTCUT(ShowWireframe, "show_wireframe", L("Show/Hide wireframe"), CANVAS, { WXK_RETURN, CTRL_SHIFT }), + SHORTCUT(ToggleGcodeWindow, "toggle_gcode_window", L("On/Off G-code window"), PREVIEW, { 'C' }), + SHORTCUT(ToggleOneLayerMode, "toggle_one_layer_mode", L("On/Off one layer mode of the vertical slider"), PREVIEW, { 'L' }), + + // Application + SHORTCUT(Preferences, "preferences", L("Preferences"), GLOBAL, PREFERENCES_CHORD), + SHORTCUT(Search, "search", L("Search"), GLOBAL, { 'F', CTRL }), + SHORTCUT(SwitchView, "switch_view", L("Switch between Prepare/Preview"), CANVAS, { WXK_TAB }), + SHORTCUT(CollapseSidebar, "collapse_sidebar", L("Collapse/Expand the sidebar"), CANVAS, { WXK_TAB, SHIFT }), + SHORTCUT(SpeedDial, "speed_dial", L("Open the speed dial"), GLOBAL, { WXK_SPACE }), + SHORTCUT(ReloadDevicePage, "reload_device_page", L("Reload the device page"), CANVAS, { WXK_F5 }), + SHORTCUT(KeyboardShortcuts, "keyboard_shortcuts", L("Show keyboard shortcuts list"), CANVAS, { '?' }), +}}; + +#undef SHORTCUT +#undef REPEATING +#undef STEPPING + +// The first shortcut of each section's run in shortcut_table and the section's heading, indexed +// by ShortcutSection. +struct SectionInfo +{ + Shortcut first; + const char* name; +}; + +constexpr std::array section_table = {{ + { Shortcut::NewProject, L("Project") }, + { Shortcut::SlicePlate, L("Slicing and printing") }, + { Shortcut::SelectAll, L("Selection") }, + { Shortcut::Undo, L("Editing") }, + { Shortcut::AddInstance, L("Objects") }, + { Shortcut::Arrange, L("Placement") }, + { Shortcut::GizmoMove, L("Gizmos") }, + { Shortcut::GoToLayer, L("Sliders") }, + { Shortcut::PaintToolCircle, L("Painting tools") }, + { Shortcut::ViewDefault, L("Camera") }, + { Shortcut::ShowLabels, L("Display") }, + { Shortcut::Preferences, L("Application") }, +}}; + +constexpr bool sections_follow_table_order() +{ + if (section_table.front().first != Shortcut(0)) + return false; + for (size_t i = 1; i < section_table.size(); ++i) + if (section_table[i].first <= section_table[i - 1].first) + return false; + return true; +} +static_assert(sections_follow_table_order(), "section_table must begin at the first shortcut and ascend"); + +constexpr bool table_is_in_enum_order() +{ + for (size_t i = 0; i < shortcut_table.size(); ++i) + if (shortcut_table[i].id != Shortcut(i)) + return false; + return true; +} +static_assert(table_is_in_enum_order(), "shortcut_table must list every Shortcut in declaration order"); + +const char* CONFIG_SECTION = "shortcuts"; +const char* UNBOUND = "none"; + +bool share_context(uint8_t a, uint8_t b) { return (a & b) != 0 || (a & GLOBAL) != 0 || (b & GLOBAL) != 0; } + +// The modifiers a modifier_variants shortcut accepts on top of its binding. +constexpr int STEP_MODIFIERS = wxMOD_SHIFT | wxMOD_CONTROL; + +// The step modifiers chord adds to binding, 0 when chord is not a step of it; a binding with +// Shift or Ctrl of its own has no steps, so no two bindings share one. +int step_modifiers(const KeyChord& chord, const KeyChord& binding) +{ + if (!binding.valid() || (binding.modifiers & STEP_MODIFIERS) != 0 || chord.key != binding.key || + (chord.modifiers & ~STEP_MODIFIERS) != binding.modifiers) + return 0; + return chord.modifiers & STEP_MODIFIERS; +} + +} // namespace + +const ShortcutInfo& shortcut_info(Shortcut shortcut) { return shortcut_table[size_t(shortcut)]; } + +ShortcutSection shortcut_section(Shortcut shortcut) +{ + size_t section = 0; + for (size_t i = 1; i < section_table.size(); ++i) + if (section_table[i].first <= shortcut) + section = i; + return ShortcutSection(section); +} + +const char* section_name(ShortcutSection section) { return section_table[size_t(section)].name; } + +std::vector shortcuts_in(ShortcutContext context) +{ + std::vector out; + for (const ShortcutInfo& info : shortcut_table) + if (info.contexts & context_bit(context)) + out.push_back(info.id); + return out; +} + +ShortcutRegistry::ShortcutRegistry() { rebuild_index(); } + +KeyChord ShortcutRegistry::binding(Shortcut shortcut) const +{ + const std::optional& override = m_overrides[size_t(shortcut)]; + return override.has_value() ? *override : shortcut_info(shortcut).default_chord; +} + +bool ShortcutRegistry::is_customized(Shortcut shortcut) const { return m_overrides[size_t(shortcut)].has_value(); } + +std::string ShortcutRegistry::display(Shortcut shortcut) const { return binding(shortcut).display(); } + +std::string ShortcutRegistry::with_key(const std::string& text, Shortcut shortcut) const +{ + const std::string key = display(shortcut); + return key.empty() ? text : text + " [" + key + "]"; +} + +std::string ShortcutRegistry::accelerator(Shortcut shortcut) const +{ + const KeyChord chord = binding(shortcut); + return chord.is_menu_accelerator() ? chord.to_string() : std::string(); +} + +std::optional ShortcutRegistry::lookup(ShortcutContext context, const KeyChord& chord) const +{ + if (!chord.valid()) + return std::nullopt; + auto it = m_index.find(chord); + if (it == m_index.end()) + return std::nullopt; + for (Shortcut shortcut : it->second) + if (shortcut_info(shortcut).contexts & context_bit(context)) + return shortcut; + return std::nullopt; +} + +std::optional ShortcutRegistry::match(ShortcutContext context, const KeyChord& chord) const +{ + if (const std::optional exact = lookup(context, chord); exact.has_value()) + return Match{ *exact, 0 }; + if ((chord.modifiers & STEP_MODIFIERS) == 0) + return std::nullopt; + for (const ShortcutInfo& info : shortcut_table) + if (info.modifier_variants && (info.contexts & context_bit(context))) + if (const int step = step_modifiers(chord, binding(info.id)); step != 0) + return Match{ info.id, step }; + return std::nullopt; +} + +std::vector ShortcutRegistry::conflicts(Shortcut shortcut, const KeyChord& chord) const +{ + std::vector out; + if (!chord.valid()) + return out; + const uint8_t contexts = shortcut_info(shortcut).contexts; + for (const ShortcutInfo& other : shortcut_table) + if (other.id != shortcut && share_context(contexts, other.contexts) && binding(other.id) == chord) + out.push_back(other.id); + return out; +} + +std::optional ShortcutRegistry::step_owner(Shortcut shortcut, const KeyChord& chord) const +{ + const uint8_t contexts = shortcut_info(shortcut).contexts; + for (const ShortcutInfo& other : shortcut_table) + if (other.modifier_variants && other.id != shortcut && share_context(contexts, other.contexts)) + if (const int step = step_modifiers(chord, binding(other.id)); step == wxMOD_SHIFT || step == wxMOD_CONTROL) // the combined step stays assignable + return other.id; + return std::nullopt; +} + +void ShortcutRegistry::bind(Shortcut shortcut, const KeyChord& chord) +{ + const ShortcutInfo& info = shortcut_info(shortcut); + if (chord == info.default_chord) + m_overrides[size_t(shortcut)].reset(); + else + m_overrides[size_t(shortcut)] = chord; + rebuild_index(); +} + +void ShortcutRegistry::reset(Shortcut shortcut) +{ + m_overrides[size_t(shortcut)].reset(); + rebuild_index(); +} + +void ShortcutRegistry::reset_all() +{ + m_overrides.fill(std::nullopt); + rebuild_index(); +} + +void ShortcutRegistry::load(const AppConfig& config) +{ + m_overrides.fill(std::nullopt); + if (config.has_section(CONFIG_SECTION)) { + const std::map& section = config.get_section(CONFIG_SECTION); + for (const ShortcutInfo& info : shortcut_table) { + auto it = section.find(info.key); + if (it == section.end()) + continue; + if (it->second == UNBOUND) + m_overrides[size_t(info.id)] = KeyChord{}; + else if (std::optional chord = KeyChord::parse(it->second); chord.has_value()) + // A Global chord is seen before any text field, so it needs a modifier or a non-typing key. + if ((info.contexts & GLOBAL) == 0 || chord->is_menu_accelerator()) + m_overrides[size_t(info.id)] = *chord; + } + } + rebuild_index(); +} + +void ShortcutRegistry::save(AppConfig& config) const +{ + for (const ShortcutInfo& info : shortcut_table) { + const std::optional& override = m_overrides[size_t(info.id)]; + if (override.has_value()) + config.set(CONFIG_SECTION, info.key, override->valid() ? override->to_string() : UNBOUND); + else + config.erase(CONFIG_SECTION, info.key); + } +} + +void ShortcutRegistry::rebuild_index() +{ + m_index.clear(); + for (const ShortcutInfo& info : shortcut_table) + if (const KeyChord chord = binding(info.id); chord.valid()) + m_index[chord].push_back(info.id); +} + +}} // namespace Slic3r::GUI diff --git a/src/slic3r/GUI/Shortcuts.hpp b/src/slic3r/GUI/Shortcuts.hpp new file mode 100644 index 0000000000..ba002556ca --- /dev/null +++ b/src/slic3r/GUI/Shortcuts.hpp @@ -0,0 +1,127 @@ +#pragma once + +#include "KeyChord.hpp" + +#include +#include +#include +#include +#include +#include + +namespace Slic3r { + +class AppConfig; + +namespace GUI { + +// Where a key press is looked up. A shortcut may belong to several contexts; Global ones are +// dispatched by the main frame before any child window sees the key. +enum class ShortcutContext : uint8_t { Global, Plater, Preview, ObjectList, Painting, Count }; + +constexpr uint8_t context_bit(ShortcutContext context) { return uint8_t(1u << unsigned(context)); } + +enum class Shortcut : uint8_t { + // Project + NewProject, OpenProject, SaveProject, SaveProjectAs, ImportModel, Publish3mf, + // Slicing and printing + SlicePlate, ExportSlicedFile, PrintPlate, PrintHostQueue, + // Selection + SelectAll, SelectAllPlates, + // Editing + Undo, Redo, Cut, Copy, Paste, DeleteSelected, DeleteAll, CloneSelected, + // Objects + AddInstance, RemoveInstance, TogglePrintable, ToggleAutoDrop, + // Placement + Arrange, ArrangePlate, Orient, OrientPlate, + MoveSelectionLeft, MoveSelectionRight, MoveSelectionUp, MoveSelectionDown, RotateSelectionLeft, RotateSelectionRight, + // Gizmos + GizmoMove, GizmoRotate, GizmoScale, GizmoFlatten, GizmoCut, GizmoMeshBoolean, GizmoFdmSupports, GizmoSeam, GizmoFuzzySkin, + GizmoMmuSegmentation, GizmoEmboss, GizmoMeasure, GizmoAssembly, GizmoBrimEars, + // Sliders + GoToLayer, LayerSliderUp, LayerSliderDown, MovesSliderLeft, MovesSliderRight, MovesSliderStart, MovesSliderEnd, + // Painting tools + PaintToolCircle, PaintToolSphere, PaintToolFill, PaintToolGapFill, PaintToolTriangle, PaintToolHeightRange, + // Camera + ViewDefault, ViewTop, ViewBottom, ViewFront, ViewRear, ViewLeft, ViewRight, ViewPlate, ZoomIn, ZoomOut, Mouse3DSettings, + // Display + ShowLabels, ShowWireframe, ToggleGcodeWindow, ToggleOneLayerMode, + // Application + Preferences, Search, SwitchView, CollapseSidebar, SpeedDial, ReloadDevicePage, KeyboardShortcuts, + Count +}; + +struct ShortcutInfo +{ + Shortcut id; + const char* key; // AppConfig key + const char* name; // untranslated description + uint8_t contexts; // context_bit() mask + KeyChord default_chord; + bool repeatable; // runs on key auto-repeat as well + // Shift or Ctrl held with the bound key select a variant of this action, such as the finer + // move step or the faster slider step. + bool modifier_variants; +}; + +// Headings of the shortcuts dialog, in listing order. +enum class ShortcutSection : uint8_t { + Project, SlicingAndPrinting, Selection, Editing, Objects, Placement, Gizmos, Sliders, PaintingTools, Camera, Display, Application, + Count +}; + +const ShortcutInfo& shortcut_info(Shortcut shortcut); +ShortcutSection shortcut_section(Shortcut shortcut); +const char* section_name(ShortcutSection section); // untranslated heading +std::vector shortcuts_in(ShortcutContext context); // in table order + +// Effective key bindings: the built-in defaults overlaid with the user's own. Owns the +// chord -> shortcut index every dispatcher queries. +class ShortcutRegistry +{ +public: + ShortcutRegistry(); + + KeyChord binding(Shortcut shortcut) const; // invalid when unbound + bool is_customized(Shortcut shortcut) const; + + std::string display(Shortcut shortcut) const; // "Ctrl+N" for tooltips and the shortcuts dialog + std::string with_key(const std::string& text, Shortcut shortcut) const; // "text [Ctrl+N]", or text alone when unbound + std::string accelerator(Shortcut shortcut) const; // wx accelerator text for menu labels; empty when unbound or not menu-safe + + // Matches a key event in one context. Global shortcuts are only found through the Global context. + std::optional lookup(ShortcutContext context, const KeyChord& chord) const; + + // lookup(), then the modifier_variants shortcuts, which also match with Shift or Ctrl added + // to their binding; step_modifiers holds whichever of the two were added. + struct Match + { + Shortcut shortcut; + int step_modifiers; + }; + std::optional match(ShortcutContext context, const KeyChord& chord) const; + + // Shortcuts other than shortcut bound to chord in a context it shares; Global shortcuts + // share every context. + std::vector conflicts(Shortcut shortcut, const KeyChord& chord) const; + + // The modifier_variants shortcut in a shared context whose Shift or Ctrl step is chord; + // such a chord is reserved for that step. + std::optional step_owner(Shortcut shortcut, const KeyChord& chord) const; + + void bind(Shortcut shortcut, const KeyChord& chord); // an invalid chord unbinds + void reset(Shortcut shortcut); + void reset_all(); + + void load(const AppConfig& config); + void save(AppConfig& config) const; + +private: + void rebuild_index(); + + std::array, size_t(Shortcut::Count)> m_overrides; + std::unordered_map, KeyChordHash> m_index; +}; + +} // namespace GUI +} // namespace Slic3r diff --git a/tests/slic3rutils/CMakeLists.txt b/tests/slic3rutils/CMakeLists.txt index 3ddacc5a1b..f86f40c3e1 100644 --- a/tests/slic3rutils/CMakeLists.txt +++ b/tests/slic3rutils/CMakeLists.txt @@ -18,6 +18,7 @@ add_executable(${_TEST_NAME}_tests test_plugin_sort.cpp test_plugin_cloud_metadata.cpp test_plugin_audit.cpp + test_shortcuts.cpp ../fff_print/test_helpers.cpp ) diff --git a/tests/slic3rutils/test_shortcuts.cpp b/tests/slic3rutils/test_shortcuts.cpp new file mode 100644 index 0000000000..7826a0610a --- /dev/null +++ b/tests/slic3rutils/test_shortcuts.cpp @@ -0,0 +1,329 @@ +#include +#include + +#include "libslic3r/AppConfig.hpp" +#include "slic3r/GUI/KeyChord.hpp" +#include "slic3r/GUI/Shortcuts.hpp" + +#include + +using namespace Slic3r; +using namespace Slic3r::GUI; + +namespace { + +wxKeyEvent key_event(wxEventType type, int key_code, int modifiers = wxMOD_NONE) +{ + wxKeyEvent evt(type); + evt.m_keyCode = key_code; + evt.SetControlDown(modifiers & wxMOD_CONTROL); + evt.SetShiftDown(modifiers & wxMOD_SHIFT); + evt.SetAltDown(modifiers & wxMOD_ALT); + return evt; +} + +} // namespace + +TEST_CASE("KeyChord round-trips through its canonical text", "[Shortcuts]") +{ + const auto [chord, text] = GENERATE(table({ + { { 'N', wxMOD_CONTROL }, "Ctrl+N" }, + { { 'S', wxMOD_CONTROL | wxMOD_SHIFT }, "Ctrl+Shift+S" }, + { { WXK_RETURN, wxMOD_SHIFT | wxMOD_ALT }, "Shift+Alt+Enter" }, + { { WXK_TAB, wxMOD_SHIFT }, "Shift+Tab" }, + { { WXK_DELETE }, "Del" }, + { { WXK_F5 }, "F5" }, + { { WXK_F12, wxMOD_CONTROL }, "Ctrl+F12" }, + { { '+' }, "+" }, + { { '-', wxMOD_CONTROL }, "Ctrl+-" }, + { { '?' }, "?" }, + { { ',', wxMOD_CONTROL }, "Ctrl+," }, + })); + CAPTURE(text); + CHECK(chord.to_string() == text); + REQUIRE(KeyChord::parse(text).has_value()); + CHECK(*KeyChord::parse(text) == chord); +} + +TEST_CASE("KeyChord::parse accepts aliases and rejects malformed text", "[Shortcuts]") +{ + CHECK(KeyChord::parse("control+n") == KeyChord{ 'N', wxMOD_CONTROL }); + CHECK(KeyChord::parse("Cmd+Shift+Delete") == KeyChord{ WXK_DELETE, wxMOD_CONTROL | wxMOD_SHIFT }); + CHECK(KeyChord::parse("PageUp") == KeyChord{ WXK_PAGEUP }); + CHECK(KeyChord::parse("f3") == KeyChord{ WXK_F3 }); + + CHECK_FALSE(KeyChord::parse("").has_value()); + CHECK_FALSE(KeyChord::parse("Ctrl+").has_value()); + CHECK_FALSE(KeyChord::parse("Meta+A").has_value()); + CHECK_FALSE(KeyChord::parse("F25").has_value()); + CHECK_FALSE(KeyChord::parse("Shift+/").has_value()); // Shift is part of the punctuation character +} + +TEST_CASE("Key events normalize to the key-down key codes", "[Shortcuts]") +{ + CHECK(KeyChord::from_event(key_event(wxEVT_KEY_DOWN, 'A', wxMOD_CONTROL)) == KeyChord{ 'A', wxMOD_CONTROL }); + CHECK(KeyChord::from_event(key_event(wxEVT_KEY_DOWN, WXK_NUMPAD5, wxMOD_CONTROL)) == KeyChord{ '5', wxMOD_CONTROL }); + CHECK(KeyChord::from_event(key_event(wxEVT_KEY_DOWN, WXK_NUMPAD_ADD)) == KeyChord{ '+' }); + CHECK(KeyChord::from_event(key_event(wxEVT_KEY_DOWN, WXK_NUMPAD_PAGEUP)) == KeyChord{ WXK_PAGEUP }); + CHECK_FALSE(KeyChord::from_event(key_event(wxEVT_KEY_DOWN, WXK_SHIFT, wxMOD_SHIFT)).valid()); + CHECK_FALSE(KeyChord::from_event(key_event(wxEVT_KEY_DOWN, WXK_CONTROL, wxMOD_CONTROL)).valid()); + + CHECK(KeyChord::from_event(key_event(wxEVT_CHAR, 'a')) == KeyChord{ 'A' }); + CHECK(KeyChord::from_event(key_event(wxEVT_CHAR, 'A', wxMOD_SHIFT)) == KeyChord{ 'A', wxMOD_SHIFT }); + CHECK(KeyChord::from_event(key_event(wxEVT_CHAR, WXK_CONTROL_C, wxMOD_CONTROL)) == KeyChord{ 'C', wxMOD_CONTROL }); + CHECK(KeyChord::from_event(key_event(wxEVT_CHAR, '+', wxMOD_SHIFT)) == KeyChord{ '+' }); + CHECK(KeyChord::from_event(key_event(wxEVT_CHAR, WXK_DELETE)) == KeyChord{ WXK_DELETE }); + CHECK_FALSE(KeyChord::from_event(key_event(wxEVT_CHAR, 0x444)).valid()); // a Cyrillic letter is not bindable +} + +TEST_CASE("Punctuation chords are the ones matched on char events", "[Shortcuts]") +{ + CHECK(KeyChord{ '+' }.is_punctuation()); + CHECK(KeyChord{ '?' }.is_punctuation()); + CHECK_FALSE(KeyChord{ 'A' }.is_punctuation()); + CHECK_FALSE(KeyChord{ '1' }.is_punctuation()); + CHECK_FALSE(KeyChord{ '=', wxMOD_CONTROL }.is_punctuation()); + CHECK_FALSE(KeyChord{ WXK_DELETE }.is_punctuation()); +} + +TEST_CASE("Chords that only the char event can resolve are recognized", "[Shortcuts]") +{ + CHECK(KeyChord{ '/', wxMOD_SHIFT }.needs_char_event()); + CHECK(KeyChord{ '-' }.needs_char_event()); + CHECK_FALSE(KeyChord{ '=', wxMOD_CONTROL }.needs_char_event()); + CHECK_FALSE(KeyChord{ 'A', wxMOD_SHIFT }.needs_char_event()); + CHECK_FALSE(KeyChord{ '1' }.needs_char_event()); + CHECK_FALSE(KeyChord{ WXK_F5 }.needs_char_event()); +} + +TEST_CASE("Only modified or non-printable chords qualify as menu accelerators", "[Shortcuts]") +{ + CHECK(KeyChord{ 'N', wxMOD_CONTROL }.is_menu_accelerator()); + CHECK(KeyChord{ 'N', wxMOD_ALT }.is_menu_accelerator()); + CHECK(KeyChord{ WXK_DELETE }.is_menu_accelerator()); + CHECK(KeyChord{ WXK_F5 }.is_menu_accelerator()); + CHECK_FALSE(KeyChord{ 'A' }.is_menu_accelerator()); + CHECK_FALSE(KeyChord{ 'A', wxMOD_SHIFT }.is_menu_accelerator()); + CHECK_FALSE(KeyChord{ '?' }.is_menu_accelerator()); + CHECK_FALSE(KeyChord{ WXK_SPACE }.is_menu_accelerator()); + CHECK_FALSE(KeyChord{}.is_menu_accelerator()); + + ShortcutRegistry registry; + CHECK(registry.accelerator(Shortcut::NewProject) == "Ctrl+N"); +#ifdef __APPLE__ + CHECK(registry.accelerator(Shortcut::DeleteSelected) == "Backspace"); +#else + CHECK(registry.accelerator(Shortcut::DeleteSelected) == "Del"); +#endif + CHECK(registry.accelerator(Shortcut::Arrange).empty()); + CHECK(registry.accelerator(Shortcut::ArrangePlate).empty()); + CHECK(registry.accelerator(Shortcut::KeyboardShortcuts).empty()); +} + +TEST_CASE("Chords convert to wx accelerator entries", "[Shortcuts]") +{ + const wxAcceleratorEntry entry = KeyChord{ 'S', wxMOD_CONTROL | wxMOD_SHIFT }.to_accelerator_entry(42); + CHECK(entry.GetFlags() == (wxACCEL_CTRL | wxACCEL_SHIFT)); + CHECK(entry.GetKeyCode() == 'S'); + CHECK(entry.GetCommand() == 42); + + const wxAcceleratorEntry bare = KeyChord{ WXK_BACK }.to_accelerator_entry(7); + CHECK(bare.GetFlags() == wxACCEL_NORMAL); + CHECK(bare.GetKeyCode() == WXK_BACK); +} + +#ifndef __APPLE__ +TEST_CASE("Display text matches the canonical text without translations", "[Shortcuts]") +{ + CHECK(KeyChord{ WXK_DELETE, wxMOD_CONTROL | wxMOD_SHIFT }.display() == "Ctrl+Shift+Del"); + CHECK(KeyChord{ WXK_DELETE, wxMOD_CONTROL | wxMOD_SHIFT }.display_parts() == std::vector{ "Ctrl", "Shift", "Del" }); + CHECK(KeyChord{ '+' }.display() == "+"); + CHECK(KeyChord{ WXK_UP, wxMOD_SHIFT }.display() == "Shift+Arrow Up"); // the arrows keep the old dialog's names + CHECK(KeyChord{ WXK_UP, wxMOD_SHIFT }.to_string() == "Shift+Up"); + CHECK(KeyChord{}.display().empty()); +} +#endif + +TEST_CASE("Every shortcut is listed under the section of its table row", "[Shortcuts]") +{ + CHECK(shortcut_section(Shortcut::NewProject) == ShortcutSection::Project); + CHECK(shortcut_section(Shortcut::Publish3mf) == ShortcutSection::Project); + CHECK(shortcut_section(Shortcut::SlicePlate) == ShortcutSection::SlicingAndPrinting); + CHECK(shortcut_section(Shortcut::GizmoBrimEars) == ShortcutSection::Gizmos); + CHECK(shortcut_section(Shortcut::MovesSliderEnd) == ShortcutSection::Sliders); + CHECK(shortcut_section(Shortcut::ViewDefault) == ShortcutSection::Camera); + CHECK(shortcut_section(Shortcut::KeyboardShortcuts) == ShortcutSection::Application); + CHECK(std::string(section_name(ShortcutSection::SlicingAndPrinting)) == "Slicing and printing"); +} + +TEST_CASE("Default bindings never collide inside a context", "[Shortcuts]") +{ + ShortcutRegistry registry; + for (size_t i = 0; i < size_t(Shortcut::Count); ++i) { + const Shortcut shortcut = Shortcut(i); + CAPTURE(shortcut_info(shortcut).key); + CHECK(registry.conflicts(shortcut, registry.binding(shortcut)).empty()); + } +} + +TEST_CASE("Shift and Ctrl variants of stepping shortcuts are left unbound", "[Shortcuts]") +{ + ShortcutRegistry registry; + for (size_t i = 0; i < size_t(Shortcut::Count); ++i) { + const ShortcutInfo& info = shortcut_info(Shortcut(i)); + if (!info.modifier_variants) + continue; + CAPTURE(info.key); + const KeyChord chord = registry.binding(info.id); + for (int modifier : { int(wxMOD_SHIFT), int(wxMOD_CONTROL), int(wxMOD_SHIFT | wxMOD_CONTROL) }) + for (size_t c = 0; c < size_t(ShortcutContext::Count); ++c) + if (info.contexts & context_bit(ShortcutContext(c))) + CHECK_FALSE(registry.lookup(ShortcutContext(c), KeyChord{ chord.key, chord.modifiers | modifier }).has_value()); + } +} + +TEST_CASE("Lookups are scoped to the context of the key press", "[Shortcuts]") +{ + ShortcutRegistry registry; + const KeyChord ctrl_n{ 'N', wxMOD_CONTROL }; + const KeyChord ctrl_c{ 'C', wxMOD_CONTROL }; + const KeyChord a{ 'A' }; + const KeyChord c{ 'C' }; + + CHECK(registry.lookup(ShortcutContext::Global, ctrl_n) == Shortcut::NewProject); + CHECK_FALSE(registry.lookup(ShortcutContext::Plater, ctrl_n).has_value()); + + CHECK(registry.lookup(ShortcutContext::Plater, ctrl_c) == Shortcut::Copy); + CHECK(registry.lookup(ShortcutContext::ObjectList, ctrl_c) == Shortcut::Copy); + CHECK_FALSE(registry.lookup(ShortcutContext::Global, ctrl_c).has_value()); + + CHECK(registry.lookup(ShortcutContext::Plater, a) == Shortcut::Arrange); + CHECK_FALSE(registry.lookup(ShortcutContext::Preview, a).has_value()); + + CHECK(registry.lookup(ShortcutContext::Plater, c) == Shortcut::GizmoCut); + CHECK(registry.lookup(ShortcutContext::Preview, c) == Shortcut::ToggleGcodeWindow); + CHECK(registry.lookup(ShortcutContext::Painting, c) == Shortcut::PaintToolCircle); +} + +TEST_CASE("Stepping shortcuts match with Shift or Ctrl added to their binding", "[Shortcuts]") +{ + ShortcutRegistry registry; + using Match = ShortcutRegistry::Match; + auto same = [](const std::optional& match, Shortcut shortcut, int step_modifiers) { + return match.has_value() && match->shortcut == shortcut && match->step_modifiers == step_modifiers; + }; + CHECK(same(registry.match(ShortcutContext::Preview, { WXK_UP }), Shortcut::LayerSliderUp, 0)); + CHECK(same(registry.match(ShortcutContext::Preview, { WXK_UP, wxMOD_SHIFT }), Shortcut::LayerSliderUp, wxMOD_SHIFT)); + CHECK(same(registry.match(ShortcutContext::Plater, { WXK_LEFT, wxMOD_CONTROL | wxMOD_SHIFT }), Shortcut::MoveSelectionLeft, wxMOD_CONTROL | wxMOD_SHIFT)); + CHECK(same(registry.match(ShortcutContext::Plater, { 'A', wxMOD_SHIFT }), Shortcut::ArrangePlate, 0)); // an exact binding wins + CHECK_FALSE(registry.match(ShortcutContext::Plater, { 'Q', wxMOD_CONTROL }).has_value()); // Orient has no variants + CHECK_FALSE(registry.match(ShortcutContext::Preview, { WXK_UP, wxMOD_ALT }).has_value()); // Alt is not a step modifier + + CHECK_FALSE(registry.match(ShortcutContext::Preview, { WXK_HOME, wxMOD_SHIFT }).has_value()); // Home has no variants + + // A binding with Shift or Ctrl of its own has no steps. + registry.bind(Shortcut::LayerSliderUp, { WXK_UP, wxMOD_CONTROL }); + CHECK(same(registry.match(ShortcutContext::Preview, { WXK_UP, wxMOD_CONTROL }), Shortcut::LayerSliderUp, 0)); + CHECK_FALSE(registry.match(ShortcutContext::Preview, { WXK_UP, wxMOD_CONTROL | wxMOD_SHIFT }).has_value()); + CHECK_FALSE(registry.match(ShortcutContext::Preview, { WXK_UP, wxMOD_SHIFT }).has_value()); + + // An exact binding on the combined step wins over it. + registry.bind(Shortcut::Arrange, { WXK_LEFT, wxMOD_CONTROL | wxMOD_SHIFT }); + CHECK(same(registry.match(ShortcutContext::Plater, { WXK_LEFT, wxMOD_CONTROL | wxMOD_SHIFT }), Shortcut::Arrange, 0)); + CHECK(same(registry.match(ShortcutContext::Plater, { WXK_LEFT, wxMOD_SHIFT }), Shortcut::MoveSelectionLeft, wxMOD_SHIFT)); +} + +TEST_CASE("Conflicts cover shared contexts and every Global shortcut", "[Shortcuts]") +{ + ShortcutRegistry registry; + CHECK(registry.conflicts(Shortcut::Arrange, { 'N', wxMOD_CONTROL }) == std::vector{ Shortcut::NewProject }); + CHECK(registry.conflicts(Shortcut::NewProject, { 'A' }) == std::vector{ Shortcut::Arrange }); + CHECK(registry.conflicts(Shortcut::ToggleGcodeWindow, { 'C' }).empty()); + CHECK(registry.conflicts(Shortcut::ZoomIn, { 'C' }) == std::vector{ Shortcut::GizmoCut, Shortcut::ToggleGcodeWindow }); + CHECK(registry.conflicts(Shortcut::Arrange, { 'A' }).empty()); // a shortcut never conflicts with itself + + // Only the exact chord conflicts; the steps of a stepping shortcut are reserved instead. + CHECK(registry.conflicts(Shortcut::GoToLayer, { WXK_UP, wxMOD_SHIFT }).empty()); + CHECK(registry.conflicts(Shortcut::LayerSliderUp, { 'G', wxMOD_SHIFT }) == std::vector{ Shortcut::GoToLayer }); +} + +TEST_CASE("Shift and Ctrl with a stepping shortcut's key are reserved for its steps", "[Shortcuts]") +{ + ShortcutRegistry registry; + CHECK(registry.step_owner(Shortcut::GoToLayer, { WXK_UP, wxMOD_SHIFT }) == Shortcut::LayerSliderUp); + CHECK(registry.step_owner(Shortcut::NewProject, { WXK_LEFT, wxMOD_CONTROL }) == Shortcut::MoveSelectionLeft); // Global shares every context + CHECK_FALSE(registry.step_owner(Shortcut::GoToLayer, { WXK_UP, wxMOD_CONTROL | wxMOD_SHIFT }).has_value()); // the combined step is free + CHECK_FALSE(registry.step_owner(Shortcut::MoveSelectionLeft, { WXK_LEFT, wxMOD_SHIFT }).has_value()); // its own step + CHECK_FALSE(registry.step_owner(Shortcut::PaintToolCircle, { WXK_UP, wxMOD_SHIFT }).has_value()); // Painting shares no context + registry.bind(Shortcut::LayerSliderUp, { WXK_UP, wxMOD_CONTROL }); + CHECK_FALSE(registry.step_owner(Shortcut::GoToLayer, { WXK_UP, wxMOD_CONTROL | wxMOD_SHIFT }).has_value()); // a modified binding has no steps +} + +TEST_CASE("Custom bindings replace the default and survive a config round trip", "[Shortcuts]") +{ + ShortcutRegistry registry; + const KeyChord w{ 'W' }; + registry.bind(Shortcut::Arrange, w); + + CHECK(registry.is_customized(Shortcut::Arrange)); + CHECK(registry.lookup(ShortcutContext::Plater, w) == Shortcut::Arrange); + CHECK_FALSE(registry.lookup(ShortcutContext::Plater, { 'A' }).has_value()); + + AppConfig config; + registry.save(config); + CHECK(config.get("shortcuts", "arrange") == "W"); + CHECK_FALSE(config.has("shortcuts", "orient")); + + ShortcutRegistry loaded; + loaded.load(config); + CHECK(loaded.lookup(ShortcutContext::Plater, w) == Shortcut::Arrange); + CHECK(loaded.binding(Shortcut::Orient) == KeyChord{ 'Q' }); + + SECTION("rebinding to the default clears the override") + { + registry.bind(Shortcut::Arrange, { 'A' }); + CHECK_FALSE(registry.is_customized(Shortcut::Arrange)); + registry.save(config); + CHECK_FALSE(config.has("shortcuts", "arrange")); + } + SECTION("an invalid chord unbinds and persists as none") + { + registry.bind(Shortcut::Arrange, KeyChord{}); + CHECK_FALSE(registry.binding(Shortcut::Arrange).valid()); + registry.save(config); + CHECK(config.get("shortcuts", "arrange") == "none"); + loaded.load(config); + CHECK_FALSE(loaded.lookup(ShortcutContext::Plater, { 'A' }).has_value()); + CHECK_FALSE(loaded.lookup(ShortcutContext::Plater, w).has_value()); + } + SECTION("reset_all restores every default") + { + registry.reset_all(); + CHECK(registry.lookup(ShortcutContext::Plater, { 'A' }) == Shortcut::Arrange); + CHECK_FALSE(registry.is_customized(Shortcut::Arrange)); + } +} + +TEST_CASE("A Global shortcut refuses a config binding that would swallow typing", "[Shortcuts]") +{ + AppConfig config; + // A string literal would pick AppConfig::set's bool overload. + config.set("shortcuts", "save_project", std::string("S")); + config.set("shortcuts", "new_project", std::string("F9")); + ShortcutRegistry registry; + registry.load(config); + CHECK(registry.binding(Shortcut::SaveProject) == KeyChord{ 'S', wxMOD_CONTROL }); + CHECK(registry.binding(Shortcut::NewProject) == KeyChord{ WXK_F9 }); +} + +TEST_CASE("Unreadable config entries fall back to the default binding", "[Shortcuts]") +{ + AppConfig config; + config.set("shortcuts", "arrange", std::string("Hyper+Q")); + config.set("shortcuts", "no_such_shortcut", std::string("Ctrl+Q")); + + ShortcutRegistry registry; + registry.load(config); + CHECK_FALSE(registry.is_customized(Shortcut::Arrange)); + CHECK(registry.lookup(ShortcutContext::Plater, { 'A' }) == Shortcut::Arrange); +} From 5caa3372bccadbe389325fc9153f0bf12f5f9118 Mon Sep 17 00:00:00 2001 From: Lam Wei Lun Date: Tue, 22 Sep 2026 12:39:53 +0800 Subject: [PATCH 19/48] Remove ellipses and update translations --- localization/i18n/OrcaSlicer.pot | 550 +++++++++------ localization/i18n/ca/OrcaSlicer_ca.po | 686 ++++++++++++------- localization/i18n/cs/OrcaSlicer_cs.po | 690 ++++++++++++------- localization/i18n/de/OrcaSlicer_de.po | 674 ++++++++++++------- localization/i18n/en/OrcaSlicer_en.po | 544 +++++++++------ localization/i18n/es/OrcaSlicer_es.po | 654 ++++++++++++------ localization/i18n/eu/OrcaSlicer_eu.po | 672 ++++++++++++------- localization/i18n/fr/OrcaSlicer_fr.po | 672 ++++++++++++------- localization/i18n/hu/OrcaSlicer_hu.po | 676 ++++++++++++------- localization/i18n/it/OrcaSlicer_it.po | 684 ++++++++++++------- localization/i18n/ja/OrcaSlicer_ja.po | 692 ++++++++++++------- localization/i18n/ko/OrcaSlicer_ko.po | 694 ++++++++++++------- localization/i18n/list.txt | 2 + localization/i18n/lt/OrcaSlicer_lt.po | 672 ++++++++++++------- localization/i18n/nl/OrcaSlicer_nl.po | 706 +++++++++++++------- localization/i18n/pl/OrcaSlicer_pl.po | 690 ++++++++++++------- localization/i18n/pt_BR/OrcaSlicer_pt_BR.po | 654 ++++++++++++------ localization/i18n/ru/OrcaSlicer_ru.po | 664 +++++++++++------- localization/i18n/sv/OrcaSlicer_sv.po | 698 ++++++++++++------- localization/i18n/th/OrcaSlicer_th.po | 672 ++++++++++++------- localization/i18n/tr/OrcaSlicer_tr.po | 688 ++++++++++++------- localization/i18n/uk/OrcaSlicer_uk.po | 686 ++++++++++++------- localization/i18n/vi/OrcaSlicer_vi.po | 694 ++++++++++++------- localization/i18n/zh_CN/OrcaSlicer_zh_CN.po | 688 ++++++++++++------- localization/i18n/zh_TW/OrcaSlicer_zh_TW.po | 680 ++++++++++++------- src/slic3r/GUI/MainFrame.cpp | 6 +- 26 files changed, 10556 insertions(+), 5532 deletions(-) diff --git a/localization/i18n/OrcaSlicer.pot b/localization/i18n/OrcaSlicer.pot index 79d50e844c..677f151fa9 100644 --- a/localization/i18n/OrcaSlicer.pot +++ b/localization/i18n/OrcaSlicer.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-09-18 15:50+0800\n" +"POT-Creation-Date: 2026-09-22 12:39+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -5554,10 +5554,13 @@ msgctxt "Camera View" msgid "Right" msgstr "" -msgid "Add" +msgid "Add plate" msgstr "" -msgid "Add plate" +msgid "Split to objects" +msgstr "" + +msgid "Add" msgstr "" msgid "Auto orient all/selected objects" @@ -5572,9 +5575,6 @@ msgstr "" msgid "Arrange objects on selected plates" msgstr "" -msgid "Split to objects" -msgstr "" - msgid "Assembly View" msgstr "" @@ -5629,6 +5629,9 @@ msgstr "" msgid "Wireframe" msgstr "" +msgid "X-Ray" +msgstr "" + msgid "Realistic View" msgstr "" @@ -6158,7 +6161,7 @@ msgstr "" msgid "Preferences" msgstr "" -msgid "Open speed dial..." +msgid "Open speed dial" msgstr "" msgctxt "Menu" @@ -7886,9 +7889,6 @@ msgstr "" msgid "Collapse sidebar" msgstr "" -msgid "Tab" -msgstr "" - #, possible-c-format, possible-boost-format msgid "Loading file: %s" msgstr "" @@ -8827,10 +8827,10 @@ msgstr "" msgid "With this option enabled, you can send a task to multiple devices at the same time and manage multiple devices." msgstr "" -msgid "Open the Speed Dial with the Space key" +msgid "Open the Speed Dial from the keyboard" msgstr "" -msgid "When enabled, pressing Space (with no other key held) opens the Speed Dial action search from any page." +msgid "When enabled, the Speed Dial keyboard shortcut (Space by default) opens the action search from any page." msgstr "" msgid "Recent actions" @@ -8956,6 +8956,15 @@ msgstr "" msgid "Set the action that dragging the right mouse button should perform." msgstr "" +msgid "Keyboard" +msgstr "" + +msgid "Keyboard shortcuts" +msgstr "" + +msgid "Choose the key for each action." +msgstr "" + msgid "Clear my choice on..." msgstr "" @@ -9049,10 +9058,38 @@ msgid "" "Set to 0 for unlimited frame rate." msgstr "" +msgid "Reuse the 3D scene while idle" +msgstr "" + +msgid "" +"Skips redrawing the 3D scene when only the mouse cursor moves over the viewport,\n" +"and reuses the previous frame's scene instead. Reduces GPU load.\n" +"Disable it if the viewport shows stale or missing contents.\n" +"\n" +"Takes effect immediately." +msgstr "" + +msgid "Skip unchanged frames" +msgstr "" + +msgid "" +"Skips drawing a frame altogether when it would be identical to the one already on screen.\n" +"Only applies to frames that reuse the 3D scene, so it needs Reuse the 3D scene while idle.\n" +"Disable it if a hover highlight, tooltip or animation stops updating.\n" +"\n" +"Takes effect immediately." +msgstr "" + msgid "Show FPS overlay" msgstr "" -msgid "Displays current viewport FPS in the top-right corner." +msgid "Displays rendering counts in the top-right corner of the viewport." +msgstr "" + +msgid "FPS: frames presented to the screen per second." +msgstr "" + +msgid "3D: frames per second that redrew the 3D scene." msgstr "" msgid "G-code Preview" @@ -9480,10 +9517,7 @@ msgstr "" msgid "Select which settings to be published in the 3MF file" msgstr "" -msgid "Publish 3MF Wiki" -msgstr "" - -msgid "Publish 3MF Video Guide" +msgid "Video Guide" msgstr "" msgid "Mixed filament - published as a whole when \"Enable\" above is selected" @@ -9675,6 +9709,12 @@ msgstr "" msgid "No wiki page for this action" msgstr "" +msgid "Show details" +msgstr "" + +msgid "Hide details" +msgstr "" + #, possible-c-format, possible-boost-format msgid "\"%s\" is a Developer setting. Enable Developer mode to edit it?" msgstr "" @@ -11373,65 +11413,37 @@ msgstr "" msgid "Configuration package changed" msgstr "" -msgid "Toolbar" -msgstr "" - -msgid "Objects list" -msgstr "" - -msgid "Import geometry data from STL/STEP/3MF/OBJ/AMF files" -msgstr "" - -msgid "Paste from clipboard" -msgstr "" - -msgid "Show/Hide 3Dconnexion devices settings dialog" -msgstr "" - -msgid "Switch table page" -msgstr "" - -msgctxt "Keyboard Shortcut" -msgid "Space" -msgstr "" - -msgid "Open speed dial" -msgstr "" - -msgid "Run a Speed Dial favourite (while the Speed Dial is open)" -msgstr "" - -msgid "Show keyboard shortcuts list" -msgstr "" - -msgid "Global shortcuts" -msgstr "" - msgid "Pan View" msgstr "" msgid "Rotate View" msgstr "" -msgid "Middle mouse button" +#, possible-c-format, possible-boost-format +msgid "Use %s or %s, or a key that does not type a character." msgstr "" -msgid "Zoom View" +msgctxt "Keyboard Shortcut" +msgid "Key" msgstr "" -msgid "Auto orients selected objects or all objects. If there are selected objects, it just orients the selected ones. Otherwise, it will orient all objects in the current project." +msgid "Left mouse" msgstr "" -msgid "Auto orients all objects on the active plate." +msgid "Available anywhere in the window, even while typing in a text field." msgstr "" -msgid "Collapse/Expand the sidebar" +msgid "Run a speed dial favorite while the dial is open" msgstr "" -msgid "Any arrow" +msgctxt "Keyboard Shortcut" +msgid "Tab" msgstr "" -msgid "Movement in camera space" +msgid "Switch to the next main tab" +msgstr "" + +msgid "Available while the 3D view on the Prepare tab has focus." msgstr "" msgid "Select a part" @@ -11443,120 +11455,28 @@ msgstr "" msgid "Select objects by rectangle" msgstr "" -msgctxt "Keyboard Shortcut" -msgid "Arrow Up" -msgstr "" - -msgid "Move selection 10mm in positive Y direction" -msgstr "" - -msgctxt "Keyboard Shortcut" -msgid "Arrow Down" -msgstr "" - -msgid "Move selection 10mm in negative Y direction" -msgstr "" - -msgctxt "Keyboard Shortcut" -msgid "Arrow Left" -msgstr "" - -msgid "Move selection 10mm in negative X direction" -msgstr "" - -msgctxt "Keyboard Shortcut" -msgid "Arrow Right" -msgstr "" - -msgid "Move selection 10mm in positive X direction" +msgid "Keyboard 1-9: set filament for object/part" msgstr "" msgid "Movement step set to 1mm" msgstr "" -msgid "Keyboard 1-9: set filament for object/part" +msgid "Movement in camera space" msgstr "" -msgid "Camera view - Default" +msgid "Middle mouse" msgstr "" -msgid "Camera view - Top" +msgid "Right mouse" msgstr "" -msgid "Camera view - Bottom" +msgid "Zoom View" msgstr "" -msgid "Camera view - Front" +msgid "Painting" msgstr "" -msgid "Camera view - Behind" -msgstr "" - -msgid "Camera Angle - Left side" -msgstr "" - -msgid "Camera Angle - Right side" -msgstr "" - -msgid "Select all objects" -msgstr "" - -msgid "Gizmo move" -msgstr "" - -msgid "Gizmo rotate" -msgstr "" - -msgid "Gizmo scale" -msgstr "" - -msgid "Gizmo place face on bed" -msgstr "" - -msgid "Gizmo cut" -msgstr "" - -msgid "Gizmo mesh boolean" -msgstr "" - -msgid "Gizmo FDM paint-on fuzzy skin" -msgstr "" - -msgid "Gizmo SLA support points" -msgstr "" - -msgid "Gizmo FDM paint-on seam" -msgstr "" - -msgid "Gizmo text emboss/engrave" -msgstr "" - -msgid "Gizmo measure" -msgstr "" - -msgid "Gizmo assemble" -msgstr "" - -msgid "Gizmo brim ears" -msgstr "" - -msgid "Zoom in" -msgstr "" - -msgid "Zoom out" -msgstr "" - -msgid "Toggle printable for object/part" -msgstr "" - -msgctxt "Keyboard Shortcut" -msgid "Tab" -msgstr "" - -msgid "Switch between Prepare/Preview" -msgstr "" - -msgid "Plater" +msgid "Available while a painting gizmo is open: supports, seam, fuzzy skin or color painting." msgstr "" msgid "Move: press to snap by 1mm" @@ -11568,13 +11488,17 @@ msgstr "" msgid "Support/Color Painting: adjust section position" msgstr "" -msgid "Gizmo" +msgid "Objects list" +msgstr "" + +msgid "Available while the object list has focus." msgstr "" msgid "Set extruder number for the objects and parts" msgstr "" -msgid "Delete objects, parts, modifiers" +msgctxt "Keyboard Shortcut" +msgid "Space" msgstr "" msgid "Select the object/part and press space to change the name" @@ -11586,42 +11510,47 @@ msgstr "" msgid "Select the object/part and mouse click to change the name" msgstr "" -msgid "Objects List" -msgstr "" - -msgid "Vertical slider - Move active thumb Up" -msgstr "" - -msgid "Vertical slider - Move active thumb Down" -msgstr "" - -msgid "Horizontal slider - Move active thumb Left" -msgstr "" - -msgid "Horizontal slider - Move active thumb Right" -msgstr "" - -msgid "On/Off one layer mode of the vertical slider" -msgstr "" - -msgid "On/Off G-code window" +msgid "Available while the 3D view on the Preview tab has focus." msgstr "" msgid "Move slider 5x faster" msgstr "" -msgctxt "Keyboard Shortcut" -msgid "Home" +msgid "Scroll slider 5x faster" msgstr "" -msgid "Horizontal slider - Move to start position" +msgid "Not customizable" msgstr "" -msgctxt "Keyboard Shortcut" -msgid "End" +#, possible-c-format, possible-boost-format +msgid "%s is assigned to %s. Reassign it to %s?" msgstr "" -msgid "Horizontal slider - Move to last position" +#, possible-c-format, possible-boost-format +msgid "The default %s is assigned to %s. Reassign it to %s?" +msgstr "" + +msgid "Global shortcuts also apply while typing." +msgstr "" + +msgid "A key that types a character cannot be a global shortcut." +msgstr "" + +msgid "Esc cancels, Enter confirms." +msgstr "" + +#, possible-c-format, possible-boost-format +msgid "" +"Press the new shortcut for\n" +"\"%s\"" +msgstr "" + +#, possible-c-format, possible-boost-format +msgid "Already used as a step of %s." +msgstr "" + +#, possible-c-format, possible-boost-format +msgid "Already assigned to %s. Press OK to reassign it." msgstr "" msgid "Release Note" @@ -15921,7 +15850,7 @@ msgstr "" msgid "Insert multiple preheat commands (e.g. M104.1). Only useful for Prusa XL. For other printers, please set it to 1." msgstr "" -msgid "G-code written at the very top of the output file, before any other content. Useful for adding metadata that printer firmware reads from the first lines of the file (e.g. estimated print time, filament usage). Supports placeholders like {print_time_sec} and {used_filament_length}." +msgid "G-code written at the very top of the output file, before any other content. Useful for adding metadata that printer firmware reads from the first lines of the file (e.g. estimated print time, filament usage). Supports placeholders like {print_time_total_sec}, {print_time_day}, {print_time_hour}, {print_time_minute}, {print_time_sec} and {used_filament_length}." msgstr "" msgid "Start G-code" @@ -17330,12 +17259,36 @@ msgstr "" msgid "Total length of filament used in the print." msgstr "" -msgid "Print time (seconds)" +msgid "Print time (total seconds)" msgstr "" msgid "Total estimated print time in seconds. Replaced with actual value during post-processing." msgstr "" +msgid "Print time (days component)" +msgstr "" + +msgid "Estimated print time day component (normal mode). Replaced with actual value during post-processing." +msgstr "" + +msgid "Print time (hours component)" +msgstr "" + +msgid "Estimated print time hour component (normal mode). Replaced with actual value during post-processing." +msgstr "" + +msgid "Print time (minutes component)" +msgstr "" + +msgid "Estimated print time minute component (normal mode). Replaced with actual value during post-processing." +msgstr "" + +msgid "Print time (seconds component)" +msgstr "" + +msgid "Estimated print time second component (normal mode). Replaced with actual value during post-processing." +msgstr "" + msgid "Filament length (meters)" msgstr "" @@ -19016,6 +18969,9 @@ msgstr "" msgid "Success!" msgstr "" +msgid "Generate API Key" +msgstr "" + msgid "Are you sure to log out?" msgstr "" @@ -19225,12 +19181,6 @@ msgstr "" msgid "Could not connect to Duet" msgstr "" -msgid "Connection to Ultimaker is working correctly." -msgstr "" - -msgid "Could not connect to Ultimaker" -msgstr "" - msgid "Unknown error occurred" msgstr "" @@ -19958,12 +19908,6 @@ msgstr "" msgid "Error: %s" msgstr "" -msgid "Show details" -msgstr "" - -msgid "Hide details" -msgstr "" - msgid "Version to install:" msgstr "" @@ -22542,6 +22486,12 @@ msgstr "" msgid "No binding for that field" msgstr "" +msgid "Enter a number" +msgstr "" + +msgid "Not a number" +msgstr "" + msgid "Primitive" msgstr "" @@ -22554,6 +22504,210 @@ msgstr "" msgid "Clear All" msgstr "" +msgctxt "Keyboard Shortcut" +msgid "Ins" +msgstr "" + +msgctxt "Keyboard Shortcut" +msgid "Home" +msgstr "" + +msgctxt "Keyboard Shortcut" +msgid "End" +msgstr "" + +msgctxt "Keyboard Shortcut" +msgid "PgUp" +msgstr "" + +msgctxt "Keyboard Shortcut" +msgid "PgDn" +msgstr "" + +msgctxt "Keyboard Shortcut" +msgid "Arrow Left" +msgstr "" + +msgctxt "Keyboard Shortcut" +msgid "Arrow Right" +msgstr "" + +msgctxt "Keyboard Shortcut" +msgid "Arrow Up" +msgstr "" + +msgctxt "Keyboard Shortcut" +msgid "Arrow Down" +msgstr "" + +msgid "Import geometry data from STL/STEP/3MF/OBJ/AMF files" +msgstr "" + +msgid "Select all objects" +msgstr "" + +msgid "Paste from clipboard" +msgstr "" + +msgid "Toggle printable for object/part" +msgstr "" + +msgid "Move selection 10mm in negative X direction" +msgstr "" + +msgid "Move selection 10mm in positive X direction" +msgstr "" + +msgid "Move selection 10mm in positive Y direction" +msgstr "" + +msgid "Move selection 10mm in negative Y direction" +msgstr "" + +msgid "Rotate selection 45 degrees counterclockwise" +msgstr "" + +msgid "Rotate selection 45 degrees clockwise" +msgstr "" + +msgid "Gizmo move" +msgstr "" + +msgid "Gizmo rotate" +msgstr "" + +msgid "Gizmo scale" +msgstr "" + +msgid "Gizmo place face on bed" +msgstr "" + +msgid "Gizmo cut" +msgstr "" + +msgid "Gizmo mesh boolean" +msgstr "" + +msgid "Gizmo FDM paint-on supports" +msgstr "" + +msgid "Gizmo FDM paint-on seam" +msgstr "" + +msgid "Gizmo FDM paint-on fuzzy skin" +msgstr "" + +msgid "Gizmo multi-material painting" +msgstr "" + +msgid "Gizmo text emboss/engrave" +msgstr "" + +msgid "Gizmo measure" +msgstr "" + +msgid "Gizmo assemble" +msgstr "" + +msgid "Gizmo brim ears" +msgstr "" + +msgid "Vertical slider - Move active thumb Up" +msgstr "" + +msgid "Vertical slider - Move active thumb Down" +msgstr "" + +msgid "Horizontal slider - Move active thumb Left" +msgstr "" + +msgid "Horizontal slider - Move active thumb Right" +msgstr "" + +msgid "Horizontal slider - Move to start position" +msgstr "" + +msgid "Horizontal slider - Move to last position" +msgstr "" + +msgid "Camera view - Default" +msgstr "" + +msgid "Camera view - Top" +msgstr "" + +msgid "Camera view - Bottom" +msgstr "" + +msgid "Camera view - Front" +msgstr "" + +msgid "Camera view - Behind" +msgstr "" + +msgid "Camera Angle - Left side" +msgstr "" + +msgid "Camera Angle - Right side" +msgstr "" + +msgid "Camera view - Current plate" +msgstr "" + +msgid "Zoom in" +msgstr "" + +msgid "Zoom out" +msgstr "" + +msgid "Show/Hide 3Dconnexion devices settings dialog" +msgstr "" + +msgid "Show/Hide wireframe" +msgstr "" + +msgid "On/Off G-code window" +msgstr "" + +msgid "On/Off one layer mode of the vertical slider" +msgstr "" + +msgid "Switch between Prepare/Preview" +msgstr "" + +msgid "Collapse/Expand the sidebar" +msgstr "" + +msgid "Open the speed dial" +msgstr "" + +msgid "Reload the device page" +msgstr "" + +msgid "Show keyboard shortcuts list" +msgstr "" + +msgid "Slicing and printing" +msgstr "" + +msgid "Editing" +msgstr "" + +msgid "Placement" +msgstr "" + +msgid "Gizmos" +msgstr "" + +msgid "Sliders" +msgstr "" + +msgid "Painting tools" +msgstr "" + +msgid "Application" +msgstr "" + #: resources/data/hints.ini: [hint:Precise wall] msgid "Precise wall\nDid you know that turning on precise wall can improve precision and layer consistency?" msgstr "" diff --git a/localization/i18n/ca/OrcaSlicer_ca.po b/localization/i18n/ca/OrcaSlicer_ca.po index dedb57fff3..27a9d805d7 100644 --- a/localization/i18n/ca/OrcaSlicer_ca.po +++ b/localization/i18n/ca/OrcaSlicer_ca.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-09-18 15:50+0800\n" +"POT-Creation-Date: 2026-09-22 12:39+0800\n" "PO-Revision-Date: 2025-03-15 10:55+0100\n" "Last-Translator: \n" "Language-Team: \n" @@ -6015,12 +6015,15 @@ msgctxt "Camera View" msgid "Right" msgstr "Dreta" -msgid "Add" -msgstr "Afegir" - msgid "Add plate" msgstr "Afegir placa" +msgid "Split to objects" +msgstr "Separar en objectes" + +msgid "Add" +msgstr "Afegir" + msgid "Auto orient all/selected objects" msgstr "Auto-orientació tots/seleccionats objectes" @@ -6033,9 +6036,6 @@ msgstr "Ordenar tots els objectes" msgid "Arrange objects on selected plates" msgstr "Ordenar els objectes en plaques seleccionades" -msgid "Split to objects" -msgstr "Separar en objectes" - msgid "Assembly View" msgstr "Vista de muntatge" @@ -6092,6 +6092,9 @@ msgstr "Contorn" msgid "Wireframe" msgstr "Malla alàmbrica" +msgid "X-Ray" +msgstr "" + # AI Translated msgid "Realistic View" msgstr "Vista realista" @@ -6634,7 +6637,7 @@ msgstr "Mostrar el contorn al voltant de l'objecte seleccionat a l'escena 3D" msgid "Preferences" msgstr "Preferències" -msgid "Open speed dial..." +msgid "Open speed dial" msgstr "" # AI Translated @@ -8469,10 +8472,6 @@ msgstr "Expandir la barra lateral" msgid "Collapse sidebar" msgstr "Replegar barra lateral" -# AI Translated -msgid "Tab" -msgstr "Pestanya" - #, c-format, boost-format msgid "Loading file: %s" msgstr "Carregant fitxer: %s" @@ -9510,10 +9509,10 @@ msgstr "Gestió multidispositiu" msgid "With this option enabled, you can send a task to multiple devices at the same time and manage multiple devices." msgstr "Amb aquesta opció habilitada, podeu enviar una tasca a diversos dispositius alhora i gestionar múltiples dispositius." -msgid "Open the Speed Dial with the Space key" +msgid "Open the Speed Dial from the keyboard" msgstr "" -msgid "When enabled, pressing Space (with no other key held) opens the Speed Dial action search from any page." +msgid "When enabled, the Speed Dial keyboard shortcut (Space by default) opens the action search from any page." msgstr "" msgid "Recent actions" @@ -9652,6 +9651,15 @@ msgstr "Arrossegament amb el botó dret del ratolí" msgid "Set the action that dragging the right mouse button should perform." msgstr "Estableix l'acció que ha de fer l'arrossegament amb el botó dret del ratolí." +msgid "Keyboard" +msgstr "" + +msgid "Keyboard shortcuts" +msgstr "" + +msgid "Choose the key for each action." +msgstr "" + msgid "Clear my choice on..." msgstr "Esborra la meva elecció a..." @@ -9776,13 +9784,40 @@ msgstr "" "Limita la velocitat de fotogrames de la vista per reduir la càrrega de la GPU i el consum.\n" "Establiu-ho a 0 per a una velocitat de fotogrames sense límit." +msgid "Reuse the 3D scene while idle" +msgstr "" + +msgid "" +"Skips redrawing the 3D scene when only the mouse cursor moves over the viewport,\n" +"and reuses the previous frame's scene instead. Reduces GPU load.\n" +"Disable it if the viewport shows stale or missing contents.\n" +"\n" +"Takes effect immediately." +msgstr "" + +msgid "Skip unchanged frames" +msgstr "" + +msgid "" +"Skips drawing a frame altogether when it would be identical to the one already on screen.\n" +"Only applies to frames that reuse the 3D scene, so it needs Reuse the 3D scene while idle.\n" +"Disable it if a hover highlight, tooltip or animation stops updating.\n" +"\n" +"Takes effect immediately." +msgstr "" + # AI Translated msgid "Show FPS overlay" msgstr "Mostrar la superposició d'FPS" -# AI Translated -msgid "Displays current viewport FPS in the top-right corner." -msgstr "Mostra els FPS actuals de la vista a la cantonada superior dreta." +msgid "Displays rendering counts in the top-right corner of the viewport." +msgstr "" + +msgid "FPS: frames presented to the screen per second." +msgstr "" + +msgid "3D: frames per second that redrew the 3D scene." +msgstr "" # AI Translated msgid "G-code Preview" @@ -10261,13 +10296,8 @@ msgstr "Publicar 3MF..." msgid "Select which settings to be published in the 3MF file" msgstr "Seleccioneu quines opcions es publicaran al fitxer 3MF" -# AI Translated -msgid "Publish 3MF Wiki" -msgstr "Wiki de Publicar 3MF" - -# AI Translated -msgid "Publish 3MF Video Guide" -msgstr "Guia en vídeo de Publicar 3MF" +msgid "Video Guide" +msgstr "" # AI Translated msgid "Mixed filament - published as a whole when \"Enable\" above is selected" @@ -10469,6 +10499,13 @@ msgstr "" msgid "No wiki page for this action" msgstr "" +msgid "Show details" +msgstr "Mostra detalls" + +# AI Translated +msgid "Hide details" +msgstr "Amagar els detalls" + #, c-format, boost-format msgid "\"%s\" is a Developer setting. Enable Developer mode to edit it?" msgstr "" @@ -12336,41 +12373,6 @@ msgstr "El paquet de configuració s'ha canviat a la Guia de Configuració anter msgid "Configuration package changed" msgstr "S'ha canviat el paquet de configuració" -msgid "Toolbar" -msgstr "Barra d’eines" - -msgid "Objects list" -msgstr "Llista d'objectes" - -msgid "Import geometry data from STL/STEP/3MF/OBJ/AMF files" -msgstr "Importar dades de geometria des de fitxers STL/STEP/3MF/OBJ/AMF" - -msgid "Paste from clipboard" -msgstr "Enganxa des del porta-retalls" - -msgid "Show/Hide 3Dconnexion devices settings dialog" -msgstr "Mostrar/Amagar quadre de diàleg Configuració de Dispositius 3Dconnexion" - -msgid "Switch table page" -msgstr "Canviar de pàgina de taula" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Space" -msgstr "Espai" - -msgid "Open speed dial" -msgstr "" - -msgid "Run a Speed Dial favourite (while the Speed Dial is open)" -msgstr "" - -msgid "Show keyboard shortcuts list" -msgstr "Mostrar la llista de dreceres de teclat" - -msgid "Global shortcuts" -msgstr "Dreceres Globals" - # AI Translated msgid "Pan View" msgstr "Desplaçament de la vista" @@ -12379,28 +12381,33 @@ msgstr "Desplaçament de la vista" msgid "Rotate View" msgstr "Rotació de la vista" -# AI Translated -msgid "Middle mouse button" -msgstr "Botó central del ratolí" +#, c-format, boost-format +msgid "Use %s or %s, or a key that does not type a character." +msgstr "" + +msgctxt "Keyboard Shortcut" +msgid "Key" +msgstr "" + +msgid "Left mouse" +msgstr "" + +msgid "Available anywhere in the window, even while typing in a text field." +msgstr "" + +msgid "Run a speed dial favorite while the dial is open" +msgstr "" # AI Translated -msgid "Zoom View" -msgstr "Zoom de la vista" +msgctxt "Keyboard Shortcut" +msgid "Tab" +msgstr "Tab" -msgid "Auto orients selected objects or all objects. If there are selected objects, it just orients the selected ones. Otherwise, it will orient all objects in the current project." -msgstr "Orienta/alinea automàticament els objectes seleccionats o tots els objectes. Si hi ha objectes seleccionats, només orientarà/alinearà els seleccionats. En cas contrari, orientarà/alinearà tots els objectes del projecte actual." +msgid "Switch to the next main tab" +msgstr "" -msgid "Auto orients all objects on the active plate." -msgstr "Orienta/alinea automàticament tots els objectes de la placa actual." - -msgid "Collapse/Expand the sidebar" -msgstr "Replegar/Expandir barra lateral" - -msgid "Any arrow" -msgstr "Qualsevol fletxa" - -msgid "Movement in camera space" -msgstr "Moviment a l'espai de la càmera" +msgid "Available while the 3D view on the Prepare tab has focus." +msgstr "" msgid "Select a part" msgstr "Seleccionar una peça" @@ -12411,127 +12418,30 @@ msgstr "Seleccionar múltiples objectes" msgid "Select objects by rectangle" msgstr "Seleccionar objectes per rectangle" -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Arrow Up" -msgstr "Fletxa amunt" - -msgid "Move selection 10mm in positive Y direction" -msgstr "Moure la selecció 10 mm en direcció Y positiva" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Arrow Down" -msgstr "Fletxa avall" - -msgid "Move selection 10mm in negative Y direction" -msgstr "Moure la selecció 10 mm en direcció Y negativa" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Arrow Left" -msgstr "Fletxa esquerra" - -msgid "Move selection 10mm in negative X direction" -msgstr "Moure la selecció 10 mm en direcció X negativa" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Arrow Right" -msgstr "Fletxa dreta" - -msgid "Move selection 10mm in positive X direction" -msgstr "Moure la selecció 10 mm en direcció X positiva" +msgid "Keyboard 1-9: set filament for object/part" +msgstr "teclat 1-9: establir filament per a objecte/peça" msgid "Movement step set to 1mm" msgstr "Pas de moviment configurat a 1 mm" -msgid "Keyboard 1-9: set filament for object/part" -msgstr "teclat 1-9: establir filament per a objecte/peça" +msgid "Movement in camera space" +msgstr "Moviment a l'espai de la càmera" -msgid "Camera view - Default" -msgstr "Vista de càmera - Predeterminada" +msgid "Middle mouse" +msgstr "" -msgid "Camera view - Top" -msgstr "Vista de càmera - Part Superior" - -msgid "Camera view - Bottom" -msgstr "Vista de càmera - Part Inferior" - -msgid "Camera view - Front" -msgstr "Vista de càmera - Frontal" - -msgid "Camera view - Behind" -msgstr "Vista de càmera - Darrere" - -msgid "Camera Angle - Left side" -msgstr "Angle de càmera - Costat Esquerre" - -msgid "Camera Angle - Right side" -msgstr "Angle de càmera - Costat Dret" - -msgid "Select all objects" -msgstr "Seleccionar tots els objectes" - -msgid "Gizmo move" -msgstr "Gizmo de Moviment" - -msgid "Gizmo rotate" -msgstr "Gizmo de Rotació" - -msgid "Gizmo scale" -msgstr "Gizmo d'Escala" - -msgid "Gizmo place face on bed" -msgstr "Gizmo de recolzament sobre la Cara a la placa" - -msgid "Gizmo cut" -msgstr "Gizmo de Tall" - -msgid "Gizmo mesh boolean" -msgstr "Gizmo booleà de malla" - -msgid "Gizmo FDM paint-on fuzzy skin" -msgstr "Eina FDM per a pell difusa pintada" - -msgid "Gizmo SLA support points" -msgstr "Gizmo de Punts de suport SLA" - -msgid "Gizmo FDM paint-on seam" -msgstr "Eina de Pintat de costures FDM" - -msgid "Gizmo text emboss/engrave" -msgstr "Gizmo de text en relleu/gravat" - -msgid "Gizmo measure" -msgstr "Gizmo mesurar" - -msgid "Gizmo assemble" -msgstr "Gizmo ensamblar" - -msgid "Gizmo brim ears" -msgstr "Gizmo orelles de la Vora d'Adherència" - -msgid "Zoom in" -msgstr "Augmentar zoom" - -msgid "Zoom out" -msgstr "Reduir zoom" +msgid "Right mouse" +msgstr "" # AI Translated -msgid "Toggle printable for object/part" -msgstr "Commutar la impressibilitat de l'objecte/peça" +msgid "Zoom View" +msgstr "Zoom de la vista" -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Tab" -msgstr "Tab" +msgid "Painting" +msgstr "" -msgid "Switch between Prepare/Preview" -msgstr "Canviar entre Preparar/Previsualitzar" - -msgid "Plater" -msgstr "Plataforma" +msgid "Available while a painting gizmo is open: supports, seam, fuzzy skin or color painting." +msgstr "" msgid "Move: press to snap by 1mm" msgstr "Moure: Clicka per ajustar en passos d'1 mm" @@ -12542,15 +12452,19 @@ msgstr "Suport/Pintat de color: configuració del radi de la ploma" msgid "Support/Color Painting: adjust section position" msgstr "Suport/Pintat de color: configuració de la posició de la secció" -# AI Translated -msgid "Gizmo" -msgstr "Gizmo" +msgid "Objects list" +msgstr "Llista d'objectes" + +msgid "Available while the object list has focus." +msgstr "" msgid "Set extruder number for the objects and parts" msgstr "Establir el número d'extrusor per als objectes i les peces" -msgid "Delete objects, parts, modifiers" -msgstr "Eliminar objectes, peces, modificadors" +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Space" +msgstr "Espai" msgid "Select the object/part and press space to change the name" msgstr "Seleccioneu l'objecte/peça i premeu espai per canviar-ne el nom" @@ -12561,45 +12475,48 @@ msgstr "Feu clic amb el ratolí" msgid "Select the object/part and mouse click to change the name" msgstr "Seleccioneu l'objecte/peça i feu clic amb el ratolí per canviar el nom" -msgid "Objects List" -msgstr "Llista d'Objectes" - -msgid "Vertical slider - Move active thumb Up" -msgstr "Barra de desplaçament Vertical - Mou el barra de desplaçament actiu cap Amunt" - -msgid "Vertical slider - Move active thumb Down" -msgstr "Barra de desplaçament Vertical - Mou el barra de desplaçament actiu cap Avall" - -msgid "Horizontal slider - Move active thumb Left" -msgstr "Barra de desplaçament Horitzontal - Mou el barra de desplaçament actiu cap a l'Esquerra" - -msgid "Horizontal slider - Move active thumb Right" -msgstr "Barra de desplaçament Horitzontal - Mou la barra de desplaçament activa cap a la Dreta" - -msgid "On/Off one layer mode of the vertical slider" -msgstr "Activar/desactivar el mode de capa única de la barra de desplaçament vertical" - -msgid "On/Off G-code window" -msgstr "Activar/Desactivar finestra de Codi-G" +msgid "Available while the 3D view on the Preview tab has focus." +msgstr "" msgid "Move slider 5x faster" msgstr "Moure la barra de desplaçament 5 vegades més ràpid" -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Home" -msgstr "Inici" +msgid "Scroll slider 5x faster" +msgstr "" -msgid "Horizontal slider - Move to start position" -msgstr "Control lliscant horitzontal - Mou fins a la posició inicial" +msgid "Not customizable" +msgstr "" -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "End" -msgstr "Fi" +#, c-format, boost-format +msgid "%s is assigned to %s. Reassign it to %s?" +msgstr "" -msgid "Horizontal slider - Move to last position" -msgstr "Control lliscant horitzontal - Mou a l'última posició" +#, c-format, boost-format +msgid "The default %s is assigned to %s. Reassign it to %s?" +msgstr "" + +msgid "Global shortcuts also apply while typing." +msgstr "" + +msgid "A key that types a character cannot be a global shortcut." +msgstr "" + +msgid "Esc cancels, Enter confirms." +msgstr "" + +#, c-format, boost-format +msgid "" +"Press the new shortcut for\n" +"\"%s\"" +msgstr "" + +#, c-format, boost-format +msgid "Already used as a step of %s." +msgstr "" + +#, c-format, boost-format +msgid "Already assigned to %s. Press OK to reassign it." +msgstr "" msgid "Release Note" msgstr "Notes de la versió" @@ -17594,8 +17511,8 @@ msgstr "Passos de preescalfament" msgid "Insert multiple preheat commands (e.g. M104.1). Only useful for Prusa XL. For other printers, please set it to 1." msgstr "Inseriu diverses ordres de preescalfament (p. ex., M104.1). Només útil per a Prusa XL. Per a altres impressores, poseu-la a 1." -msgid "G-code written at the very top of the output file, before any other content. Useful for adding metadata that printer firmware reads from the first lines of the file (e.g. estimated print time, filament usage). Supports placeholders like {print_time_sec} and {used_filament_length}." -msgstr "G-code escrit al començament del fitxer de sortida, abans de qualsevol altre contingut. Útil per afegir metadades que el firmware de la impressora llegeix de les primeres línies del fitxer (p. ex. temps d'impressió estimat, ús de filament). Admet espais reservats com {print_time_sec} i {used_filament_length}." +msgid "G-code written at the very top of the output file, before any other content. Useful for adding metadata that printer firmware reads from the first lines of the file (e.g. estimated print time, filament usage). Supports placeholders like {print_time_total_sec}, {print_time_day}, {print_time_hour}, {print_time_minute}, {print_time_sec} and {used_filament_length}." +msgstr "" msgid "Start G-code" msgstr "Codi-G inicial" @@ -19154,12 +19071,36 @@ msgstr "Filament usat" msgid "Total length of filament used in the print." msgstr "Longitud total de filament utilitzat a la impressió." -msgid "Print time (seconds)" -msgstr "Temps d'impressió (segons)" +msgid "Print time (total seconds)" +msgstr "" msgid "Total estimated print time in seconds. Replaced with actual value during post-processing." msgstr "Temps d'impressió estimat total en segons. Substituït pel valor real durant el post-processament." +msgid "Print time (days component)" +msgstr "" + +msgid "Estimated print time day component (normal mode). Replaced with actual value during post-processing." +msgstr "" + +msgid "Print time (hours component)" +msgstr "" + +msgid "Estimated print time hour component (normal mode). Replaced with actual value during post-processing." +msgstr "" + +msgid "Print time (minutes component)" +msgstr "" + +msgid "Estimated print time minute component (normal mode). Replaced with actual value during post-processing." +msgstr "" + +msgid "Print time (seconds component)" +msgstr "" + +msgid "Estimated print time second component (normal mode). Replaced with actual value during post-processing." +msgstr "" + msgid "Filament length (meters)" msgstr "Longitud del filament (metres)" @@ -21033,6 +20974,9 @@ msgstr "No s'ha detectat cap sessió vàlida. Voleu continuar amb l'inici de ses msgid "Success!" msgstr "Èxit!" +msgid "Generate API Key" +msgstr "" + msgid "Are you sure to log out?" msgstr "Estàs segur de tancar sessió?" @@ -22088,13 +22032,6 @@ msgstr "El connector de xarxa Bambu és necessari per a les funcions del núvol, msgid "Error: %s" msgstr "Error: %s" -msgid "Show details" -msgstr "Mostra detalls" - -# AI Translated -msgid "Hide details" -msgstr "Amagar els detalls" - msgid "Version to install:" msgstr "Versió a instal·lar:" @@ -24751,6 +24688,12 @@ msgstr "" msgid "No binding for that field" msgstr "" +msgid "Enter a number" +msgstr "" + +msgid "Not a number" +msgstr "" + msgid "Primitive" msgstr "" @@ -24763,6 +24706,217 @@ msgstr "" msgid "Clear All" msgstr "" +msgctxt "Keyboard Shortcut" +msgid "Ins" +msgstr "" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Home" +msgstr "Inici" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "End" +msgstr "Fi" + +msgctxt "Keyboard Shortcut" +msgid "PgUp" +msgstr "" + +msgctxt "Keyboard Shortcut" +msgid "PgDn" +msgstr "" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Arrow Left" +msgstr "Fletxa esquerra" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Arrow Right" +msgstr "Fletxa dreta" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Arrow Up" +msgstr "Fletxa amunt" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Arrow Down" +msgstr "Fletxa avall" + +msgid "Import geometry data from STL/STEP/3MF/OBJ/AMF files" +msgstr "Importar dades de geometria des de fitxers STL/STEP/3MF/OBJ/AMF" + +msgid "Select all objects" +msgstr "Seleccionar tots els objectes" + +msgid "Paste from clipboard" +msgstr "Enganxa des del porta-retalls" + +# AI Translated +msgid "Toggle printable for object/part" +msgstr "Commutar la impressibilitat de l'objecte/peça" + +msgid "Move selection 10mm in negative X direction" +msgstr "Moure la selecció 10 mm en direcció X negativa" + +msgid "Move selection 10mm in positive X direction" +msgstr "Moure la selecció 10 mm en direcció X positiva" + +msgid "Move selection 10mm in positive Y direction" +msgstr "Moure la selecció 10 mm en direcció Y positiva" + +msgid "Move selection 10mm in negative Y direction" +msgstr "Moure la selecció 10 mm en direcció Y negativa" + +msgid "Rotate selection 45 degrees counterclockwise" +msgstr "" + +msgid "Rotate selection 45 degrees clockwise" +msgstr "" + +msgid "Gizmo move" +msgstr "Gizmo de Moviment" + +msgid "Gizmo rotate" +msgstr "Gizmo de Rotació" + +msgid "Gizmo scale" +msgstr "Gizmo d'Escala" + +msgid "Gizmo place face on bed" +msgstr "Gizmo de recolzament sobre la Cara a la placa" + +msgid "Gizmo cut" +msgstr "Gizmo de Tall" + +msgid "Gizmo mesh boolean" +msgstr "Gizmo booleà de malla" + +msgid "Gizmo FDM paint-on supports" +msgstr "" + +msgid "Gizmo FDM paint-on seam" +msgstr "Eina de Pintat de costures FDM" + +msgid "Gizmo FDM paint-on fuzzy skin" +msgstr "Eina FDM per a pell difusa pintada" + +msgid "Gizmo multi-material painting" +msgstr "" + +msgid "Gizmo text emboss/engrave" +msgstr "Gizmo de text en relleu/gravat" + +msgid "Gizmo measure" +msgstr "Gizmo mesurar" + +msgid "Gizmo assemble" +msgstr "Gizmo ensamblar" + +msgid "Gizmo brim ears" +msgstr "Gizmo orelles de la Vora d'Adherència" + +msgid "Vertical slider - Move active thumb Up" +msgstr "Barra de desplaçament Vertical - Mou el barra de desplaçament actiu cap Amunt" + +msgid "Vertical slider - Move active thumb Down" +msgstr "Barra de desplaçament Vertical - Mou el barra de desplaçament actiu cap Avall" + +msgid "Horizontal slider - Move active thumb Left" +msgstr "Barra de desplaçament Horitzontal - Mou el barra de desplaçament actiu cap a l'Esquerra" + +msgid "Horizontal slider - Move active thumb Right" +msgstr "Barra de desplaçament Horitzontal - Mou la barra de desplaçament activa cap a la Dreta" + +msgid "Horizontal slider - Move to start position" +msgstr "Control lliscant horitzontal - Mou fins a la posició inicial" + +msgid "Horizontal slider - Move to last position" +msgstr "Control lliscant horitzontal - Mou a l'última posició" + +msgid "Camera view - Default" +msgstr "Vista de càmera - Predeterminada" + +msgid "Camera view - Top" +msgstr "Vista de càmera - Part Superior" + +msgid "Camera view - Bottom" +msgstr "Vista de càmera - Part Inferior" + +msgid "Camera view - Front" +msgstr "Vista de càmera - Frontal" + +msgid "Camera view - Behind" +msgstr "Vista de càmera - Darrere" + +msgid "Camera Angle - Left side" +msgstr "Angle de càmera - Costat Esquerre" + +msgid "Camera Angle - Right side" +msgstr "Angle de càmera - Costat Dret" + +msgid "Camera view - Current plate" +msgstr "" + +msgid "Zoom in" +msgstr "Augmentar zoom" + +msgid "Zoom out" +msgstr "Reduir zoom" + +msgid "Show/Hide 3Dconnexion devices settings dialog" +msgstr "Mostrar/Amagar quadre de diàleg Configuració de Dispositius 3Dconnexion" + +msgid "Show/Hide wireframe" +msgstr "" + +msgid "On/Off G-code window" +msgstr "Activar/Desactivar finestra de Codi-G" + +msgid "On/Off one layer mode of the vertical slider" +msgstr "Activar/desactivar el mode de capa única de la barra de desplaçament vertical" + +msgid "Switch between Prepare/Preview" +msgstr "Canviar entre Preparar/Previsualitzar" + +msgid "Collapse/Expand the sidebar" +msgstr "Replegar/Expandir barra lateral" + +msgid "Open the speed dial" +msgstr "" + +msgid "Reload the device page" +msgstr "" + +msgid "Show keyboard shortcuts list" +msgstr "Mostrar la llista de dreceres de teclat" + +msgid "Slicing and printing" +msgstr "" + +msgid "Editing" +msgstr "" + +msgid "Placement" +msgstr "" + +msgid "Gizmos" +msgstr "" + +msgid "Sliders" +msgstr "" + +msgid "Painting tools" +msgstr "" + +msgid "Application" +msgstr "" + #: resources/data/hints.ini: [hint:Precise wall] msgid "" "Precise wall\n" @@ -25064,6 +25218,66 @@ msgstr "" "Evitar la deformació( warping )\n" "Sabíeu que quan imprimiu materials propensos a deformar-se, com ara l'ABS, augmentar adequadament la temperatura del llit pot reduir la probabilitat de deformació?" +# AI Translated +#~ msgid "Tab" +#~ msgstr "Pestanya" + +# AI Translated +#~ msgid "Displays current viewport FPS in the top-right corner." +#~ msgstr "Mostra els FPS actuals de la vista a la cantonada superior dreta." + +# AI Translated +#~ msgid "Publish 3MF Wiki" +#~ msgstr "Wiki de Publicar 3MF" + +# AI Translated +#~ msgid "Publish 3MF Video Guide" +#~ msgstr "Guia en vídeo de Publicar 3MF" + +#~ msgid "Toolbar" +#~ msgstr "Barra d’eines" + +#~ msgid "Switch table page" +#~ msgstr "Canviar de pàgina de taula" + +#~ msgid "Global shortcuts" +#~ msgstr "Dreceres Globals" + +# AI Translated +#~ msgid "Middle mouse button" +#~ msgstr "Botó central del ratolí" + +#~ msgid "Auto orients selected objects or all objects. If there are selected objects, it just orients the selected ones. Otherwise, it will orient all objects in the current project." +#~ msgstr "Orienta/alinea automàticament els objectes seleccionats o tots els objectes. Si hi ha objectes seleccionats, només orientarà/alinearà els seleccionats. En cas contrari, orientarà/alinearà tots els objectes del projecte actual." + +#~ msgid "Auto orients all objects on the active plate." +#~ msgstr "Orienta/alinea automàticament tots els objectes de la placa actual." + +#~ msgid "Any arrow" +#~ msgstr "Qualsevol fletxa" + +#~ msgid "Gizmo SLA support points" +#~ msgstr "Gizmo de Punts de suport SLA" + +#~ msgid "Plater" +#~ msgstr "Plataforma" + +# AI Translated +#~ msgid "Gizmo" +#~ msgstr "Gizmo" + +#~ msgid "Delete objects, parts, modifiers" +#~ msgstr "Eliminar objectes, peces, modificadors" + +#~ msgid "Objects List" +#~ msgstr "Llista d'Objectes" + +#~ msgid "G-code written at the very top of the output file, before any other content. Useful for adding metadata that printer firmware reads from the first lines of the file (e.g. estimated print time, filament usage). Supports placeholders like {print_time_sec} and {used_filament_length}." +#~ msgstr "G-code escrit al començament del fitxer de sortida, abans de qualsevol altre contingut. Útil per afegir metadades que el firmware de la impressora llegeix de les primeres línies del fitxer (p. ex. temps d'impressió estimat, ús de filament). Admet espais reservats com {print_time_sec} i {used_filament_length}." + +#~ msgid "Print time (seconds)" +#~ msgstr "Temps d'impressió (segons)" + # AI Translated #~ msgid "Open actions speed dial" #~ msgstr "Obrir el marcatge ràpid d'accions" diff --git a/localization/i18n/cs/OrcaSlicer_cs.po b/localization/i18n/cs/OrcaSlicer_cs.po index 5518d1d81e..c676d09a9a 100644 --- a/localization/i18n/cs/OrcaSlicer_cs.po +++ b/localization/i18n/cs/OrcaSlicer_cs.po @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-09-18 15:50+0800\n" +"POT-Creation-Date: 2026-09-22 12:39+0800\n" "PO-Revision-Date: \n" "Last-Translator: Jakub Hencl\n" "Language-Team: \n" @@ -5976,12 +5976,15 @@ msgctxt "Camera View" msgid "Right" msgstr "Pravý" -msgid "Add" -msgstr "Přidat" - msgid "Add plate" msgstr "Přidat desku" +msgid "Split to objects" +msgstr "Rozdělit na objekty" + +msgid "Add" +msgstr "Přidat" + msgid "Auto orient all/selected objects" msgstr "Automaticky orientovat všechny/vybrané objekty" @@ -5994,9 +5997,6 @@ msgstr "Rozložit všechny objekty" msgid "Arrange objects on selected plates" msgstr "Rozložit objekty na vybraných deskách" -msgid "Split to objects" -msgstr "Rozdělit na objekty" - msgid "Assembly View" msgstr "Zobrazení sestavy" @@ -6054,6 +6054,9 @@ msgstr "Obrys" msgid "Wireframe" msgstr "Drátový model" +msgid "X-Ray" +msgstr "" + # AI Translated msgid "Realistic View" msgstr "Realistické zobrazení" @@ -6599,7 +6602,7 @@ msgstr "Zobrazit obrys kolem vybraného objektu ve 3D scéně." msgid "Preferences" msgstr "Předvolby" -msgid "Open speed dial..." +msgid "Open speed dial" msgstr "" # AI Translated @@ -8436,10 +8439,6 @@ msgstr "Rozbalit postranní panel" msgid "Collapse sidebar" msgstr "Sbalit postranní panel" -# AI Translated -msgid "Tab" -msgstr "Tab" - #, c-format, boost-format msgid "Loading file: %s" msgstr "Načítání souboru: %s" @@ -9463,10 +9462,10 @@ msgstr "Správa více zařízení" msgid "With this option enabled, you can send a task to multiple devices at the same time and manage multiple devices." msgstr "Pokud je tato volba povolena, můžete odeslat úlohu na více zařízení současně a spravovat více zařízení." -msgid "Open the Speed Dial with the Space key" +msgid "Open the Speed Dial from the keyboard" msgstr "" -msgid "When enabled, pressing Space (with no other key held) opens the Speed Dial action search from any page." +msgid "When enabled, the Speed Dial keyboard shortcut (Space by default) opens the action search from any page." msgstr "" msgid "Recent actions" @@ -9606,6 +9605,15 @@ msgstr "Tažení pravým tlačítkem myši" msgid "Set the action that dragging the right mouse button should perform." msgstr "Nastavte akci, kterou má provádět tažení pravým tlačítkem myši." +msgid "Keyboard" +msgstr "" + +msgid "Keyboard shortcuts" +msgstr "" + +msgid "Choose the key for each action." +msgstr "" + msgid "Clear my choice on..." msgstr "Vymazat mou volbu pro..." @@ -9730,13 +9738,40 @@ msgstr "" "Omezuje snímkovou frekvenci zobrazení, aby se snížila zátěž GPU a spotřeba energie.\n" "Nastavte 0 pro neomezenou snímkovou frekvenci." +msgid "Reuse the 3D scene while idle" +msgstr "" + +msgid "" +"Skips redrawing the 3D scene when only the mouse cursor moves over the viewport,\n" +"and reuses the previous frame's scene instead. Reduces GPU load.\n" +"Disable it if the viewport shows stale or missing contents.\n" +"\n" +"Takes effect immediately." +msgstr "" + +msgid "Skip unchanged frames" +msgstr "" + +msgid "" +"Skips drawing a frame altogether when it would be identical to the one already on screen.\n" +"Only applies to frames that reuse the 3D scene, so it needs Reuse the 3D scene while idle.\n" +"Disable it if a hover highlight, tooltip or animation stops updating.\n" +"\n" +"Takes effect immediately." +msgstr "" + # AI Translated msgid "Show FPS overlay" msgstr "Zobrazit překryv s FPS" -# AI Translated -msgid "Displays current viewport FPS in the top-right corner." -msgstr "Zobrazuje aktuální FPS zobrazení v pravém horním rohu." +msgid "Displays rendering counts in the top-right corner of the viewport." +msgstr "" + +msgid "FPS: frames presented to the screen per second." +msgstr "" + +msgid "3D: frames per second that redrew the 3D scene." +msgstr "" # AI Translated msgid "G-code Preview" @@ -10208,13 +10243,8 @@ msgstr "Publikovat 3MF..." msgid "Select which settings to be published in the 3MF file" msgstr "Vyberte, která nastavení se mají publikovat v souboru 3MF" -# AI Translated -msgid "Publish 3MF Wiki" -msgstr "Wiki k publikování 3MF" - -# AI Translated -msgid "Publish 3MF Video Guide" -msgstr "Videonávod k publikování 3MF" +msgid "Video Guide" +msgstr "" # AI Translated msgid "Mixed filament - published as a whole when \"Enable\" above is selected" @@ -10417,6 +10447,14 @@ msgstr "" msgid "No wiki page for this action" msgstr "" +# AI Translated +msgid "Show details" +msgstr "Zobrazit podrobnosti" + +# AI Translated +msgid "Hide details" +msgstr "Skrýt podrobnosti" + #, c-format, boost-format msgid "\"%s\" is a Developer setting. Enable Developer mode to edit it?" msgstr "" @@ -12321,68 +12359,39 @@ msgstr "Konfigurační balíček byl změněn v předchozím průvodci nastaven msgid "Configuration package changed" msgstr "Balíček konfigurace byl změněn" -msgid "Toolbar" -msgstr "Panel nástrojů" - -msgid "Objects list" -msgstr "Seznam objektů" - -msgid "Import geometry data from STL/STEP/3MF/OBJ/AMF files" -msgstr "Importovat geometrická data ze souborů STL/STEP/3MF/OBJ/AMF" - -msgid "Paste from clipboard" -msgstr "Vložit ze schránky" - -msgid "Show/Hide 3Dconnexion devices settings dialog" -msgstr "Zobrazit/Skrýt dialog nastavení zařízení 3Dconnexion" - -msgid "Switch table page" -msgstr "Přepnout stránku tabulky" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Space" -msgstr "Mezerník" - -msgid "Open speed dial" -msgstr "" - -msgid "Run a Speed Dial favourite (while the Speed Dial is open)" -msgstr "" - -msgid "Show keyboard shortcuts list" -msgstr "Zobrazit seznam klávesových zkratek" - -msgid "Global shortcuts" -msgstr "Globální klávesové zkratky" - msgid "Pan View" msgstr "Posun pohledu" msgid "Rotate View" msgstr "Otočit pohled" +#, c-format, boost-format +msgid "Use %s or %s, or a key that does not type a character." +msgstr "" + +msgctxt "Keyboard Shortcut" +msgid "Key" +msgstr "" + +msgid "Left mouse" +msgstr "" + +msgid "Available anywhere in the window, even while typing in a text field." +msgstr "" + +msgid "Run a speed dial favorite while the dial is open" +msgstr "" + # AI Translated -msgid "Middle mouse button" -msgstr "Prostřední tlačítko myši" +msgctxt "Keyboard Shortcut" +msgid "Tab" +msgstr "Tab" -msgid "Zoom View" -msgstr "Přiblížení pohledu" +msgid "Switch to the next main tab" +msgstr "" -msgid "Auto orients selected objects or all objects. If there are selected objects, it just orients the selected ones. Otherwise, it will orient all objects in the current project." -msgstr "Automaticky orientuje vybrané nebo všechny objekty. Pokud jsou vybrané objekty, orientuje pouze tyto. Jinak orientuje všechny objekty v aktuálním projektu." - -msgid "Auto orients all objects on the active plate." -msgstr "Automaticky orientuje všechny objekty na aktivní desce." - -msgid "Collapse/Expand the sidebar" -msgstr "Sbalit/rozbalit postranní panel" - -msgid "Any arrow" -msgstr "Libovolná šipka" - -msgid "Movement in camera space" -msgstr "Pohyb v prostoru kamery" +msgid "Available while the 3D view on the Prepare tab has focus." +msgstr "" msgid "Select a part" msgstr "Vyberte část" @@ -12393,127 +12402,29 @@ msgstr "Vyberte více objektů" msgid "Select objects by rectangle" msgstr "Vyberte objekty obdélníkem" -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Arrow Up" -msgstr "Šipka nahoru" - -msgid "Move selection 10mm in positive Y direction" -msgstr "Přesuňte výběr o 10 mm v kladném směru osy Y" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Arrow Down" -msgstr "Šipka dolů" - -msgid "Move selection 10mm in negative Y direction" -msgstr "Přesuňte výběr o 10 mm v záporném směru osy Y" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Arrow Left" -msgstr "Šipka vlevo" - -msgid "Move selection 10mm in negative X direction" -msgstr "Přesuňte výběr o 10 mm v záporném směru osy X" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Arrow Right" -msgstr "Šipka vpravo" - -msgid "Move selection 10mm in positive X direction" -msgstr "Přesuňte výběr o 10 mm v kladném směru osy X" +msgid "Keyboard 1-9: set filament for object/part" +msgstr "Klávesy 1–9: nastavit filament pro objekt/část" msgid "Movement step set to 1mm" msgstr "Krok pohybu nastaven na 1 mm" -msgid "Keyboard 1-9: set filament for object/part" -msgstr "Klávesy 1–9: nastavit filament pro objekt/část" +msgid "Movement in camera space" +msgstr "Pohyb v prostoru kamery" -msgid "Camera view - Default" -msgstr "Pohled kamery – výchozí" +msgid "Middle mouse" +msgstr "" -msgid "Camera view - Top" -msgstr "Pohled kamery – shora" +msgid "Right mouse" +msgstr "" -msgid "Camera view - Bottom" -msgstr "Pohled kamery – zespodu" +msgid "Zoom View" +msgstr "Přiblížení pohledu" -msgid "Camera view - Front" -msgstr "Pohled kamery – zepředu" +msgid "Painting" +msgstr "" -msgid "Camera view - Behind" -msgstr "Pohled kamery – zezadu" - -msgid "Camera Angle - Left side" -msgstr "Úhel kamery – levá strana" - -msgid "Camera Angle - Right side" -msgstr "Úhel kamery – pravá strana" - -msgid "Select all objects" -msgstr "Vybrat všechny objekty" - -msgid "Gizmo move" -msgstr "Gizmo posouvat" - -msgid "Gizmo rotate" -msgstr "Gizmo otočit" - -msgid "Gizmo scale" -msgstr "Gizmo změnit měřítko" - -msgid "Gizmo place face on bed" -msgstr "Gizmo umístit plochu na podložku" - -msgid "Gizmo cut" -msgstr "Gizmo řezat" - -# AI Translated -msgid "Gizmo mesh boolean" -msgstr "Gizmo booleovské operace se sítí" - -msgid "Gizmo FDM paint-on fuzzy skin" -msgstr "Gizmo FDM malování efektu chlupatého povrchu" - -msgid "Gizmo SLA support points" -msgstr "Gizmo SLA podpůrné body" - -msgid "Gizmo FDM paint-on seam" -msgstr "Gizmo FDM malování švu" - -msgid "Gizmo text emboss/engrave" -msgstr "Gizmo text vystouplý/gravírovaný" - -msgid "Gizmo measure" -msgstr "Gizmo měření" - -msgid "Gizmo assemble" -msgstr "Gizmo sestavit" - -msgid "Gizmo brim ears" -msgstr "Gizmo ouška lemu" - -msgid "Zoom in" -msgstr "Přiblížit" - -msgid "Zoom out" -msgstr "Oddálit" - -msgid "Toggle printable for object/part" -msgstr "Přepnout tisknutelnost objektu/části" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Tab" -msgstr "Tab" - -msgid "Switch between Prepare/Preview" -msgstr "Přepnout mezi Přípravou/Náhledem" - -msgid "Plater" -msgstr "Deska" +msgid "Available while a painting gizmo is open: supports, seam, fuzzy skin or color painting." +msgstr "" msgid "Move: press to snap by 1mm" msgstr "Pohyb: stiskněte pro posun o 1 mm" @@ -12524,15 +12435,19 @@ msgstr "Podpora/barva malování: nastavení poloměru pera" msgid "Support/Color Painting: adjust section position" msgstr "Podpora/barva malování: nastavení pozice úseku" -# AI Translated -msgid "Gizmo" -msgstr "Gizmo" +msgid "Objects list" +msgstr "Seznam objektů" + +msgid "Available while the object list has focus." +msgstr "" msgid "Set extruder number for the objects and parts" msgstr "Nastavit číslo extruderu pro objekty a části" -msgid "Delete objects, parts, modifiers" -msgstr "Smazat objekty, části, modifikátory" +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Space" +msgstr "Mezerník" msgid "Select the object/part and press space to change the name" msgstr "Vyberte objekt/část a stiskněte mezerník pro změnu názvu" @@ -12543,45 +12458,48 @@ msgstr "Kliknutí myší" msgid "Select the object/part and mouse click to change the name" msgstr "Vyberte objekt/část a klikněte myší pro změnu názvu" -msgid "Objects List" -msgstr "Seznam objektů" - -msgid "Vertical slider - Move active thumb Up" -msgstr "Vertikální posuvník – Posuňte aktivní jezdec nahoru" - -msgid "Vertical slider - Move active thumb Down" -msgstr "Vertikální posuvník – posuňte aktivní jezdec dolů" - -msgid "Horizontal slider - Move active thumb Left" -msgstr "Vodorovný posuvník – posunout aktivní jezdec vlevo" - -msgid "Horizontal slider - Move active thumb Right" -msgstr "Vodorovný posuvník – posunout aktivní jezdec vpravo" - -msgid "On/Off one layer mode of the vertical slider" -msgstr "Zapnout/vypnout režim jedné vrstvy na vertikálním posuvníku" - -msgid "On/Off G-code window" -msgstr "Zapnout/vypnout okno G-code" +msgid "Available while the 3D view on the Preview tab has focus." +msgstr "" msgid "Move slider 5x faster" msgstr "Posouvejte posuvník 5× rychleji" -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Home" -msgstr "Home" +msgid "Scroll slider 5x faster" +msgstr "" -msgid "Horizontal slider - Move to start position" -msgstr "Vodorovný posuvník – přesunout na začátek" +msgid "Not customizable" +msgstr "" -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "End" -msgstr "End" +#, c-format, boost-format +msgid "%s is assigned to %s. Reassign it to %s?" +msgstr "" -msgid "Horizontal slider - Move to last position" -msgstr "Vodorovný posuvník – přesunout na poslední pozici" +#, c-format, boost-format +msgid "The default %s is assigned to %s. Reassign it to %s?" +msgstr "" + +msgid "Global shortcuts also apply while typing." +msgstr "" + +msgid "A key that types a character cannot be a global shortcut." +msgstr "" + +msgid "Esc cancels, Enter confirms." +msgstr "" + +#, c-format, boost-format +msgid "" +"Press the new shortcut for\n" +"\"%s\"" +msgstr "" + +#, c-format, boost-format +msgid "Already used as a step of %s." +msgstr "" + +#, c-format, boost-format +msgid "Already assigned to %s. Press OK to reassign it." +msgstr "" msgid "Release Note" msgstr "Poznámky k vydání" @@ -17532,8 +17450,8 @@ msgstr "Kroky předehřevu" msgid "Insert multiple preheat commands (e.g. M104.1). Only useful for Prusa XL. For other printers, please set it to 1." msgstr "Vložte více příkazů pro předehřev (např. M104.1). Pouze pro Prusa XL. U ostatních tiskáren nastavte na 1." -msgid "G-code written at the very top of the output file, before any other content. Useful for adding metadata that printer firmware reads from the first lines of the file (e.g. estimated print time, filament usage). Supports placeholders like {print_time_sec} and {used_filament_length}." -msgstr "G-code zapsaný na úplný začátek výstupního souboru před jakýkoli další obsah. Užitečné pro přidání metadat, která firmware tiskárny čte z prvních řádků souboru (např. odhadovaná doba tisku nebo spotřeba filamentu). Podporuje zástupné proměnné jako {print_time_sec} a {used_filament_length}." +msgid "G-code written at the very top of the output file, before any other content. Useful for adding metadata that printer firmware reads from the first lines of the file (e.g. estimated print time, filament usage). Supports placeholders like {print_time_total_sec}, {print_time_day}, {print_time_hour}, {print_time_minute}, {print_time_sec} and {used_filament_length}." +msgstr "" # AI Translated msgid "Start G-code" @@ -19075,12 +18993,36 @@ msgstr "Použitý filament" msgid "Total length of filament used in the print." msgstr "Celková délka filamentu použitého při tisku." -msgid "Print time (seconds)" -msgstr "Doba tisku (sekundy)" +msgid "Print time (total seconds)" +msgstr "" msgid "Total estimated print time in seconds. Replaced with actual value during post-processing." msgstr "Celková odhadovaná doba tisku v sekundách. Během následného zpracování bude nahrazena skutečnou hodnotou." +msgid "Print time (days component)" +msgstr "" + +msgid "Estimated print time day component (normal mode). Replaced with actual value during post-processing." +msgstr "" + +msgid "Print time (hours component)" +msgstr "" + +msgid "Estimated print time hour component (normal mode). Replaced with actual value during post-processing." +msgstr "" + +msgid "Print time (minutes component)" +msgstr "" + +msgid "Estimated print time minute component (normal mode). Replaced with actual value during post-processing." +msgstr "" + +msgid "Print time (seconds component)" +msgstr "" + +msgid "Estimated print time second component (normal mode). Replaced with actual value during post-processing." +msgstr "" + msgid "Filament length (meters)" msgstr "Délka filamentu (metry)" @@ -20950,6 +20892,9 @@ msgstr "Nebyla zjištěna platná relace. Pokračovat přihlášením do 3DPrint msgid "Success!" msgstr "Úspěch!" +msgid "Generate API Key" +msgstr "" + msgid "Are you sure to log out?" msgstr "Opravdu se chcete odhlásit?" @@ -22041,14 +21986,6 @@ msgstr "Síťový plug-in Bambu je nutný pro cloudové funkce, vyhledávání t msgid "Error: %s" msgstr "Chyba: %s" -# AI Translated -msgid "Show details" -msgstr "Zobrazit podrobnosti" - -# AI Translated -msgid "Hide details" -msgstr "Skrýt podrobnosti" - # AI Translated msgid "Version to install:" msgstr "Verze k instalaci:" @@ -24731,6 +24668,12 @@ msgstr "" msgid "No binding for that field" msgstr "" +msgid "Enter a number" +msgstr "" + +msgid "Not a number" +msgstr "" + msgid "Primitive" msgstr "" @@ -24743,6 +24686,217 @@ msgstr "" msgid "Clear All" msgstr "" +msgctxt "Keyboard Shortcut" +msgid "Ins" +msgstr "" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Home" +msgstr "Home" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "End" +msgstr "End" + +msgctxt "Keyboard Shortcut" +msgid "PgUp" +msgstr "" + +msgctxt "Keyboard Shortcut" +msgid "PgDn" +msgstr "" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Arrow Left" +msgstr "Šipka vlevo" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Arrow Right" +msgstr "Šipka vpravo" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Arrow Up" +msgstr "Šipka nahoru" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Arrow Down" +msgstr "Šipka dolů" + +msgid "Import geometry data from STL/STEP/3MF/OBJ/AMF files" +msgstr "Importovat geometrická data ze souborů STL/STEP/3MF/OBJ/AMF" + +msgid "Select all objects" +msgstr "Vybrat všechny objekty" + +msgid "Paste from clipboard" +msgstr "Vložit ze schránky" + +msgid "Toggle printable for object/part" +msgstr "Přepnout tisknutelnost objektu/části" + +msgid "Move selection 10mm in negative X direction" +msgstr "Přesuňte výběr o 10 mm v záporném směru osy X" + +msgid "Move selection 10mm in positive X direction" +msgstr "Přesuňte výběr o 10 mm v kladném směru osy X" + +msgid "Move selection 10mm in positive Y direction" +msgstr "Přesuňte výběr o 10 mm v kladném směru osy Y" + +msgid "Move selection 10mm in negative Y direction" +msgstr "Přesuňte výběr o 10 mm v záporném směru osy Y" + +msgid "Rotate selection 45 degrees counterclockwise" +msgstr "" + +msgid "Rotate selection 45 degrees clockwise" +msgstr "" + +msgid "Gizmo move" +msgstr "Gizmo posouvat" + +msgid "Gizmo rotate" +msgstr "Gizmo otočit" + +msgid "Gizmo scale" +msgstr "Gizmo změnit měřítko" + +msgid "Gizmo place face on bed" +msgstr "Gizmo umístit plochu na podložku" + +msgid "Gizmo cut" +msgstr "Gizmo řezat" + +# AI Translated +msgid "Gizmo mesh boolean" +msgstr "Gizmo booleovské operace se sítí" + +msgid "Gizmo FDM paint-on supports" +msgstr "" + +msgid "Gizmo FDM paint-on seam" +msgstr "Gizmo FDM malování švu" + +msgid "Gizmo FDM paint-on fuzzy skin" +msgstr "Gizmo FDM malování efektu chlupatého povrchu" + +msgid "Gizmo multi-material painting" +msgstr "" + +msgid "Gizmo text emboss/engrave" +msgstr "Gizmo text vystouplý/gravírovaný" + +msgid "Gizmo measure" +msgstr "Gizmo měření" + +msgid "Gizmo assemble" +msgstr "Gizmo sestavit" + +msgid "Gizmo brim ears" +msgstr "Gizmo ouška lemu" + +msgid "Vertical slider - Move active thumb Up" +msgstr "Vertikální posuvník – Posuňte aktivní jezdec nahoru" + +msgid "Vertical slider - Move active thumb Down" +msgstr "Vertikální posuvník – posuňte aktivní jezdec dolů" + +msgid "Horizontal slider - Move active thumb Left" +msgstr "Vodorovný posuvník – posunout aktivní jezdec vlevo" + +msgid "Horizontal slider - Move active thumb Right" +msgstr "Vodorovný posuvník – posunout aktivní jezdec vpravo" + +msgid "Horizontal slider - Move to start position" +msgstr "Vodorovný posuvník – přesunout na začátek" + +msgid "Horizontal slider - Move to last position" +msgstr "Vodorovný posuvník – přesunout na poslední pozici" + +msgid "Camera view - Default" +msgstr "Pohled kamery – výchozí" + +msgid "Camera view - Top" +msgstr "Pohled kamery – shora" + +msgid "Camera view - Bottom" +msgstr "Pohled kamery – zespodu" + +msgid "Camera view - Front" +msgstr "Pohled kamery – zepředu" + +msgid "Camera view - Behind" +msgstr "Pohled kamery – zezadu" + +msgid "Camera Angle - Left side" +msgstr "Úhel kamery – levá strana" + +msgid "Camera Angle - Right side" +msgstr "Úhel kamery – pravá strana" + +msgid "Camera view - Current plate" +msgstr "" + +msgid "Zoom in" +msgstr "Přiblížit" + +msgid "Zoom out" +msgstr "Oddálit" + +msgid "Show/Hide 3Dconnexion devices settings dialog" +msgstr "Zobrazit/Skrýt dialog nastavení zařízení 3Dconnexion" + +msgid "Show/Hide wireframe" +msgstr "" + +msgid "On/Off G-code window" +msgstr "Zapnout/vypnout okno G-code" + +msgid "On/Off one layer mode of the vertical slider" +msgstr "Zapnout/vypnout režim jedné vrstvy na vertikálním posuvníku" + +msgid "Switch between Prepare/Preview" +msgstr "Přepnout mezi Přípravou/Náhledem" + +msgid "Collapse/Expand the sidebar" +msgstr "Sbalit/rozbalit postranní panel" + +msgid "Open the speed dial" +msgstr "" + +msgid "Reload the device page" +msgstr "" + +msgid "Show keyboard shortcuts list" +msgstr "Zobrazit seznam klávesových zkratek" + +msgid "Slicing and printing" +msgstr "" + +msgid "Editing" +msgstr "" + +msgid "Placement" +msgstr "" + +msgid "Gizmos" +msgstr "" + +msgid "Sliders" +msgstr "" + +msgid "Painting tools" +msgstr "" + +msgid "Application" +msgstr "" + #: resources/data/hints.ini: [hint:Precise wall] msgid "" "Precise wall\n" @@ -25045,6 +25199,66 @@ msgstr "" "Zamezte kroucení\n" "Víte, že při tisku materiálů náchylných ke kroucení, jako je ABS, může vhodné zvýšení teploty vyhřívané desky snížit pravděpodobnost kroucení?" +# AI Translated +#~ msgid "Tab" +#~ msgstr "Tab" + +# AI Translated +#~ msgid "Displays current viewport FPS in the top-right corner." +#~ msgstr "Zobrazuje aktuální FPS zobrazení v pravém horním rohu." + +# AI Translated +#~ msgid "Publish 3MF Wiki" +#~ msgstr "Wiki k publikování 3MF" + +# AI Translated +#~ msgid "Publish 3MF Video Guide" +#~ msgstr "Videonávod k publikování 3MF" + +#~ msgid "Toolbar" +#~ msgstr "Panel nástrojů" + +#~ msgid "Switch table page" +#~ msgstr "Přepnout stránku tabulky" + +#~ msgid "Global shortcuts" +#~ msgstr "Globální klávesové zkratky" + +# AI Translated +#~ msgid "Middle mouse button" +#~ msgstr "Prostřední tlačítko myši" + +#~ msgid "Auto orients selected objects or all objects. If there are selected objects, it just orients the selected ones. Otherwise, it will orient all objects in the current project." +#~ msgstr "Automaticky orientuje vybrané nebo všechny objekty. Pokud jsou vybrané objekty, orientuje pouze tyto. Jinak orientuje všechny objekty v aktuálním projektu." + +#~ msgid "Auto orients all objects on the active plate." +#~ msgstr "Automaticky orientuje všechny objekty na aktivní desce." + +#~ msgid "Any arrow" +#~ msgstr "Libovolná šipka" + +#~ msgid "Gizmo SLA support points" +#~ msgstr "Gizmo SLA podpůrné body" + +#~ msgid "Plater" +#~ msgstr "Deska" + +# AI Translated +#~ msgid "Gizmo" +#~ msgstr "Gizmo" + +#~ msgid "Delete objects, parts, modifiers" +#~ msgstr "Smazat objekty, části, modifikátory" + +#~ msgid "Objects List" +#~ msgstr "Seznam objektů" + +#~ msgid "G-code written at the very top of the output file, before any other content. Useful for adding metadata that printer firmware reads from the first lines of the file (e.g. estimated print time, filament usage). Supports placeholders like {print_time_sec} and {used_filament_length}." +#~ msgstr "G-code zapsaný na úplný začátek výstupního souboru před jakýkoli další obsah. Užitečné pro přidání metadat, která firmware tiskárny čte z prvních řádků souboru (např. odhadovaná doba tisku nebo spotřeba filamentu). Podporuje zástupné proměnné jako {print_time_sec} a {used_filament_length}." + +#~ msgid "Print time (seconds)" +#~ msgstr "Doba tisku (sekundy)" + # AI Translated #~ msgid "Open actions speed dial" #~ msgstr "Otevřít rychlou nabídku akcí" diff --git a/localization/i18n/de/OrcaSlicer_de.po b/localization/i18n/de/OrcaSlicer_de.po index 4957eef170..7fefd18081 100644 --- a/localization/i18n/de/OrcaSlicer_de.po +++ b/localization/i18n/de/OrcaSlicer_de.po @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-09-18 15:50+0800\n" +"POT-Creation-Date: 2026-09-22 12:39+0800\n" "PO-Revision-Date: \n" "Last-Translator: Heiko Liebscher \n" "Language-Team: \n" @@ -5873,12 +5873,15 @@ msgctxt "Camera View" msgid "Right" msgstr "rechts" -msgid "Add" -msgstr "Hinzufügen" - msgid "Add plate" msgstr "Druckplatte hinzufügen" +msgid "Split to objects" +msgstr "In Objekte trennen" + +msgid "Add" +msgstr "Hinzufügen" + msgid "Auto orient all/selected objects" msgstr "Alle/ausgewählte Objekte automatische Ausrichtung" @@ -5891,9 +5894,6 @@ msgstr "Alle Objekte anordnen" msgid "Arrange objects on selected plates" msgstr "Objekte auf ausgewählten Druckplatten anordnen" -msgid "Split to objects" -msgstr "In Objekte trennen" - msgid "Assembly View" msgstr "Montageansicht" @@ -5949,6 +5949,9 @@ msgstr "Umriss" msgid "Wireframe" msgstr "Gittermodell" +msgid "X-Ray" +msgstr "" + msgid "Realistic View" msgstr "Realistische Ansicht" @@ -6487,7 +6490,7 @@ msgstr "Kontur um das ausgewählte Objekt in der 3D-Szene anzeigen." msgid "Preferences" msgstr "Einstellungen" -msgid "Open speed dial..." +msgid "Open speed dial" msgstr "" # AI Translated @@ -8304,10 +8307,6 @@ msgstr "Seitenleiste erweitern" msgid "Collapse sidebar" msgstr "Seitenleiste reduzieren" -# AI Translated -msgid "Tab" -msgstr "Tab" - #, c-format, boost-format msgid "Loading file: %s" msgstr "Datei wird geladen: %s" @@ -9334,10 +9333,10 @@ msgstr "Multi-Geräte-Verwaltung" msgid "With this option enabled, you can send a task to multiple devices at the same time and manage multiple devices." msgstr "Wenn diese Option aktiviert ist, können Sie eine Aufgabe gleichzeitig an mehrere Geräte senden und mehrere Geräte verwalten." -msgid "Open the Speed Dial with the Space key" +msgid "Open the Speed Dial from the keyboard" msgstr "" -msgid "When enabled, pressing Space (with no other key held) opens the Speed Dial action search from any page." +msgid "When enabled, the Speed Dial keyboard shortcut (Space by default) opens the action search from any page." msgstr "" msgid "Recent actions" @@ -9469,6 +9468,15 @@ msgstr "Rechte Maustaste drücken" msgid "Set the action that dragging the right mouse button should perform." msgstr "Legen Sie die Aktion fest, die das Ziehen der rechten Maustaste ausführen soll." +msgid "Keyboard" +msgstr "" + +msgid "Keyboard shortcuts" +msgstr "" + +msgid "Choose the key for each action." +msgstr "" + msgid "Clear my choice on..." msgstr "Meine Auswahl löschen bei ..." @@ -9579,11 +9587,39 @@ msgstr "" "Begrenzt die Bildrate des Viewports, um die GPU-Auslastung und den Energieverbrauch zu reduzieren.\n" "Auf 0 setzen für unbegrenzte Bildrate." +msgid "Reuse the 3D scene while idle" +msgstr "" + +msgid "" +"Skips redrawing the 3D scene when only the mouse cursor moves over the viewport,\n" +"and reuses the previous frame's scene instead. Reduces GPU load.\n" +"Disable it if the viewport shows stale or missing contents.\n" +"\n" +"Takes effect immediately." +msgstr "" + +msgid "Skip unchanged frames" +msgstr "" + +msgid "" +"Skips drawing a frame altogether when it would be identical to the one already on screen.\n" +"Only applies to frames that reuse the 3D scene, so it needs Reuse the 3D scene while idle.\n" +"Disable it if a hover highlight, tooltip or animation stops updating.\n" +"\n" +"Takes effect immediately." +msgstr "" + msgid "Show FPS overlay" msgstr "FPS-Overlay anzeigen" -msgid "Displays current viewport FPS in the top-right corner." -msgstr "Zeigt die aktuelle FPS des Viewports in der oberen rechten Ecke an." +msgid "Displays rendering counts in the top-right corner of the viewport." +msgstr "" + +msgid "FPS: frames presented to the screen per second." +msgstr "" + +msgid "3D: frames per second that redrew the 3D scene." +msgstr "" # AI Translated msgid "G-code Preview" @@ -10042,13 +10078,8 @@ msgstr "3MF veröffentlichen..." msgid "Select which settings to be published in the 3MF file" msgstr "Wählen Sie aus, welche Einstellungen in der 3MF-Datei veröffentlicht werden" -# AI Translated -msgid "Publish 3MF Wiki" -msgstr "Wiki: 3MF veröffentlichen" - -# AI Translated -msgid "Publish 3MF Video Guide" -msgstr "Videoanleitung: 3MF veröffentlichen" +msgid "Video Guide" +msgstr "" # AI Translated msgid "Mixed filament - published as a whole when \"Enable\" above is selected" @@ -10250,6 +10281,13 @@ msgstr "" msgid "No wiki page for this action" msgstr "" +msgid "Show details" +msgstr "Zeige Details" + +# AI Translated +msgid "Hide details" +msgstr "Details ausblenden" + #, c-format, boost-format msgid "\"%s\" is a Developer setting. Enable Developer mode to edit it?" msgstr "" @@ -12080,67 +12118,39 @@ msgstr "Das Konfigurationspaket wurde im vorherigen Konfigurationsleitfaden geä msgid "Configuration package changed" msgstr "Konfigurationspaket geändert" -msgid "Toolbar" -msgstr "Werkzeugleiste" - -msgid "Objects list" -msgstr "Liste der Objekte" - -msgid "Import geometry data from STL/STEP/3MF/OBJ/AMF files" -msgstr "Importiere Geometriedaten aus STL/STEP/3MF/OBJ/AMF-Dateien" - -msgid "Paste from clipboard" -msgstr "Aus Zwischenablage einfügen" - -msgid "Show/Hide 3Dconnexion devices settings dialog" -msgstr "Dialogfeld für 3Dconnexion Geräteeinstellungen anzeigen/ausblenden" - -msgid "Switch table page" -msgstr "Seitenwechsel" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Space" -msgstr "Leertaste" - -msgid "Open speed dial" -msgstr "" - -msgid "Run a Speed Dial favourite (while the Speed Dial is open)" -msgstr "" - -msgid "Show keyboard shortcuts list" -msgstr "Liste der Tastaturkürzel anzeigen" - -msgid "Global shortcuts" -msgstr "Globale Tastaturkürzel" - msgid "Pan View" msgstr "Ansicht verschieben" msgid "Rotate View" msgstr "Ansicht drehen" -msgid "Middle mouse button" -msgstr "Mittlere Maustaste" +#, c-format, boost-format +msgid "Use %s or %s, or a key that does not type a character." +msgstr "" -msgid "Zoom View" -msgstr "Ansicht zoomen" +msgctxt "Keyboard Shortcut" +msgid "Key" +msgstr "" -msgid "Auto orients selected objects or all objects. If there are selected objects, it just orients the selected ones. Otherwise, it will orient all objects in the current project." -msgstr "Diese Funktion richtet ausgewählte Objekte oder alle Objekte automatisch aus. Wenn es ausgewählte Objekte gibt, werden nur die ausgewählten Objekte ausgerichtet. Andernfalls werden alle Objekte auf das aktuelle Projekt ausgerichtet." +msgid "Left mouse" +msgstr "" -msgid "Auto orients all objects on the active plate." -msgstr "Diese Funktion richtet alle Objekte auf der aktuellen Druckplatte ausgerichtet." +msgid "Available anywhere in the window, even while typing in a text field." +msgstr "" -msgid "Collapse/Expand the sidebar" -msgstr "Seitenleiste zu-/aufklappen" +msgid "Run a speed dial favorite while the dial is open" +msgstr "" -msgid "Any arrow" -msgstr "Beliebiger Pfeil" +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Tab" +msgstr "Tab" -msgid "Movement in camera space" -msgstr "Bewegung im Kameraraum" +msgid "Switch to the next main tab" +msgstr "" + +msgid "Available while the 3D view on the Prepare tab has focus." +msgstr "" msgid "Select a part" msgstr "Teil auswählen" @@ -12151,126 +12161,29 @@ msgstr "Mehrere Objekte auswählen" msgid "Select objects by rectangle" msgstr "Objekte per Rechteck auswählen" -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Arrow Up" -msgstr "Pfeil nach oben" - -msgid "Move selection 10mm in positive Y direction" -msgstr "Auswahl 10 mm in positiver Y-Richtung verschieben" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Arrow Down" -msgstr "Pfeil nach unten" - -msgid "Move selection 10mm in negative Y direction" -msgstr "Auswahl 10 mm in negativer Y-Richtung verschieben" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Arrow Left" -msgstr "Pfeil nach links" - -msgid "Move selection 10mm in negative X direction" -msgstr "Auswahl 10 mm in negativer X-Richtung verschieben" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Arrow Right" -msgstr "Pfeil nach rechts" - -msgid "Move selection 10mm in positive X direction" -msgstr "Auswahl 10 mm in positiver X-Richtung verschieben" +msgid "Keyboard 1-9: set filament for object/part" +msgstr "Tastatur 1-9: Filament für Objekt/Teil einstellen" msgid "Movement step set to 1mm" msgstr "Bewegungsschritt auf 1 mm eingestellt" -msgid "Keyboard 1-9: set filament for object/part" -msgstr "Tastatur 1-9: Filament für Objekt/Teil einstellen" +msgid "Movement in camera space" +msgstr "Bewegung im Kameraraum" -msgid "Camera view - Default" -msgstr "Kameraperspektive - Standard" +msgid "Middle mouse" +msgstr "" -msgid "Camera view - Top" -msgstr "Kameraperspektive - Oben" +msgid "Right mouse" +msgstr "" -msgid "Camera view - Bottom" -msgstr "Kameraperspektive - Unten" +msgid "Zoom View" +msgstr "Ansicht zoomen" -msgid "Camera view - Front" -msgstr "Kameraperspektive - Vorderseite" +msgid "Painting" +msgstr "" -msgid "Camera view - Behind" -msgstr "Kameraperspektive - Hinten" - -msgid "Camera Angle - Left side" -msgstr "Kameraperspektive - Links" - -msgid "Camera Angle - Right side" -msgstr "Kameraperspektive - Rechts" - -msgid "Select all objects" -msgstr "Alle Objekte auswählen" - -msgid "Gizmo move" -msgstr "Bewegen" - -msgid "Gizmo rotate" -msgstr "Rotieren" - -msgid "Gizmo scale" -msgstr "Skalieren" - -msgid "Gizmo place face on bed" -msgstr "Fläche auf druckbett platzieren" - -msgid "Gizmo cut" -msgstr "Trennen" - -msgid "Gizmo mesh boolean" -msgstr "Gizmo mesh-boolesche" - -msgid "Gizmo FDM paint-on fuzzy skin" -msgstr "FDM Pinsel auf Fuzzy Oberfläche" - -msgid "Gizmo SLA support points" -msgstr "SLA Stützpunkte" - -msgid "Gizmo FDM paint-on seam" -msgstr "FDM Naht aufmalen" - -msgid "Gizmo text emboss/engrave" -msgstr "Text prägen/gravieren" - -msgid "Gizmo measure" -msgstr "Gizmo messen" - -msgid "Gizmo assemble" -msgstr "Gizmo Zusammenbauen" - -msgid "Gizmo brim ears" -msgstr "Gizmo mausohren" - -msgid "Zoom in" -msgstr "Vergrößern" - -msgid "Zoom out" -msgstr "Verkleinern" - -msgid "Toggle printable for object/part" -msgstr "Druckbar für Objekt/Teil umschalten" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Tab" -msgstr "Tab" - -msgid "Switch between Prepare/Preview" -msgstr "Zwischen Vorbereiten/ Vorschau wechseln" - -msgid "Plater" -msgstr "Druckplatte" +msgid "Available while a painting gizmo is open: supports, seam, fuzzy skin or color painting." +msgstr "" msgid "Move: press to snap by 1mm" msgstr "Verschieben: Drücken, um in 1 mm einzurasten" @@ -12281,14 +12194,19 @@ msgstr "Stützen/Farbmalen: Stiftradius einstellen" msgid "Support/Color Painting: adjust section position" msgstr "Stützen/Farbmalen: Position des Abschnitts anpassen" -msgid "Gizmo" -msgstr "Gizmo" +msgid "Objects list" +msgstr "Liste der Objekte" + +msgid "Available while the object list has focus." +msgstr "" msgid "Set extruder number for the objects and parts" msgstr "Extrudernummer für die Objekte und Teile einstellen" -msgid "Delete objects, parts, modifiers" -msgstr "Objekte, Teile, Modifikatoren löschen" +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Space" +msgstr "Leertaste" msgid "Select the object/part and press space to change the name" msgstr "Wähle das Objekt/Teil aus und drücke die Leertaste, um den Namen zu ändern" @@ -12299,45 +12217,48 @@ msgstr "Mausklick" msgid "Select the object/part and mouse click to change the name" msgstr "Wähle das Objekt/Teil aus und klicke mit der Maus, um den Namen zu ändern" -msgid "Objects List" -msgstr "Objektliste" - -msgid "Vertical slider - Move active thumb Up" -msgstr "Vertikaler Schieberegler - Aktiven Schieber nach oben bewegen" - -msgid "Vertical slider - Move active thumb Down" -msgstr "Vertikaler Schieberegler - Aktiven Schieber nach unten bewegen" - -msgid "Horizontal slider - Move active thumb Left" -msgstr "Horizontaler Schieberegler - Aktiven Schieber nach links bewegen" - -msgid "Horizontal slider - Move active thumb Right" -msgstr "Horizontaler Schieberegler - Aktiven Schieber nach rechts bewegen" - -msgid "On/Off one layer mode of the vertical slider" -msgstr "Ein/Aus Einschichtmodus des vertikalen Schiebereglers" - -msgid "On/Off G-code window" -msgstr "Ein-/Ausblenden des G-Code-Fensters" +msgid "Available while the 3D view on the Preview tab has focus." +msgstr "" msgid "Move slider 5x faster" msgstr "Schieberegler 5x schneller bewegen" -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Home" -msgstr "Pos1" +msgid "Scroll slider 5x faster" +msgstr "" -msgid "Horizontal slider - Move to start position" -msgstr "Horizontaler Schieberegler - Zur Startposition bewegen" +msgid "Not customizable" +msgstr "" -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "End" -msgstr "Ende" +#, c-format, boost-format +msgid "%s is assigned to %s. Reassign it to %s?" +msgstr "" -msgid "Horizontal slider - Move to last position" -msgstr "Horizontaler Schieberegler - Zur letzten Position bewegen" +#, c-format, boost-format +msgid "The default %s is assigned to %s. Reassign it to %s?" +msgstr "" + +msgid "Global shortcuts also apply while typing." +msgstr "" + +msgid "A key that types a character cannot be a global shortcut." +msgstr "" + +msgid "Esc cancels, Enter confirms." +msgstr "" + +#, c-format, boost-format +msgid "" +"Press the new shortcut for\n" +"\"%s\"" +msgstr "" + +#, c-format, boost-format +msgid "Already used as a step of %s." +msgstr "" + +#, c-format, boost-format +msgid "Already assigned to %s. Press OK to reassign it." +msgstr "" msgid "Release Note" msgstr "Hinweis zur Veröffentlichung" @@ -17194,8 +17115,8 @@ msgstr "Vorheizschritte" msgid "Insert multiple preheat commands (e.g. M104.1). Only useful for Prusa XL. For other printers, please set it to 1." msgstr "Fügen Sie mehrere Vorheizbefehle ein (z.B. M104.1). Nur nützlich für Prusa XL. Für andere Drucker bitte auf 1 setzen." -msgid "G-code written at the very top of the output file, before any other content. Useful for adding metadata that printer firmware reads from the first lines of the file (e.g. estimated print time, filament usage). Supports placeholders like {print_time_sec} and {used_filament_length}." -msgstr "G-Code, der ganz oben in die Ausgabedatei geschrieben wird, vor allen anderen Inhalten. Nützlich zum Hinzufügen von Metadaten, die die Druckerfirmware aus den ersten Zeilen der Datei liest (z.B. geschätzte Druckzeit, Filamentverbrauch). Unterstützt Platzhalter wie {print_time_sec} und {used_filament_length}." +msgid "G-code written at the very top of the output file, before any other content. Useful for adding metadata that printer firmware reads from the first lines of the file (e.g. estimated print time, filament usage). Supports placeholders like {print_time_total_sec}, {print_time_day}, {print_time_hour}, {print_time_minute}, {print_time_sec} and {used_filament_length}." +msgstr "" # AI Translated msgid "Start G-code" @@ -18724,12 +18645,36 @@ msgstr "Genutztes Filament" msgid "Total length of filament used in the print." msgstr "Gesamtlänge des im Druck verwendeten Filaments." -msgid "Print time (seconds)" -msgstr "Druckzeit (Sekunden)" +msgid "Print time (total seconds)" +msgstr "" msgid "Total estimated print time in seconds. Replaced with actual value during post-processing." msgstr "Gesammt geschätzte Druckzeit in Sekunden. Ersetzt durch den tatsächlichen Wert während der Nachbearbeitung." +msgid "Print time (days component)" +msgstr "" + +msgid "Estimated print time day component (normal mode). Replaced with actual value during post-processing." +msgstr "" + +msgid "Print time (hours component)" +msgstr "" + +msgid "Estimated print time hour component (normal mode). Replaced with actual value during post-processing." +msgstr "" + +msgid "Print time (minutes component)" +msgstr "" + +msgid "Estimated print time minute component (normal mode). Replaced with actual value during post-processing." +msgstr "" + +msgid "Print time (seconds component)" +msgstr "" + +msgid "Estimated print time second component (normal mode). Replaced with actual value during post-processing." +msgstr "" + msgid "Filament length (meters)" msgstr "Filamentlänge (Meter)" @@ -20563,6 +20508,9 @@ msgstr "Keine gültige Sitzung erkannt. Mit dem Login bei 3DPrinterOS fortfahren msgid "Success!" msgstr "Erfolgreich!" +msgid "Generate API Key" +msgstr "" + msgid "Are you sure to log out?" msgstr "Sind Sie sicher, dass Sie sich abmelden möchten?" @@ -21518,13 +21466,6 @@ msgstr "Das Bambu Netzwerk Plug-in ist erforderlich für Cloud-Funktionen, Druck msgid "Error: %s" msgstr "Fehler: %s" -msgid "Show details" -msgstr "Zeige Details" - -# AI Translated -msgid "Hide details" -msgstr "Details ausblenden" - msgid "Version to install:" msgstr "Version zum Installieren:" @@ -24155,6 +24096,12 @@ msgstr "" msgid "No binding for that field" msgstr "" +msgid "Enter a number" +msgstr "" + +msgid "Not a number" +msgstr "" + msgid "Primitive" msgstr "" @@ -24167,6 +24114,216 @@ msgstr "" msgid "Clear All" msgstr "" +msgctxt "Keyboard Shortcut" +msgid "Ins" +msgstr "" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Home" +msgstr "Pos1" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "End" +msgstr "Ende" + +msgctxt "Keyboard Shortcut" +msgid "PgUp" +msgstr "" + +msgctxt "Keyboard Shortcut" +msgid "PgDn" +msgstr "" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Arrow Left" +msgstr "Pfeil nach links" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Arrow Right" +msgstr "Pfeil nach rechts" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Arrow Up" +msgstr "Pfeil nach oben" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Arrow Down" +msgstr "Pfeil nach unten" + +msgid "Import geometry data from STL/STEP/3MF/OBJ/AMF files" +msgstr "Importiere Geometriedaten aus STL/STEP/3MF/OBJ/AMF-Dateien" + +msgid "Select all objects" +msgstr "Alle Objekte auswählen" + +msgid "Paste from clipboard" +msgstr "Aus Zwischenablage einfügen" + +msgid "Toggle printable for object/part" +msgstr "Druckbar für Objekt/Teil umschalten" + +msgid "Move selection 10mm in negative X direction" +msgstr "Auswahl 10 mm in negativer X-Richtung verschieben" + +msgid "Move selection 10mm in positive X direction" +msgstr "Auswahl 10 mm in positiver X-Richtung verschieben" + +msgid "Move selection 10mm in positive Y direction" +msgstr "Auswahl 10 mm in positiver Y-Richtung verschieben" + +msgid "Move selection 10mm in negative Y direction" +msgstr "Auswahl 10 mm in negativer Y-Richtung verschieben" + +msgid "Rotate selection 45 degrees counterclockwise" +msgstr "" + +msgid "Rotate selection 45 degrees clockwise" +msgstr "" + +msgid "Gizmo move" +msgstr "Bewegen" + +msgid "Gizmo rotate" +msgstr "Rotieren" + +msgid "Gizmo scale" +msgstr "Skalieren" + +msgid "Gizmo place face on bed" +msgstr "Fläche auf druckbett platzieren" + +msgid "Gizmo cut" +msgstr "Trennen" + +msgid "Gizmo mesh boolean" +msgstr "Gizmo mesh-boolesche" + +msgid "Gizmo FDM paint-on supports" +msgstr "" + +msgid "Gizmo FDM paint-on seam" +msgstr "FDM Naht aufmalen" + +msgid "Gizmo FDM paint-on fuzzy skin" +msgstr "FDM Pinsel auf Fuzzy Oberfläche" + +msgid "Gizmo multi-material painting" +msgstr "" + +msgid "Gizmo text emboss/engrave" +msgstr "Text prägen/gravieren" + +msgid "Gizmo measure" +msgstr "Gizmo messen" + +msgid "Gizmo assemble" +msgstr "Gizmo Zusammenbauen" + +msgid "Gizmo brim ears" +msgstr "Gizmo mausohren" + +msgid "Vertical slider - Move active thumb Up" +msgstr "Vertikaler Schieberegler - Aktiven Schieber nach oben bewegen" + +msgid "Vertical slider - Move active thumb Down" +msgstr "Vertikaler Schieberegler - Aktiven Schieber nach unten bewegen" + +msgid "Horizontal slider - Move active thumb Left" +msgstr "Horizontaler Schieberegler - Aktiven Schieber nach links bewegen" + +msgid "Horizontal slider - Move active thumb Right" +msgstr "Horizontaler Schieberegler - Aktiven Schieber nach rechts bewegen" + +msgid "Horizontal slider - Move to start position" +msgstr "Horizontaler Schieberegler - Zur Startposition bewegen" + +msgid "Horizontal slider - Move to last position" +msgstr "Horizontaler Schieberegler - Zur letzten Position bewegen" + +msgid "Camera view - Default" +msgstr "Kameraperspektive - Standard" + +msgid "Camera view - Top" +msgstr "Kameraperspektive - Oben" + +msgid "Camera view - Bottom" +msgstr "Kameraperspektive - Unten" + +msgid "Camera view - Front" +msgstr "Kameraperspektive - Vorderseite" + +msgid "Camera view - Behind" +msgstr "Kameraperspektive - Hinten" + +msgid "Camera Angle - Left side" +msgstr "Kameraperspektive - Links" + +msgid "Camera Angle - Right side" +msgstr "Kameraperspektive - Rechts" + +msgid "Camera view - Current plate" +msgstr "" + +msgid "Zoom in" +msgstr "Vergrößern" + +msgid "Zoom out" +msgstr "Verkleinern" + +msgid "Show/Hide 3Dconnexion devices settings dialog" +msgstr "Dialogfeld für 3Dconnexion Geräteeinstellungen anzeigen/ausblenden" + +msgid "Show/Hide wireframe" +msgstr "" + +msgid "On/Off G-code window" +msgstr "Ein-/Ausblenden des G-Code-Fensters" + +msgid "On/Off one layer mode of the vertical slider" +msgstr "Ein/Aus Einschichtmodus des vertikalen Schiebereglers" + +msgid "Switch between Prepare/Preview" +msgstr "Zwischen Vorbereiten/ Vorschau wechseln" + +msgid "Collapse/Expand the sidebar" +msgstr "Seitenleiste zu-/aufklappen" + +msgid "Open the speed dial" +msgstr "" + +msgid "Reload the device page" +msgstr "" + +msgid "Show keyboard shortcuts list" +msgstr "Liste der Tastaturkürzel anzeigen" + +msgid "Slicing and printing" +msgstr "" + +msgid "Editing" +msgstr "" + +msgid "Placement" +msgstr "" + +msgid "Gizmos" +msgstr "" + +msgid "Sliders" +msgstr "" + +msgid "Painting tools" +msgstr "" + +msgid "Application" +msgstr "" + #: resources/data/hints.ini: [hint:Precise wall] msgid "" "Precise wall\n" @@ -24467,6 +24624,63 @@ msgstr "" "Verwerfungen vermeiden\n" "Wussten Sie, dass beim Drucken von Materialien, die zu Verwerfungen neigen, wie z.B. ABS, durch eine entsprechende Erhöhung der Heizbetttemperatur die Wahrscheinlichkeit von Verwerfungen verringert werden kann?" +# AI Translated +#~ msgid "Tab" +#~ msgstr "Tab" + +#~ msgid "Displays current viewport FPS in the top-right corner." +#~ msgstr "Zeigt die aktuelle FPS des Viewports in der oberen rechten Ecke an." + +# AI Translated +#~ msgid "Publish 3MF Wiki" +#~ msgstr "Wiki: 3MF veröffentlichen" + +# AI Translated +#~ msgid "Publish 3MF Video Guide" +#~ msgstr "Videoanleitung: 3MF veröffentlichen" + +#~ msgid "Toolbar" +#~ msgstr "Werkzeugleiste" + +#~ msgid "Switch table page" +#~ msgstr "Seitenwechsel" + +#~ msgid "Global shortcuts" +#~ msgstr "Globale Tastaturkürzel" + +#~ msgid "Middle mouse button" +#~ msgstr "Mittlere Maustaste" + +#~ msgid "Auto orients selected objects or all objects. If there are selected objects, it just orients the selected ones. Otherwise, it will orient all objects in the current project." +#~ msgstr "Diese Funktion richtet ausgewählte Objekte oder alle Objekte automatisch aus. Wenn es ausgewählte Objekte gibt, werden nur die ausgewählten Objekte ausgerichtet. Andernfalls werden alle Objekte auf das aktuelle Projekt ausgerichtet." + +#~ msgid "Auto orients all objects on the active plate." +#~ msgstr "Diese Funktion richtet alle Objekte auf der aktuellen Druckplatte ausgerichtet." + +#~ msgid "Any arrow" +#~ msgstr "Beliebiger Pfeil" + +#~ msgid "Gizmo SLA support points" +#~ msgstr "SLA Stützpunkte" + +#~ msgid "Plater" +#~ msgstr "Druckplatte" + +#~ msgid "Gizmo" +#~ msgstr "Gizmo" + +#~ msgid "Delete objects, parts, modifiers" +#~ msgstr "Objekte, Teile, Modifikatoren löschen" + +#~ msgid "Objects List" +#~ msgstr "Objektliste" + +#~ msgid "G-code written at the very top of the output file, before any other content. Useful for adding metadata that printer firmware reads from the first lines of the file (e.g. estimated print time, filament usage). Supports placeholders like {print_time_sec} and {used_filament_length}." +#~ msgstr "G-Code, der ganz oben in die Ausgabedatei geschrieben wird, vor allen anderen Inhalten. Nützlich zum Hinzufügen von Metadaten, die die Druckerfirmware aus den ersten Zeilen der Datei liest (z.B. geschätzte Druckzeit, Filamentverbrauch). Unterstützt Platzhalter wie {print_time_sec} und {used_filament_length}." + +#~ msgid "Print time (seconds)" +#~ msgstr "Druckzeit (Sekunden)" + # AI Translated #~ msgid "Open actions speed dial" #~ msgstr "Aktions-Schnellwahl öffnen" diff --git a/localization/i18n/en/OrcaSlicer_en.po b/localization/i18n/en/OrcaSlicer_en.po index 080cae9632..3b915b2fcd 100644 --- a/localization/i18n/en/OrcaSlicer_en.po +++ b/localization/i18n/en/OrcaSlicer_en.po @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-09-18 15:50+0800\n" +"POT-Creation-Date: 2026-09-22 12:39+0800\n" "PO-Revision-Date: 2026-06-17 15:44-0300\n" "Last-Translator: Alexandre Folle de Menezes\n" "Language-Team: \n" @@ -5550,10 +5550,13 @@ msgctxt "Camera View" msgid "Right" msgstr "" -msgid "Add" +msgid "Add plate" msgstr "" -msgid "Add plate" +msgid "Split to objects" +msgstr "" + +msgid "Add" msgstr "" msgid "Auto orient all/selected objects" @@ -5568,9 +5571,6 @@ msgstr "" msgid "Arrange objects on selected plates" msgstr "" -msgid "Split to objects" -msgstr "" - msgid "Assembly View" msgstr "" @@ -5625,6 +5625,9 @@ msgstr "" msgid "Wireframe" msgstr "" +msgid "X-Ray" +msgstr "" + msgid "Realistic View" msgstr "" @@ -6154,7 +6157,7 @@ msgstr "" msgid "Preferences" msgstr "" -msgid "Open speed dial..." +msgid "Open speed dial" msgstr "" msgctxt "Menu" @@ -7882,9 +7885,6 @@ msgstr "" msgid "Collapse sidebar" msgstr "" -msgid "Tab" -msgstr "" - #, c-format, boost-format msgid "Loading file: %s" msgstr "" @@ -8823,10 +8823,10 @@ msgstr "" msgid "With this option enabled, you can send a task to multiple devices at the same time and manage multiple devices." msgstr "" -msgid "Open the Speed Dial with the Space key" +msgid "Open the Speed Dial from the keyboard" msgstr "" -msgid "When enabled, pressing Space (with no other key held) opens the Speed Dial action search from any page." +msgid "When enabled, the Speed Dial keyboard shortcut (Space by default) opens the action search from any page." msgstr "" msgid "Recent actions" @@ -8952,6 +8952,15 @@ msgstr "" msgid "Set the action that dragging the right mouse button should perform." msgstr "" +msgid "Keyboard" +msgstr "" + +msgid "Keyboard shortcuts" +msgstr "" + +msgid "Choose the key for each action." +msgstr "" + msgid "Clear my choice on..." msgstr "" @@ -9045,10 +9054,38 @@ msgid "" "Set to 0 for unlimited frame rate." msgstr "" +msgid "Reuse the 3D scene while idle" +msgstr "" + +msgid "" +"Skips redrawing the 3D scene when only the mouse cursor moves over the viewport,\n" +"and reuses the previous frame's scene instead. Reduces GPU load.\n" +"Disable it if the viewport shows stale or missing contents.\n" +"\n" +"Takes effect immediately." +msgstr "" + +msgid "Skip unchanged frames" +msgstr "" + +msgid "" +"Skips drawing a frame altogether when it would be identical to the one already on screen.\n" +"Only applies to frames that reuse the 3D scene, so it needs Reuse the 3D scene while idle.\n" +"Disable it if a hover highlight, tooltip or animation stops updating.\n" +"\n" +"Takes effect immediately." +msgstr "" + msgid "Show FPS overlay" msgstr "" -msgid "Displays current viewport FPS in the top-right corner." +msgid "Displays rendering counts in the top-right corner of the viewport." +msgstr "" + +msgid "FPS: frames presented to the screen per second." +msgstr "" + +msgid "3D: frames per second that redrew the 3D scene." msgstr "" msgid "G-code Preview" @@ -9476,10 +9513,7 @@ msgstr "" msgid "Select which settings to be published in the 3MF file" msgstr "" -msgid "Publish 3MF Wiki" -msgstr "" - -msgid "Publish 3MF Video Guide" +msgid "Video Guide" msgstr "" msgid "Mixed filament - published as a whole when \"Enable\" above is selected" @@ -9671,6 +9705,12 @@ msgstr "" msgid "No wiki page for this action" msgstr "" +msgid "Show details" +msgstr "" + +msgid "Hide details" +msgstr "" + #, c-format, boost-format msgid "\"%s\" is a Developer setting. Enable Developer mode to edit it?" msgstr "" @@ -11369,65 +11409,37 @@ msgstr "" msgid "Configuration package changed" msgstr "" -msgid "Toolbar" -msgstr "" - -msgid "Objects list" -msgstr "" - -msgid "Import geometry data from STL/STEP/3MF/OBJ/AMF files" -msgstr "" - -msgid "Paste from clipboard" -msgstr "" - -msgid "Show/Hide 3Dconnexion devices settings dialog" -msgstr "" - -msgid "Switch table page" -msgstr "" - -msgctxt "Keyboard Shortcut" -msgid "Space" -msgstr "" - -msgid "Open speed dial" -msgstr "" - -msgid "Run a Speed Dial favourite (while the Speed Dial is open)" -msgstr "" - -msgid "Show keyboard shortcuts list" -msgstr "" - -msgid "Global shortcuts" -msgstr "" - msgid "Pan View" msgstr "" msgid "Rotate View" msgstr "" -msgid "Middle mouse button" +#, c-format, boost-format +msgid "Use %s or %s, or a key that does not type a character." msgstr "" -msgid "Zoom View" +msgctxt "Keyboard Shortcut" +msgid "Key" msgstr "" -msgid "Auto orients selected objects or all objects. If there are selected objects, it just orients the selected ones. Otherwise, it will orient all objects in the current project." +msgid "Left mouse" msgstr "" -msgid "Auto orients all objects on the active plate." +msgid "Available anywhere in the window, even while typing in a text field." msgstr "" -msgid "Collapse/Expand the sidebar" +msgid "Run a speed dial favorite while the dial is open" msgstr "" -msgid "Any arrow" +msgctxt "Keyboard Shortcut" +msgid "Tab" msgstr "" -msgid "Movement in camera space" +msgid "Switch to the next main tab" +msgstr "" + +msgid "Available while the 3D view on the Prepare tab has focus." msgstr "" msgid "Select a part" @@ -11439,120 +11451,28 @@ msgstr "" msgid "Select objects by rectangle" msgstr "" -msgctxt "Keyboard Shortcut" -msgid "Arrow Up" -msgstr "" - -msgid "Move selection 10mm in positive Y direction" -msgstr "" - -msgctxt "Keyboard Shortcut" -msgid "Arrow Down" -msgstr "" - -msgid "Move selection 10mm in negative Y direction" -msgstr "" - -msgctxt "Keyboard Shortcut" -msgid "Arrow Left" -msgstr "" - -msgid "Move selection 10mm in negative X direction" -msgstr "" - -msgctxt "Keyboard Shortcut" -msgid "Arrow Right" -msgstr "" - -msgid "Move selection 10mm in positive X direction" +msgid "Keyboard 1-9: set filament for object/part" msgstr "" msgid "Movement step set to 1mm" msgstr "" -msgid "Keyboard 1-9: set filament for object/part" +msgid "Movement in camera space" msgstr "" -msgid "Camera view - Default" +msgid "Middle mouse" msgstr "" -msgid "Camera view - Top" +msgid "Right mouse" msgstr "" -msgid "Camera view - Bottom" +msgid "Zoom View" msgstr "" -msgid "Camera view - Front" +msgid "Painting" msgstr "" -msgid "Camera view - Behind" -msgstr "" - -msgid "Camera Angle - Left side" -msgstr "" - -msgid "Camera Angle - Right side" -msgstr "" - -msgid "Select all objects" -msgstr "" - -msgid "Gizmo move" -msgstr "" - -msgid "Gizmo rotate" -msgstr "" - -msgid "Gizmo scale" -msgstr "" - -msgid "Gizmo place face on bed" -msgstr "" - -msgid "Gizmo cut" -msgstr "" - -msgid "Gizmo mesh boolean" -msgstr "" - -msgid "Gizmo FDM paint-on fuzzy skin" -msgstr "" - -msgid "Gizmo SLA support points" -msgstr "" - -msgid "Gizmo FDM paint-on seam" -msgstr "" - -msgid "Gizmo text emboss/engrave" -msgstr "" - -msgid "Gizmo measure" -msgstr "" - -msgid "Gizmo assemble" -msgstr "" - -msgid "Gizmo brim ears" -msgstr "" - -msgid "Zoom in" -msgstr "" - -msgid "Zoom out" -msgstr "" - -msgid "Toggle printable for object/part" -msgstr "" - -msgctxt "Keyboard Shortcut" -msgid "Tab" -msgstr "" - -msgid "Switch between Prepare/Preview" -msgstr "" - -msgid "Plater" +msgid "Available while a painting gizmo is open: supports, seam, fuzzy skin or color painting." msgstr "" msgid "Move: press to snap by 1mm" @@ -11564,13 +11484,17 @@ msgstr "" msgid "Support/Color Painting: adjust section position" msgstr "" -msgid "Gizmo" +msgid "Objects list" +msgstr "" + +msgid "Available while the object list has focus." msgstr "" msgid "Set extruder number for the objects and parts" msgstr "" -msgid "Delete objects, parts, modifiers" +msgctxt "Keyboard Shortcut" +msgid "Space" msgstr "" msgid "Select the object/part and press space to change the name" @@ -11582,42 +11506,47 @@ msgstr "" msgid "Select the object/part and mouse click to change the name" msgstr "" -msgid "Objects List" -msgstr "" - -msgid "Vertical slider - Move active thumb Up" -msgstr "" - -msgid "Vertical slider - Move active thumb Down" -msgstr "" - -msgid "Horizontal slider - Move active thumb Left" -msgstr "" - -msgid "Horizontal slider - Move active thumb Right" -msgstr "" - -msgid "On/Off one layer mode of the vertical slider" -msgstr "" - -msgid "On/Off G-code window" +msgid "Available while the 3D view on the Preview tab has focus." msgstr "" msgid "Move slider 5x faster" msgstr "" -msgctxt "Keyboard Shortcut" -msgid "Home" +msgid "Scroll slider 5x faster" msgstr "" -msgid "Horizontal slider - Move to start position" +msgid "Not customizable" msgstr "" -msgctxt "Keyboard Shortcut" -msgid "End" +#, c-format, boost-format +msgid "%s is assigned to %s. Reassign it to %s?" msgstr "" -msgid "Horizontal slider - Move to last position" +#, c-format, boost-format +msgid "The default %s is assigned to %s. Reassign it to %s?" +msgstr "" + +msgid "Global shortcuts also apply while typing." +msgstr "" + +msgid "A key that types a character cannot be a global shortcut." +msgstr "" + +msgid "Esc cancels, Enter confirms." +msgstr "" + +#, c-format, boost-format +msgid "" +"Press the new shortcut for\n" +"\"%s\"" +msgstr "" + +#, c-format, boost-format +msgid "Already used as a step of %s." +msgstr "" + +#, c-format, boost-format +msgid "Already assigned to %s. Press OK to reassign it." msgstr "" msgid "Release Note" @@ -15917,7 +15846,7 @@ msgstr "" msgid "Insert multiple preheat commands (e.g. M104.1). Only useful for Prusa XL. For other printers, please set it to 1." msgstr "" -msgid "G-code written at the very top of the output file, before any other content. Useful for adding metadata that printer firmware reads from the first lines of the file (e.g. estimated print time, filament usage). Supports placeholders like {print_time_sec} and {used_filament_length}." +msgid "G-code written at the very top of the output file, before any other content. Useful for adding metadata that printer firmware reads from the first lines of the file (e.g. estimated print time, filament usage). Supports placeholders like {print_time_total_sec}, {print_time_day}, {print_time_hour}, {print_time_minute}, {print_time_sec} and {used_filament_length}." msgstr "" msgid "Start G-code" @@ -17326,12 +17255,36 @@ msgstr "" msgid "Total length of filament used in the print." msgstr "" -msgid "Print time (seconds)" +msgid "Print time (total seconds)" msgstr "" msgid "Total estimated print time in seconds. Replaced with actual value during post-processing." msgstr "" +msgid "Print time (days component)" +msgstr "" + +msgid "Estimated print time day component (normal mode). Replaced with actual value during post-processing." +msgstr "" + +msgid "Print time (hours component)" +msgstr "" + +msgid "Estimated print time hour component (normal mode). Replaced with actual value during post-processing." +msgstr "" + +msgid "Print time (minutes component)" +msgstr "" + +msgid "Estimated print time minute component (normal mode). Replaced with actual value during post-processing." +msgstr "" + +msgid "Print time (seconds component)" +msgstr "" + +msgid "Estimated print time second component (normal mode). Replaced with actual value during post-processing." +msgstr "" + msgid "Filament length (meters)" msgstr "" @@ -19012,6 +18965,9 @@ msgstr "" msgid "Success!" msgstr "" +msgid "Generate API Key" +msgstr "" + msgid "Are you sure to log out?" msgstr "" @@ -19948,12 +19904,6 @@ msgstr "" msgid "Error: %s" msgstr "" -msgid "Show details" -msgstr "" - -msgid "Hide details" -msgstr "" - msgid "Version to install:" msgstr "" @@ -22532,6 +22482,12 @@ msgstr "" msgid "No binding for that field" msgstr "" +msgid "Enter a number" +msgstr "" + +msgid "Not a number" +msgstr "" + msgid "Primitive" msgstr "" @@ -22544,6 +22500,210 @@ msgstr "" msgid "Clear All" msgstr "" +msgctxt "Keyboard Shortcut" +msgid "Ins" +msgstr "" + +msgctxt "Keyboard Shortcut" +msgid "Home" +msgstr "" + +msgctxt "Keyboard Shortcut" +msgid "End" +msgstr "" + +msgctxt "Keyboard Shortcut" +msgid "PgUp" +msgstr "" + +msgctxt "Keyboard Shortcut" +msgid "PgDn" +msgstr "" + +msgctxt "Keyboard Shortcut" +msgid "Arrow Left" +msgstr "" + +msgctxt "Keyboard Shortcut" +msgid "Arrow Right" +msgstr "" + +msgctxt "Keyboard Shortcut" +msgid "Arrow Up" +msgstr "" + +msgctxt "Keyboard Shortcut" +msgid "Arrow Down" +msgstr "" + +msgid "Import geometry data from STL/STEP/3MF/OBJ/AMF files" +msgstr "" + +msgid "Select all objects" +msgstr "" + +msgid "Paste from clipboard" +msgstr "" + +msgid "Toggle printable for object/part" +msgstr "" + +msgid "Move selection 10mm in negative X direction" +msgstr "" + +msgid "Move selection 10mm in positive X direction" +msgstr "" + +msgid "Move selection 10mm in positive Y direction" +msgstr "" + +msgid "Move selection 10mm in negative Y direction" +msgstr "" + +msgid "Rotate selection 45 degrees counterclockwise" +msgstr "" + +msgid "Rotate selection 45 degrees clockwise" +msgstr "" + +msgid "Gizmo move" +msgstr "" + +msgid "Gizmo rotate" +msgstr "" + +msgid "Gizmo scale" +msgstr "" + +msgid "Gizmo place face on bed" +msgstr "" + +msgid "Gizmo cut" +msgstr "" + +msgid "Gizmo mesh boolean" +msgstr "" + +msgid "Gizmo FDM paint-on supports" +msgstr "" + +msgid "Gizmo FDM paint-on seam" +msgstr "" + +msgid "Gizmo FDM paint-on fuzzy skin" +msgstr "" + +msgid "Gizmo multi-material painting" +msgstr "" + +msgid "Gizmo text emboss/engrave" +msgstr "" + +msgid "Gizmo measure" +msgstr "" + +msgid "Gizmo assemble" +msgstr "" + +msgid "Gizmo brim ears" +msgstr "" + +msgid "Vertical slider - Move active thumb Up" +msgstr "" + +msgid "Vertical slider - Move active thumb Down" +msgstr "" + +msgid "Horizontal slider - Move active thumb Left" +msgstr "" + +msgid "Horizontal slider - Move active thumb Right" +msgstr "" + +msgid "Horizontal slider - Move to start position" +msgstr "" + +msgid "Horizontal slider - Move to last position" +msgstr "" + +msgid "Camera view - Default" +msgstr "" + +msgid "Camera view - Top" +msgstr "" + +msgid "Camera view - Bottom" +msgstr "" + +msgid "Camera view - Front" +msgstr "" + +msgid "Camera view - Behind" +msgstr "" + +msgid "Camera Angle - Left side" +msgstr "" + +msgid "Camera Angle - Right side" +msgstr "" + +msgid "Camera view - Current plate" +msgstr "" + +msgid "Zoom in" +msgstr "" + +msgid "Zoom out" +msgstr "" + +msgid "Show/Hide 3Dconnexion devices settings dialog" +msgstr "" + +msgid "Show/Hide wireframe" +msgstr "" + +msgid "On/Off G-code window" +msgstr "" + +msgid "On/Off one layer mode of the vertical slider" +msgstr "" + +msgid "Switch between Prepare/Preview" +msgstr "" + +msgid "Collapse/Expand the sidebar" +msgstr "" + +msgid "Open the speed dial" +msgstr "" + +msgid "Reload the device page" +msgstr "" + +msgid "Show keyboard shortcuts list" +msgstr "" + +msgid "Slicing and printing" +msgstr "" + +msgid "Editing" +msgstr "" + +msgid "Placement" +msgstr "" + +msgid "Gizmos" +msgstr "" + +msgid "Sliders" +msgstr "" + +msgid "Painting tools" +msgstr "" + +msgid "Application" +msgstr "" + #: resources/data/hints.ini: [hint:Precise wall] msgid "" "Precise wall\n" diff --git a/localization/i18n/es/OrcaSlicer_es.po b/localization/i18n/es/OrcaSlicer_es.po index 5d864aa200..0b337641b8 100644 --- a/localization/i18n/es/OrcaSlicer_es.po +++ b/localization/i18n/es/OrcaSlicer_es.po @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-09-18 15:50+0800\n" +"POT-Creation-Date: 2026-09-22 12:39+0800\n" "PO-Revision-Date: \n" "Last-Translator: Ian A. Bassi <>\n" "Language-Team: \n" @@ -5729,12 +5729,15 @@ msgctxt "Camera View" msgid "Right" msgstr "Derecha" -msgid "Add" -msgstr "Añadir" - msgid "Add plate" msgstr "Añadir cama" +msgid "Split to objects" +msgstr "Separar en objetos" + +msgid "Add" +msgstr "Añadir" + msgid "Auto orient all/selected objects" msgstr "Orientar automáticamente todos/seleccionados objetos" @@ -5747,9 +5750,6 @@ msgstr "Ordenar todos los objetos" msgid "Arrange objects on selected plates" msgstr "Organizar los objetos en las camas seleccionadas" -msgid "Split to objects" -msgstr "Separar en objetos" - msgid "Assembly View" msgstr "Vista de Emsamblado" @@ -5804,6 +5804,9 @@ msgstr "Contorno" msgid "Wireframe" msgstr "Malla alámbrica" +msgid "X-Ray" +msgstr "" + msgid "Realistic View" msgstr "Vista realista" @@ -6343,7 +6346,7 @@ msgstr "Mostrar el contorno alrededor del objeto seleccionado en la escena 3D." msgid "Preferences" msgstr "Preferencias" -msgid "Open speed dial..." +msgid "Open speed dial" msgstr "" msgctxt "Menu" @@ -8109,9 +8112,6 @@ msgstr "Expandir barra lateral" msgid "Collapse sidebar" msgstr "Colapsar barra lateral" -msgid "Tab" -msgstr "Pestaña" - #, c-format, boost-format msgid "Loading file: %s" msgstr "Cargando archivo: %s" @@ -9102,10 +9102,10 @@ msgstr "Gestión multidispositivo" msgid "With this option enabled, you can send a task to multiple devices at the same time and manage multiple devices." msgstr "Con esta opción activada, puede enviar una tarea a varios dispositivos al mismo tiempo y gestionar varios dispositivos." -msgid "Open the Speed Dial with the Space key" +msgid "Open the Speed Dial from the keyboard" msgstr "" -msgid "When enabled, pressing Space (with no other key held) opens the Speed Dial action search from any page." +msgid "When enabled, the Speed Dial keyboard shortcut (Space by default) opens the action search from any page." msgstr "" msgid "Recent actions" @@ -9237,6 +9237,15 @@ msgstr "Arrastrar con el botón derecho del ratón" msgid "Set the action that dragging the right mouse button should perform." msgstr "Establece la acción que se debe realizar al arrastrar el botón derecho del ratón." +msgid "Keyboard" +msgstr "" + +msgid "Keyboard shortcuts" +msgstr "" + +msgid "Choose the key for each action." +msgstr "" + msgid "Clear my choice on..." msgstr "Limpiar mi elección en..." @@ -9345,11 +9354,39 @@ msgstr "" "Limita la frecuencia de fotogramas de la ventana gráfica para reducir la carga de la GPU y el consumo de energía.\n" "Establece el valor en 0 para una frecuencia de fotogramas ilimitada." +msgid "Reuse the 3D scene while idle" +msgstr "" + +msgid "" +"Skips redrawing the 3D scene when only the mouse cursor moves over the viewport,\n" +"and reuses the previous frame's scene instead. Reduces GPU load.\n" +"Disable it if the viewport shows stale or missing contents.\n" +"\n" +"Takes effect immediately." +msgstr "" + +msgid "Skip unchanged frames" +msgstr "" + +msgid "" +"Skips drawing a frame altogether when it would be identical to the one already on screen.\n" +"Only applies to frames that reuse the 3D scene, so it needs Reuse the 3D scene while idle.\n" +"Disable it if a hover highlight, tooltip or animation stops updating.\n" +"\n" +"Takes effect immediately." +msgstr "" + msgid "Show FPS overlay" msgstr "Mostrar FPS en pantalla" -msgid "Displays current viewport FPS in the top-right corner." -msgstr "Muestra los FPS en la esquina superior derecha." +msgid "Displays rendering counts in the top-right corner of the viewport." +msgstr "" + +msgid "FPS: frames presented to the screen per second." +msgstr "" + +msgid "3D: frames per second that redrew the 3D scene." +msgstr "" msgid "G-code Preview" msgstr "Vista previa del G-code" @@ -9800,13 +9837,8 @@ msgstr "Publicar 3MF..." msgid "Select which settings to be published in the 3MF file" msgstr "Seleccione qué ajustes se publicarán en el archivo 3MF" -# AI Translated -msgid "Publish 3MF Wiki" -msgstr "Wiki de Publicar 3MF" - -# AI Translated -msgid "Publish 3MF Video Guide" -msgstr "Guía en vídeo de Publicar 3MF" +msgid "Video Guide" +msgstr "" # AI Translated msgid "Mixed filament - published as a whole when \"Enable\" above is selected" @@ -10008,6 +10040,12 @@ msgstr "" msgid "No wiki page for this action" msgstr "" +msgid "Show details" +msgstr "Mostrar detalles" + +msgid "Hide details" +msgstr "Ocultar detalles" + #, c-format, boost-format msgid "\"%s\" is a Developer setting. Enable Developer mode to edit it?" msgstr "" @@ -11783,66 +11821,38 @@ msgstr "El paquete de configuración se cambia en la Guía de configuración ant msgid "Configuration package changed" msgstr "Paquete de configuración cambiado" -msgid "Toolbar" -msgstr "Barra de herramientas" - -msgid "Objects list" -msgstr "Lista de objetos" - -msgid "Import geometry data from STL/STEP/3MF/OBJ/AMF files" -msgstr "Importar datos de geometría de los archivos STL/STEP/3MF/OBJ/AMF" - -msgid "Paste from clipboard" -msgstr "Pegar desde el portapapeles" - -msgid "Show/Hide 3Dconnexion devices settings dialog" -msgstr "Mostrar/Ocultar el diálogo de ajustes de los dispositivos 3Dconnexion" - -msgid "Switch table page" -msgstr "Cambiar de página de tabla" - -msgctxt "Keyboard Shortcut" -msgid "Space" -msgstr "Espacio" - -msgid "Open speed dial" -msgstr "" - -msgid "Run a Speed Dial favourite (while the Speed Dial is open)" -msgstr "" - -msgid "Show keyboard shortcuts list" -msgstr "Muestra lista de atajos de teclado" - -msgid "Global shortcuts" -msgstr "Atajos globales" - msgid "Pan View" msgstr "Movimiento de la vista" msgid "Rotate View" msgstr "Rotación de vista" -msgid "Middle mouse button" -msgstr "Botón central del ratón" +#, c-format, boost-format +msgid "Use %s or %s, or a key that does not type a character." +msgstr "" -msgid "Zoom View" -msgstr "Zoom de vista" +msgctxt "Keyboard Shortcut" +msgid "Key" +msgstr "" -msgid "Auto orients selected objects or all objects. If there are selected objects, it just orients the selected ones. Otherwise, it will orient all objects in the current project." -msgstr "Orienta automáticamente los objetos seleccionados o todos los objetos. Si hay objetos seleccionados, sólo orienta los seleccionados. En caso contrario, orientará todos los objetos del proyecto actual." +msgid "Left mouse" +msgstr "" -msgid "Auto orients all objects on the active plate." -msgstr "Orienta automáticamente todos los objetos de la placa actual." +msgid "Available anywhere in the window, even while typing in a text field." +msgstr "" -msgid "Collapse/Expand the sidebar" -msgstr "Ocultar/Expandir barra lateral" +msgid "Run a speed dial favorite while the dial is open" +msgstr "" -msgid "Any arrow" -msgstr "⌘+Cualquier flecha" +msgctxt "Keyboard Shortcut" +msgid "Tab" +msgstr "Tab" -msgid "Movement in camera space" -msgstr "Movimiento en el espacio de la cámara" +msgid "Switch to the next main tab" +msgstr "" + +msgid "Available while the 3D view on the Prepare tab has focus." +msgstr "" msgid "Select a part" msgstr "Seleccionar una pieza" @@ -11853,121 +11863,29 @@ msgstr "Seleccionar varios objetos" msgid "Select objects by rectangle" msgstr "Seleccionar objetos por rectángulo" -msgctxt "Keyboard Shortcut" -msgid "Arrow Up" -msgstr "Flecha arriba" - -msgid "Move selection 10mm in positive Y direction" -msgstr "Mover la selección 10 mm en dirección Y positiva" - -msgctxt "Keyboard Shortcut" -msgid "Arrow Down" -msgstr "Flecha abajo" - -msgid "Move selection 10mm in negative Y direction" -msgstr "Mover la selección 10 mm en dirección Y negativa" - -msgctxt "Keyboard Shortcut" -msgid "Arrow Left" -msgstr "Flecha izquierda" - -msgid "Move selection 10mm in negative X direction" -msgstr "Mover la selección 10 mm en dirección X negativa" - -msgctxt "Keyboard Shortcut" -msgid "Arrow Right" -msgstr "Flecha derecha" - -msgid "Move selection 10mm in positive X direction" -msgstr "Mover la selección 10 mm en dirección X positiva" +msgid "Keyboard 1-9: set filament for object/part" +msgstr "Teclado 1-9: ajustar el filamento para el objeto/pieza" msgid "Movement step set to 1mm" msgstr "Paso de movimiento configurado a 1 mm" -msgid "Keyboard 1-9: set filament for object/part" -msgstr "Teclado 1-9: ajustar el filamento para el objeto/pieza" +msgid "Movement in camera space" +msgstr "Movimiento en el espacio de la cámara" -msgid "Camera view - Default" -msgstr "Vista de la cámara - Por defecto" +msgid "Middle mouse" +msgstr "" -msgid "Camera view - Top" -msgstr "Vista de la cámara - Parte Superior" +msgid "Right mouse" +msgstr "" -msgid "Camera view - Bottom" -msgstr "Vista de la cámara - Parte inferior" +msgid "Zoom View" +msgstr "Zoom de vista" -msgid "Camera view - Front" -msgstr "Vista de la cámara - Frontal" +msgid "Painting" +msgstr "" -msgid "Camera view - Behind" -msgstr "Vista de la cámara - Posterior" - -msgid "Camera Angle - Left side" -msgstr "Ángulo de la cámara - Lado izquierdo" - -msgid "Camera Angle - Right side" -msgstr "Ángulo de la cámara - Lado derecho" - -msgid "Select all objects" -msgstr "Seleccionar todos los objetos" - -msgid "Gizmo move" -msgstr "Herramienta de movimiento" - -msgid "Gizmo rotate" -msgstr "Herramienta de rotación" - -msgid "Gizmo scale" -msgstr "Herramienta de escala" - -msgid "Gizmo place face on bed" -msgstr "Herramienta de situar cara en cama" - -msgid "Gizmo cut" -msgstr "Herramienta de corte" - -msgid "Gizmo mesh boolean" -msgstr "Gizmo buleana de malla" - -msgid "Gizmo FDM paint-on fuzzy skin" -msgstr "Herramienta FDM para pintar piel rugosa" - -msgid "Gizmo SLA support points" -msgstr "Herramienta de puntos de soporte SLA" - -msgid "Gizmo FDM paint-on seam" -msgstr "Herramienta de pintado de costuras FDM" - -msgid "Gizmo text emboss/engrave" -msgstr "Herramienta de texto en relieve/grabado" - -msgid "Gizmo measure" -msgstr "Gizmo medir" - -msgid "Gizmo assemble" -msgstr "Gizmo ensamblar" - -msgid "Gizmo brim ears" -msgstr "Gizmo orejas de borde" - -msgid "Zoom in" -msgstr "Acercar" - -msgid "Zoom out" -msgstr "Alejar" - -msgid "Toggle printable for object/part" -msgstr "Activar/desactivar la impresión para el objeto/pieza" - -msgctxt "Keyboard Shortcut" -msgid "Tab" -msgstr "Tab" - -msgid "Switch between Prepare/Preview" -msgstr "Cambiar entre Preparar/Previsualizar" - -msgid "Plater" -msgstr "Cama" +msgid "Available while a painting gizmo is open: supports, seam, fuzzy skin or color painting." +msgstr "" msgid "Move: press to snap by 1mm" msgstr "Mover: pulsar para ajustar 1mm" @@ -11978,14 +11896,18 @@ msgstr "Soporte/Pintado en color: ajuste del radio del pincel" msgid "Support/Color Painting: adjust section position" msgstr "Soporte/Pintado de color: ajuste de la posición de la sección" -msgid "Gizmo" -msgstr "Herramienta" +msgid "Objects list" +msgstr "Lista de objetos" + +msgid "Available while the object list has focus." +msgstr "" msgid "Set extruder number for the objects and parts" msgstr "Ajustar el número de extrusor para los objetos y las piezas" -msgid "Delete objects, parts, modifiers" -msgstr "Eliminar objetos, piezas, modificadores" +msgctxt "Keyboard Shortcut" +msgid "Space" +msgstr "Espacio" msgid "Select the object/part and press space to change the name" msgstr "Seleccione el objeto/pieza y pulse la barra espaciadora para cambiar el nombre" @@ -11996,43 +11918,48 @@ msgstr "Clic del ratón" msgid "Select the object/part and mouse click to change the name" msgstr "Seleccione el objeto/pieza y haga clic con el ratón para cambiar el nombre" -msgid "Objects List" -msgstr "Lista de Objetos" - -msgid "Vertical slider - Move active thumb Up" -msgstr "Control deslizante vertical - Mover el pulgar activo hacia Arriba" - -msgid "Vertical slider - Move active thumb Down" -msgstr "Control deslizante vertical - Mover el pulgar activo hacia Abajo" - -msgid "Horizontal slider - Move active thumb Left" -msgstr "Control deslizante horizontal - Mover el pulgar activo hacia la Izquierda" - -msgid "Horizontal slider - Move active thumb Right" -msgstr "Control deslizante horizontal - Mover el pulgar activo hacia la Derecha" - -msgid "On/Off one layer mode of the vertical slider" -msgstr "Activar/Desactivar el modo de una capa del control deslizante vertical" - -msgid "On/Off G-code window" -msgstr "Activar/Desactivar ventana de G-Code" +msgid "Available while the 3D view on the Preview tab has focus." +msgstr "" msgid "Move slider 5x faster" msgstr "Mover el deslizador 5 veces más rápido" -msgctxt "Keyboard Shortcut" -msgid "Home" -msgstr "Inicio" +msgid "Scroll slider 5x faster" +msgstr "" -msgid "Horizontal slider - Move to start position" -msgstr "Deslizador horizontal - Desplazarse a la posición inicial" +msgid "Not customizable" +msgstr "" -msgctxt "Keyboard Shortcut" -msgid "End" -msgstr "Fin" +#, c-format, boost-format +msgid "%s is assigned to %s. Reassign it to %s?" +msgstr "" -msgid "Horizontal slider - Move to last position" -msgstr "Deslizador horizontal - Desplazarse a la última posición" +#, c-format, boost-format +msgid "The default %s is assigned to %s. Reassign it to %s?" +msgstr "" + +msgid "Global shortcuts also apply while typing." +msgstr "" + +msgid "A key that types a character cannot be a global shortcut." +msgstr "" + +msgid "Esc cancels, Enter confirms." +msgstr "" + +#, c-format, boost-format +msgid "" +"Press the new shortcut for\n" +"\"%s\"" +msgstr "" + +#, c-format, boost-format +msgid "Already used as a step of %s." +msgstr "" + +#, c-format, boost-format +msgid "Already assigned to %s. Press OK to reassign it." +msgstr "" msgid "Release Note" msgstr "Notas de versión" @@ -16817,8 +16744,8 @@ msgstr "Pasos de precalentamiento" msgid "Insert multiple preheat commands (e.g. M104.1). Only useful for Prusa XL. For other printers, please set it to 1." msgstr "Insertar múltiples comandos de precalentamiento (por ejemplo, M104.1). Sólo útil para Prusa XL. Para otras impresoras, por favor ajústar a 1." -msgid "G-code written at the very top of the output file, before any other content. Useful for adding metadata that printer firmware reads from the first lines of the file (e.g. estimated print time, filament usage). Supports placeholders like {print_time_sec} and {used_filament_length}." -msgstr "G-code escrito en la parte superior del archivo de salida, antes de cualquier otro contenido. Útil para añadir metadatos que el firmware de la impresora lea desde las primeras líneas del archivo (por ejemplo, tiempo estimado de impresión, uso de filamento). Soporta marcadores como {print_time_sec} y {used_filament_length}." +msgid "G-code written at the very top of the output file, before any other content. Useful for adding metadata that printer firmware reads from the first lines of the file (e.g. estimated print time, filament usage). Supports placeholders like {print_time_total_sec}, {print_time_day}, {print_time_hour}, {print_time_minute}, {print_time_sec} and {used_filament_length}." +msgstr "" msgid "Start G-code" msgstr "G-Code inicial" @@ -18326,12 +18253,36 @@ msgstr "Filamento usado" msgid "Total length of filament used in the print." msgstr "Longitud total de filamento utilizado en la impresión." -msgid "Print time (seconds)" -msgstr "Tiempo de impresión (segundos)" +msgid "Print time (total seconds)" +msgstr "" msgid "Total estimated print time in seconds. Replaced with actual value during post-processing." msgstr "Tiempo total estimado de impresión en segundos. Reemplazado con valor real durante el post-procesamiento." +msgid "Print time (days component)" +msgstr "" + +msgid "Estimated print time day component (normal mode). Replaced with actual value during post-processing." +msgstr "" + +msgid "Print time (hours component)" +msgstr "" + +msgid "Estimated print time hour component (normal mode). Replaced with actual value during post-processing." +msgstr "" + +msgid "Print time (minutes component)" +msgstr "" + +msgid "Estimated print time minute component (normal mode). Replaced with actual value during post-processing." +msgstr "" + +msgid "Print time (seconds component)" +msgstr "" + +msgid "Estimated print time second component (normal mode). Replaced with actual value during post-processing." +msgstr "" + msgid "Filament length (meters)" msgstr "Longitud de filamento (metros)" @@ -20165,6 +20116,9 @@ msgstr "No se ha detectado una sesión válida. ¿Desea iniciar sesión en 3DPri msgid "Success!" msgstr "¡Éxito!" +msgid "Generate API Key" +msgstr "" + msgid "Are you sure to log out?" msgstr "¿Estás seguro de cerrar la sesión?" @@ -21115,12 +21069,6 @@ msgstr "El Plug-in de Bambu Network es necesario para las funciones en la nube, msgid "Error: %s" msgstr "Error: %s" -msgid "Show details" -msgstr "Mostrar detalles" - -msgid "Hide details" -msgstr "Ocultar detalles" - msgid "Version to install:" msgstr "Versión a instalar:" @@ -23704,6 +23652,12 @@ msgstr "" msgid "No binding for that field" msgstr "" +msgid "Enter a number" +msgstr "" + +msgid "Not a number" +msgstr "" + msgid "Primitive" msgstr "" @@ -23716,6 +23670,210 @@ msgstr "" msgid "Clear All" msgstr "" +msgctxt "Keyboard Shortcut" +msgid "Ins" +msgstr "" + +msgctxt "Keyboard Shortcut" +msgid "Home" +msgstr "Inicio" + +msgctxt "Keyboard Shortcut" +msgid "End" +msgstr "Fin" + +msgctxt "Keyboard Shortcut" +msgid "PgUp" +msgstr "" + +msgctxt "Keyboard Shortcut" +msgid "PgDn" +msgstr "" + +msgctxt "Keyboard Shortcut" +msgid "Arrow Left" +msgstr "Flecha izquierda" + +msgctxt "Keyboard Shortcut" +msgid "Arrow Right" +msgstr "Flecha derecha" + +msgctxt "Keyboard Shortcut" +msgid "Arrow Up" +msgstr "Flecha arriba" + +msgctxt "Keyboard Shortcut" +msgid "Arrow Down" +msgstr "Flecha abajo" + +msgid "Import geometry data from STL/STEP/3MF/OBJ/AMF files" +msgstr "Importar datos de geometría de los archivos STL/STEP/3MF/OBJ/AMF" + +msgid "Select all objects" +msgstr "Seleccionar todos los objetos" + +msgid "Paste from clipboard" +msgstr "Pegar desde el portapapeles" + +msgid "Toggle printable for object/part" +msgstr "Activar/desactivar la impresión para el objeto/pieza" + +msgid "Move selection 10mm in negative X direction" +msgstr "Mover la selección 10 mm en dirección X negativa" + +msgid "Move selection 10mm in positive X direction" +msgstr "Mover la selección 10 mm en dirección X positiva" + +msgid "Move selection 10mm in positive Y direction" +msgstr "Mover la selección 10 mm en dirección Y positiva" + +msgid "Move selection 10mm in negative Y direction" +msgstr "Mover la selección 10 mm en dirección Y negativa" + +msgid "Rotate selection 45 degrees counterclockwise" +msgstr "" + +msgid "Rotate selection 45 degrees clockwise" +msgstr "" + +msgid "Gizmo move" +msgstr "Herramienta de movimiento" + +msgid "Gizmo rotate" +msgstr "Herramienta de rotación" + +msgid "Gizmo scale" +msgstr "Herramienta de escala" + +msgid "Gizmo place face on bed" +msgstr "Herramienta de situar cara en cama" + +msgid "Gizmo cut" +msgstr "Herramienta de corte" + +msgid "Gizmo mesh boolean" +msgstr "Gizmo buleana de malla" + +msgid "Gizmo FDM paint-on supports" +msgstr "" + +msgid "Gizmo FDM paint-on seam" +msgstr "Herramienta de pintado de costuras FDM" + +msgid "Gizmo FDM paint-on fuzzy skin" +msgstr "Herramienta FDM para pintar piel rugosa" + +msgid "Gizmo multi-material painting" +msgstr "" + +msgid "Gizmo text emboss/engrave" +msgstr "Herramienta de texto en relieve/grabado" + +msgid "Gizmo measure" +msgstr "Gizmo medir" + +msgid "Gizmo assemble" +msgstr "Gizmo ensamblar" + +msgid "Gizmo brim ears" +msgstr "Gizmo orejas de borde" + +msgid "Vertical slider - Move active thumb Up" +msgstr "Control deslizante vertical - Mover el pulgar activo hacia Arriba" + +msgid "Vertical slider - Move active thumb Down" +msgstr "Control deslizante vertical - Mover el pulgar activo hacia Abajo" + +msgid "Horizontal slider - Move active thumb Left" +msgstr "Control deslizante horizontal - Mover el pulgar activo hacia la Izquierda" + +msgid "Horizontal slider - Move active thumb Right" +msgstr "Control deslizante horizontal - Mover el pulgar activo hacia la Derecha" + +msgid "Horizontal slider - Move to start position" +msgstr "Deslizador horizontal - Desplazarse a la posición inicial" + +msgid "Horizontal slider - Move to last position" +msgstr "Deslizador horizontal - Desplazarse a la última posición" + +msgid "Camera view - Default" +msgstr "Vista de la cámara - Por defecto" + +msgid "Camera view - Top" +msgstr "Vista de la cámara - Parte Superior" + +msgid "Camera view - Bottom" +msgstr "Vista de la cámara - Parte inferior" + +msgid "Camera view - Front" +msgstr "Vista de la cámara - Frontal" + +msgid "Camera view - Behind" +msgstr "Vista de la cámara - Posterior" + +msgid "Camera Angle - Left side" +msgstr "Ángulo de la cámara - Lado izquierdo" + +msgid "Camera Angle - Right side" +msgstr "Ángulo de la cámara - Lado derecho" + +msgid "Camera view - Current plate" +msgstr "" + +msgid "Zoom in" +msgstr "Acercar" + +msgid "Zoom out" +msgstr "Alejar" + +msgid "Show/Hide 3Dconnexion devices settings dialog" +msgstr "Mostrar/Ocultar el diálogo de ajustes de los dispositivos 3Dconnexion" + +msgid "Show/Hide wireframe" +msgstr "" + +msgid "On/Off G-code window" +msgstr "Activar/Desactivar ventana de G-Code" + +msgid "On/Off one layer mode of the vertical slider" +msgstr "Activar/Desactivar el modo de una capa del control deslizante vertical" + +msgid "Switch between Prepare/Preview" +msgstr "Cambiar entre Preparar/Previsualizar" + +msgid "Collapse/Expand the sidebar" +msgstr "Ocultar/Expandir barra lateral" + +msgid "Open the speed dial" +msgstr "" + +msgid "Reload the device page" +msgstr "" + +msgid "Show keyboard shortcuts list" +msgstr "Muestra lista de atajos de teclado" + +msgid "Slicing and printing" +msgstr "" + +msgid "Editing" +msgstr "" + +msgid "Placement" +msgstr "" + +msgid "Gizmos" +msgstr "" + +msgid "Sliders" +msgstr "" + +msgid "Painting tools" +msgstr "" + +msgid "Application" +msgstr "" + #: resources/data/hints.ini: [hint:Precise wall] msgid "" "Precise wall\n" @@ -24016,6 +24174,62 @@ msgstr "" "Evita la deformación\n" "¿Sabías que al imprimir materiales propensos a la deformación como el ABS, aumentar adecuadamente la temperatura de la cama térmica puede reducir la probabilidad de deformaciones?" +#~ msgid "Tab" +#~ msgstr "Pestaña" + +#~ msgid "Displays current viewport FPS in the top-right corner." +#~ msgstr "Muestra los FPS en la esquina superior derecha." + +# AI Translated +#~ msgid "Publish 3MF Wiki" +#~ msgstr "Wiki de Publicar 3MF" + +# AI Translated +#~ msgid "Publish 3MF Video Guide" +#~ msgstr "Guía en vídeo de Publicar 3MF" + +#~ msgid "Toolbar" +#~ msgstr "Barra de herramientas" + +#~ msgid "Switch table page" +#~ msgstr "Cambiar de página de tabla" + +#~ msgid "Global shortcuts" +#~ msgstr "Atajos globales" + +#~ msgid "Middle mouse button" +#~ msgstr "Botón central del ratón" + +#~ msgid "Auto orients selected objects or all objects. If there are selected objects, it just orients the selected ones. Otherwise, it will orient all objects in the current project." +#~ msgstr "Orienta automáticamente los objetos seleccionados o todos los objetos. Si hay objetos seleccionados, sólo orienta los seleccionados. En caso contrario, orientará todos los objetos del proyecto actual." + +#~ msgid "Auto orients all objects on the active plate." +#~ msgstr "Orienta automáticamente todos los objetos de la placa actual." + +#~ msgid "Any arrow" +#~ msgstr "⌘+Cualquier flecha" + +#~ msgid "Gizmo SLA support points" +#~ msgstr "Herramienta de puntos de soporte SLA" + +#~ msgid "Plater" +#~ msgstr "Cama" + +#~ msgid "Gizmo" +#~ msgstr "Herramienta" + +#~ msgid "Delete objects, parts, modifiers" +#~ msgstr "Eliminar objetos, piezas, modificadores" + +#~ msgid "Objects List" +#~ msgstr "Lista de Objetos" + +#~ msgid "G-code written at the very top of the output file, before any other content. Useful for adding metadata that printer firmware reads from the first lines of the file (e.g. estimated print time, filament usage). Supports placeholders like {print_time_sec} and {used_filament_length}." +#~ msgstr "G-code escrito en la parte superior del archivo de salida, antes de cualquier otro contenido. Útil para añadir metadatos que el firmware de la impresora lea desde las primeras líneas del archivo (por ejemplo, tiempo estimado de impresión, uso de filamento). Soporta marcadores como {print_time_sec} y {used_filament_length}." + +#~ msgid "Print time (seconds)" +#~ msgstr "Tiempo de impresión (segundos)" + #~ msgid "Open actions speed dial" #~ msgstr "Abrir el menú rápido de acciones" diff --git a/localization/i18n/eu/OrcaSlicer_eu.po b/localization/i18n/eu/OrcaSlicer_eu.po index a3b02f9e87..717e55078a 100644 --- a/localization/i18n/eu/OrcaSlicer_eu.po +++ b/localization/i18n/eu/OrcaSlicer_eu.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-09-18 15:50+0800\n" +"POT-Creation-Date: 2026-09-22 12:39+0800\n" "PO-Revision-Date: 2026-07-20 13:33+0200\n" "Last-Translator: Manu Goiogana \n" "Language-Team: \n" @@ -5779,12 +5779,15 @@ msgctxt "Camera View" msgid "Right" msgstr "Eskuinekoa" -msgid "Add" -msgstr "Gehitu" - msgid "Add plate" msgstr "Plaka gehitu" +msgid "Split to objects" +msgstr "Objektuetan zatitu" + +msgid "Add" +msgstr "Gehitu" + msgid "Auto orient all/selected objects" msgstr "Automatikoki orientatu hautatutako objektuak/objektu guztiak" @@ -5797,9 +5800,6 @@ msgstr "Antolatu objektu guztiak" msgid "Arrange objects on selected plates" msgstr "Antolatu hautatutako plaketako objektu guztiak" -msgid "Split to objects" -msgstr "Objektuetan zatitu" - msgid "Assembly View" msgstr "Multzoaren Ikuspegia" @@ -5854,6 +5854,9 @@ msgstr "Ingerada" msgid "Wireframe" msgstr "Alanbre-egitura" +msgid "X-Ray" +msgstr "" + msgid "Realistic View" msgstr "Ikuspegi errealista" @@ -6389,7 +6392,7 @@ msgstr "Erakutsi hautatutako objektuaren inguruko ingerada 3D eszenan." msgid "Preferences" msgstr "Hobespenak" -msgid "Open speed dial..." +msgid "Open speed dial" msgstr "" # AI Translated @@ -8186,9 +8189,6 @@ msgstr "Zabaldu alboko barra" msgid "Collapse sidebar" msgstr "Tolestu alboko barra" -msgid "Tab" -msgstr "Fitxa" - #, c-format, boost-format msgid "Loading file: %s" msgstr "%s fitxategia kargatzen" @@ -9183,10 +9183,10 @@ msgstr "Gailu anitzen kudeaketa" msgid "With this option enabled, you can send a task to multiple devices at the same time and manage multiple devices." msgstr "Aukera hau gaituta, zeregin bat hainbat gailutara bidali eta hainbat gailu kudea ditzakezu aldi berean." -msgid "Open the Speed Dial with the Space key" +msgid "Open the Speed Dial from the keyboard" msgstr "" -msgid "When enabled, pressing Space (with no other key held) opens the Speed Dial action search from any page." +msgid "When enabled, the Speed Dial keyboard shortcut (Space by default) opens the action search from any page." msgstr "" msgid "Recent actions" @@ -9318,6 +9318,15 @@ msgstr "Saguaren eskuineko botoiarekin arrastatu" msgid "Set the action that dragging the right mouse button should perform." msgstr "Ezarri saguaren eskuineko botoia arrastatzean egin beharreko ekintza." +msgid "Keyboard" +msgstr "" + +msgid "Keyboard shortcuts" +msgstr "" + +msgid "Choose the key for each action." +msgstr "" + msgid "Clear my choice on..." msgstr "Garbitu nire aukera hemen..." @@ -9426,11 +9435,39 @@ msgstr "" "Ikuspegiaren fotograma-tasa mugatzen du GPUaren karga eta energia-kontsumoa murrizteko.\n" "Ezarri 0 fotograma-tasa mugagabea erabiltzeko." +msgid "Reuse the 3D scene while idle" +msgstr "" + +msgid "" +"Skips redrawing the 3D scene when only the mouse cursor moves over the viewport,\n" +"and reuses the previous frame's scene instead. Reduces GPU load.\n" +"Disable it if the viewport shows stale or missing contents.\n" +"\n" +"Takes effect immediately." +msgstr "" + +msgid "Skip unchanged frames" +msgstr "" + +msgid "" +"Skips drawing a frame altogether when it would be identical to the one already on screen.\n" +"Only applies to frames that reuse the 3D scene, so it needs Reuse the 3D scene while idle.\n" +"Disable it if a hover highlight, tooltip or animation stops updating.\n" +"\n" +"Takes effect immediately." +msgstr "" + msgid "Show FPS overlay" msgstr "Erakutsi FPS gainjartzea" -msgid "Displays current viewport FPS in the top-right corner." -msgstr "Uneko ikuspegiaren FPSa goiko eskuineko izkinan erakusten du." +msgid "Displays rendering counts in the top-right corner of the viewport." +msgstr "" + +msgid "FPS: frames presented to the screen per second." +msgstr "" + +msgid "3D: frames per second that redrew the 3D scene." +msgstr "" # AI Translated msgid "G-code Preview" @@ -9886,13 +9923,8 @@ msgstr "Argitaratu 3MF..." msgid "Select which settings to be published in the 3MF file" msgstr "Hautatu zein ezarpen argitaratuko diren 3MF fitxategian" -# AI Translated -msgid "Publish 3MF Wiki" -msgstr "3MF argitaratzeko wikia" - -# AI Translated -msgid "Publish 3MF Video Guide" -msgstr "3MF argitaratzeko bideo-gida" +msgid "Video Guide" +msgstr "" # AI Translated msgid "Mixed filament - published as a whole when \"Enable\" above is selected" @@ -10094,6 +10126,13 @@ msgstr "" msgid "No wiki page for this action" msgstr "" +msgid "Show details" +msgstr "Erakutsi xehetasunak" + +# AI Translated +msgid "Hide details" +msgstr "Ezkutatu xehetasunak" + #, c-format, boost-format msgid "\"%s\" is a Developer setting. Enable Developer mode to edit it?" msgstr "" @@ -11893,67 +11932,39 @@ msgstr "Konfigurazio-paketea aldatu da aurreko Konfigurazio Gidan" msgid "Configuration package changed" msgstr "Konfigurazio-paketea aldatu da" -msgid "Toolbar" -msgstr "Tresna-barra" - -msgid "Objects list" -msgstr "Objektuen zerrenda" - -msgid "Import geometry data from STL/STEP/3MF/OBJ/AMF files" -msgstr "Inportatu geometriaren datuak STL/STEP/3MF/OBJ/AMF fitxategietatik" - -msgid "Paste from clipboard" -msgstr "Itsatsi arbeletik" - -msgid "Show/Hide 3Dconnexion devices settings dialog" -msgstr "Erakutsi/Ezkutatu 3Dconnexion gailuen ezarpenen elkarrizketa-koadroa" - -msgid "Switch table page" -msgstr "Aldatu taula-orria" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Space" -msgstr "Zuriunea" - -msgid "Open speed dial" -msgstr "" - -msgid "Run a Speed Dial favourite (while the Speed Dial is open)" -msgstr "" - -msgid "Show keyboard shortcuts list" -msgstr "Erakutsi teklatu-lasterbideen zerrenda" - -msgid "Global shortcuts" -msgstr "Lasterbide globalak" - msgid "Pan View" msgstr "Mugitu ikuspegia" msgid "Rotate View" msgstr "Biratu ikuspegia" -msgid "Middle mouse button" -msgstr "Saguaren erdiko botoia" +#, c-format, boost-format +msgid "Use %s or %s, or a key that does not type a character." +msgstr "" -msgid "Zoom View" -msgstr "Zooma ikuspegian" +msgctxt "Keyboard Shortcut" +msgid "Key" +msgstr "" -msgid "Auto orients selected objects or all objects. If there are selected objects, it just orients the selected ones. Otherwise, it will orient all objects in the current project." -msgstr "Hautatutako objektuak edo objektu guztiak automatikoki orientatzen ditu. Objektuak hautatuta badaude, hautatutakoak bakarrik orientatzen ditu. Bestela, uneko proiektuko objektu guztiak orientatuko ditu." +msgid "Left mouse" +msgstr "" -msgid "Auto orients all objects on the active plate." -msgstr "Objektu guztiak automatikoki orientatzen ditu plaka aktiboan." +msgid "Available anywhere in the window, even while typing in a text field." +msgstr "" -msgid "Collapse/Expand the sidebar" -msgstr "Tolestu/Zabaldu alboko barra" +msgid "Run a speed dial favorite while the dial is open" +msgstr "" -msgid "Any arrow" -msgstr "Edozein gezi" +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Tab" +msgstr "Tab" -msgid "Movement in camera space" -msgstr "Mugimendua kameraren espazioan" +msgid "Switch to the next main tab" +msgstr "" + +msgid "Available while the 3D view on the Prepare tab has focus." +msgstr "" msgid "Select a part" msgstr "Hautatu pieza bat" @@ -11964,126 +11975,29 @@ msgstr "Hautatu objektu bat baino gehiago" msgid "Select objects by rectangle" msgstr "Hautatu objektuak laukizuzen bidez" -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Arrow Up" -msgstr "Gora gezia" - -msgid "Move selection 10mm in positive Y direction" -msgstr "Mugitu hautapena 10 mm Y noranzko positiboan" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Arrow Down" -msgstr "Behera gezia" - -msgid "Move selection 10mm in negative Y direction" -msgstr "Mugitu hautapena 10 mm Y noranzko negatiboan" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Arrow Left" -msgstr "Ezkerrera gezia" - -msgid "Move selection 10mm in negative X direction" -msgstr "Mugitu hautapena 10 mm X noranzko negatiboan" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Arrow Right" -msgstr "Eskuinera gezia" - -msgid "Move selection 10mm in positive X direction" -msgstr "Mugitu hautapena 10 mm X noranzko positiboan" +msgid "Keyboard 1-9: set filament for object/part" +msgstr "1-9 teklak: ezarri filamentua objektuari/piezari" msgid "Movement step set to 1mm" msgstr "Mugimendu-urratsa 1 mm-an ezarri da" -msgid "Keyboard 1-9: set filament for object/part" -msgstr "1-9 teklak: ezarri filamentua objektuari/piezari" +msgid "Movement in camera space" +msgstr "Mugimendua kameraren espazioan" -msgid "Camera view - Default" -msgstr "Kameraren ikuspegia - Lehenetsia" +msgid "Middle mouse" +msgstr "" -msgid "Camera view - Top" -msgstr "Kameraren ikuspegia - Goia" +msgid "Right mouse" +msgstr "" -msgid "Camera view - Bottom" -msgstr "Kameraren ikuspegia - Behea" +msgid "Zoom View" +msgstr "Zooma ikuspegian" -msgid "Camera view - Front" -msgstr "Kameraren ikuspegia - Aurrea" +msgid "Painting" +msgstr "" -msgid "Camera view - Behind" -msgstr "Kameraren ikuspegia - Atzea" - -msgid "Camera Angle - Left side" -msgstr "Kameraren angelua - Ezker aldea" - -msgid "Camera Angle - Right side" -msgstr "Kameraren angelua - Eskuin aldea" - -msgid "Select all objects" -msgstr "Hautatu objektu guztiak" - -msgid "Gizmo move" -msgstr "Mugitzeko tresna" - -msgid "Gizmo rotate" -msgstr "Biraketa tresna" - -msgid "Gizmo scale" -msgstr "Eskalarako tresna" - -msgid "Gizmo place face on bed" -msgstr "Aurpegia ohean kokatzeko tresna" - -msgid "Gizmo cut" -msgstr "Ebakitzeko tresna" - -msgid "Gizmo mesh boolean" -msgstr "Sare boolearrerako tresna" - -msgid "Gizmo FDM paint-on fuzzy skin" -msgstr "FDM gainazal zimurra margotzeko tresna" - -msgid "Gizmo SLA support points" -msgstr "SLA euskarri-puntuentzako tresna" - -msgid "Gizmo FDM paint-on seam" -msgstr "FDM josturak margotzeko tresna" - -msgid "Gizmo text emboss/engrave" -msgstr "Testua erliebean/grabatuta ipintzeko tresna" - -msgid "Gizmo measure" -msgstr "Neurtzeko tresna" - -msgid "Gizmo assemble" -msgstr "Muntatzeko tresna" - -msgid "Gizmo brim ears" -msgstr "Belarri ertzen tresna" - -msgid "Zoom in" -msgstr "Zooma handitu" - -msgid "Zoom out" -msgstr "Txikiagotu zooma" - -msgid "Toggle printable for object/part" -msgstr "Txandakatu objektuaren/piezaren inprimagarritasuna" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Tab" -msgstr "Tab" - -msgid "Switch between Prepare/Preview" -msgstr "Aldatu Prestatu/Aurrebista artean" - -msgid "Plater" -msgstr "Plaka-antolatzailea" +msgid "Available while a painting gizmo is open: supports, seam, fuzzy skin or color painting." +msgstr "" msgid "Move: press to snap by 1mm" msgstr "Mugitu: sakatu 1 mm-ko jauzietan atxikitzeko" @@ -12094,14 +12008,19 @@ msgstr "Euskarri/Kolore margotzea: doitu boligrafoaren erradioa" msgid "Support/Color Painting: adjust section position" msgstr "Euskarri/Kolore-margotzea: doitu sekzioaren posizioa" -msgid "Gizmo" -msgstr "Tresna" +msgid "Objects list" +msgstr "Objektuen zerrenda" + +msgid "Available while the object list has focus." +msgstr "" msgid "Set extruder number for the objects and parts" msgstr "Ezarri objektuen eta piezen estrusore zenbakia" -msgid "Delete objects, parts, modifiers" -msgstr "Ezabatu objektuak, piezak eta aldatzaileak" +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Space" +msgstr "Zuriunea" msgid "Select the object/part and press space to change the name" msgstr "Hautatu objektua/partea eta sakatu zuriunea izena aldatzeko" @@ -12112,45 +12031,48 @@ msgstr "Saguaren klika" msgid "Select the object/part and mouse click to change the name" msgstr "Hautatu objektua/pieza eta egin klik izena aldatzeko" -msgid "Objects List" -msgstr "Objektuen zerrenda" - -msgid "Vertical slider - Move active thumb Up" -msgstr "Graduatzaile bertikala - Mugitu hatz aktiboa gora" - -msgid "Vertical slider - Move active thumb Down" -msgstr "Graduatzaile bertikala - Mugitu hatz aktiboa behera" - -msgid "Horizontal slider - Move active thumb Left" -msgstr "Graduatzaile horizontala - Mugitu hatz aktiboa ezkerrera" - -msgid "Horizontal slider - Move active thumb Right" -msgstr "Graduatzaile horizontala - Mugitu hatz aktiboa eskuinera" - -msgid "On/Off one layer mode of the vertical slider" -msgstr "Aktibatu/Desaktibatu graduatzaile bertikalaren geruza bakarreko modua" - -msgid "On/Off G-code window" -msgstr "G-code leihoa aktibatu/desaktibatu" +msgid "Available while the 3D view on the Preview tab has focus." +msgstr "" msgid "Move slider 5x faster" msgstr "Mugitu graduatzailea 5 aldiz azkarrago" -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Home" -msgstr "Hasiera" +msgid "Scroll slider 5x faster" +msgstr "" -msgid "Horizontal slider - Move to start position" -msgstr "Graduatzaile horizontala - Mugitu hasierako posiziora" +msgid "Not customizable" +msgstr "" -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "End" -msgstr "Amaiera" +#, c-format, boost-format +msgid "%s is assigned to %s. Reassign it to %s?" +msgstr "" -msgid "Horizontal slider - Move to last position" -msgstr "Graduatzaile horizontala - Mugitu azken posiziora" +#, c-format, boost-format +msgid "The default %s is assigned to %s. Reassign it to %s?" +msgstr "" + +msgid "Global shortcuts also apply while typing." +msgstr "" + +msgid "A key that types a character cannot be a global shortcut." +msgstr "" + +msgid "Esc cancels, Enter confirms." +msgstr "" + +#, c-format, boost-format +msgid "" +"Press the new shortcut for\n" +"\"%s\"" +msgstr "" + +#, c-format, boost-format +msgid "Already used as a step of %s." +msgstr "" + +#, c-format, boost-format +msgid "Already assigned to %s. Press OK to reassign it." +msgstr "" msgid "Release Note" msgstr "Argitalpen-oharra" @@ -16987,8 +16909,8 @@ msgstr "Aurrez berotzeko urratsak" msgid "Insert multiple preheat commands (e.g. M104.1). Only useful for Prusa XL. For other printers, please set it to 1." msgstr "Txertatu aurrez berotzeko hainbat komando (adib. M104.1). Prusa XL-rakobakarrik da erabilgarria. Beste inprimagailuetarako, ezarri 1." -msgid "G-code written at the very top of the output file, before any other content. Useful for adding metadata that printer firmware reads from the first lines of the file (e.g. estimated print time, filament usage). Supports placeholders like {print_time_sec} and {used_filament_length}." -msgstr "Irteerako fitxategiaren hasiera-hasieran idatzitako G-codea, beste edozein eduki baino lehen. Inprimagailuaren firmwareak fitxategiaren lehen lerroetatik irakurtzen dituen metadatuak gehitzeko erabilgarria da (adibidez, zenbatetsitako inprimatze-denbora edo filamentuen erabilera). {print_time_sec} eta {used_filament_length} moduko leku-markak onartzen ditu." +msgid "G-code written at the very top of the output file, before any other content. Useful for adding metadata that printer firmware reads from the first lines of the file (e.g. estimated print time, filament usage). Supports placeholders like {print_time_total_sec}, {print_time_day}, {print_time_hour}, {print_time_minute}, {print_time_sec} and {used_filament_length}." +msgstr "" msgid "Start G-code" msgstr "Hasierako G-codea" @@ -18505,12 +18427,36 @@ msgstr "Erabilitako filamentua" msgid "Total length of filament used in the print." msgstr "Inprimaketan erabilitako filamentuen luzera osoa." -msgid "Print time (seconds)" -msgstr "Inprimatze-denbora (segundoak)" +msgid "Print time (total seconds)" +msgstr "" msgid "Total estimated print time in seconds. Replaced with actual value during post-processing." msgstr "Kalkulatutako guztizko inprimatze-denbora, segundotan. Benetako balioarekin ordezten da osteko prozesatzean." +msgid "Print time (days component)" +msgstr "" + +msgid "Estimated print time day component (normal mode). Replaced with actual value during post-processing." +msgstr "" + +msgid "Print time (hours component)" +msgstr "" + +msgid "Estimated print time hour component (normal mode). Replaced with actual value during post-processing." +msgstr "" + +msgid "Print time (minutes component)" +msgstr "" + +msgid "Estimated print time minute component (normal mode). Replaced with actual value during post-processing." +msgstr "" + +msgid "Print time (seconds component)" +msgstr "" + +msgid "Estimated print time second component (normal mode). Replaced with actual value during post-processing." +msgstr "" + msgid "Filament length (meters)" msgstr "Filamentuaren luzera (metroak)" @@ -20345,6 +20291,9 @@ msgstr "Ez da baliozko saiorik detektatu. 3DPrinterOS-en saioa hasi nahi duzu?" msgid "Success!" msgstr "Ondo egin da!" +msgid "Generate API Key" +msgstr "" + msgid "Are you sure to log out?" msgstr "Ziur saioa amaitu nahi duzula?" @@ -21300,13 +21249,6 @@ msgstr "Bambu sareko plugina beharrezkoa da hodeiko funtzioetarako, inprimagailu msgid "Error: %s" msgstr "Errorea: %s" -msgid "Show details" -msgstr "Erakutsi xehetasunak" - -# AI Translated -msgid "Hide details" -msgstr "Ezkutatu xehetasunak" - msgid "Version to install:" msgstr "Instalatu beharreko bertsioa:" @@ -23891,6 +23833,12 @@ msgstr "" msgid "No binding for that field" msgstr "" +msgid "Enter a number" +msgstr "" + +msgid "Not a number" +msgstr "" + msgid "Primitive" msgstr "" @@ -23903,6 +23851,216 @@ msgstr "" msgid "Clear All" msgstr "" +msgctxt "Keyboard Shortcut" +msgid "Ins" +msgstr "" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Home" +msgstr "Hasiera" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "End" +msgstr "Amaiera" + +msgctxt "Keyboard Shortcut" +msgid "PgUp" +msgstr "" + +msgctxt "Keyboard Shortcut" +msgid "PgDn" +msgstr "" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Arrow Left" +msgstr "Ezkerrera gezia" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Arrow Right" +msgstr "Eskuinera gezia" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Arrow Up" +msgstr "Gora gezia" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Arrow Down" +msgstr "Behera gezia" + +msgid "Import geometry data from STL/STEP/3MF/OBJ/AMF files" +msgstr "Inportatu geometriaren datuak STL/STEP/3MF/OBJ/AMF fitxategietatik" + +msgid "Select all objects" +msgstr "Hautatu objektu guztiak" + +msgid "Paste from clipboard" +msgstr "Itsatsi arbeletik" + +msgid "Toggle printable for object/part" +msgstr "Txandakatu objektuaren/piezaren inprimagarritasuna" + +msgid "Move selection 10mm in negative X direction" +msgstr "Mugitu hautapena 10 mm X noranzko negatiboan" + +msgid "Move selection 10mm in positive X direction" +msgstr "Mugitu hautapena 10 mm X noranzko positiboan" + +msgid "Move selection 10mm in positive Y direction" +msgstr "Mugitu hautapena 10 mm Y noranzko positiboan" + +msgid "Move selection 10mm in negative Y direction" +msgstr "Mugitu hautapena 10 mm Y noranzko negatiboan" + +msgid "Rotate selection 45 degrees counterclockwise" +msgstr "" + +msgid "Rotate selection 45 degrees clockwise" +msgstr "" + +msgid "Gizmo move" +msgstr "Mugitzeko tresna" + +msgid "Gizmo rotate" +msgstr "Biraketa tresna" + +msgid "Gizmo scale" +msgstr "Eskalarako tresna" + +msgid "Gizmo place face on bed" +msgstr "Aurpegia ohean kokatzeko tresna" + +msgid "Gizmo cut" +msgstr "Ebakitzeko tresna" + +msgid "Gizmo mesh boolean" +msgstr "Sare boolearrerako tresna" + +msgid "Gizmo FDM paint-on supports" +msgstr "" + +msgid "Gizmo FDM paint-on seam" +msgstr "FDM josturak margotzeko tresna" + +msgid "Gizmo FDM paint-on fuzzy skin" +msgstr "FDM gainazal zimurra margotzeko tresna" + +msgid "Gizmo multi-material painting" +msgstr "" + +msgid "Gizmo text emboss/engrave" +msgstr "Testua erliebean/grabatuta ipintzeko tresna" + +msgid "Gizmo measure" +msgstr "Neurtzeko tresna" + +msgid "Gizmo assemble" +msgstr "Muntatzeko tresna" + +msgid "Gizmo brim ears" +msgstr "Belarri ertzen tresna" + +msgid "Vertical slider - Move active thumb Up" +msgstr "Graduatzaile bertikala - Mugitu hatz aktiboa gora" + +msgid "Vertical slider - Move active thumb Down" +msgstr "Graduatzaile bertikala - Mugitu hatz aktiboa behera" + +msgid "Horizontal slider - Move active thumb Left" +msgstr "Graduatzaile horizontala - Mugitu hatz aktiboa ezkerrera" + +msgid "Horizontal slider - Move active thumb Right" +msgstr "Graduatzaile horizontala - Mugitu hatz aktiboa eskuinera" + +msgid "Horizontal slider - Move to start position" +msgstr "Graduatzaile horizontala - Mugitu hasierako posiziora" + +msgid "Horizontal slider - Move to last position" +msgstr "Graduatzaile horizontala - Mugitu azken posiziora" + +msgid "Camera view - Default" +msgstr "Kameraren ikuspegia - Lehenetsia" + +msgid "Camera view - Top" +msgstr "Kameraren ikuspegia - Goia" + +msgid "Camera view - Bottom" +msgstr "Kameraren ikuspegia - Behea" + +msgid "Camera view - Front" +msgstr "Kameraren ikuspegia - Aurrea" + +msgid "Camera view - Behind" +msgstr "Kameraren ikuspegia - Atzea" + +msgid "Camera Angle - Left side" +msgstr "Kameraren angelua - Ezker aldea" + +msgid "Camera Angle - Right side" +msgstr "Kameraren angelua - Eskuin aldea" + +msgid "Camera view - Current plate" +msgstr "" + +msgid "Zoom in" +msgstr "Zooma handitu" + +msgid "Zoom out" +msgstr "Txikiagotu zooma" + +msgid "Show/Hide 3Dconnexion devices settings dialog" +msgstr "Erakutsi/Ezkutatu 3Dconnexion gailuen ezarpenen elkarrizketa-koadroa" + +msgid "Show/Hide wireframe" +msgstr "" + +msgid "On/Off G-code window" +msgstr "G-code leihoa aktibatu/desaktibatu" + +msgid "On/Off one layer mode of the vertical slider" +msgstr "Aktibatu/Desaktibatu graduatzaile bertikalaren geruza bakarreko modua" + +msgid "Switch between Prepare/Preview" +msgstr "Aldatu Prestatu/Aurrebista artean" + +msgid "Collapse/Expand the sidebar" +msgstr "Tolestu/Zabaldu alboko barra" + +msgid "Open the speed dial" +msgstr "" + +msgid "Reload the device page" +msgstr "" + +msgid "Show keyboard shortcuts list" +msgstr "Erakutsi teklatu-lasterbideen zerrenda" + +msgid "Slicing and printing" +msgstr "" + +msgid "Editing" +msgstr "" + +msgid "Placement" +msgstr "" + +msgid "Gizmos" +msgstr "" + +msgid "Sliders" +msgstr "" + +msgid "Painting tools" +msgstr "" + +msgid "Application" +msgstr "" + #: resources/data/hints.ini: [hint:Precise wall] msgid "" "Precise wall\n" @@ -24203,6 +24361,62 @@ msgstr "" "Saihestu okertzea\n" "Ba al zenekien ABS bezalako okertzeko joera duten materialak inprimatzean ohe beroaren tenperatura egoki igotzeak okertzeko probabilitatea murriztu dezakeela?" +#~ msgid "Tab" +#~ msgstr "Fitxa" + +#~ msgid "Displays current viewport FPS in the top-right corner." +#~ msgstr "Uneko ikuspegiaren FPSa goiko eskuineko izkinan erakusten du." + +# AI Translated +#~ msgid "Publish 3MF Wiki" +#~ msgstr "3MF argitaratzeko wikia" + +# AI Translated +#~ msgid "Publish 3MF Video Guide" +#~ msgstr "3MF argitaratzeko bideo-gida" + +#~ msgid "Toolbar" +#~ msgstr "Tresna-barra" + +#~ msgid "Switch table page" +#~ msgstr "Aldatu taula-orria" + +#~ msgid "Global shortcuts" +#~ msgstr "Lasterbide globalak" + +#~ msgid "Middle mouse button" +#~ msgstr "Saguaren erdiko botoia" + +#~ msgid "Auto orients selected objects or all objects. If there are selected objects, it just orients the selected ones. Otherwise, it will orient all objects in the current project." +#~ msgstr "Hautatutako objektuak edo objektu guztiak automatikoki orientatzen ditu. Objektuak hautatuta badaude, hautatutakoak bakarrik orientatzen ditu. Bestela, uneko proiektuko objektu guztiak orientatuko ditu." + +#~ msgid "Auto orients all objects on the active plate." +#~ msgstr "Objektu guztiak automatikoki orientatzen ditu plaka aktiboan." + +#~ msgid "Any arrow" +#~ msgstr "Edozein gezi" + +#~ msgid "Gizmo SLA support points" +#~ msgstr "SLA euskarri-puntuentzako tresna" + +#~ msgid "Plater" +#~ msgstr "Plaka-antolatzailea" + +#~ msgid "Gizmo" +#~ msgstr "Tresna" + +#~ msgid "Delete objects, parts, modifiers" +#~ msgstr "Ezabatu objektuak, piezak eta aldatzaileak" + +#~ msgid "Objects List" +#~ msgstr "Objektuen zerrenda" + +#~ msgid "G-code written at the very top of the output file, before any other content. Useful for adding metadata that printer firmware reads from the first lines of the file (e.g. estimated print time, filament usage). Supports placeholders like {print_time_sec} and {used_filament_length}." +#~ msgstr "Irteerako fitxategiaren hasiera-hasieran idatzitako G-codea, beste edozein eduki baino lehen. Inprimagailuaren firmwareak fitxategiaren lehen lerroetatik irakurtzen dituen metadatuak gehitzeko erabilgarria da (adibidez, zenbatetsitako inprimatze-denbora edo filamentuen erabilera). {print_time_sec} eta {used_filament_length} moduko leku-markak onartzen ditu." + +#~ msgid "Print time (seconds)" +#~ msgstr "Inprimatze-denbora (segundoak)" + #~ msgid "Open actions speed dial" #~ msgstr "Ekintzen markatze azkarra ireki" diff --git a/localization/i18n/fr/OrcaSlicer_fr.po b/localization/i18n/fr/OrcaSlicer_fr.po index a4c3c88954..f9f5f38865 100644 --- a/localization/i18n/fr/OrcaSlicer_fr.po +++ b/localization/i18n/fr/OrcaSlicer_fr.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-09-18 15:50+0800\n" +"POT-Creation-Date: 2026-09-22 12:39+0800\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: Guislain Cyril, Thomas Lété\n" @@ -5822,12 +5822,15 @@ msgctxt "Camera View" msgid "Right" msgstr "Droite" -msgid "Add" -msgstr "Ajouter" - msgid "Add plate" msgstr "Ajouter un plateau" +msgid "Split to objects" +msgstr "Diviser en objets individuels" + +msgid "Add" +msgstr "Ajouter" + msgid "Auto orient all/selected objects" msgstr "Orientation automatique de tous les objets sélectionnés" @@ -5840,9 +5843,6 @@ msgstr "Organiser tous les objets" msgid "Arrange objects on selected plates" msgstr "Organiser les objets sur les plaques sélectionnées" -msgid "Split to objects" -msgstr "Diviser en objets individuels" - msgid "Assembly View" msgstr "Vue de l'assemblage" @@ -5897,6 +5897,9 @@ msgstr "Contour" msgid "Wireframe" msgstr "Fil de fer" +msgid "X-Ray" +msgstr "" + msgid "Realistic View" msgstr "Vue réaliste" @@ -6436,7 +6439,7 @@ msgstr "Afficher le tracé contour de l’objet sélectionné dans la scène 3D. msgid "Preferences" msgstr "Préférences" -msgid "Open speed dial..." +msgid "Open speed dial" msgstr "" # AI Translated @@ -8242,9 +8245,6 @@ msgstr "Agrandir la barre latérale" msgid "Collapse sidebar" msgstr "Réduire la barre latérale" -msgid "Tab" -msgstr "Onglet" - #, c-format, boost-format msgid "Loading file: %s" msgstr "Chargement du fichier : %s" @@ -9250,10 +9250,10 @@ msgstr "Gestion multi appareils" msgid "With this option enabled, you can send a task to multiple devices at the same time and manage multiple devices." msgstr "Si cette option est activée, vous pouvez envoyer une tâche à plusieurs appareils en même temps et gérer plusieurs appareils." -msgid "Open the Speed Dial with the Space key" +msgid "Open the Speed Dial from the keyboard" msgstr "" -msgid "When enabled, pressing Space (with no other key held) opens the Speed Dial action search from any page." +msgid "When enabled, the Speed Dial keyboard shortcut (Space by default) opens the action search from any page." msgstr "" msgid "Recent actions" @@ -9385,6 +9385,15 @@ msgstr "Glisser avec le bouton droit de la souris" msgid "Set the action that dragging the right mouse button should perform." msgstr "Définit l’action effectuée en faisant glisser le bouton droit de la souris." +msgid "Keyboard" +msgstr "" + +msgid "Keyboard shortcuts" +msgstr "" + +msgid "Choose the key for each action." +msgstr "" + msgid "Clear my choice on..." msgstr "Effacer mon choix sur…" @@ -9495,11 +9504,39 @@ msgstr "" "Limite la fréquence d’images de la vue pour réduire la charge du GPU et la consommation d’énergie.\n" "Réglez sur 0 pour une fréquence d’images illimitée." +msgid "Reuse the 3D scene while idle" +msgstr "" + +msgid "" +"Skips redrawing the 3D scene when only the mouse cursor moves over the viewport,\n" +"and reuses the previous frame's scene instead. Reduces GPU load.\n" +"Disable it if the viewport shows stale or missing contents.\n" +"\n" +"Takes effect immediately." +msgstr "" + +msgid "Skip unchanged frames" +msgstr "" + +msgid "" +"Skips drawing a frame altogether when it would be identical to the one already on screen.\n" +"Only applies to frames that reuse the 3D scene, so it needs Reuse the 3D scene while idle.\n" +"Disable it if a hover highlight, tooltip or animation stops updating.\n" +"\n" +"Takes effect immediately." +msgstr "" + msgid "Show FPS overlay" msgstr "Afficher la superposition des FPS" -msgid "Displays current viewport FPS in the top-right corner." -msgstr "Affiche les FPS actuels de la vue dans le coin supérieur droit." +msgid "Displays rendering counts in the top-right corner of the viewport." +msgstr "" + +msgid "FPS: frames presented to the screen per second." +msgstr "" + +msgid "3D: frames per second that redrew the 3D scene." +msgstr "" # AI Translated msgid "G-code Preview" @@ -9956,13 +9993,8 @@ msgstr "Publier 3MF..." msgid "Select which settings to be published in the 3MF file" msgstr "Sélectionnez les réglages à publier dans le fichier 3MF" -# AI Translated -msgid "Publish 3MF Wiki" -msgstr "Wiki de Publier 3MF" - -# AI Translated -msgid "Publish 3MF Video Guide" -msgstr "Guide vidéo de Publier 3MF" +msgid "Video Guide" +msgstr "" # AI Translated msgid "Mixed filament - published as a whole when \"Enable\" above is selected" @@ -10164,6 +10196,13 @@ msgstr "" msgid "No wiki page for this action" msgstr "" +msgid "Show details" +msgstr "Afficher les détails" + +# AI Translated +msgid "Hide details" +msgstr "Masquer les détails" + #, c-format, boost-format msgid "\"%s\" is a Developer setting. Enable Developer mode to edit it?" msgstr "" @@ -11988,67 +12027,39 @@ msgstr "Le paquet de configuration a été modifié dans le guide de configurati msgid "Configuration package changed" msgstr "Package de configuration modifié" -msgid "Toolbar" -msgstr "Barre d'outils" - -msgid "Objects list" -msgstr "Liste des objets" - -msgid "Import geometry data from STL/STEP/3MF/OBJ/AMF files" -msgstr "Importez des données de géométrie à partir de fichiers STL/STEP/3MF/OBJ/AMF" - -msgid "Paste from clipboard" -msgstr "Coller depuis le presse-papier" - -msgid "Show/Hide 3Dconnexion devices settings dialog" -msgstr "Afficher/Masquer la boîte de dialogue des paramètres des périphériques 3Dconnexion" - -msgid "Switch table page" -msgstr "Page du tableau de commutation" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Space" -msgstr "Espace" - -msgid "Open speed dial" -msgstr "" - -msgid "Run a Speed Dial favourite (while the Speed Dial is open)" -msgstr "" - -msgid "Show keyboard shortcuts list" -msgstr "Afficher la liste des raccourcis clavier" - -msgid "Global shortcuts" -msgstr "Raccourcis globaux" - msgid "Pan View" msgstr "Déplacement de la vue" msgid "Rotate View" msgstr "Rotation de la vue" -msgid "Middle mouse button" -msgstr "Bouton central de la souris" +#, c-format, boost-format +msgid "Use %s or %s, or a key that does not type a character." +msgstr "" -msgid "Zoom View" -msgstr "Zoom de la vue" +msgctxt "Keyboard Shortcut" +msgid "Key" +msgstr "" -msgid "Auto orients selected objects or all objects. If there are selected objects, it just orients the selected ones. Otherwise, it will orient all objects in the current project." -msgstr "Oriente automatiquement les objets sélectionnés ou tous les objets. S’il y a des objets sélectionnés, seuls ceux-ci sont orientés. Sinon, tous les objets du projet en cours sont orientés." +msgid "Left mouse" +msgstr "" -msgid "Auto orients all objects on the active plate." -msgstr "Oriente automatiquement tous les objets de la plaque actuelle." +msgid "Available anywhere in the window, even while typing in a text field." +msgstr "" -msgid "Collapse/Expand the sidebar" -msgstr "Réduire/développer la barre latérale" +msgid "Run a speed dial favorite while the dial is open" +msgstr "" -msgid "Any arrow" -msgstr "Toutes les flèches" +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Tab" +msgstr "Tab" -msgid "Movement in camera space" -msgstr "Mouvement dans l'espace de la caméra" +msgid "Switch to the next main tab" +msgstr "" + +msgid "Available while the 3D view on the Prepare tab has focus." +msgstr "" msgid "Select a part" msgstr "Sélectionner une pièce" @@ -12059,126 +12070,29 @@ msgstr "Sélectionner plusieurs objets" msgid "Select objects by rectangle" msgstr "Sélectionner les objets par rectangle" -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Arrow Up" -msgstr "Flèche haut" - -msgid "Move selection 10mm in positive Y direction" -msgstr "Déplacer la sélection de 10 mm dans la direction positive Y" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Arrow Down" -msgstr "Flèche bas" - -msgid "Move selection 10mm in negative Y direction" -msgstr "Déplacer la sélection de 10 mm dans la direction négative Y" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Arrow Left" -msgstr "Flèche gauche" - -msgid "Move selection 10mm in negative X direction" -msgstr "Déplacer la sélection de 10 mm dans la direction négative X" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Arrow Right" -msgstr "Flèche droite" - -msgid "Move selection 10mm in positive X direction" -msgstr "Déplacer la sélection de 10 mm dans la direction positive X" +msgid "Keyboard 1-9: set filament for object/part" +msgstr "clavier 1-9 : définir le filament pour l'objet/la pièce" msgid "Movement step set to 1mm" msgstr "Pas du mouvement réglé sur 1 mm" -msgid "Keyboard 1-9: set filament for object/part" -msgstr "clavier 1-9 : définir le filament pour l'objet/la pièce" +msgid "Movement in camera space" +msgstr "Mouvement dans l'espace de la caméra" -msgid "Camera view - Default" -msgstr "Vue caméra - Par défaut" +msgid "Middle mouse" +msgstr "" -msgid "Camera view - Top" -msgstr "Vue caméra - Haut" +msgid "Right mouse" +msgstr "" -msgid "Camera view - Bottom" -msgstr "Vue caméra - Bas" +msgid "Zoom View" +msgstr "Zoom de la vue" -msgid "Camera view - Front" -msgstr "Vue de la caméra - Avant" +msgid "Painting" +msgstr "" -msgid "Camera view - Behind" -msgstr "Vue caméra - Derrière" - -msgid "Camera Angle - Left side" -msgstr "Angle de caméra - Côté gauche" - -msgid "Camera Angle - Right side" -msgstr "Angle de caméra - Côté droit" - -msgid "Select all objects" -msgstr "Sélectionner tous les objets" - -msgid "Gizmo move" -msgstr "Gizmo déplacer" - -msgid "Gizmo rotate" -msgstr "Gizmo pivoter" - -msgid "Gizmo scale" -msgstr "Gizmo redimensionner" - -msgid "Gizmo place face on bed" -msgstr "Gizmo placer la face sur le plateau" - -msgid "Gizmo cut" -msgstr "Gizmo couper" - -msgid "Gizmo mesh boolean" -msgstr "Gizmo booléennes" - -msgid "Gizmo FDM paint-on fuzzy skin" -msgstr "Outil FDM de surface irrégulière peinte" - -msgid "Gizmo SLA support points" -msgstr "Gizmo Point de support SLA" - -msgid "Gizmo FDM paint-on seam" -msgstr "Gizmo Peinture de la couture FDM" - -msgid "Gizmo text emboss/engrave" -msgstr "Gizmo embosser/graver du texte" - -msgid "Gizmo measure" -msgstr "Gizmo mesurer" - -msgid "Gizmo assemble" -msgstr "Gizmo assembler" - -msgid "Gizmo brim ears" -msgstr "Gizmo bordure à oreilles" - -msgid "Zoom in" -msgstr "Zoom avant" - -msgid "Zoom out" -msgstr "Zoom arrière" - -msgid "Toggle printable for object/part" -msgstr "Basculer l’état imprimable de l’objet/de la pièce" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Tab" -msgstr "Tab" - -msgid "Switch between Prepare/Preview" -msgstr "Basculer entre Préparer/Aperçu" - -msgid "Plater" -msgstr "Plateau" +msgid "Available while a painting gizmo is open: supports, seam, fuzzy skin or color painting." +msgstr "" msgid "Move: press to snap by 1mm" msgstr "Déplacer : appuyez pour aligner de 1 mm" @@ -12189,14 +12103,19 @@ msgstr "Support/Peinture couleur : ajustez le rayon du stylet" msgid "Support/Color Painting: adjust section position" msgstr "Support/Peinture couleur : ajuster la position de la section" -msgid "Gizmo" -msgstr "Gizmo" +msgid "Objects list" +msgstr "Liste des objets" + +msgid "Available while the object list has focus." +msgstr "" msgid "Set extruder number for the objects and parts" msgstr "Définir le numéro d'extrudeur pour les objets et les pièces" -msgid "Delete objects, parts, modifiers" -msgstr "Supprimer des objets, des pièces, des modificateurs" +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Space" +msgstr "Espace" msgid "Select the object/part and press space to change the name" msgstr "Sélectionnez l'objet/la pièce et appuyez sur espace pour changer le nom" @@ -12207,45 +12126,48 @@ msgstr "Clic de souris" msgid "Select the object/part and mouse click to change the name" msgstr "Sélectionnez l'objet/la pièce et cliquez avec la souris pour changer le nom" -msgid "Objects List" -msgstr "Liste des objets" - -msgid "Vertical slider - Move active thumb Up" -msgstr "Barre de défilement verticale - Déplacer le curseur actif vers le Haut" - -msgid "Vertical slider - Move active thumb Down" -msgstr "Barre de défilement verticale - Déplacer le curseur actif vers le Bas" - -msgid "Horizontal slider - Move active thumb Left" -msgstr "Barre de défilement horizontale - Déplacer le curseur actif vers la Gauche" - -msgid "Horizontal slider - Move active thumb Right" -msgstr "Barre de défilement horizontale - Déplacer le curseur actif vers la Droite" - -msgid "On/Off one layer mode of the vertical slider" -msgstr "On/Off mode couche unique de la barre de défilement verticale" - -msgid "On/Off G-code window" -msgstr "On/Off Fenêtre G-code" +msgid "Available while the 3D view on the Preview tab has focus." +msgstr "" msgid "Move slider 5x faster" msgstr "Déplacez le curseur 5 fois plus vite" -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Home" -msgstr "Début" +msgid "Scroll slider 5x faster" +msgstr "" -msgid "Horizontal slider - Move to start position" -msgstr "Curseur horizontal - Déplacement vers la position de départ" +msgid "Not customizable" +msgstr "" -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "End" -msgstr "Fin" +#, c-format, boost-format +msgid "%s is assigned to %s. Reassign it to %s?" +msgstr "" -msgid "Horizontal slider - Move to last position" -msgstr "Curseur horizontal - Déplacer vers la dernière position" +#, c-format, boost-format +msgid "The default %s is assigned to %s. Reassign it to %s?" +msgstr "" + +msgid "Global shortcuts also apply while typing." +msgstr "" + +msgid "A key that types a character cannot be a global shortcut." +msgstr "" + +msgid "Esc cancels, Enter confirms." +msgstr "" + +#, c-format, boost-format +msgid "" +"Press the new shortcut for\n" +"\"%s\"" +msgstr "" + +#, c-format, boost-format +msgid "Already used as a step of %s." +msgstr "" + +#, c-format, boost-format +msgid "Already assigned to %s. Press OK to reassign it." +msgstr "" msgid "Release Note" msgstr "Note de version" @@ -17090,8 +17012,8 @@ msgstr "Étapes de préchauffage" msgid "Insert multiple preheat commands (e.g. M104.1). Only useful for Prusa XL. For other printers, please set it to 1." msgstr "Insérer plusieurs commandes de préchauffage (par exemple M104.1). Uniquement utile pour la Prusa XL. Pour les autres imprimantes, veuillez le régler sur 1." -msgid "G-code written at the very top of the output file, before any other content. Useful for adding metadata that printer firmware reads from the first lines of the file (e.g. estimated print time, filament usage). Supports placeholders like {print_time_sec} and {used_filament_length}." -msgstr "G-code écrit tout en haut du fichier de sortie, avant tout autre contenu. Utile pour ajouter des métadonnées que le firmware de l'imprimante lit depuis les premières lignes du fichier (ex. temps d'impression estimé, utilisation du filament). Prend en charge les espaces réservés comme {print_time_sec} et {used_filament_length}." +msgid "G-code written at the very top of the output file, before any other content. Useful for adding metadata that printer firmware reads from the first lines of the file (e.g. estimated print time, filament usage). Supports placeholders like {print_time_total_sec}, {print_time_day}, {print_time_hour}, {print_time_minute}, {print_time_sec} and {used_filament_length}." +msgstr "" msgid "Start G-code" msgstr "G-code de démarrage" @@ -18615,12 +18537,36 @@ msgstr "Filament utilisé" msgid "Total length of filament used in the print." msgstr "Longueur totale de filament utilisé dans l'impression." -msgid "Print time (seconds)" -msgstr "Temps d'impression (secondes)" +msgid "Print time (total seconds)" +msgstr "" msgid "Total estimated print time in seconds. Replaced with actual value during post-processing." msgstr "Temps d'impression total estimé en secondes. Remplacé par la valeur réelle lors du post-traitement." +msgid "Print time (days component)" +msgstr "" + +msgid "Estimated print time day component (normal mode). Replaced with actual value during post-processing." +msgstr "" + +msgid "Print time (hours component)" +msgstr "" + +msgid "Estimated print time hour component (normal mode). Replaced with actual value during post-processing." +msgstr "" + +msgid "Print time (minutes component)" +msgstr "" + +msgid "Estimated print time minute component (normal mode). Replaced with actual value during post-processing." +msgstr "" + +msgid "Print time (seconds component)" +msgstr "" + +msgid "Estimated print time second component (normal mode). Replaced with actual value during post-processing." +msgstr "" + msgid "Filament length (meters)" msgstr "Longueur de filament (mètres)" @@ -20455,6 +20401,9 @@ msgstr "Aucune session valide détectée. Procéder à la connexion à 3DPrinter msgid "Success!" msgstr "Succès !" +msgid "Generate API Key" +msgstr "" + msgid "Are you sure to log out?" msgstr "Voulez-vous vraiment vous déconnecter ?" @@ -21410,13 +21359,6 @@ msgstr "Le plug-in réseau Bambu est requis pour les fonctionnalités cloud, la msgid "Error: %s" msgstr "Erreur : %s" -msgid "Show details" -msgstr "Afficher les détails" - -# AI Translated -msgid "Hide details" -msgstr "Masquer les détails" - msgid "Version to install:" msgstr "Version à installer :" @@ -24045,6 +23987,12 @@ msgstr "" msgid "No binding for that field" msgstr "" +msgid "Enter a number" +msgstr "" + +msgid "Not a number" +msgstr "" + msgid "Primitive" msgstr "" @@ -24057,6 +24005,216 @@ msgstr "" msgid "Clear All" msgstr "" +msgctxt "Keyboard Shortcut" +msgid "Ins" +msgstr "" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Home" +msgstr "Début" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "End" +msgstr "Fin" + +msgctxt "Keyboard Shortcut" +msgid "PgUp" +msgstr "" + +msgctxt "Keyboard Shortcut" +msgid "PgDn" +msgstr "" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Arrow Left" +msgstr "Flèche gauche" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Arrow Right" +msgstr "Flèche droite" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Arrow Up" +msgstr "Flèche haut" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Arrow Down" +msgstr "Flèche bas" + +msgid "Import geometry data from STL/STEP/3MF/OBJ/AMF files" +msgstr "Importez des données de géométrie à partir de fichiers STL/STEP/3MF/OBJ/AMF" + +msgid "Select all objects" +msgstr "Sélectionner tous les objets" + +msgid "Paste from clipboard" +msgstr "Coller depuis le presse-papier" + +msgid "Toggle printable for object/part" +msgstr "Basculer l’état imprimable de l’objet/de la pièce" + +msgid "Move selection 10mm in negative X direction" +msgstr "Déplacer la sélection de 10 mm dans la direction négative X" + +msgid "Move selection 10mm in positive X direction" +msgstr "Déplacer la sélection de 10 mm dans la direction positive X" + +msgid "Move selection 10mm in positive Y direction" +msgstr "Déplacer la sélection de 10 mm dans la direction positive Y" + +msgid "Move selection 10mm in negative Y direction" +msgstr "Déplacer la sélection de 10 mm dans la direction négative Y" + +msgid "Rotate selection 45 degrees counterclockwise" +msgstr "" + +msgid "Rotate selection 45 degrees clockwise" +msgstr "" + +msgid "Gizmo move" +msgstr "Gizmo déplacer" + +msgid "Gizmo rotate" +msgstr "Gizmo pivoter" + +msgid "Gizmo scale" +msgstr "Gizmo redimensionner" + +msgid "Gizmo place face on bed" +msgstr "Gizmo placer la face sur le plateau" + +msgid "Gizmo cut" +msgstr "Gizmo couper" + +msgid "Gizmo mesh boolean" +msgstr "Gizmo booléennes" + +msgid "Gizmo FDM paint-on supports" +msgstr "" + +msgid "Gizmo FDM paint-on seam" +msgstr "Gizmo Peinture de la couture FDM" + +msgid "Gizmo FDM paint-on fuzzy skin" +msgstr "Outil FDM de surface irrégulière peinte" + +msgid "Gizmo multi-material painting" +msgstr "" + +msgid "Gizmo text emboss/engrave" +msgstr "Gizmo embosser/graver du texte" + +msgid "Gizmo measure" +msgstr "Gizmo mesurer" + +msgid "Gizmo assemble" +msgstr "Gizmo assembler" + +msgid "Gizmo brim ears" +msgstr "Gizmo bordure à oreilles" + +msgid "Vertical slider - Move active thumb Up" +msgstr "Barre de défilement verticale - Déplacer le curseur actif vers le Haut" + +msgid "Vertical slider - Move active thumb Down" +msgstr "Barre de défilement verticale - Déplacer le curseur actif vers le Bas" + +msgid "Horizontal slider - Move active thumb Left" +msgstr "Barre de défilement horizontale - Déplacer le curseur actif vers la Gauche" + +msgid "Horizontal slider - Move active thumb Right" +msgstr "Barre de défilement horizontale - Déplacer le curseur actif vers la Droite" + +msgid "Horizontal slider - Move to start position" +msgstr "Curseur horizontal - Déplacement vers la position de départ" + +msgid "Horizontal slider - Move to last position" +msgstr "Curseur horizontal - Déplacer vers la dernière position" + +msgid "Camera view - Default" +msgstr "Vue caméra - Par défaut" + +msgid "Camera view - Top" +msgstr "Vue caméra - Haut" + +msgid "Camera view - Bottom" +msgstr "Vue caméra - Bas" + +msgid "Camera view - Front" +msgstr "Vue de la caméra - Avant" + +msgid "Camera view - Behind" +msgstr "Vue caméra - Derrière" + +msgid "Camera Angle - Left side" +msgstr "Angle de caméra - Côté gauche" + +msgid "Camera Angle - Right side" +msgstr "Angle de caméra - Côté droit" + +msgid "Camera view - Current plate" +msgstr "" + +msgid "Zoom in" +msgstr "Zoom avant" + +msgid "Zoom out" +msgstr "Zoom arrière" + +msgid "Show/Hide 3Dconnexion devices settings dialog" +msgstr "Afficher/Masquer la boîte de dialogue des paramètres des périphériques 3Dconnexion" + +msgid "Show/Hide wireframe" +msgstr "" + +msgid "On/Off G-code window" +msgstr "On/Off Fenêtre G-code" + +msgid "On/Off one layer mode of the vertical slider" +msgstr "On/Off mode couche unique de la barre de défilement verticale" + +msgid "Switch between Prepare/Preview" +msgstr "Basculer entre Préparer/Aperçu" + +msgid "Collapse/Expand the sidebar" +msgstr "Réduire/développer la barre latérale" + +msgid "Open the speed dial" +msgstr "" + +msgid "Reload the device page" +msgstr "" + +msgid "Show keyboard shortcuts list" +msgstr "Afficher la liste des raccourcis clavier" + +msgid "Slicing and printing" +msgstr "" + +msgid "Editing" +msgstr "" + +msgid "Placement" +msgstr "" + +msgid "Gizmos" +msgstr "" + +msgid "Sliders" +msgstr "" + +msgid "Painting tools" +msgstr "" + +msgid "Application" +msgstr "" + #: resources/data/hints.ini: [hint:Precise wall] msgid "" "Precise wall\n" @@ -24357,6 +24515,62 @@ msgstr "" "Éviter la déformation\n" "Saviez-vous que lors de l’impression de matériaux susceptibles de se déformer, tels que l’ABS, une augmentation appropriée de la température du plateau chauffant peut réduire la probabilité de déformation?" +#~ msgid "Tab" +#~ msgstr "Onglet" + +#~ msgid "Displays current viewport FPS in the top-right corner." +#~ msgstr "Affiche les FPS actuels de la vue dans le coin supérieur droit." + +# AI Translated +#~ msgid "Publish 3MF Wiki" +#~ msgstr "Wiki de Publier 3MF" + +# AI Translated +#~ msgid "Publish 3MF Video Guide" +#~ msgstr "Guide vidéo de Publier 3MF" + +#~ msgid "Toolbar" +#~ msgstr "Barre d'outils" + +#~ msgid "Switch table page" +#~ msgstr "Page du tableau de commutation" + +#~ msgid "Global shortcuts" +#~ msgstr "Raccourcis globaux" + +#~ msgid "Middle mouse button" +#~ msgstr "Bouton central de la souris" + +#~ msgid "Auto orients selected objects or all objects. If there are selected objects, it just orients the selected ones. Otherwise, it will orient all objects in the current project." +#~ msgstr "Oriente automatiquement les objets sélectionnés ou tous les objets. S’il y a des objets sélectionnés, seuls ceux-ci sont orientés. Sinon, tous les objets du projet en cours sont orientés." + +#~ msgid "Auto orients all objects on the active plate." +#~ msgstr "Oriente automatiquement tous les objets de la plaque actuelle." + +#~ msgid "Any arrow" +#~ msgstr "Toutes les flèches" + +#~ msgid "Gizmo SLA support points" +#~ msgstr "Gizmo Point de support SLA" + +#~ msgid "Plater" +#~ msgstr "Plateau" + +#~ msgid "Gizmo" +#~ msgstr "Gizmo" + +#~ msgid "Delete objects, parts, modifiers" +#~ msgstr "Supprimer des objets, des pièces, des modificateurs" + +#~ msgid "Objects List" +#~ msgstr "Liste des objets" + +#~ msgid "G-code written at the very top of the output file, before any other content. Useful for adding metadata that printer firmware reads from the first lines of the file (e.g. estimated print time, filament usage). Supports placeholders like {print_time_sec} and {used_filament_length}." +#~ msgstr "G-code écrit tout en haut du fichier de sortie, avant tout autre contenu. Utile pour ajouter des métadonnées que le firmware de l'imprimante lit depuis les premières lignes du fichier (ex. temps d'impression estimé, utilisation du filament). Prend en charge les espaces réservés comme {print_time_sec} et {used_filament_length}." + +#~ msgid "Print time (seconds)" +#~ msgstr "Temps d'impression (secondes)" + # AI Translated #~ msgid "Open actions speed dial" #~ msgstr "Ouvrir le menu d'actions rapides" diff --git a/localization/i18n/hu/OrcaSlicer_hu.po b/localization/i18n/hu/OrcaSlicer_hu.po index f83b1679e5..4299ad09e8 100644 --- a/localization/i18n/hu/OrcaSlicer_hu.po +++ b/localization/i18n/hu/OrcaSlicer_hu.po @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-09-18 15:50+0800\n" +"POT-Creation-Date: 2026-09-22 12:39+0800\n" "Language: hu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -5919,12 +5919,15 @@ msgctxt "Camera View" msgid "Right" msgstr "Jobb" -msgid "Add" -msgstr "Hozzáadás" - msgid "Add plate" msgstr "Tálca hozzáadása" +msgid "Split to objects" +msgstr "Felosztás objektumokra" + +msgid "Add" +msgstr "Hozzáadás" + msgid "Auto orient all/selected objects" msgstr "Az összes/kiválasztott objektum automatikus tájolása" @@ -5937,9 +5940,6 @@ msgstr "Összes objektum elrendezése" msgid "Arrange objects on selected plates" msgstr "Objektumok elrendezése a kiválasztott tálcákon" -msgid "Split to objects" -msgstr "Felosztás objektumokra" - msgid "Assembly View" msgstr "Összeszerelési nézet" @@ -5996,6 +5996,9 @@ msgstr "Körvonal" msgid "Wireframe" msgstr "Drótváz" +msgid "X-Ray" +msgstr "" + # AI Translated msgid "Realistic View" msgstr "Valósághű nézet" @@ -6538,7 +6541,7 @@ msgstr "Körvonal megjelenítése a kijelölt objektum körül a 3D nézetben." msgid "Preferences" msgstr "Beállítások" -msgid "Open speed dial..." +msgid "Open speed dial" msgstr "" # AI Translated @@ -8358,10 +8361,6 @@ msgstr "Az oldalsáv kibontása" msgid "Collapse sidebar" msgstr "&Az oldalsáv összecsukása" -# AI Translated -msgid "Tab" -msgstr "Tab" - #, c-format, boost-format msgid "Loading file: %s" msgstr "Fájl betöltése: %s" @@ -9386,10 +9385,10 @@ msgstr "Többeszközös kezelés" msgid "With this option enabled, you can send a task to multiple devices at the same time and manage multiple devices." msgstr "Ezzel az opcióval egyszerre több eszközre küldhetsz feladatot és több eszközt kezelhetsz." -msgid "Open the Speed Dial with the Space key" +msgid "Open the Speed Dial from the keyboard" msgstr "" -msgid "When enabled, pressing Space (with no other key held) opens the Speed Dial action search from any page." +msgid "When enabled, the Speed Dial keyboard shortcut (Space by default) opens the action search from any page." msgstr "" msgid "Recent actions" @@ -9521,6 +9520,15 @@ msgstr "Jobb egérhúzás" msgid "Set the action that dragging the right mouse button should perform." msgstr "Állítsd be a jobb egérgomb húzásával végrehajtandó műveletet." +msgid "Keyboard" +msgstr "" + +msgid "Keyboard shortcuts" +msgstr "" + +msgid "Choose the key for each action." +msgstr "" + msgid "Clear my choice on..." msgstr "Választásom törlése ennél..." @@ -9637,11 +9645,39 @@ msgstr "" "Korlátozza a nézetablak képsebességét a GPU terhelés és az energiafogyasztás csökkentése érdekében.\n" "Állítsd 0-ra a korlátlan képkockasebességhez." +msgid "Reuse the 3D scene while idle" +msgstr "" + +msgid "" +"Skips redrawing the 3D scene when only the mouse cursor moves over the viewport,\n" +"and reuses the previous frame's scene instead. Reduces GPU load.\n" +"Disable it if the viewport shows stale or missing contents.\n" +"\n" +"Takes effect immediately." +msgstr "" + +msgid "Skip unchanged frames" +msgstr "" + +msgid "" +"Skips drawing a frame altogether when it would be identical to the one already on screen.\n" +"Only applies to frames that reuse the 3D scene, so it needs Reuse the 3D scene while idle.\n" +"Disable it if a hover highlight, tooltip or animation stops updating.\n" +"\n" +"Takes effect immediately." +msgstr "" + msgid "Show FPS overlay" msgstr "FPS fedvény megjelenítése" -msgid "Displays current viewport FPS in the top-right corner." -msgstr "Megjeleníti az aktuális nézetablak FPS-t a jobb felső sarokban." +msgid "Displays rendering counts in the top-right corner of the viewport." +msgstr "" + +msgid "FPS: frames presented to the screen per second." +msgstr "" + +msgid "3D: frames per second that redrew the 3D scene." +msgstr "" # AI Translated msgid "G-code Preview" @@ -10116,13 +10152,8 @@ msgstr "3MF közzététele..." msgid "Select which settings to be published in the 3MF file" msgstr "Válaszd ki, mely beállítások kerüljenek közzétételre a 3MF fájlban" -# AI Translated -msgid "Publish 3MF Wiki" -msgstr "3MF közzététele wiki" - -# AI Translated -msgid "Publish 3MF Video Guide" -msgstr "3MF közzététele videós útmutató" +msgid "Video Guide" +msgstr "" # AI Translated msgid "Mixed filament - published as a whole when \"Enable\" above is selected" @@ -10324,6 +10355,13 @@ msgstr "" msgid "No wiki page for this action" msgstr "" +msgid "Show details" +msgstr "Részletek megjelenítése" + +# AI Translated +msgid "Hide details" +msgstr "Részletek elrejtése" + #, c-format, boost-format msgid "\"%s\" is a Developer setting. Enable Developer mode to edit it?" msgstr "" @@ -12170,67 +12208,39 @@ msgstr "A konfigurációs csomag az előző konfigurációs útmutatóban módos msgid "Configuration package changed" msgstr "Konfigurációs csomag megváltozott" -msgid "Toolbar" -msgstr "Eszköztár" - -msgid "Objects list" -msgstr "Objektumok listája" - -msgid "Import geometry data from STL/STEP/3MF/OBJ/AMF files" -msgstr "Geometriai adatok importálása STL/STEP/3MF/OBJ/AMF fájlokból" - -msgid "Paste from clipboard" -msgstr "Beillesztés a vágólapról" - -msgid "Show/Hide 3Dconnexion devices settings dialog" -msgstr "3Dconnexion-eszközbeállítások párbeszédablak megjelenítése/elrejtése" - -msgid "Switch table page" -msgstr "Váltás táblázatra" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Space" -msgstr "Szóköz" - -msgid "Open speed dial" -msgstr "" - -msgid "Run a Speed Dial favourite (while the Speed Dial is open)" -msgstr "" - -msgid "Show keyboard shortcuts list" -msgstr "Gyorsgombok listájának megjelenítése" - -msgid "Global shortcuts" -msgstr "Globális gyorsbillentyűk" - msgid "Pan View" msgstr "Pásztázó nézet" msgid "Rotate View" msgstr "Forgató nézet" -msgid "Middle mouse button" -msgstr "Középső egérgomb" +#, c-format, boost-format +msgid "Use %s or %s, or a key that does not type a character." +msgstr "" -msgid "Zoom View" -msgstr "Nagyító nézet" +msgctxt "Keyboard Shortcut" +msgid "Key" +msgstr "" -msgid "Auto orients selected objects or all objects. If there are selected objects, it just orients the selected ones. Otherwise, it will orient all objects in the current project." -msgstr "Automatikusan beállítja a kijelölt objektumok vagy az összes objektum tájolását. Ha vannak kijelölt objektumok, akkor csak a kijelölteket, ellenkező esetben pedig a projektben levő összes objektumot orientálja." +msgid "Left mouse" +msgstr "" -msgid "Auto orients all objects on the active plate." -msgstr "Automatikusan orientálja az aktuális tálcán levő összes objektumot." +msgid "Available anywhere in the window, even while typing in a text field." +msgstr "" -msgid "Collapse/Expand the sidebar" -msgstr "Az oldalsáv összecsukása/kinyitása" +msgid "Run a speed dial favorite while the dial is open" +msgstr "" -msgid "Any arrow" -msgstr "Bármelyik nyílbillentyű" +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Tab" +msgstr "Tab" -msgid "Movement in camera space" -msgstr "Mozgás a kameratérben" +msgid "Switch to the next main tab" +msgstr "" + +msgid "Available while the 3D view on the Prepare tab has focus." +msgstr "" msgid "Select a part" msgstr "Válassz egy tárgyat" @@ -12241,126 +12251,29 @@ msgstr "Több objektum kijelölése" msgid "Select objects by rectangle" msgstr "Objektumok kijelölése téglalapok alapján" -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Arrow Up" -msgstr "Felfelé nyíl" - -msgid "Move selection 10mm in positive Y direction" -msgstr "Kijelölés mozgatása 10 mm-rel pozitív Y irányban" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Arrow Down" -msgstr "Lefelé nyíl" - -msgid "Move selection 10mm in negative Y direction" -msgstr "Kijelölés mozgatása 10 mm-rel negatív Y irányban" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Arrow Left" -msgstr "Balra nyíl" - -msgid "Move selection 10mm in negative X direction" -msgstr "Kijelölés mozgatása 10 mm-rel negatív X irányban" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Arrow Right" -msgstr "Jobbra nyíl" - -msgid "Move selection 10mm in positive X direction" -msgstr "Kijelölés mozgatása 10 mm-rel pozitív X irányban" +msgid "Keyboard 1-9: set filament for object/part" +msgstr "filament hozzárendelése az objektumhoz/tárgyhoz" msgid "Movement step set to 1mm" msgstr "Mozgatás lépéstávolsága 1mm-re állítva" -msgid "Keyboard 1-9: set filament for object/part" -msgstr "filament hozzárendelése az objektumhoz/tárgyhoz" +msgid "Movement in camera space" +msgstr "Mozgás a kameratérben" -msgid "Camera view - Default" -msgstr "Kameranézet - Alapértelmezett" +msgid "Middle mouse" +msgstr "" -msgid "Camera view - Top" -msgstr "Kameranézet - Felülről" +msgid "Right mouse" +msgstr "" -msgid "Camera view - Bottom" -msgstr "Kameranézet - Alulról" +msgid "Zoom View" +msgstr "Nagyító nézet" -msgid "Camera view - Front" -msgstr "Kameranézet - Elölről" +msgid "Painting" +msgstr "" -msgid "Camera view - Behind" -msgstr "Kameranézet - Hátulról" - -msgid "Camera Angle - Left side" -msgstr "Kameranézet - Bal oldal" - -msgid "Camera Angle - Right side" -msgstr "Kameranézet - Jobb oldal" - -msgid "Select all objects" -msgstr "Összes objektum kijelölése" - -msgid "Gizmo move" -msgstr "Gizmo mozgatás" - -msgid "Gizmo rotate" -msgstr "Gizmo forgatás" - -msgid "Gizmo scale" -msgstr "Gizmo átméretezés" - -msgid "Gizmo place face on bed" -msgstr "Gizmo felület asztalra illesztése" - -msgid "Gizmo cut" -msgstr "Gizmo vágás" - -msgid "Gizmo mesh boolean" -msgstr "Gizmo modellháló logikai műveletek" - -msgid "Gizmo FDM paint-on fuzzy skin" -msgstr "Gizmo FDM barázdált felület festése" - -msgid "Gizmo SLA support points" -msgstr "Gizmo SLA támaszpontok" - -msgid "Gizmo FDM paint-on seam" -msgstr "Gizmo FDM varrat festés" - -msgid "Gizmo text emboss/engrave" -msgstr "Gizmo szöveg dombornyomás/gravírozás" - -msgid "Gizmo measure" -msgstr "Gizmo mérés" - -msgid "Gizmo assemble" -msgstr "Gizmo összeállítás" - -msgid "Gizmo brim ears" -msgstr "Gizmo peremfülek" - -msgid "Zoom in" -msgstr "Zoom közelítés" - -msgid "Zoom out" -msgstr "Zoom távolítás" - -msgid "Toggle printable for object/part" -msgstr "Nyomtathatóság váltása objektumhoz/alkatrészhez" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Tab" -msgstr "Tab" - -msgid "Switch between Prepare/Preview" -msgstr "Váltás előkészítés/előnézet között" - -msgid "Plater" -msgstr "Tálca" +msgid "Available while a painting gizmo is open: supports, seam, fuzzy skin or color painting." +msgstr "" msgid "Move: press to snap by 1mm" msgstr "Mozgatás: lenyomva 1 mm-es lépésekre illeszt" @@ -12371,15 +12284,19 @@ msgstr "Támasz/Színfestés: toll méretének beállítása" msgid "Support/Color Painting: adjust section position" msgstr "Támasz/Színfestés: metszet pozíciójának beállítása" -# AI Translated -msgid "Gizmo" -msgstr "Gizmo" +msgid "Objects list" +msgstr "Objektumok listája" + +msgid "Available while the object list has focus." +msgstr "" msgid "Set extruder number for the objects and parts" msgstr "Extruder szám beállítása az objektumok és tárgyak számára" -msgid "Delete objects, parts, modifiers" -msgstr "Objektumok, tárgyak, módosítók törlése" +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Space" +msgstr "Szóköz" msgid "Select the object/part and press space to change the name" msgstr "Válaszd ki az objektumot vagy alkatrészt, majd nyomd meg a szóközt a név megváltoztatásához" @@ -12390,45 +12307,48 @@ msgstr "Egérkattintás" msgid "Select the object/part and mouse click to change the name" msgstr "Válaszd ki az objektumot vagy alkatrészt, majd kattints a nevére az átnevezéshez" -msgid "Objects List" -msgstr "Tárgyak listája" - -msgid "Vertical slider - Move active thumb Up" -msgstr "Függőleges csúszka - Az aktív csúszka felfelé mozgatása" - -msgid "Vertical slider - Move active thumb Down" -msgstr "Függőleges csúszka - Az aktív csúszka lefelé mozgatása" - -msgid "Horizontal slider - Move active thumb Left" -msgstr "Vízszintes csúszka - Az aktív csúszka balra mozgatása" - -msgid "Horizontal slider - Move active thumb Right" -msgstr "Vízszintes csúszka - Az aktív csúszka jobbra mozgatása" - -msgid "On/Off one layer mode of the vertical slider" -msgstr "Függőleges csúszka egyréteges módjának ki/bekapcsolása" - -msgid "On/Off G-code window" -msgstr "G-kód ablak be/ki" +msgid "Available while the 3D view on the Preview tab has focus." +msgstr "" msgid "Move slider 5x faster" msgstr "Csúszka 5x gyorsabb mozgatása" -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Home" -msgstr "Home" +msgid "Scroll slider 5x faster" +msgstr "" -msgid "Horizontal slider - Move to start position" -msgstr "Vízszintes csúszka - Ugrás a kezdőpozícióra" +msgid "Not customizable" +msgstr "" -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "End" -msgstr "End" +#, c-format, boost-format +msgid "%s is assigned to %s. Reassign it to %s?" +msgstr "" -msgid "Horizontal slider - Move to last position" -msgstr "Vízszintes csúszka - Ugrás az utolsó pozícióra" +#, c-format, boost-format +msgid "The default %s is assigned to %s. Reassign it to %s?" +msgstr "" + +msgid "Global shortcuts also apply while typing." +msgstr "" + +msgid "A key that types a character cannot be a global shortcut." +msgstr "" + +msgid "Esc cancels, Enter confirms." +msgstr "" + +#, c-format, boost-format +msgid "" +"Press the new shortcut for\n" +"\"%s\"" +msgstr "" + +#, c-format, boost-format +msgid "Already used as a step of %s." +msgstr "" + +#, c-format, boost-format +msgid "Already assigned to %s. Press OK to reassign it." +msgstr "" msgid "Release Note" msgstr "Verzióinformáció" @@ -17350,8 +17270,8 @@ msgstr "Előmelegítési lépések" msgid "Insert multiple preheat commands (e.g. M104.1). Only useful for Prusa XL. For other printers, please set it to 1." msgstr "Több előmelegítési parancs beszúrása (pl. M104.1). Ez csak a Prusa XL esetén hasznos. Más nyomtatóknál állítsd 1-re." -msgid "G-code written at the very top of the output file, before any other content. Useful for adding metadata that printer firmware reads from the first lines of the file (e.g. estimated print time, filament usage). Supports placeholders like {print_time_sec} and {used_filament_length}." -msgstr "A kimeneti fájl legelejére írt G-kód, minden más tartalom előtt. Hasznos olyan metaadatok hozzáadására, amelyeket a nyomtató firmware-e a fájl első soraiból olvas ki (pl. becsült nyomtatási idő, filamentfelhasználás). Támogatja az olyan helyőrzőket, mint a {print_time_sec} és a {used_filament_length}." +msgid "G-code written at the very top of the output file, before any other content. Useful for adding metadata that printer firmware reads from the first lines of the file (e.g. estimated print time, filament usage). Supports placeholders like {print_time_total_sec}, {print_time_day}, {print_time_hour}, {print_time_minute}, {print_time_sec} and {used_filament_length}." +msgstr "" msgid "Start G-code" msgstr "Kezdő G-kód" @@ -18888,12 +18808,36 @@ msgstr "Használt filament" msgid "Total length of filament used in the print." msgstr "A nyomtatás során felhasznált filament teljes hossza." -msgid "Print time (seconds)" -msgstr "Nyomtatási idő (másodperc)" +msgid "Print time (total seconds)" +msgstr "" msgid "Total estimated print time in seconds. Replaced with actual value during post-processing." msgstr "A teljes becsült nyomtatási idő másodpercben. Az utófeldolgozás során a tényleges értékre cserélődik." +msgid "Print time (days component)" +msgstr "" + +msgid "Estimated print time day component (normal mode). Replaced with actual value during post-processing." +msgstr "" + +msgid "Print time (hours component)" +msgstr "" + +msgid "Estimated print time hour component (normal mode). Replaced with actual value during post-processing." +msgstr "" + +msgid "Print time (minutes component)" +msgstr "" + +msgid "Estimated print time minute component (normal mode). Replaced with actual value during post-processing." +msgstr "" + +msgid "Print time (seconds component)" +msgstr "" + +msgid "Estimated print time second component (normal mode). Replaced with actual value during post-processing." +msgstr "" + msgid "Filament length (meters)" msgstr "Filament hossza (méter)" @@ -20761,6 +20705,9 @@ msgstr "Nem található érvényes munkamenet. Folytatod a bejelentkezést a 3DP msgid "Success!" msgstr "Sikerült!" +msgid "Generate API Key" +msgstr "" + msgid "Are you sure to log out?" msgstr "Biztosan kijelentkezel?" @@ -21810,13 +21757,6 @@ msgstr "A Bambu hálózati bővítmény szükséges a felhőfunkciókhoz, a nyom msgid "Error: %s" msgstr "Hiba: %s" -msgid "Show details" -msgstr "Részletek megjelenítése" - -# AI Translated -msgid "Hide details" -msgstr "Részletek elrejtése" - msgid "Version to install:" msgstr "Telepítendő verzió:" @@ -24473,6 +24413,12 @@ msgstr "" msgid "No binding for that field" msgstr "" +msgid "Enter a number" +msgstr "" + +msgid "Not a number" +msgstr "" + msgid "Primitive" msgstr "" @@ -24485,6 +24431,216 @@ msgstr "" msgid "Clear All" msgstr "" +msgctxt "Keyboard Shortcut" +msgid "Ins" +msgstr "" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Home" +msgstr "Home" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "End" +msgstr "End" + +msgctxt "Keyboard Shortcut" +msgid "PgUp" +msgstr "" + +msgctxt "Keyboard Shortcut" +msgid "PgDn" +msgstr "" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Arrow Left" +msgstr "Balra nyíl" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Arrow Right" +msgstr "Jobbra nyíl" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Arrow Up" +msgstr "Felfelé nyíl" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Arrow Down" +msgstr "Lefelé nyíl" + +msgid "Import geometry data from STL/STEP/3MF/OBJ/AMF files" +msgstr "Geometriai adatok importálása STL/STEP/3MF/OBJ/AMF fájlokból" + +msgid "Select all objects" +msgstr "Összes objektum kijelölése" + +msgid "Paste from clipboard" +msgstr "Beillesztés a vágólapról" + +msgid "Toggle printable for object/part" +msgstr "Nyomtathatóság váltása objektumhoz/alkatrészhez" + +msgid "Move selection 10mm in negative X direction" +msgstr "Kijelölés mozgatása 10 mm-rel negatív X irányban" + +msgid "Move selection 10mm in positive X direction" +msgstr "Kijelölés mozgatása 10 mm-rel pozitív X irányban" + +msgid "Move selection 10mm in positive Y direction" +msgstr "Kijelölés mozgatása 10 mm-rel pozitív Y irányban" + +msgid "Move selection 10mm in negative Y direction" +msgstr "Kijelölés mozgatása 10 mm-rel negatív Y irányban" + +msgid "Rotate selection 45 degrees counterclockwise" +msgstr "" + +msgid "Rotate selection 45 degrees clockwise" +msgstr "" + +msgid "Gizmo move" +msgstr "Gizmo mozgatás" + +msgid "Gizmo rotate" +msgstr "Gizmo forgatás" + +msgid "Gizmo scale" +msgstr "Gizmo átméretezés" + +msgid "Gizmo place face on bed" +msgstr "Gizmo felület asztalra illesztése" + +msgid "Gizmo cut" +msgstr "Gizmo vágás" + +msgid "Gizmo mesh boolean" +msgstr "Gizmo modellháló logikai műveletek" + +msgid "Gizmo FDM paint-on supports" +msgstr "" + +msgid "Gizmo FDM paint-on seam" +msgstr "Gizmo FDM varrat festés" + +msgid "Gizmo FDM paint-on fuzzy skin" +msgstr "Gizmo FDM barázdált felület festése" + +msgid "Gizmo multi-material painting" +msgstr "" + +msgid "Gizmo text emboss/engrave" +msgstr "Gizmo szöveg dombornyomás/gravírozás" + +msgid "Gizmo measure" +msgstr "Gizmo mérés" + +msgid "Gizmo assemble" +msgstr "Gizmo összeállítás" + +msgid "Gizmo brim ears" +msgstr "Gizmo peremfülek" + +msgid "Vertical slider - Move active thumb Up" +msgstr "Függőleges csúszka - Az aktív csúszka felfelé mozgatása" + +msgid "Vertical slider - Move active thumb Down" +msgstr "Függőleges csúszka - Az aktív csúszka lefelé mozgatása" + +msgid "Horizontal slider - Move active thumb Left" +msgstr "Vízszintes csúszka - Az aktív csúszka balra mozgatása" + +msgid "Horizontal slider - Move active thumb Right" +msgstr "Vízszintes csúszka - Az aktív csúszka jobbra mozgatása" + +msgid "Horizontal slider - Move to start position" +msgstr "Vízszintes csúszka - Ugrás a kezdőpozícióra" + +msgid "Horizontal slider - Move to last position" +msgstr "Vízszintes csúszka - Ugrás az utolsó pozícióra" + +msgid "Camera view - Default" +msgstr "Kameranézet - Alapértelmezett" + +msgid "Camera view - Top" +msgstr "Kameranézet - Felülről" + +msgid "Camera view - Bottom" +msgstr "Kameranézet - Alulról" + +msgid "Camera view - Front" +msgstr "Kameranézet - Elölről" + +msgid "Camera view - Behind" +msgstr "Kameranézet - Hátulról" + +msgid "Camera Angle - Left side" +msgstr "Kameranézet - Bal oldal" + +msgid "Camera Angle - Right side" +msgstr "Kameranézet - Jobb oldal" + +msgid "Camera view - Current plate" +msgstr "" + +msgid "Zoom in" +msgstr "Zoom közelítés" + +msgid "Zoom out" +msgstr "Zoom távolítás" + +msgid "Show/Hide 3Dconnexion devices settings dialog" +msgstr "3Dconnexion-eszközbeállítások párbeszédablak megjelenítése/elrejtése" + +msgid "Show/Hide wireframe" +msgstr "" + +msgid "On/Off G-code window" +msgstr "G-kód ablak be/ki" + +msgid "On/Off one layer mode of the vertical slider" +msgstr "Függőleges csúszka egyréteges módjának ki/bekapcsolása" + +msgid "Switch between Prepare/Preview" +msgstr "Váltás előkészítés/előnézet között" + +msgid "Collapse/Expand the sidebar" +msgstr "Az oldalsáv összecsukása/kinyitása" + +msgid "Open the speed dial" +msgstr "" + +msgid "Reload the device page" +msgstr "" + +msgid "Show keyboard shortcuts list" +msgstr "Gyorsgombok listájának megjelenítése" + +msgid "Slicing and printing" +msgstr "" + +msgid "Editing" +msgstr "" + +msgid "Placement" +msgstr "" + +msgid "Gizmos" +msgstr "" + +msgid "Sliders" +msgstr "" + +msgid "Painting tools" +msgstr "" + +msgid "Application" +msgstr "" + #: resources/data/hints.ini: [hint:Precise wall] msgid "" "Precise wall\n" @@ -24786,6 +24942,64 @@ msgstr "" "Kunkorodás elkerülése\n" "Tudtad, hogy a kunkorodásra hajlamos anyagok (például ABS) nyomtatásakor az asztal hőmérsékletének növelése csökkentheti a kunkorodás valószínűségét?" +# AI Translated +#~ msgid "Tab" +#~ msgstr "Tab" + +#~ msgid "Displays current viewport FPS in the top-right corner." +#~ msgstr "Megjeleníti az aktuális nézetablak FPS-t a jobb felső sarokban." + +# AI Translated +#~ msgid "Publish 3MF Wiki" +#~ msgstr "3MF közzététele wiki" + +# AI Translated +#~ msgid "Publish 3MF Video Guide" +#~ msgstr "3MF közzététele videós útmutató" + +#~ msgid "Toolbar" +#~ msgstr "Eszköztár" + +#~ msgid "Switch table page" +#~ msgstr "Váltás táblázatra" + +#~ msgid "Global shortcuts" +#~ msgstr "Globális gyorsbillentyűk" + +#~ msgid "Middle mouse button" +#~ msgstr "Középső egérgomb" + +#~ msgid "Auto orients selected objects or all objects. If there are selected objects, it just orients the selected ones. Otherwise, it will orient all objects in the current project." +#~ msgstr "Automatikusan beállítja a kijelölt objektumok vagy az összes objektum tájolását. Ha vannak kijelölt objektumok, akkor csak a kijelölteket, ellenkező esetben pedig a projektben levő összes objektumot orientálja." + +#~ msgid "Auto orients all objects on the active plate." +#~ msgstr "Automatikusan orientálja az aktuális tálcán levő összes objektumot." + +#~ msgid "Any arrow" +#~ msgstr "Bármelyik nyílbillentyű" + +#~ msgid "Gizmo SLA support points" +#~ msgstr "Gizmo SLA támaszpontok" + +#~ msgid "Plater" +#~ msgstr "Tálca" + +# AI Translated +#~ msgid "Gizmo" +#~ msgstr "Gizmo" + +#~ msgid "Delete objects, parts, modifiers" +#~ msgstr "Objektumok, tárgyak, módosítók törlése" + +#~ msgid "Objects List" +#~ msgstr "Tárgyak listája" + +#~ msgid "G-code written at the very top of the output file, before any other content. Useful for adding metadata that printer firmware reads from the first lines of the file (e.g. estimated print time, filament usage). Supports placeholders like {print_time_sec} and {used_filament_length}." +#~ msgstr "A kimeneti fájl legelejére írt G-kód, minden más tartalom előtt. Hasznos olyan metaadatok hozzáadására, amelyeket a nyomtató firmware-e a fájl első soraiból olvas ki (pl. becsült nyomtatási idő, filamentfelhasználás). Támogatja az olyan helyőrzőket, mint a {print_time_sec} és a {used_filament_length}." + +#~ msgid "Print time (seconds)" +#~ msgstr "Nyomtatási idő (másodperc)" + # AI Translated #~ msgid "Open actions speed dial" #~ msgstr "Műveletek gyorsmenüjének megnyitása" diff --git a/localization/i18n/it/OrcaSlicer_it.po b/localization/i18n/it/OrcaSlicer_it.po index 087189ae93..c8dd94c407 100644 --- a/localization/i18n/it/OrcaSlicer_it.po +++ b/localization/i18n/it/OrcaSlicer_it.po @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-09-18 15:50+0800\n" +"POT-Creation-Date: 2026-09-22 12:39+0800\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: \n" @@ -5920,12 +5920,15 @@ msgctxt "Camera View" msgid "Right" msgstr "Destra" -msgid "Add" -msgstr "Aggiungi" - msgid "Add plate" msgstr "Aggiungi piatto" +msgid "Split to objects" +msgstr "Dividi in oggetti" + +msgid "Add" +msgstr "Aggiungi" + msgid "Auto orient all/selected objects" msgstr "Orientamento automatico tutti/selezionati oggetti" @@ -5938,9 +5941,6 @@ msgstr "Disponi tutti gli oggetti" msgid "Arrange objects on selected plates" msgstr "Disponi gli oggetti sui piatti selezionati" -msgid "Split to objects" -msgstr "Dividi in oggetti" - msgid "Assembly View" msgstr "Vista di montaggio" @@ -5997,6 +5997,9 @@ msgstr "Contorno" msgid "Wireframe" msgstr "Modello reticolato" +msgid "X-Ray" +msgstr "" + # AI Translated msgid "Realistic View" msgstr "Vista realistica" @@ -6540,7 +6543,7 @@ msgstr "Mostra il contorno attorno all'oggetto selezionato nella scena 3D." msgid "Preferences" msgstr "Preferenze" -msgid "Open speed dial..." +msgid "Open speed dial" msgstr "" # AI Translated @@ -8362,10 +8365,6 @@ msgstr "Espandi barra laterale" msgid "Collapse sidebar" msgstr "Riduci barra laterale" -# AI Translated -msgid "Tab" -msgstr "Tab" - #, c-format, boost-format msgid "Loading file: %s" msgstr "Caricamento file: %s" @@ -9388,10 +9387,10 @@ msgstr "Gestione multi-dispositivo" msgid "With this option enabled, you can send a task to multiple devices at the same time and manage multiple devices." msgstr "Abilitando questa opzione, puoi inviare un'attività a più dispositivi contemporaneamente e gestire più dispositivi." -msgid "Open the Speed Dial with the Space key" +msgid "Open the Speed Dial from the keyboard" msgstr "" -msgid "When enabled, pressing Space (with no other key held) opens the Speed Dial action search from any page." +msgid "When enabled, the Speed Dial keyboard shortcut (Space by default) opens the action search from any page." msgstr "" msgid "Recent actions" @@ -9530,6 +9529,15 @@ msgstr "Trascinamento con il tasto destro del mouse" msgid "Set the action that dragging the right mouse button should perform." msgstr "Imposta l'azione che deve eseguire il trascinamento con il tasto destro del mouse." +msgid "Keyboard" +msgstr "" + +msgid "Keyboard shortcuts" +msgstr "" + +msgid "Choose the key for each action." +msgstr "" + msgid "Clear my choice on..." msgstr "Cancella la mia scelta su..." @@ -9654,13 +9662,40 @@ msgstr "" "Limita la frequenza dei fotogrammi della vista per ridurre il carico della GPU e il consumo energetico.\n" "Imposta a 0 per una frequenza dei fotogrammi illimitata." +msgid "Reuse the 3D scene while idle" +msgstr "" + +msgid "" +"Skips redrawing the 3D scene when only the mouse cursor moves over the viewport,\n" +"and reuses the previous frame's scene instead. Reduces GPU load.\n" +"Disable it if the viewport shows stale or missing contents.\n" +"\n" +"Takes effect immediately." +msgstr "" + +msgid "Skip unchanged frames" +msgstr "" + +msgid "" +"Skips drawing a frame altogether when it would be identical to the one already on screen.\n" +"Only applies to frames that reuse the 3D scene, so it needs Reuse the 3D scene while idle.\n" +"Disable it if a hover highlight, tooltip or animation stops updating.\n" +"\n" +"Takes effect immediately." +msgstr "" + # AI Translated msgid "Show FPS overlay" msgstr "Mostra overlay FPS" -# AI Translated -msgid "Displays current viewport FPS in the top-right corner." -msgstr "Mostra gli FPS correnti della vista nell'angolo in alto a destra." +msgid "Displays rendering counts in the top-right corner of the viewport." +msgstr "" + +msgid "FPS: frames presented to the screen per second." +msgstr "" + +msgid "3D: frames per second that redrew the 3D scene." +msgstr "" # AI Translated msgid "G-code Preview" @@ -10134,13 +10169,8 @@ msgstr "Pubblica 3MF..." msgid "Select which settings to be published in the 3MF file" msgstr "Seleziona quali impostazioni pubblicare nel file 3MF" -# AI Translated -msgid "Publish 3MF Wiki" -msgstr "Wiki di Pubblica 3MF" - -# AI Translated -msgid "Publish 3MF Video Guide" -msgstr "Guida video di Pubblica 3MF" +msgid "Video Guide" +msgstr "" # AI Translated msgid "Mixed filament - published as a whole when \"Enable\" above is selected" @@ -10342,6 +10372,13 @@ msgstr "" msgid "No wiki page for this action" msgstr "" +msgid "Show details" +msgstr "Mostra dettagli" + +# AI Translated +msgid "Hide details" +msgstr "Nascondi dettagli" + #, c-format, boost-format msgid "\"%s\" is a Developer setting. Enable Developer mode to edit it?" msgstr "" @@ -12190,68 +12227,39 @@ msgstr "Il pacchetto di configurazione è stato modificato nella precedente Guid msgid "Configuration package changed" msgstr "Pacchetto di configurazione modificato" -msgid "Toolbar" -msgstr "Barra degli strumenti" - -msgid "Objects list" -msgstr "Elenco oggetti" - -msgid "Import geometry data from STL/STEP/3MF/OBJ/AMF files" -msgstr "Importa geometrie da file STL/STEP/3MF/OBJ/AMF" - -msgid "Paste from clipboard" -msgstr "Incolla dagli appunti" - -msgid "Show/Hide 3Dconnexion devices settings dialog" -msgstr "Mostra/nascondi la finestra di dialogo delle impostazioni dei dispositivi 3Dconnexion" - -msgid "Switch table page" -msgstr "Cambia pagina tabella" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Space" -msgstr "Spazio" - -msgid "Open speed dial" -msgstr "" - -msgid "Run a Speed Dial favourite (while the Speed Dial is open)" -msgstr "" - -msgid "Show keyboard shortcuts list" -msgstr "Mostra elenco scorciatoie da tastiera" - -msgid "Global shortcuts" -msgstr "Scorciatoie globali" - msgid "Pan View" msgstr "Vista panoramica" msgid "Rotate View" msgstr "Ruota vista" +#, c-format, boost-format +msgid "Use %s or %s, or a key that does not type a character." +msgstr "" + +msgctxt "Keyboard Shortcut" +msgid "Key" +msgstr "" + +msgid "Left mouse" +msgstr "" + +msgid "Available anywhere in the window, even while typing in a text field." +msgstr "" + +msgid "Run a speed dial favorite while the dial is open" +msgstr "" + # AI Translated -msgid "Middle mouse button" -msgstr "Tasto centrale del mouse" +msgctxt "Keyboard Shortcut" +msgid "Tab" +msgstr "Tab" -msgid "Zoom View" -msgstr "Vista Zoom" +msgid "Switch to the next main tab" +msgstr "" -msgid "Auto orients selected objects or all objects. If there are selected objects, it just orients the selected ones. Otherwise, it will orient all objects in the current project." -msgstr "Questo orienta automaticamente gli oggetti selezionati o tutti gli oggetti. Se ci sono oggetti selezionati, orienta solo quelli selezionati. Altrimenti, orienterà tutti gli elementi nel progetto corrente." - -msgid "Auto orients all objects on the active plate." -msgstr "Questo orienta tutti gli oggetti nel piatto corrente." - -msgid "Collapse/Expand the sidebar" -msgstr "Riduci/Espandi barra laterale" - -msgid "Any arrow" -msgstr "Qualsiasi freccia" - -msgid "Movement in camera space" -msgstr "Movimento nello spazio della telecamera" +msgid "Available while the 3D view on the Prepare tab has focus." +msgstr "" msgid "Select a part" msgstr "Seleziona parte" @@ -12262,126 +12270,29 @@ msgstr "Seleziona più oggetti" msgid "Select objects by rectangle" msgstr "Seleziona oggetti per rettangolo" -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Arrow Up" -msgstr "Freccia su" - -msgid "Move selection 10mm in positive Y direction" -msgstr "Sposta selezione di 10 mm in direzione Y positiva" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Arrow Down" -msgstr "Freccia giù" - -msgid "Move selection 10mm in negative Y direction" -msgstr "Sposta selezione di 10 mm in direzione Y negativa" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Arrow Left" -msgstr "Freccia sinistra" - -msgid "Move selection 10mm in negative X direction" -msgstr "Sposta selezione di 10 mm in direzione X negativa" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Arrow Right" -msgstr "Freccia destra" - -msgid "Move selection 10mm in positive X direction" -msgstr "Sposta selezione di 10 mm in direzione X positiva" +msgid "Keyboard 1-9: set filament for object/part" +msgstr "Tastiera 1-9: imposta il filamento per l'oggetto/parte" msgid "Movement step set to 1mm" msgstr "Passo movimento impostato a 1 mm" -msgid "Keyboard 1-9: set filament for object/part" -msgstr "Tastiera 1-9: imposta il filamento per l'oggetto/parte" +msgid "Movement in camera space" +msgstr "Movimento nello spazio della telecamera" -msgid "Camera view - Default" -msgstr "Vista telecamera - Predefinito" +msgid "Middle mouse" +msgstr "" -msgid "Camera view - Top" -msgstr "Vista telecamera - In Alto" +msgid "Right mouse" +msgstr "" -msgid "Camera view - Bottom" -msgstr "Vista telecamera - In Basso" +msgid "Zoom View" +msgstr "Vista Zoom" -msgid "Camera view - Front" -msgstr "Vista telecamera - Anteriore" +msgid "Painting" +msgstr "" -msgid "Camera view - Behind" -msgstr "Vista telecamera - Posteriore" - -msgid "Camera Angle - Left side" -msgstr "Angolo della camera - Lato sinistro" - -msgid "Camera Angle - Right side" -msgstr "Angolo della camera - Lato destro" - -msgid "Select all objects" -msgstr "Seleziona tutti gli oggetti" - -msgid "Gizmo move" -msgstr "Strumento Muovi" - -msgid "Gizmo rotate" -msgstr "Strumento Ruota" - -msgid "Gizmo scale" -msgstr "Strumento Scala" - -msgid "Gizmo place face on bed" -msgstr "Strumento posiziona faccia sul piatto" - -msgid "Gizmo cut" -msgstr "Strumento Taglia" - -msgid "Gizmo mesh boolean" -msgstr "Gizmo maglia booleana" - -msgid "Gizmo FDM paint-on fuzzy skin" -msgstr "Strumento FDM per superficie ruvida dipinta" - -msgid "Gizmo SLA support points" -msgstr "Strumento Punti di supporto SLA" - -msgid "Gizmo FDM paint-on seam" -msgstr "Strumento Dipingi cucitura FDM" - -msgid "Gizmo text emboss/engrave" -msgstr "Strumento testo in rilievo/incisione" - -msgid "Gizmo measure" -msgstr "Gizmo misura" - -msgid "Gizmo assemble" -msgstr "Gizmo assemblaggio" - -msgid "Gizmo brim ears" -msgstr "Gizmo tese ad orecchio" - -msgid "Zoom in" -msgstr "Ingrandisci" - -msgid "Zoom out" -msgstr "Rimpicciolisci" - -msgid "Toggle printable for object/part" -msgstr "Attiva/disattiva stampa per oggetto/parte" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Tab" -msgstr "Tab" - -msgid "Switch between Prepare/Preview" -msgstr "Passa tra Prepara e Anteprima" - -msgid "Plater" -msgstr "Piatto" +msgid "Available while a painting gizmo is open: supports, seam, fuzzy skin or color painting." +msgstr "" msgid "Move: press to snap by 1mm" msgstr "Sposta: premi per muovere di 1 mm" @@ -12392,14 +12303,19 @@ msgstr "Supporto/Pittura a colori: regola il raggio della penna" msgid "Support/Color Painting: adjust section position" msgstr "Supporto/Pittura a colori: regola la posizione della sezione" -msgid "Gizmo" -msgstr "Strumento" +msgid "Objects list" +msgstr "Elenco oggetti" + +msgid "Available while the object list has focus." +msgstr "" msgid "Set extruder number for the objects and parts" msgstr "Imposta il numero dell'estrusore per gli oggetti e le parti" -msgid "Delete objects, parts, modifiers" -msgstr "Elimina oggetti, parti, modificatori" +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Space" +msgstr "Spazio" msgid "Select the object/part and press space to change the name" msgstr "Seleziona l'oggetto/la parte e premi la barra spaziatrice per modificare il nome" @@ -12410,45 +12326,48 @@ msgstr "Clic del mouse" msgid "Select the object/part and mouse click to change the name" msgstr "Seleziona l'oggetto/la parte e fai clic con il mouse per modificare il nome" -msgid "Objects List" -msgstr "Elenco oggetti" - -msgid "Vertical slider - Move active thumb Up" -msgstr "Cursore di scorrimento verticale - Solleva cursore attivo" - -msgid "Vertical slider - Move active thumb Down" -msgstr "Cursore di scorrimento verticale - Abbassa cursore attivo" - -msgid "Horizontal slider - Move active thumb Left" -msgstr "Cursore di scorrimento orizzontale - Sposta a sinistra il cursore attivo" - -msgid "Horizontal slider - Move active thumb Right" -msgstr "Cursore di scorrimento orizzontale - Sposta a destra il cursore attivo" - -msgid "On/Off one layer mode of the vertical slider" -msgstr "Attiva/Disattiva modalità singolo strato del cursore di scorrimento verticale" - -msgid "On/Off G-code window" -msgstr "Attiva/Disattiva finestra G-code" +msgid "Available while the 3D view on the Preview tab has focus." +msgstr "" msgid "Move slider 5x faster" msgstr "Sposta il cursore 5 volte più velocemente" -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Home" -msgstr "Home" +msgid "Scroll slider 5x faster" +msgstr "" -msgid "Horizontal slider - Move to start position" -msgstr "Cursore di scorrimento orizzontale - Sposta alla posizione iniziale" +msgid "Not customizable" +msgstr "" -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "End" -msgstr "Fine" +#, c-format, boost-format +msgid "%s is assigned to %s. Reassign it to %s?" +msgstr "" -msgid "Horizontal slider - Move to last position" -msgstr "Cursore di scorrimento orizzontale - Sposta alla posizione finale" +#, c-format, boost-format +msgid "The default %s is assigned to %s. Reassign it to %s?" +msgstr "" + +msgid "Global shortcuts also apply while typing." +msgstr "" + +msgid "A key that types a character cannot be a global shortcut." +msgstr "" + +msgid "Esc cancels, Enter confirms." +msgstr "" + +#, c-format, boost-format +msgid "" +"Press the new shortcut for\n" +"\"%s\"" +msgstr "" + +#, c-format, boost-format +msgid "Already used as a step of %s." +msgstr "" + +#, c-format, boost-format +msgid "Already assigned to %s. Press OK to reassign it." +msgstr "" msgid "Release Note" msgstr "Note di rilascio" @@ -17372,8 +17291,8 @@ msgstr "Fasi preriscaldamento" msgid "Insert multiple preheat commands (e.g. M104.1). Only useful for Prusa XL. For other printers, please set it to 1." msgstr "Inserisci più comandi di preriscaldamento (ad esempio M104.1). Utile solo per Prusa XL. Per altre stampanti, impostalo su 1." -msgid "G-code written at the very top of the output file, before any other content. Useful for adding metadata that printer firmware reads from the first lines of the file (e.g. estimated print time, filament usage). Supports placeholders like {print_time_sec} and {used_filament_length}." -msgstr "G-code scritto all'inizio del file di output, prima di qualsiasi altro contenuto. Utile per aggiungere metadati che il firmware della stampante legge dalle prime righe del file (ad es. tempo di stampa stimato, utilizzo filamento). Supporta segnaposto come {print_time_sec} e {used_filament_length}." +msgid "G-code written at the very top of the output file, before any other content. Useful for adding metadata that printer firmware reads from the first lines of the file (e.g. estimated print time, filament usage). Supports placeholders like {print_time_total_sec}, {print_time_day}, {print_time_hour}, {print_time_minute}, {print_time_sec} and {used_filament_length}." +msgstr "" msgid "Start G-code" msgstr "G-code iniziale" @@ -18911,12 +18830,36 @@ msgstr "Filamento usato" msgid "Total length of filament used in the print." msgstr "Lunghezza totale di filamento utilizzato nella stampa." -msgid "Print time (seconds)" -msgstr "Tempo di stampa (secondi)" +msgid "Print time (total seconds)" +msgstr "" msgid "Total estimated print time in seconds. Replaced with actual value during post-processing." msgstr "Tempo di stampa stimato totale in secondi. Sostituito con il valore effettivo durante la post-elaborazione." +msgid "Print time (days component)" +msgstr "" + +msgid "Estimated print time day component (normal mode). Replaced with actual value during post-processing." +msgstr "" + +msgid "Print time (hours component)" +msgstr "" + +msgid "Estimated print time hour component (normal mode). Replaced with actual value during post-processing." +msgstr "" + +msgid "Print time (minutes component)" +msgstr "" + +msgid "Estimated print time minute component (normal mode). Replaced with actual value during post-processing." +msgstr "" + +msgid "Print time (seconds component)" +msgstr "" + +msgid "Estimated print time second component (normal mode). Replaced with actual value during post-processing." +msgstr "" + msgid "Filament length (meters)" msgstr "Lunghezza filamento (metri)" @@ -20779,6 +20722,9 @@ msgstr "Nessuna sessione valida rilevata. Procedere con l'accesso a 3DPrinterOS? msgid "Success!" msgstr "Successo!" +msgid "Generate API Key" +msgstr "" + msgid "Are you sure to log out?" msgstr "Sei sicuro di volerti disconnettere?" @@ -21834,13 +21780,6 @@ msgstr "Il modulo di rete Bambu è necessario per le funzionalità cloud, il ril msgid "Error: %s" msgstr "Errore: %s" -msgid "Show details" -msgstr "Mostra dettagli" - -# AI Translated -msgid "Hide details" -msgstr "Nascondi dettagli" - msgid "Version to install:" msgstr "Versione da installare:" @@ -24497,6 +24436,12 @@ msgstr "" msgid "No binding for that field" msgstr "" +msgid "Enter a number" +msgstr "" + +msgid "Not a number" +msgstr "" + msgid "Primitive" msgstr "" @@ -24509,6 +24454,216 @@ msgstr "" msgid "Clear All" msgstr "" +msgctxt "Keyboard Shortcut" +msgid "Ins" +msgstr "" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Home" +msgstr "Home" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "End" +msgstr "Fine" + +msgctxt "Keyboard Shortcut" +msgid "PgUp" +msgstr "" + +msgctxt "Keyboard Shortcut" +msgid "PgDn" +msgstr "" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Arrow Left" +msgstr "Freccia sinistra" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Arrow Right" +msgstr "Freccia destra" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Arrow Up" +msgstr "Freccia su" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Arrow Down" +msgstr "Freccia giù" + +msgid "Import geometry data from STL/STEP/3MF/OBJ/AMF files" +msgstr "Importa geometrie da file STL/STEP/3MF/OBJ/AMF" + +msgid "Select all objects" +msgstr "Seleziona tutti gli oggetti" + +msgid "Paste from clipboard" +msgstr "Incolla dagli appunti" + +msgid "Toggle printable for object/part" +msgstr "Attiva/disattiva stampa per oggetto/parte" + +msgid "Move selection 10mm in negative X direction" +msgstr "Sposta selezione di 10 mm in direzione X negativa" + +msgid "Move selection 10mm in positive X direction" +msgstr "Sposta selezione di 10 mm in direzione X positiva" + +msgid "Move selection 10mm in positive Y direction" +msgstr "Sposta selezione di 10 mm in direzione Y positiva" + +msgid "Move selection 10mm in negative Y direction" +msgstr "Sposta selezione di 10 mm in direzione Y negativa" + +msgid "Rotate selection 45 degrees counterclockwise" +msgstr "" + +msgid "Rotate selection 45 degrees clockwise" +msgstr "" + +msgid "Gizmo move" +msgstr "Strumento Muovi" + +msgid "Gizmo rotate" +msgstr "Strumento Ruota" + +msgid "Gizmo scale" +msgstr "Strumento Scala" + +msgid "Gizmo place face on bed" +msgstr "Strumento posiziona faccia sul piatto" + +msgid "Gizmo cut" +msgstr "Strumento Taglia" + +msgid "Gizmo mesh boolean" +msgstr "Gizmo maglia booleana" + +msgid "Gizmo FDM paint-on supports" +msgstr "" + +msgid "Gizmo FDM paint-on seam" +msgstr "Strumento Dipingi cucitura FDM" + +msgid "Gizmo FDM paint-on fuzzy skin" +msgstr "Strumento FDM per superficie ruvida dipinta" + +msgid "Gizmo multi-material painting" +msgstr "" + +msgid "Gizmo text emboss/engrave" +msgstr "Strumento testo in rilievo/incisione" + +msgid "Gizmo measure" +msgstr "Gizmo misura" + +msgid "Gizmo assemble" +msgstr "Gizmo assemblaggio" + +msgid "Gizmo brim ears" +msgstr "Gizmo tese ad orecchio" + +msgid "Vertical slider - Move active thumb Up" +msgstr "Cursore di scorrimento verticale - Solleva cursore attivo" + +msgid "Vertical slider - Move active thumb Down" +msgstr "Cursore di scorrimento verticale - Abbassa cursore attivo" + +msgid "Horizontal slider - Move active thumb Left" +msgstr "Cursore di scorrimento orizzontale - Sposta a sinistra il cursore attivo" + +msgid "Horizontal slider - Move active thumb Right" +msgstr "Cursore di scorrimento orizzontale - Sposta a destra il cursore attivo" + +msgid "Horizontal slider - Move to start position" +msgstr "Cursore di scorrimento orizzontale - Sposta alla posizione iniziale" + +msgid "Horizontal slider - Move to last position" +msgstr "Cursore di scorrimento orizzontale - Sposta alla posizione finale" + +msgid "Camera view - Default" +msgstr "Vista telecamera - Predefinito" + +msgid "Camera view - Top" +msgstr "Vista telecamera - In Alto" + +msgid "Camera view - Bottom" +msgstr "Vista telecamera - In Basso" + +msgid "Camera view - Front" +msgstr "Vista telecamera - Anteriore" + +msgid "Camera view - Behind" +msgstr "Vista telecamera - Posteriore" + +msgid "Camera Angle - Left side" +msgstr "Angolo della camera - Lato sinistro" + +msgid "Camera Angle - Right side" +msgstr "Angolo della camera - Lato destro" + +msgid "Camera view - Current plate" +msgstr "" + +msgid "Zoom in" +msgstr "Ingrandisci" + +msgid "Zoom out" +msgstr "Rimpicciolisci" + +msgid "Show/Hide 3Dconnexion devices settings dialog" +msgstr "Mostra/nascondi la finestra di dialogo delle impostazioni dei dispositivi 3Dconnexion" + +msgid "Show/Hide wireframe" +msgstr "" + +msgid "On/Off G-code window" +msgstr "Attiva/Disattiva finestra G-code" + +msgid "On/Off one layer mode of the vertical slider" +msgstr "Attiva/Disattiva modalità singolo strato del cursore di scorrimento verticale" + +msgid "Switch between Prepare/Preview" +msgstr "Passa tra Prepara e Anteprima" + +msgid "Collapse/Expand the sidebar" +msgstr "Riduci/Espandi barra laterale" + +msgid "Open the speed dial" +msgstr "" + +msgid "Reload the device page" +msgstr "" + +msgid "Show keyboard shortcuts list" +msgstr "Mostra elenco scorciatoie da tastiera" + +msgid "Slicing and printing" +msgstr "" + +msgid "Editing" +msgstr "" + +msgid "Placement" +msgstr "" + +msgid "Gizmos" +msgstr "" + +msgid "Sliders" +msgstr "" + +msgid "Painting tools" +msgstr "" + +msgid "Application" +msgstr "" + #: resources/data/hints.ini: [hint:Precise wall] msgid "" "Precise wall\n" @@ -24810,6 +24965,65 @@ msgstr "" "Evita le deformazioni\n" "Sapevi che quando si stampano materiali soggetti a deformazioni come l'ABS, aumentare in modo appropriato la temperatura del piano riscaldato può ridurre la probabilità di deformazione?" +# AI Translated +#~ msgid "Tab" +#~ msgstr "Tab" + +# AI Translated +#~ msgid "Displays current viewport FPS in the top-right corner." +#~ msgstr "Mostra gli FPS correnti della vista nell'angolo in alto a destra." + +# AI Translated +#~ msgid "Publish 3MF Wiki" +#~ msgstr "Wiki di Pubblica 3MF" + +# AI Translated +#~ msgid "Publish 3MF Video Guide" +#~ msgstr "Guida video di Pubblica 3MF" + +#~ msgid "Toolbar" +#~ msgstr "Barra degli strumenti" + +#~ msgid "Switch table page" +#~ msgstr "Cambia pagina tabella" + +#~ msgid "Global shortcuts" +#~ msgstr "Scorciatoie globali" + +# AI Translated +#~ msgid "Middle mouse button" +#~ msgstr "Tasto centrale del mouse" + +#~ msgid "Auto orients selected objects or all objects. If there are selected objects, it just orients the selected ones. Otherwise, it will orient all objects in the current project." +#~ msgstr "Questo orienta automaticamente gli oggetti selezionati o tutti gli oggetti. Se ci sono oggetti selezionati, orienta solo quelli selezionati. Altrimenti, orienterà tutti gli elementi nel progetto corrente." + +#~ msgid "Auto orients all objects on the active plate." +#~ msgstr "Questo orienta tutti gli oggetti nel piatto corrente." + +#~ msgid "Any arrow" +#~ msgstr "Qualsiasi freccia" + +#~ msgid "Gizmo SLA support points" +#~ msgstr "Strumento Punti di supporto SLA" + +#~ msgid "Plater" +#~ msgstr "Piatto" + +#~ msgid "Gizmo" +#~ msgstr "Strumento" + +#~ msgid "Delete objects, parts, modifiers" +#~ msgstr "Elimina oggetti, parti, modificatori" + +#~ msgid "Objects List" +#~ msgstr "Elenco oggetti" + +#~ msgid "G-code written at the very top of the output file, before any other content. Useful for adding metadata that printer firmware reads from the first lines of the file (e.g. estimated print time, filament usage). Supports placeholders like {print_time_sec} and {used_filament_length}." +#~ msgstr "G-code scritto all'inizio del file di output, prima di qualsiasi altro contenuto. Utile per aggiungere metadati che il firmware della stampante legge dalle prime righe del file (ad es. tempo di stampa stimato, utilizzo filamento). Supporta segnaposto come {print_time_sec} e {used_filament_length}." + +#~ msgid "Print time (seconds)" +#~ msgstr "Tempo di stampa (secondi)" + # AI Translated #~ msgid "Open actions speed dial" #~ msgstr "Apri la selezione rapida delle azioni" diff --git a/localization/i18n/ja/OrcaSlicer_ja.po b/localization/i18n/ja/OrcaSlicer_ja.po index 98f937fc6d..78a5d55307 100644 --- a/localization/i18n/ja/OrcaSlicer_ja.po +++ b/localization/i18n/ja/OrcaSlicer_ja.po @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-09-18 15:50+0800\n" +"POT-Creation-Date: 2026-09-22 12:39+0800\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: \n" @@ -5937,12 +5937,15 @@ msgctxt "Camera View" msgid "Right" msgstr "右" -msgid "Add" -msgstr "追加" - msgid "Add plate" msgstr "プレートを追加" +msgid "Split to objects" +msgstr "オブジェクトに分割" + +msgid "Add" +msgstr "追加" + msgid "Auto orient all/selected objects" msgstr "すべてのオブジェクト/選択したオブジェクトの方向を自動設定する" @@ -5955,9 +5958,6 @@ msgstr "全てをレイアウト" msgid "Arrange objects on selected plates" msgstr "選択したプレートをレイアウト" -msgid "Split to objects" -msgstr "オブジェクトに分割" - msgid "Assembly View" msgstr "組立て" @@ -6014,6 +6014,9 @@ msgstr "アウトライン" msgid "Wireframe" msgstr "ワイヤフレーム" +msgid "X-Ray" +msgstr "" + # AI Translated msgid "Realistic View" msgstr "リアルビュー" @@ -6550,7 +6553,7 @@ msgstr "3Dシーンで選択したオブジェクトの周りにアウトライ msgid "Preferences" msgstr "設定" -msgid "Open speed dial..." +msgid "Open speed dial" msgstr "" # AI Translated @@ -8373,10 +8376,6 @@ msgstr "サイドバーを展開" msgid "Collapse sidebar" msgstr "サイドバーを折りたたむ" -# AI Translated -msgid "Tab" -msgstr "Tab" - #, c-format, boost-format msgid "Loading file: %s" msgstr "ファイルを読込む: %s" @@ -9411,10 +9410,10 @@ msgstr "マルチデバイス管理" msgid "With this option enabled, you can send a task to multiple devices at the same time and manage multiple devices." msgstr "このオプションを有効にすると、複数のデバイスに同時にタスクを送信し、複数のデバイスを管理できます。" -msgid "Open the Speed Dial with the Space key" +msgid "Open the Speed Dial from the keyboard" msgstr "" -msgid "When enabled, pressing Space (with no other key held) opens the Speed Dial action search from any page." +msgid "When enabled, the Speed Dial keyboard shortcut (Space by default) opens the action search from any page." msgstr "" msgid "Recent actions" @@ -9553,6 +9552,15 @@ msgstr "マウス右ドラッグ" msgid "Set the action that dragging the right mouse button should perform." msgstr "マウス右ボタンのドラッグで実行する操作を設定します。" +msgid "Keyboard" +msgstr "" + +msgid "Keyboard shortcuts" +msgstr "" + +msgid "Choose the key for each action." +msgstr "" + msgid "Clear my choice on..." msgstr "選択をクリア..." @@ -9677,13 +9685,40 @@ msgstr "" "ビューポートのフレームレートを制限し、GPU負荷と消費電力を抑えます。\n" "0に設定するとフレームレートは無制限になります。" +msgid "Reuse the 3D scene while idle" +msgstr "" + +msgid "" +"Skips redrawing the 3D scene when only the mouse cursor moves over the viewport,\n" +"and reuses the previous frame's scene instead. Reduces GPU load.\n" +"Disable it if the viewport shows stale or missing contents.\n" +"\n" +"Takes effect immediately." +msgstr "" + +msgid "Skip unchanged frames" +msgstr "" + +msgid "" +"Skips drawing a frame altogether when it would be identical to the one already on screen.\n" +"Only applies to frames that reuse the 3D scene, so it needs Reuse the 3D scene while idle.\n" +"Disable it if a hover highlight, tooltip or animation stops updating.\n" +"\n" +"Takes effect immediately." +msgstr "" + # AI Translated msgid "Show FPS overlay" msgstr "FPSオーバーレイを表示" -# AI Translated -msgid "Displays current viewport FPS in the top-right corner." -msgstr "現在のビューポートのFPSを右上に表示します。" +msgid "Displays rendering counts in the top-right corner of the viewport." +msgstr "" + +msgid "FPS: frames presented to the screen per second." +msgstr "" + +msgid "3D: frames per second that redrew the 3D scene." +msgstr "" # AI Translated msgid "G-code Preview" @@ -10159,13 +10194,8 @@ msgstr "3MFを公開..." msgid "Select which settings to be published in the 3MF file" msgstr "3MFファイルで公開する設定を選択してください" -# AI Translated -msgid "Publish 3MF Wiki" -msgstr "3MF公開のWiki" - -# AI Translated -msgid "Publish 3MF Video Guide" -msgstr "3MF公開のビデオガイド" +msgid "Video Guide" +msgstr "" # AI Translated msgid "Mixed filament - published as a whole when \"Enable\" above is selected" @@ -10367,6 +10397,13 @@ msgstr "" msgid "No wiki page for this action" msgstr "" +msgid "Show details" +msgstr "詳細を表示" + +# AI Translated +msgid "Hide details" +msgstr "詳細を隠す" + #, c-format, boost-format msgid "\"%s\" is a Developer setting. Enable Developer mode to edit it?" msgstr "" @@ -12214,68 +12251,39 @@ msgstr "構成パッケージが前のコンフィグガイドに変更されま msgid "Configuration package changed" msgstr "構成パッケージが変更されました" -msgid "Toolbar" -msgstr "ツールバー" - -msgid "Objects list" -msgstr "オブジェクト一覧" - -msgid "Import geometry data from STL/STEP/3MF/OBJ/AMF files" -msgstr "STL/STEP/3MF/OBJ/AMFファイルからジオメトリデータをインポート" - -msgid "Paste from clipboard" -msgstr "貼り付け" - -msgid "Show/Hide 3Dconnexion devices settings dialog" -msgstr "3Dconnexion設定を表示/非表示" - -msgid "Switch table page" -msgstr "テーブルページを切り替え" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Space" -msgstr "Space" - -msgid "Open speed dial" -msgstr "" - -msgid "Run a Speed Dial favourite (while the Speed Dial is open)" -msgstr "" - -msgid "Show keyboard shortcuts list" -msgstr "ショートカット一覧を表示" - -msgid "Global shortcuts" -msgstr "ショートカット" - msgid "Pan View" msgstr "移動" msgid "Rotate View" msgstr "回転" +#, c-format, boost-format +msgid "Use %s or %s, or a key that does not type a character." +msgstr "" + +msgctxt "Keyboard Shortcut" +msgid "Key" +msgstr "" + +msgid "Left mouse" +msgstr "" + +msgid "Available anywhere in the window, even while typing in a text field." +msgstr "" + +msgid "Run a speed dial favorite while the dial is open" +msgstr "" + # AI Translated -msgid "Middle mouse button" -msgstr "マウス中ボタン" +msgctxt "Keyboard Shortcut" +msgid "Tab" +msgstr "Tab" -msgid "Zoom View" -msgstr "ズーム" +msgid "Switch to the next main tab" +msgstr "" -msgid "Auto orients selected objects or all objects. If there are selected objects, it just orients the selected ones. Otherwise, it will orient all objects in the current project." -msgstr "選択したオブジェクトまたはプロジェクト内のすべてのオブジェクトの方向を自動的に設定します。" - -msgid "Auto orients all objects on the active plate." -msgstr "現在のプレート上のすべてのオブジェクトの方向を自動的に設定します。" - -msgid "Collapse/Expand the sidebar" -msgstr "サイドバーを展開/隠す" - -msgid "Any arrow" -msgstr "任意の矢印キー" - -msgid "Movement in camera space" -msgstr "オブジェクト移動" +msgid "Available while the 3D view on the Prepare tab has focus." +msgstr "" msgid "Select a part" msgstr "パーツを選択" @@ -12286,127 +12294,29 @@ msgstr "複数のオブジェクトを選択" msgid "Select objects by rectangle" msgstr "矩形でオブジェクトを選択" -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Arrow Up" -msgstr "↑" - -msgid "Move selection 10mm in positive Y direction" -msgstr "Y方向 10mm" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Arrow Down" -msgstr "↓" - -msgid "Move selection 10mm in negative Y direction" -msgstr "Y方向 -10mm" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Arrow Left" -msgstr "←" - -msgid "Move selection 10mm in negative X direction" -msgstr "X方向 -10mm" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Arrow Right" -msgstr "→" - -msgid "Move selection 10mm in positive X direction" -msgstr "X方向 10mm" +msgid "Keyboard 1-9: set filament for object/part" +msgstr "キー1-9: オブジェクト/パーツのフィラメントを設定" msgid "Movement step set to 1mm" msgstr "移動ステップを1mmに設定" -msgid "Keyboard 1-9: set filament for object/part" -msgstr "キー1-9: オブジェクト/パーツのフィラメントを設定" +msgid "Movement in camera space" +msgstr "オブジェクト移動" -msgid "Camera view - Default" -msgstr "デフォルト" +msgid "Middle mouse" +msgstr "" -msgid "Camera view - Top" -msgstr "トップ" +msgid "Right mouse" +msgstr "" -msgid "Camera view - Bottom" -msgstr "底面" +msgid "Zoom View" +msgstr "ズーム" -msgid "Camera view - Front" -msgstr "正面" +msgid "Painting" +msgstr "" -msgid "Camera view - Behind" -msgstr "背面" - -msgid "Camera Angle - Left side" -msgstr "左側" - -msgid "Camera Angle - Right side" -msgstr "右側" - -msgid "Select all objects" -msgstr "すべてのオブジェクトを選択" - -msgid "Gizmo move" -msgstr "移動" - -msgid "Gizmo rotate" -msgstr "回転" - -msgid "Gizmo scale" -msgstr "スケール" - -msgid "Gizmo place face on bed" -msgstr "底面選択" - -msgid "Gizmo cut" -msgstr "カット" - -msgid "Gizmo mesh boolean" -msgstr "メッシュブール" - -msgid "Gizmo FDM paint-on fuzzy skin" -msgstr "ギズモ FDMファジースキンペイント" - -msgid "Gizmo SLA support points" -msgstr "SLAサポートポイント" - -msgid "Gizmo FDM paint-on seam" -msgstr "継ぎ目ペイント" - -msgid "Gizmo text emboss/engrave" -msgstr "ギズモ・テキストのエンボス/エングレーブ" - -msgid "Gizmo measure" -msgstr "測る" - -msgid "Gizmo assemble" -msgstr "組立てる" - -msgid "Gizmo brim ears" -msgstr "ブリム" - -msgid "Zoom in" -msgstr "ズームイン" - -msgid "Zoom out" -msgstr "縮小" - -# AI Translated -msgid "Toggle printable for object/part" -msgstr "オブジェクト/パーツの印刷可否を切り替え" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Tab" -msgstr "Tab" - -msgid "Switch between Prepare/Preview" -msgstr "準備/プレビュー間の切り替え" - -msgid "Plater" -msgstr "準備" +msgid "Available while a painting gizmo is open: supports, seam, fuzzy skin or color painting." +msgstr "" msgid "Move: press to snap by 1mm" msgstr "1mm単位で移動" @@ -12417,15 +12327,19 @@ msgstr "サポート/色塗り: 半径のサイズ" msgid "Support/Color Painting: adjust section position" msgstr "サポート/色塗り: 断面の位置" -# AI Translated -msgid "Gizmo" -msgstr "ギズモ" +msgid "Objects list" +msgstr "オブジェクト一覧" + +msgid "Available while the object list has focus." +msgstr "" msgid "Set extruder number for the objects and parts" msgstr "オブジェクトとパーツ造形用の押出機番号を設定" -msgid "Delete objects, parts, modifiers" -msgstr "オブジェクト、パーツ、モディファイヤを削除" +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Space" +msgstr "Space" msgid "Select the object/part and press space to change the name" msgstr "オブジェクト/パーツを選択し、名前を変更します" @@ -12436,45 +12350,48 @@ msgstr "マウスクリック" msgid "Select the object/part and mouse click to change the name" msgstr "オブジェクト/パーツを選択し、名前を変更します" -msgid "Objects List" -msgstr "オブジェクト一覧" - -msgid "Vertical slider - Move active thumb Up" -msgstr "垂直スライダー" - -msgid "Vertical slider - Move active thumb Down" -msgstr "垂直スライダー" - -msgid "Horizontal slider - Move active thumb Left" -msgstr "水平スライダー (左)" - -msgid "Horizontal slider - Move active thumb Right" -msgstr "水平スライダー (右)" - -msgid "On/Off one layer mode of the vertical slider" -msgstr "垂直スライダーの1レイヤーモードのオン/オフ" - -msgid "On/Off G-code window" -msgstr "G-codeウィンドウのオン/オフ" +msgid "Available while the 3D view on the Preview tab has focus." +msgstr "" msgid "Move slider 5x faster" msgstr "5x" -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Home" -msgstr "Home" +msgid "Scroll slider 5x faster" +msgstr "" -msgid "Horizontal slider - Move to start position" -msgstr "水平スライダー - 開始位置に移動" +msgid "Not customizable" +msgstr "" -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "End" -msgstr "End" +#, c-format, boost-format +msgid "%s is assigned to %s. Reassign it to %s?" +msgstr "" -msgid "Horizontal slider - Move to last position" -msgstr "水平スライダー - 最後の位置に移動" +#, c-format, boost-format +msgid "The default %s is assigned to %s. Reassign it to %s?" +msgstr "" + +msgid "Global shortcuts also apply while typing." +msgstr "" + +msgid "A key that types a character cannot be a global shortcut." +msgstr "" + +msgid "Esc cancels, Enter confirms." +msgstr "" + +#, c-format, boost-format +msgid "" +"Press the new shortcut for\n" +"\"%s\"" +msgstr "" + +#, c-format, boost-format +msgid "Already used as a step of %s." +msgstr "" + +#, c-format, boost-format +msgid "Already assigned to %s. Press OK to reassign it." +msgstr "" msgid "Release Note" msgstr "リリースノート" @@ -17711,9 +17628,8 @@ msgstr "予熱ステップ数" msgid "Insert multiple preheat commands (e.g. M104.1). Only useful for Prusa XL. For other printers, please set it to 1." msgstr "複数の予熱コマンド (M104.1など) を挿入します。Prusa XLでのみ有効です。その他のプリンターでは1に設定してください。" -# AI Translated -msgid "G-code written at the very top of the output file, before any other content. Useful for adding metadata that printer firmware reads from the first lines of the file (e.g. estimated print time, filament usage). Supports placeholders like {print_time_sec} and {used_filament_length}." -msgstr "出力ファイルの先頭、他のどの内容よりも前に書き込まれるG-codeです。プリンターのファームウェアがファイル先頭の数行から読み取るメタデータ (推定印刷時間、フィラメント使用量など) を追加するのに便利です。{print_time_sec}や{used_filament_length}などのプレースホルダーに対応しています。" +msgid "G-code written at the very top of the output file, before any other content. Useful for adding metadata that printer firmware reads from the first lines of the file (e.g. estimated print time, filament usage). Supports placeholders like {print_time_total_sec}, {print_time_day}, {print_time_hour}, {print_time_minute}, {print_time_sec} and {used_filament_length}." +msgstr "" msgid "Start G-code" msgstr "スタートG-code" @@ -19371,14 +19287,37 @@ msgstr "フィラメント使用量" msgid "Total length of filament used in the print." msgstr "プリントに使用されるフィラメントの全長。" -# AI Translated -msgid "Print time (seconds)" -msgstr "印刷時間 (秒)" +msgid "Print time (total seconds)" +msgstr "" # AI Translated msgid "Total estimated print time in seconds. Replaced with actual value during post-processing." msgstr "推定される総印刷時間 (秒) です。後処理時に実際の値に置き換えられます。" +msgid "Print time (days component)" +msgstr "" + +msgid "Estimated print time day component (normal mode). Replaced with actual value during post-processing." +msgstr "" + +msgid "Print time (hours component)" +msgstr "" + +msgid "Estimated print time hour component (normal mode). Replaced with actual value during post-processing." +msgstr "" + +msgid "Print time (minutes component)" +msgstr "" + +msgid "Estimated print time minute component (normal mode). Replaced with actual value during post-processing." +msgstr "" + +msgid "Print time (seconds component)" +msgstr "" + +msgid "Estimated print time second component (normal mode). Replaced with actual value during post-processing." +msgstr "" + # AI Translated msgid "Filament length (meters)" msgstr "フィラメント長 (メートル)" @@ -21296,6 +21235,9 @@ msgstr "有効なセッションが検出されませんでした。3DPrinterOS msgid "Success!" msgstr "成功!" +msgid "Generate API Key" +msgstr "" + msgid "Are you sure to log out?" msgstr "本当にログアウトしますか?" @@ -22379,13 +22321,6 @@ msgstr "Bambuネットワークプラグインはクラウド機能、プリン msgid "Error: %s" msgstr "エラー: %s" -msgid "Show details" -msgstr "詳細を表示" - -# AI Translated -msgid "Hide details" -msgstr "詳細を隠す" - msgid "Version to install:" msgstr "インストールするバージョン:" @@ -25042,6 +24977,12 @@ msgstr "" msgid "No binding for that field" msgstr "" +msgid "Enter a number" +msgstr "" + +msgid "Not a number" +msgstr "" + msgid "Primitive" msgstr "" @@ -25054,6 +24995,217 @@ msgstr "" msgid "Clear All" msgstr "" +msgctxt "Keyboard Shortcut" +msgid "Ins" +msgstr "" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Home" +msgstr "Home" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "End" +msgstr "End" + +msgctxt "Keyboard Shortcut" +msgid "PgUp" +msgstr "" + +msgctxt "Keyboard Shortcut" +msgid "PgDn" +msgstr "" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Arrow Left" +msgstr "←" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Arrow Right" +msgstr "→" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Arrow Up" +msgstr "↑" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Arrow Down" +msgstr "↓" + +msgid "Import geometry data from STL/STEP/3MF/OBJ/AMF files" +msgstr "STL/STEP/3MF/OBJ/AMFファイルからジオメトリデータをインポート" + +msgid "Select all objects" +msgstr "すべてのオブジェクトを選択" + +msgid "Paste from clipboard" +msgstr "貼り付け" + +# AI Translated +msgid "Toggle printable for object/part" +msgstr "オブジェクト/パーツの印刷可否を切り替え" + +msgid "Move selection 10mm in negative X direction" +msgstr "X方向 -10mm" + +msgid "Move selection 10mm in positive X direction" +msgstr "X方向 10mm" + +msgid "Move selection 10mm in positive Y direction" +msgstr "Y方向 10mm" + +msgid "Move selection 10mm in negative Y direction" +msgstr "Y方向 -10mm" + +msgid "Rotate selection 45 degrees counterclockwise" +msgstr "" + +msgid "Rotate selection 45 degrees clockwise" +msgstr "" + +msgid "Gizmo move" +msgstr "移動" + +msgid "Gizmo rotate" +msgstr "回転" + +msgid "Gizmo scale" +msgstr "スケール" + +msgid "Gizmo place face on bed" +msgstr "底面選択" + +msgid "Gizmo cut" +msgstr "カット" + +msgid "Gizmo mesh boolean" +msgstr "メッシュブール" + +msgid "Gizmo FDM paint-on supports" +msgstr "" + +msgid "Gizmo FDM paint-on seam" +msgstr "継ぎ目ペイント" + +msgid "Gizmo FDM paint-on fuzzy skin" +msgstr "ギズモ FDMファジースキンペイント" + +msgid "Gizmo multi-material painting" +msgstr "" + +msgid "Gizmo text emboss/engrave" +msgstr "ギズモ・テキストのエンボス/エングレーブ" + +msgid "Gizmo measure" +msgstr "測る" + +msgid "Gizmo assemble" +msgstr "組立てる" + +msgid "Gizmo brim ears" +msgstr "ブリム" + +msgid "Vertical slider - Move active thumb Up" +msgstr "垂直スライダー" + +msgid "Vertical slider - Move active thumb Down" +msgstr "垂直スライダー" + +msgid "Horizontal slider - Move active thumb Left" +msgstr "水平スライダー (左)" + +msgid "Horizontal slider - Move active thumb Right" +msgstr "水平スライダー (右)" + +msgid "Horizontal slider - Move to start position" +msgstr "水平スライダー - 開始位置に移動" + +msgid "Horizontal slider - Move to last position" +msgstr "水平スライダー - 最後の位置に移動" + +msgid "Camera view - Default" +msgstr "デフォルト" + +msgid "Camera view - Top" +msgstr "トップ" + +msgid "Camera view - Bottom" +msgstr "底面" + +msgid "Camera view - Front" +msgstr "正面" + +msgid "Camera view - Behind" +msgstr "背面" + +msgid "Camera Angle - Left side" +msgstr "左側" + +msgid "Camera Angle - Right side" +msgstr "右側" + +msgid "Camera view - Current plate" +msgstr "" + +msgid "Zoom in" +msgstr "ズームイン" + +msgid "Zoom out" +msgstr "縮小" + +msgid "Show/Hide 3Dconnexion devices settings dialog" +msgstr "3Dconnexion設定を表示/非表示" + +msgid "Show/Hide wireframe" +msgstr "" + +msgid "On/Off G-code window" +msgstr "G-codeウィンドウのオン/オフ" + +msgid "On/Off one layer mode of the vertical slider" +msgstr "垂直スライダーの1レイヤーモードのオン/オフ" + +msgid "Switch between Prepare/Preview" +msgstr "準備/プレビュー間の切り替え" + +msgid "Collapse/Expand the sidebar" +msgstr "サイドバーを展開/隠す" + +msgid "Open the speed dial" +msgstr "" + +msgid "Reload the device page" +msgstr "" + +msgid "Show keyboard shortcuts list" +msgstr "ショートカット一覧を表示" + +msgid "Slicing and printing" +msgstr "" + +msgid "Editing" +msgstr "" + +msgid "Placement" +msgstr "" + +msgid "Gizmos" +msgstr "" + +msgid "Sliders" +msgstr "" + +msgid "Painting tools" +msgstr "" + +msgid "Application" +msgstr "" + # AI Translated #: resources/data/hints.ini: [hint:Precise wall] msgid "" @@ -25366,6 +25518,68 @@ msgstr "" "反りを避ける\n" "ABSのような反りやすい素材を印刷する場合、ヒートベッドの温度を適切に上げることで、反りが発生する確率を下げることができることをご存知ですか?" +# AI Translated +#~ msgid "Tab" +#~ msgstr "Tab" + +# AI Translated +#~ msgid "Displays current viewport FPS in the top-right corner." +#~ msgstr "現在のビューポートのFPSを右上に表示します。" + +# AI Translated +#~ msgid "Publish 3MF Wiki" +#~ msgstr "3MF公開のWiki" + +# AI Translated +#~ msgid "Publish 3MF Video Guide" +#~ msgstr "3MF公開のビデオガイド" + +#~ msgid "Toolbar" +#~ msgstr "ツールバー" + +#~ msgid "Switch table page" +#~ msgstr "テーブルページを切り替え" + +#~ msgid "Global shortcuts" +#~ msgstr "ショートカット" + +# AI Translated +#~ msgid "Middle mouse button" +#~ msgstr "マウス中ボタン" + +#~ msgid "Auto orients selected objects or all objects. If there are selected objects, it just orients the selected ones. Otherwise, it will orient all objects in the current project." +#~ msgstr "選択したオブジェクトまたはプロジェクト内のすべてのオブジェクトの方向を自動的に設定します。" + +#~ msgid "Auto orients all objects on the active plate." +#~ msgstr "現在のプレート上のすべてのオブジェクトの方向を自動的に設定します。" + +#~ msgid "Any arrow" +#~ msgstr "任意の矢印キー" + +#~ msgid "Gizmo SLA support points" +#~ msgstr "SLAサポートポイント" + +#~ msgid "Plater" +#~ msgstr "準備" + +# AI Translated +#~ msgid "Gizmo" +#~ msgstr "ギズモ" + +#~ msgid "Delete objects, parts, modifiers" +#~ msgstr "オブジェクト、パーツ、モディファイヤを削除" + +#~ msgid "Objects List" +#~ msgstr "オブジェクト一覧" + +# AI Translated +#~ msgid "G-code written at the very top of the output file, before any other content. Useful for adding metadata that printer firmware reads from the first lines of the file (e.g. estimated print time, filament usage). Supports placeholders like {print_time_sec} and {used_filament_length}." +#~ msgstr "出力ファイルの先頭、他のどの内容よりも前に書き込まれるG-codeです。プリンターのファームウェアがファイル先頭の数行から読み取るメタデータ (推定印刷時間、フィラメント使用量など) を追加するのに便利です。{print_time_sec}や{used_filament_length}などのプレースホルダーに対応しています。" + +# AI Translated +#~ msgid "Print time (seconds)" +#~ msgstr "印刷時間 (秒)" + # AI Translated #~ msgid "Open actions speed dial" #~ msgstr "アクションスピードダイヤルを開く" diff --git a/localization/i18n/ko/OrcaSlicer_ko.po b/localization/i18n/ko/OrcaSlicer_ko.po index 1dda527e28..a6cc7df84a 100644 --- a/localization/i18n/ko/OrcaSlicer_ko.po +++ b/localization/i18n/ko/OrcaSlicer_ko.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-09-18 15:50+0800\n" +"POT-Creation-Date: 2026-09-22 12:39+0800\n" "PO-Revision-Date: 2025-06-02 17:12+0900\n" "Last-Translator: crwusiz \n" "Language-Team: \n" @@ -5949,12 +5949,15 @@ msgctxt "Camera View" msgid "Right" msgstr "오른쪽" -msgid "Add" -msgstr "추가" - msgid "Add plate" msgstr "플레이트 추가" +msgid "Split to objects" +msgstr "객체로 분할" + +msgid "Add" +msgstr "추가" + msgid "Auto orient all/selected objects" msgstr "모든/선택한 객체 자동 방향 지정" @@ -5967,9 +5970,6 @@ msgstr "모든 객체 정렬" msgid "Arrange objects on selected plates" msgstr "선택한 플레이트의 객체 정렬" -msgid "Split to objects" -msgstr "객체로 분할" - msgid "Assembly View" msgstr "조립 보기" @@ -6026,6 +6026,9 @@ msgstr "외곽선" msgid "Wireframe" msgstr "와이어프레임" +msgid "X-Ray" +msgstr "" + # AI Translated msgid "Realistic View" msgstr "사실적 보기" @@ -6563,7 +6566,7 @@ msgstr "3D 장면에서 선택한 객체 주변에 윤곽선 표시" msgid "Preferences" msgstr "기본 설정" -msgid "Open speed dial..." +msgid "Open speed dial" msgstr "" # AI Translated @@ -8387,10 +8390,6 @@ msgstr "사이드바 확장" msgid "Collapse sidebar" msgstr "사이드바 접기" -# AI Translated -msgid "Tab" -msgstr "탭" - #, c-format, boost-format msgid "Loading file: %s" msgstr "파일 로드 중: %s" @@ -9471,10 +9470,10 @@ msgstr "다중 장치 관리" msgid "With this option enabled, you can send a task to multiple devices at the same time and manage multiple devices." msgstr "활성화하면 여러 장치에 동시에 작업을 보내고 여러 장치를 관리할 수 있습니다." -msgid "Open the Speed Dial with the Space key" +msgid "Open the Speed Dial from the keyboard" msgstr "" -msgid "When enabled, pressing Space (with no other key held) opens the Speed Dial action search from any page." +msgid "When enabled, the Speed Dial keyboard shortcut (Space by default) opens the action search from any page." msgstr "" msgid "Recent actions" @@ -9622,6 +9621,15 @@ msgstr "마우스 오른쪽 버튼 드래그" msgid "Set the action that dragging the right mouse button should perform." msgstr "마우스 오른쪽 버튼을 드래그할 때 수행할 동작을 설정합니다." +msgid "Keyboard" +msgstr "" + +msgid "Keyboard shortcuts" +msgstr "" + +msgid "Choose the key for each action." +msgstr "" + # AI Translated msgid "Clear my choice on..." msgstr "다음 항목에 대한 선택 지우기..." @@ -9750,13 +9758,40 @@ msgstr "" "뷰포트의 프레임 속도를 제한하여 GPU 부하와 전력 사용량을 줄입니다.\n" "0으로 설정하면 프레임 속도가 무제한이 됩니다." +msgid "Reuse the 3D scene while idle" +msgstr "" + +msgid "" +"Skips redrawing the 3D scene when only the mouse cursor moves over the viewport,\n" +"and reuses the previous frame's scene instead. Reduces GPU load.\n" +"Disable it if the viewport shows stale or missing contents.\n" +"\n" +"Takes effect immediately." +msgstr "" + +msgid "Skip unchanged frames" +msgstr "" + +msgid "" +"Skips drawing a frame altogether when it would be identical to the one already on screen.\n" +"Only applies to frames that reuse the 3D scene, so it needs Reuse the 3D scene while idle.\n" +"Disable it if a hover highlight, tooltip or animation stops updating.\n" +"\n" +"Takes effect immediately." +msgstr "" + # AI Translated msgid "Show FPS overlay" msgstr "FPS 오버레이 표시" -# AI Translated -msgid "Displays current viewport FPS in the top-right corner." -msgstr "현재 뷰포트의 FPS를 오른쪽 위 모서리에 표시합니다." +msgid "Displays rendering counts in the top-right corner of the viewport." +msgstr "" + +msgid "FPS: frames presented to the screen per second." +msgstr "" + +msgid "3D: frames per second that redrew the 3D scene." +msgstr "" # AI Translated msgid "G-code Preview" @@ -10247,13 +10282,8 @@ msgstr "3MF 게시..." msgid "Select which settings to be published in the 3MF file" msgstr "3MF 파일에 게시할 설정을 선택하세요" -# AI Translated -msgid "Publish 3MF Wiki" -msgstr "3MF 게시 위키" - -# AI Translated -msgid "Publish 3MF Video Guide" -msgstr "3MF 게시 비디오 가이드" +msgid "Video Guide" +msgstr "" # AI Translated msgid "Mixed filament - published as a whole when \"Enable\" above is selected" @@ -10456,6 +10486,14 @@ msgstr "" msgid "No wiki page for this action" msgstr "" +# AI Translated +msgid "Show details" +msgstr "세부 정보 표시" + +# AI Translated +msgid "Hide details" +msgstr "세부 정보 숨기기" + #, c-format, boost-format msgid "\"%s\" is a Developer setting. Enable Developer mode to edit it?" msgstr "" @@ -12345,68 +12383,39 @@ msgstr "이전 구성 가이드에서 구성 패키지가 변경되었습니다" msgid "Configuration package changed" msgstr "구성 패키지가 변경됨" -msgid "Toolbar" -msgstr "도구 모음" - -msgid "Objects list" -msgstr "객체 목록" - -msgid "Import geometry data from STL/STEP/3MF/OBJ/AMF files" -msgstr "STL/STEP/3MF/OBJ/AMF 파일에서 형상 데이터 가져오기" - -msgid "Paste from clipboard" -msgstr "클립보드에서 붙여넣기" - -msgid "Show/Hide 3Dconnexion devices settings dialog" -msgstr "3D 연결 장치 설정 표시/숨기기 대화상자" - -msgid "Switch table page" -msgstr "테이블 페이지 전환" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Space" -msgstr "Space" - -msgid "Open speed dial" -msgstr "" - -msgid "Run a Speed Dial favourite (while the Speed Dial is open)" -msgstr "" - -msgid "Show keyboard shortcuts list" -msgstr "키보드 단축키 목록 보기" - -msgid "Global shortcuts" -msgstr "전역 단축키" - msgid "Pan View" msgstr "보기 이동" msgid "Rotate View" msgstr "보기 회전" +#, c-format, boost-format +msgid "Use %s or %s, or a key that does not type a character." +msgstr "" + +msgctxt "Keyboard Shortcut" +msgid "Key" +msgstr "" + +msgid "Left mouse" +msgstr "" + +msgid "Available anywhere in the window, even while typing in a text field." +msgstr "" + +msgid "Run a speed dial favorite while the dial is open" +msgstr "" + # AI Translated -msgid "Middle mouse button" -msgstr "마우스 가운데 버튼" +msgctxt "Keyboard Shortcut" +msgid "Tab" +msgstr "Tab" -msgid "Zoom View" -msgstr "줌 뷰" +msgid "Switch to the next main tab" +msgstr "" -msgid "Auto orients selected objects or all objects. If there are selected objects, it just orients the selected ones. Otherwise, it will orient all objects in the current project." -msgstr "선택한 객체 또는 모든 객체의 방향을 자동으로 조정합니다. 선택한 객체가 있는 경우 선택한 객체만 조정되고, 그렇지 않은 경우 프로젝트의 모든 객체가 조정됩니다." - -msgid "Auto orients all objects on the active plate." -msgstr "현재 플레이트에 있는 모든 객체의 방향을 자동으로 지정합니다." - -msgid "Collapse/Expand the sidebar" -msgstr "사이드바 접기/펼치기" - -msgid "Any arrow" -msgstr "모든 화살표" - -msgid "Movement in camera space" -msgstr "카메라 공간에서 이동" +msgid "Available while the 3D view on the Prepare tab has focus." +msgstr "" msgid "Select a part" msgstr "부품 선택" @@ -12417,129 +12426,30 @@ msgstr "여러 객체 선택" msgid "Select objects by rectangle" msgstr "사각형으로 객체 선택" -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Arrow Up" -msgstr "↑" - -msgid "Move selection 10mm in positive Y direction" -msgstr "선택 항목을 +Y 방향으로 10mm 이동" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Arrow Down" -msgstr "↓" - -msgid "Move selection 10mm in negative Y direction" -msgstr "선택 항목을 -Y 방향으로 10mm 이동" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Arrow Left" -msgstr "←" - -msgid "Move selection 10mm in negative X direction" -msgstr "선택 항목을 -X 방향으로 10mm 이동" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Arrow Right" -msgstr "→" - -msgid "Move selection 10mm in positive X direction" -msgstr "선택 항목을 +X 방향으로 10mm 이동" +msgid "Keyboard 1-9: set filament for object/part" +msgstr "키보드 1-9: 객체/부품에 필라멘트 할당" # AI Translated msgid "Movement step set to 1mm" msgstr "이동 단위를 1mm로 설정" -msgid "Keyboard 1-9: set filament for object/part" -msgstr "키보드 1-9: 객체/부품에 필라멘트 할당" +msgid "Movement in camera space" +msgstr "카메라 공간에서 이동" -msgid "Camera view - Default" -msgstr "카메라 시점 - 기본" +msgid "Middle mouse" +msgstr "" -msgid "Camera view - Top" -msgstr "카메라 시점 - 위" +msgid "Right mouse" +msgstr "" -msgid "Camera view - Bottom" -msgstr "카메라 시점 - 아래" +msgid "Zoom View" +msgstr "줌 뷰" -msgid "Camera view - Front" -msgstr "카메라 시점 - 앞" +msgid "Painting" +msgstr "" -msgid "Camera view - Behind" -msgstr "카메라 시점 - 뒤" - -msgid "Camera Angle - Left side" -msgstr "카메라 각도 - 좌측" - -msgid "Camera Angle - Right side" -msgstr "카메라 각도 - 우측" - -msgid "Select all objects" -msgstr "모든 객체 선택" - -msgid "Gizmo move" -msgstr "변형도구 이동" - -msgid "Gizmo rotate" -msgstr "변형도구 회전" - -msgid "Gizmo scale" -msgstr "변형도구 배율" - -msgid "Gizmo place face on bed" -msgstr "변형도구 바닥면 선택" - -msgid "Gizmo cut" -msgstr "변형도구 잘라내기" - -msgid "Gizmo mesh boolean" -msgstr "변형도구 합집합/차집합/교집합" - -# AI Translated -msgid "Gizmo FDM paint-on fuzzy skin" -msgstr "변형도구 FDM 퍼지 스킨 칠하기" - -msgid "Gizmo SLA support points" -msgstr "변형도구 서포트 칠하기" - -msgid "Gizmo FDM paint-on seam" -msgstr "변형도구 재봉선 칠하기" - -msgid "Gizmo text emboss/engrave" -msgstr "변형도구 - 텍스트 엠보싱/인그레이빙" - -msgid "Gizmo measure" -msgstr "변형도구 측정" - -msgid "Gizmo assemble" -msgstr "변형도구 병합" - -msgid "Gizmo brim ears" -msgstr "변형도구 브림 귀" - -msgid "Zoom in" -msgstr "확대" - -msgid "Zoom out" -msgstr "축소" - -# AI Translated -msgid "Toggle printable for object/part" -msgstr "객체/부품의 출력 가능 여부 전환" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Tab" -msgstr "Tab" - -msgid "Switch between Prepare/Preview" -msgstr "준비 하기/미리 보기 전환" - -msgid "Plater" -msgstr "출력판" +msgid "Available while a painting gizmo is open: supports, seam, fuzzy skin or color painting." +msgstr "" msgid "Move: press to snap by 1mm" msgstr "이동: 눌러서 1mm씩 이동" @@ -12550,14 +12460,19 @@ msgstr "서포트/색상 칠하기: 펜 반경 조정" msgid "Support/Color Painting: adjust section position" msgstr "서포트/색상 칠하기: 단면 위치 조정" -msgid "Gizmo" -msgstr "변형도구" +msgid "Objects list" +msgstr "객체 목록" + +msgid "Available while the object list has focus." +msgstr "" msgid "Set extruder number for the objects and parts" msgstr "객체 및 부품에 대한 압출기 번호 설정" -msgid "Delete objects, parts, modifiers" -msgstr "객체, 부품, 수정자 삭제" +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Space" +msgstr "Space" msgid "Select the object/part and press space to change the name" msgstr "객체/부품을 선택하고 스페이스바를 눌러 이름을 변경합니다" @@ -12568,45 +12483,48 @@ msgstr "마우스 클릭" msgid "Select the object/part and mouse click to change the name" msgstr "객체/부품을 선택하고 마우스를 클릭하여 이름을 변경합니다" -msgid "Objects List" -msgstr "객체 목록" - -msgid "Vertical slider - Move active thumb Up" -msgstr "수직 슬라이더 - 활성 레이어 위로 이동" - -msgid "Vertical slider - Move active thumb Down" -msgstr "수직 슬라이더 - 활성 레이어 아래로 이동" - -msgid "Horizontal slider - Move active thumb Left" -msgstr "수평 슬라이더 - 활성 라인 왼쪽으로 이동" - -msgid "Horizontal slider - Move active thumb Right" -msgstr "수평 슬라이더 - 활성 라인 오른쪽으로 이동" - -msgid "On/Off one layer mode of the vertical slider" -msgstr "수직 슬라이더의 한 레이어 모드 켜기/끄기" - -msgid "On/Off G-code window" -msgstr "Gcode 창 켜기/끄기" +msgid "Available while the 3D view on the Preview tab has focus." +msgstr "" msgid "Move slider 5x faster" msgstr "슬라이더를 5배 빠르게 이동" -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Home" -msgstr "Home" +msgid "Scroll slider 5x faster" +msgstr "" -msgid "Horizontal slider - Move to start position" -msgstr "수평 슬라이더 - 시작 위치로 이동" +msgid "Not customizable" +msgstr "" -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "End" -msgstr "End" +#, c-format, boost-format +msgid "%s is assigned to %s. Reassign it to %s?" +msgstr "" -msgid "Horizontal slider - Move to last position" -msgstr "수평 슬라이더 - 마지막 위치로 이동" +#, c-format, boost-format +msgid "The default %s is assigned to %s. Reassign it to %s?" +msgstr "" + +msgid "Global shortcuts also apply while typing." +msgstr "" + +msgid "A key that types a character cannot be a global shortcut." +msgstr "" + +msgid "Esc cancels, Enter confirms." +msgstr "" + +#, c-format, boost-format +msgid "" +"Press the new shortcut for\n" +"\"%s\"" +msgstr "" + +#, c-format, boost-format +msgid "Already used as a step of %s." +msgstr "" + +#, c-format, boost-format +msgid "Already assigned to %s. Press OK to reassign it." +msgstr "" msgid "Release Note" msgstr "릴리스 노트" @@ -17678,9 +17596,8 @@ msgstr "예열 단계" msgid "Insert multiple preheat commands (e.g. M104.1). Only useful for Prusa XL. For other printers, please set it to 1." msgstr "여러 예열 명령(예: M104.1)을 삽입하세요. Prusa XL에만 유용합니다. 다른 프린터의 경우 1로 설정하세요." -# AI Translated -msgid "G-code written at the very top of the output file, before any other content. Useful for adding metadata that printer firmware reads from the first lines of the file (e.g. estimated print time, filament usage). Supports placeholders like {print_time_sec} and {used_filament_length}." -msgstr "출력 파일의 가장 앞부분, 다른 모든 내용보다 먼저 기록되는 G-code입니다. 프린터 펌웨어가 파일의 첫 줄에서 읽는 메타데이터(예: 예상 출력 시간, 필라멘트 사용량)를 추가하는 데 유용합니다. {print_time_sec}, {used_filament_length}와 같은 자리 표시자를 지원합니다." +msgid "G-code written at the very top of the output file, before any other content. Useful for adding metadata that printer firmware reads from the first lines of the file (e.g. estimated print time, filament usage). Supports placeholders like {print_time_total_sec}, {print_time_day}, {print_time_hour}, {print_time_minute}, {print_time_sec} and {used_filament_length}." +msgstr "" msgid "Start G-code" msgstr "시작 Gcode" @@ -19257,14 +19174,37 @@ msgstr "사용된 필라멘트" msgid "Total length of filament used in the print." msgstr "출력에 사용된 필라멘트의 총 길이입니다." -# AI Translated -msgid "Print time (seconds)" -msgstr "출력 시간(초)" +msgid "Print time (total seconds)" +msgstr "" # AI Translated msgid "Total estimated print time in seconds. Replaced with actual value during post-processing." msgstr "초 단위의 총 예상 출력 시간입니다. 후처리 중에 실제 값으로 대체됩니다." +msgid "Print time (days component)" +msgstr "" + +msgid "Estimated print time day component (normal mode). Replaced with actual value during post-processing." +msgstr "" + +msgid "Print time (hours component)" +msgstr "" + +msgid "Estimated print time hour component (normal mode). Replaced with actual value during post-processing." +msgstr "" + +msgid "Print time (minutes component)" +msgstr "" + +msgid "Estimated print time minute component (normal mode). Replaced with actual value during post-processing." +msgstr "" + +msgid "Print time (seconds component)" +msgstr "" + +msgid "Estimated print time second component (normal mode). Replaced with actual value during post-processing." +msgstr "" + # AI Translated msgid "Filament length (meters)" msgstr "필라멘트 길이(미터)" @@ -21172,6 +21112,9 @@ msgstr "유효한 세션이 감지되지 않았습니다. 3DPrinterOS에 로그 msgid "Success!" msgstr "성공!" +msgid "Generate API Key" +msgstr "" + msgid "Are you sure to log out?" msgstr "정말 로그아웃하시겠습니까?" @@ -22241,14 +22184,6 @@ msgstr "클라우드 기능, 프린터 검색, 원격 출력에는 Bambu 네트 msgid "Error: %s" msgstr "오류: %s" -# AI Translated -msgid "Show details" -msgstr "세부 정보 표시" - -# AI Translated -msgid "Hide details" -msgstr "세부 정보 숨기기" - # AI Translated msgid "Version to install:" msgstr "설치할 버전:" @@ -24918,6 +24853,12 @@ msgstr "" msgid "No binding for that field" msgstr "" +msgid "Enter a number" +msgstr "" + +msgid "Not a number" +msgstr "" + msgid "Primitive" msgstr "" @@ -24930,6 +24871,218 @@ msgstr "" msgid "Clear All" msgstr "" +msgctxt "Keyboard Shortcut" +msgid "Ins" +msgstr "" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Home" +msgstr "Home" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "End" +msgstr "End" + +msgctxt "Keyboard Shortcut" +msgid "PgUp" +msgstr "" + +msgctxt "Keyboard Shortcut" +msgid "PgDn" +msgstr "" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Arrow Left" +msgstr "←" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Arrow Right" +msgstr "→" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Arrow Up" +msgstr "↑" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Arrow Down" +msgstr "↓" + +msgid "Import geometry data from STL/STEP/3MF/OBJ/AMF files" +msgstr "STL/STEP/3MF/OBJ/AMF 파일에서 형상 데이터 가져오기" + +msgid "Select all objects" +msgstr "모든 객체 선택" + +msgid "Paste from clipboard" +msgstr "클립보드에서 붙여넣기" + +# AI Translated +msgid "Toggle printable for object/part" +msgstr "객체/부품의 출력 가능 여부 전환" + +msgid "Move selection 10mm in negative X direction" +msgstr "선택 항목을 -X 방향으로 10mm 이동" + +msgid "Move selection 10mm in positive X direction" +msgstr "선택 항목을 +X 방향으로 10mm 이동" + +msgid "Move selection 10mm in positive Y direction" +msgstr "선택 항목을 +Y 방향으로 10mm 이동" + +msgid "Move selection 10mm in negative Y direction" +msgstr "선택 항목을 -Y 방향으로 10mm 이동" + +msgid "Rotate selection 45 degrees counterclockwise" +msgstr "" + +msgid "Rotate selection 45 degrees clockwise" +msgstr "" + +msgid "Gizmo move" +msgstr "변형도구 이동" + +msgid "Gizmo rotate" +msgstr "변형도구 회전" + +msgid "Gizmo scale" +msgstr "변형도구 배율" + +msgid "Gizmo place face on bed" +msgstr "변형도구 바닥면 선택" + +msgid "Gizmo cut" +msgstr "변형도구 잘라내기" + +msgid "Gizmo mesh boolean" +msgstr "변형도구 합집합/차집합/교집합" + +msgid "Gizmo FDM paint-on supports" +msgstr "" + +msgid "Gizmo FDM paint-on seam" +msgstr "변형도구 재봉선 칠하기" + +# AI Translated +msgid "Gizmo FDM paint-on fuzzy skin" +msgstr "변형도구 FDM 퍼지 스킨 칠하기" + +msgid "Gizmo multi-material painting" +msgstr "" + +msgid "Gizmo text emboss/engrave" +msgstr "변형도구 - 텍스트 엠보싱/인그레이빙" + +msgid "Gizmo measure" +msgstr "변형도구 측정" + +msgid "Gizmo assemble" +msgstr "변형도구 병합" + +msgid "Gizmo brim ears" +msgstr "변형도구 브림 귀" + +msgid "Vertical slider - Move active thumb Up" +msgstr "수직 슬라이더 - 활성 레이어 위로 이동" + +msgid "Vertical slider - Move active thumb Down" +msgstr "수직 슬라이더 - 활성 레이어 아래로 이동" + +msgid "Horizontal slider - Move active thumb Left" +msgstr "수평 슬라이더 - 활성 라인 왼쪽으로 이동" + +msgid "Horizontal slider - Move active thumb Right" +msgstr "수평 슬라이더 - 활성 라인 오른쪽으로 이동" + +msgid "Horizontal slider - Move to start position" +msgstr "수평 슬라이더 - 시작 위치로 이동" + +msgid "Horizontal slider - Move to last position" +msgstr "수평 슬라이더 - 마지막 위치로 이동" + +msgid "Camera view - Default" +msgstr "카메라 시점 - 기본" + +msgid "Camera view - Top" +msgstr "카메라 시점 - 위" + +msgid "Camera view - Bottom" +msgstr "카메라 시점 - 아래" + +msgid "Camera view - Front" +msgstr "카메라 시점 - 앞" + +msgid "Camera view - Behind" +msgstr "카메라 시점 - 뒤" + +msgid "Camera Angle - Left side" +msgstr "카메라 각도 - 좌측" + +msgid "Camera Angle - Right side" +msgstr "카메라 각도 - 우측" + +msgid "Camera view - Current plate" +msgstr "" + +msgid "Zoom in" +msgstr "확대" + +msgid "Zoom out" +msgstr "축소" + +msgid "Show/Hide 3Dconnexion devices settings dialog" +msgstr "3D 연결 장치 설정 표시/숨기기 대화상자" + +msgid "Show/Hide wireframe" +msgstr "" + +msgid "On/Off G-code window" +msgstr "Gcode 창 켜기/끄기" + +msgid "On/Off one layer mode of the vertical slider" +msgstr "수직 슬라이더의 한 레이어 모드 켜기/끄기" + +msgid "Switch between Prepare/Preview" +msgstr "준비 하기/미리 보기 전환" + +msgid "Collapse/Expand the sidebar" +msgstr "사이드바 접기/펼치기" + +msgid "Open the speed dial" +msgstr "" + +msgid "Reload the device page" +msgstr "" + +msgid "Show keyboard shortcuts list" +msgstr "키보드 단축키 목록 보기" + +msgid "Slicing and printing" +msgstr "" + +msgid "Editing" +msgstr "" + +msgid "Placement" +msgstr "" + +msgid "Gizmos" +msgstr "" + +msgid "Sliders" +msgstr "" + +msgid "Painting tools" +msgstr "" + +msgid "Application" +msgstr "" + #: resources/data/hints.ini: [hint:Precise wall] msgid "" "Precise wall\n" @@ -25232,6 +25385,67 @@ msgstr "" "뒤틀림 방지\n" "ABS와 같이 뒤틀림이 발생하기 쉬운 소재를 출력할 때, 히트베드 온도를 적절하게 높이면 뒤틀림 가능성을 줄일 수 있다는 사실을 알고 계셨나요?" +# AI Translated +#~ msgid "Tab" +#~ msgstr "탭" + +# AI Translated +#~ msgid "Displays current viewport FPS in the top-right corner." +#~ msgstr "현재 뷰포트의 FPS를 오른쪽 위 모서리에 표시합니다." + +# AI Translated +#~ msgid "Publish 3MF Wiki" +#~ msgstr "3MF 게시 위키" + +# AI Translated +#~ msgid "Publish 3MF Video Guide" +#~ msgstr "3MF 게시 비디오 가이드" + +#~ msgid "Toolbar" +#~ msgstr "도구 모음" + +#~ msgid "Switch table page" +#~ msgstr "테이블 페이지 전환" + +#~ msgid "Global shortcuts" +#~ msgstr "전역 단축키" + +# AI Translated +#~ msgid "Middle mouse button" +#~ msgstr "마우스 가운데 버튼" + +#~ msgid "Auto orients selected objects or all objects. If there are selected objects, it just orients the selected ones. Otherwise, it will orient all objects in the current project." +#~ msgstr "선택한 객체 또는 모든 객체의 방향을 자동으로 조정합니다. 선택한 객체가 있는 경우 선택한 객체만 조정되고, 그렇지 않은 경우 프로젝트의 모든 객체가 조정됩니다." + +#~ msgid "Auto orients all objects on the active plate." +#~ msgstr "현재 플레이트에 있는 모든 객체의 방향을 자동으로 지정합니다." + +#~ msgid "Any arrow" +#~ msgstr "모든 화살표" + +#~ msgid "Gizmo SLA support points" +#~ msgstr "변형도구 서포트 칠하기" + +#~ msgid "Plater" +#~ msgstr "출력판" + +#~ msgid "Gizmo" +#~ msgstr "변형도구" + +#~ msgid "Delete objects, parts, modifiers" +#~ msgstr "객체, 부품, 수정자 삭제" + +#~ msgid "Objects List" +#~ msgstr "객체 목록" + +# AI Translated +#~ msgid "G-code written at the very top of the output file, before any other content. Useful for adding metadata that printer firmware reads from the first lines of the file (e.g. estimated print time, filament usage). Supports placeholders like {print_time_sec} and {used_filament_length}." +#~ msgstr "출력 파일의 가장 앞부분, 다른 모든 내용보다 먼저 기록되는 G-code입니다. 프린터 펌웨어가 파일의 첫 줄에서 읽는 메타데이터(예: 예상 출력 시간, 필라멘트 사용량)를 추가하는 데 유용합니다. {print_time_sec}, {used_filament_length}와 같은 자리 표시자를 지원합니다." + +# AI Translated +#~ msgid "Print time (seconds)" +#~ msgstr "출력 시간(초)" + # AI Translated #~ msgid "Open actions speed dial" #~ msgstr "작업 스피드 다이얼 열기" diff --git a/localization/i18n/list.txt b/localization/i18n/list.txt index 7636bf2484..ef049fa48e 100644 --- a/localization/i18n/list.txt +++ b/localization/i18n/list.txt @@ -300,3 +300,5 @@ src/slic3r/GUI/CAD/DesignPanel.cpp src/slic3r/GUI/CAD/SketchInlineEditor.cpp src/slic3r/GUI/Gizmos/GLGizmoPrimitive.cpp src/slic3r/GUI/Gizmos/GLGizmoSketch.cpp +src/slic3r/GUI/KeyChord.cpp +src/slic3r/GUI/Shortcuts.cpp diff --git a/localization/i18n/lt/OrcaSlicer_lt.po b/localization/i18n/lt/OrcaSlicer_lt.po index 6fe2933981..49deda164c 100644 --- a/localization/i18n/lt/OrcaSlicer_lt.po +++ b/localization/i18n/lt/OrcaSlicer_lt.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-09-18 15:50+0800\n" +"POT-Creation-Date: 2026-09-22 12:39+0800\n" "PO-Revision-Date: 2026-07-02 14:13+0300\n" "Last-Translator: Gintaras Kučinskas \n" "Language-Team: \n" @@ -5911,12 +5911,15 @@ msgctxt "Camera View" msgid "Right" msgstr "Dešinė" -msgid "Add" -msgstr "Įtraukti" - msgid "Add plate" msgstr "Įtraukti plokštę" +msgid "Split to objects" +msgstr "Padalinti į objektus" + +msgid "Add" +msgstr "Įtraukti" + msgid "Auto orient all/selected objects" msgstr "Automatiškai orientuoti visus / pasirinktus objektus" @@ -5929,9 +5932,6 @@ msgstr "Išdėstyti visus objektus" msgid "Arrange objects on selected plates" msgstr "Išdėstyti objektus pasirinktose plokštėse" -msgid "Split to objects" -msgstr "Padalinti į objektus" - msgid "Assembly View" msgstr "Surinkimo vaizdas" @@ -5986,6 +5986,9 @@ msgstr "Kontūras" msgid "Wireframe" msgstr "Rodyti karkasinį vaizdą" +msgid "X-Ray" +msgstr "" + msgid "Realistic View" msgstr "Realistiškas vaizdas" @@ -6525,7 +6528,7 @@ msgstr "Rodyti kontūrą aplink pasirinktą objektą 3D scenoje." msgid "Preferences" msgstr "Parinktys" -msgid "Open speed dial..." +msgid "Open speed dial" msgstr "" # AI Translated @@ -8353,9 +8356,6 @@ msgstr "Išskleisti šoninę juostą" msgid "Collapse sidebar" msgstr "Sutraukti šoninę juostą" -msgid "Tab" -msgstr "Tab" - #, c-format, boost-format msgid "Loading file: %s" msgstr "Įkeliamas failas: %s" @@ -9369,10 +9369,10 @@ msgstr "Kelių įrenginių valdymas" msgid "With this option enabled, you can send a task to multiple devices at the same time and manage multiple devices." msgstr "Kai įjungta ši funkcija, jūs galite siųsti užduotį keliems įrenginiams vienu metu, taip apt kontroliuoti keletą įrenginių." -msgid "Open the Speed Dial with the Space key" +msgid "Open the Speed Dial from the keyboard" msgstr "" -msgid "When enabled, pressing Space (with no other key held) opens the Speed Dial action search from any page." +msgid "When enabled, the Speed Dial keyboard shortcut (Space by default) opens the action search from any page." msgstr "" msgid "Recent actions" @@ -9504,6 +9504,15 @@ msgstr "Vilkti dešiniuoju pelės mygtuku" msgid "Set the action that dragging the right mouse button should perform." msgstr "Nustatykite veiksmą, kuris turi būti atliktas, velkant dešinįjį pelės mygtuką." +msgid "Keyboard" +msgstr "" + +msgid "Keyboard shortcuts" +msgstr "" + +msgid "Choose the key for each action." +msgstr "" + msgid "Clear my choice on..." msgstr "Išvalyti mano pasirinkimą..." @@ -9612,11 +9621,39 @@ msgid "" "Set to 0 for unlimited frame rate." msgstr "Riboja vaizdo srities kadrų dažnį, kad sumažintų vaizdo plokštės (GPU) apkrovą ir energijos sąnaudas. Įveskite 0, jei kadrų dažnis neribojamas." +msgid "Reuse the 3D scene while idle" +msgstr "" + +msgid "" +"Skips redrawing the 3D scene when only the mouse cursor moves over the viewport,\n" +"and reuses the previous frame's scene instead. Reduces GPU load.\n" +"Disable it if the viewport shows stale or missing contents.\n" +"\n" +"Takes effect immediately." +msgstr "" + +msgid "Skip unchanged frames" +msgstr "" + +msgid "" +"Skips drawing a frame altogether when it would be identical to the one already on screen.\n" +"Only applies to frames that reuse the 3D scene, so it needs Reuse the 3D scene while idle.\n" +"Disable it if a hover highlight, tooltip or animation stops updating.\n" +"\n" +"Takes effect immediately." +msgstr "" + msgid "Show FPS overlay" msgstr "Rodyti KPS (FPS) indikatorių" -msgid "Displays current viewport FPS in the top-right corner." -msgstr "Viršutiniame dešiniajame kampe rodo esamą vaizdo srities kadrų dažnį." +msgid "Displays rendering counts in the top-right corner of the viewport." +msgstr "" + +msgid "FPS: frames presented to the screen per second." +msgstr "" + +msgid "3D: frames per second that redrew the 3D scene." +msgstr "" # AI Translated msgid "G-code Preview" @@ -10073,13 +10110,8 @@ msgstr "Talpinti 3MF..." msgid "Select which settings to be published in the 3MF file" msgstr "Pasirinkite, kuriuos parametrus talpinti 3MF faile" -# AI Translated -msgid "Publish 3MF Wiki" -msgstr "3MF talpinimo wiki" - -# AI Translated -msgid "Publish 3MF Video Guide" -msgstr "3MF talpinimo vaizdo vadovas" +msgid "Video Guide" +msgstr "" # AI Translated msgid "Mixed filament - published as a whole when \"Enable\" above is selected" @@ -10281,6 +10313,13 @@ msgstr "" msgid "No wiki page for this action" msgstr "" +msgid "Show details" +msgstr "Rodyti išsamiau" + +# AI Translated +msgid "Hide details" +msgstr "Slėpti išsamią informaciją" + #, c-format, boost-format msgid "\"%s\" is a Developer setting. Enable Developer mode to edit it?" msgstr "" @@ -12117,67 +12156,39 @@ msgstr "Konfigūracijos paketas buvo pakeistas ankstesniame konfigūravimo vadov msgid "Configuration package changed" msgstr "Pakeistas konfigūracijos paketas" -msgid "Toolbar" -msgstr "Įrankių juosta" - -msgid "Objects list" -msgstr "Objektų sąrašas" - -msgid "Import geometry data from STL/STEP/3MF/OBJ/AMF files" -msgstr "Importuoti geometrijos duomenis iš STL/STEP/3MF/OBJ/AMF failų" - -msgid "Paste from clipboard" -msgstr "Įklijuoti iš mainų srities" - -msgid "Show/Hide 3Dconnexion devices settings dialog" -msgstr "Rodyti/slėpti 3DConnexion įrenginių nustatymų dialogo langą" - -msgid "Switch table page" -msgstr "Perjungti lentelės puslapį" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Space" -msgstr "Tarpas" - -msgid "Open speed dial" -msgstr "" - -msgid "Run a Speed Dial favourite (while the Speed Dial is open)" -msgstr "" - -msgid "Show keyboard shortcuts list" -msgstr "Rodyti sparčiųjų klavišų sąrašą" - -msgid "Global shortcuts" -msgstr "Bendrieji spartieji klavišai" - msgid "Pan View" msgstr "Vaizdo stūmimas (panoraminis vaizdas)" msgid "Rotate View" msgstr "Vaizdo pasukimas" -msgid "Middle mouse button" -msgstr "Vidurinis pelės mygtukas" +#, c-format, boost-format +msgid "Use %s or %s, or a key that does not type a character." +msgstr "" -msgid "Zoom View" -msgstr "Vaizdo mastelio keitimas (zoom)" +msgctxt "Keyboard Shortcut" +msgid "Key" +msgstr "" -msgid "Auto orients selected objects or all objects. If there are selected objects, it just orients the selected ones. Otherwise, it will orient all objects in the current project." -msgstr "Automatiškai orientuoja pasirinktus objektus arba visus objektus. Jei yra pasirinkti objektai, orientuoja tik pasirinktus. Kitais atvejais orientuoja visus esamo projekto objektus." +msgid "Left mouse" +msgstr "" -msgid "Auto orients all objects on the active plate." -msgstr "Automatiškai orientuoja visus objektus aktyvioje plokštėje." +msgid "Available anywhere in the window, even while typing in a text field." +msgstr "" -msgid "Collapse/Expand the sidebar" -msgstr "Sutraukti / išskleisti šoninę juostą" +msgid "Run a speed dial favorite while the dial is open" +msgstr "" -msgid "Any arrow" -msgstr "Bet kuri rodyklė" +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Tab" +msgstr "Tab" -msgid "Movement in camera space" -msgstr "Judėjimas kameros erdvėje" +msgid "Switch to the next main tab" +msgstr "" + +msgid "Available while the 3D view on the Prepare tab has focus." +msgstr "" msgid "Select a part" msgstr "Pasirinkti dalį" @@ -12188,126 +12199,29 @@ msgstr "Pasirinkite kelis objektus" msgid "Select objects by rectangle" msgstr "Pasirinkti objektus stačiakampio rėmeliu" -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Arrow Up" -msgstr "Rodyklė aukštyn" - -msgid "Move selection 10mm in positive Y direction" -msgstr "Perkelti pasirinkimą 10 mm teigiama Y kryptimi" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Arrow Down" -msgstr "Rodyklė žemyn" - -msgid "Move selection 10mm in negative Y direction" -msgstr "Perkelti pasirinkimą 10 mm neigiama Y kryptimi" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Arrow Left" -msgstr "Rodyklė kairėn" - -msgid "Move selection 10mm in negative X direction" -msgstr "Perkelti pasirinkimą 10 mm neigiama X kryptimi" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Arrow Right" -msgstr "Rodyklė dešinėn" - -msgid "Move selection 10mm in positive X direction" -msgstr "Perkelti pasirinkimą 10 mm teigiama X kryptimi" +msgid "Keyboard 1-9: set filament for object/part" +msgstr "Klaviatūra 1-9: nustatyti objekto/dalies giją" msgid "Movement step set to 1mm" msgstr "Judėjimo žingsnis nustatytas į 1 mm" -msgid "Keyboard 1-9: set filament for object/part" -msgstr "Klaviatūra 1-9: nustatyti objekto/dalies giją" +msgid "Movement in camera space" +msgstr "Judėjimas kameros erdvėje" -msgid "Camera view - Default" -msgstr "Kameros vaizdas - Numatytasis" +msgid "Middle mouse" +msgstr "" -msgid "Camera view - Top" -msgstr "Kameros vaizdas - Viršus" +msgid "Right mouse" +msgstr "" -msgid "Camera view - Bottom" -msgstr "Kameros vaizdas - Apačia" +msgid "Zoom View" +msgstr "Vaizdo mastelio keitimas (zoom)" -msgid "Camera view - Front" -msgstr "Kameros vaizdas - Priekis" +msgid "Painting" +msgstr "" -msgid "Camera view - Behind" -msgstr "Kameros vaizdas – iš galo" - -msgid "Camera Angle - Left side" -msgstr "Kameros kampas – iš kairės" - -msgid "Camera Angle - Right side" -msgstr "Kameros kampas – iš dešinės" - -msgid "Select all objects" -msgstr "Pasirinkti visus objektus" - -msgid "Gizmo move" -msgstr "Perkėlimo manipuliatorius" - -msgid "Gizmo rotate" -msgstr "Pasukimo manipuliatorius" - -msgid "Gizmo scale" -msgstr "Mastelio keitimo manipuliatorius" - -msgid "Gizmo place face on bed" -msgstr "Paviršiaus dėjimo ant pagrindo manipuliatorius" - -msgid "Gizmo cut" -msgstr "Pjovimo manipuliatorius" - -msgid "Gizmo mesh boolean" -msgstr "Loginių tinklelio veiksmų (Boolean) manipuliatorius" - -msgid "Gizmo FDM paint-on fuzzy skin" -msgstr "FDM užtepamo grublėto paviršiaus (fuzzy skin) manipuliatorius" - -msgid "Gizmo SLA support points" -msgstr "SLA atramų taškų manipuliatorius" - -msgid "Gizmo FDM paint-on seam" -msgstr "FDM užtepamos siūlės (seam) manipuliatorius" - -msgid "Gizmo text emboss/engrave" -msgstr "Teksto iškėlimo ir įspaudimo (emboss/engrave) manipuliatorius" - -msgid "Gizmo measure" -msgstr "Matavimo manipuliatorius" - -msgid "Gizmo assemble" -msgstr "Surinkimo manipuliatorius" - -msgid "Gizmo brim ears" -msgstr "Krašto „auselių“ (brim ears) manipuliatorius" - -msgid "Zoom in" -msgstr "Padidinti" - -msgid "Zoom out" -msgstr "Nutolinti" - -msgid "Toggle printable for object/part" -msgstr "Perjungti objekto / dalies spausdinimą" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Tab" -msgstr "Tab" - -msgid "Switch between Prepare/Preview" -msgstr "Perjungimas tarp Paruošti / Peržiūrėti" - -msgid "Plater" -msgstr "Plokštė" +msgid "Available while a painting gizmo is open: supports, seam, fuzzy skin or color painting." +msgstr "" msgid "Move: press to snap by 1mm" msgstr "Perkėlimas: paspauskite, kad pritrauktumėte kas 1 mm" @@ -12318,14 +12232,19 @@ msgstr "Atramų ir spalvų užtepimas: keisti teptuko spindulį" msgid "Support/Color Painting: adjust section position" msgstr "Atramų ir spalvų užtepimas: keisti pjūvio padėtį" -msgid "Gizmo" -msgstr "Manipuliatorius" +msgid "Objects list" +msgstr "Objektų sąrašas" + +msgid "Available while the object list has focus." +msgstr "" msgid "Set extruder number for the objects and parts" msgstr "Nustatykite ekstruderio numerį objektams ir dalims" -msgid "Delete objects, parts, modifiers" -msgstr "Ištrinti objektus, dalis, modifikatorius" +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Space" +msgstr "Tarpas" msgid "Select the object/part and press space to change the name" msgstr "Pasirinkite objektą ir (arba) dalį ir paspauskite tarpo klavišą, kad pakeistumėte pavadinimą" @@ -12336,45 +12255,48 @@ msgstr "Pelės paspaudimas" msgid "Select the object/part and mouse click to change the name" msgstr "Pasirinkite objektą/dalį ir spustelėkite pele, kad pakeistumėte pavadinimą" -msgid "Objects List" -msgstr "Objektų sąrašas" - -msgid "Vertical slider - Move active thumb Up" -msgstr "Vertikalus slankiklis – kelti aktyvų žymeklį aukštyn" - -msgid "Vertical slider - Move active thumb Down" -msgstr "Vertikalus slankiklis – nuleisti aktyvų žymeklį žemyn" - -msgid "Horizontal slider - Move active thumb Left" -msgstr "Horizontalus slankiklis – stumti aktyvų žymeklį kairėn" - -msgid "Horizontal slider - Move active thumb Right" -msgstr "Horizontalus slankiklis – stumti aktyvų žymeklį dešinėn" - -msgid "On/Off one layer mode of the vertical slider" -msgstr "Vertikalaus slankiklio vieno sluoksnio režimas įjungimas / išjungimas" - -msgid "On/Off G-code window" -msgstr "G-kodo lango įjungimas / išjungimas" +msgid "Available while the 3D view on the Preview tab has focus." +msgstr "" msgid "Move slider 5x faster" msgstr "Judinkite slankiklį 5 kartus greičiau" -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Home" -msgstr "Home" +msgid "Scroll slider 5x faster" +msgstr "" -msgid "Horizontal slider - Move to start position" -msgstr "Horizontalus slankiklis – perkelti į pradinę padėtį" +msgid "Not customizable" +msgstr "" -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "End" -msgstr "End" +#, c-format, boost-format +msgid "%s is assigned to %s. Reassign it to %s?" +msgstr "" -msgid "Horizontal slider - Move to last position" -msgstr "Horizontalus slankiklis – perkelti į paskutinę padėtį" +#, c-format, boost-format +msgid "The default %s is assigned to %s. Reassign it to %s?" +msgstr "" + +msgid "Global shortcuts also apply while typing." +msgstr "" + +msgid "A key that types a character cannot be a global shortcut." +msgstr "" + +msgid "Esc cancels, Enter confirms." +msgstr "" + +#, c-format, boost-format +msgid "" +"Press the new shortcut for\n" +"\"%s\"" +msgstr "" + +#, c-format, boost-format +msgid "Already used as a step of %s." +msgstr "" + +#, c-format, boost-format +msgid "Already assigned to %s. Press OK to reassign it." +msgstr "" msgid "Release Note" msgstr "Versijos pastabos (Release notes)" @@ -17222,8 +17144,8 @@ msgstr "Įkaitinimo etapai" msgid "Insert multiple preheat commands (e.g. M104.1). Only useful for Prusa XL. For other printers, please set it to 1." msgstr "Įterpkite kelias įkaitinimo komandas (pvz., M104.1). Naudinga tik „Prusa XL“. Kitiems spausdintuvams nustatykite 1." -msgid "G-code written at the very top of the output file, before any other content. Useful for adding metadata that printer firmware reads from the first lines of the file (e.g. estimated print time, filament usage). Supports placeholders like {print_time_sec} and {used_filament_length}." -msgstr "G-kodas, įrašomas pačiame išvesties failo viršuje, prieš bet kokį kitą turinį. Naudingas įterpti metaduomenims, kuriuos spausdintuvo aparatinė programinė įranga nuskaito iš pirmųjų failo eilučių (pvz., numatomą spausdinimo laiką, gijos sąnaudas). Palaiko kintamuosius (placeholders), tokius kaip {print_time_sec} ir {used_filament_length}." +msgid "G-code written at the very top of the output file, before any other content. Useful for adding metadata that printer firmware reads from the first lines of the file (e.g. estimated print time, filament usage). Supports placeholders like {print_time_total_sec}, {print_time_day}, {print_time_hour}, {print_time_minute}, {print_time_sec} and {used_filament_length}." +msgstr "" msgid "Start G-code" msgstr "Pradžios G-kodas" @@ -18765,12 +18687,36 @@ msgstr "Naudota gija" msgid "Total length of filament used in the print." msgstr "Bendras viso spausdinimo metu sunaudotos gijos ilgis." -msgid "Print time (seconds)" -msgstr "Spausdinimo laikas (sekundėmis)" +msgid "Print time (total seconds)" +msgstr "" msgid "Total estimated print time in seconds. Replaced with actual value during post-processing." msgstr "Bendras numatomas spausdinimo laikas sekundėmis. Papildomo apdorojimo (post-processing) metu pakeičiama faktine reikšme." +msgid "Print time (days component)" +msgstr "" + +msgid "Estimated print time day component (normal mode). Replaced with actual value during post-processing." +msgstr "" + +msgid "Print time (hours component)" +msgstr "" + +msgid "Estimated print time hour component (normal mode). Replaced with actual value during post-processing." +msgstr "" + +msgid "Print time (minutes component)" +msgstr "" + +msgid "Estimated print time minute component (normal mode). Replaced with actual value during post-processing." +msgstr "" + +msgid "Print time (seconds component)" +msgstr "" + +msgid "Estimated print time second component (normal mode). Replaced with actual value during post-processing." +msgstr "" + msgid "Filament length (meters)" msgstr "Gijos ilgis (metrais)" @@ -20612,6 +20558,9 @@ msgstr "Nerasta galiojančios sesijos. Prisijungti prie „3DPrinterOS“?" msgid "Success!" msgstr "Pavyko!" +msgid "Generate API Key" +msgstr "" + msgid "Are you sure to log out?" msgstr "Ar tikrai norite atsijungti?" @@ -21567,13 +21516,6 @@ msgstr "„Bambu“ tinklo papildinys yra būtinas, kad veiktų debesijos funkci msgid "Error: %s" msgstr "Klaida: %s" -msgid "Show details" -msgstr "Rodyti išsamiau" - -# AI Translated -msgid "Hide details" -msgstr "Slėpti išsamią informaciją" - msgid "Version to install:" msgstr "Diegiama versija:" @@ -24202,6 +24144,12 @@ msgstr "" msgid "No binding for that field" msgstr "" +msgid "Enter a number" +msgstr "" + +msgid "Not a number" +msgstr "" + msgid "Primitive" msgstr "" @@ -24214,6 +24162,216 @@ msgstr "" msgid "Clear All" msgstr "" +msgctxt "Keyboard Shortcut" +msgid "Ins" +msgstr "" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Home" +msgstr "Home" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "End" +msgstr "End" + +msgctxt "Keyboard Shortcut" +msgid "PgUp" +msgstr "" + +msgctxt "Keyboard Shortcut" +msgid "PgDn" +msgstr "" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Arrow Left" +msgstr "Rodyklė kairėn" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Arrow Right" +msgstr "Rodyklė dešinėn" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Arrow Up" +msgstr "Rodyklė aukštyn" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Arrow Down" +msgstr "Rodyklė žemyn" + +msgid "Import geometry data from STL/STEP/3MF/OBJ/AMF files" +msgstr "Importuoti geometrijos duomenis iš STL/STEP/3MF/OBJ/AMF failų" + +msgid "Select all objects" +msgstr "Pasirinkti visus objektus" + +msgid "Paste from clipboard" +msgstr "Įklijuoti iš mainų srities" + +msgid "Toggle printable for object/part" +msgstr "Perjungti objekto / dalies spausdinimą" + +msgid "Move selection 10mm in negative X direction" +msgstr "Perkelti pasirinkimą 10 mm neigiama X kryptimi" + +msgid "Move selection 10mm in positive X direction" +msgstr "Perkelti pasirinkimą 10 mm teigiama X kryptimi" + +msgid "Move selection 10mm in positive Y direction" +msgstr "Perkelti pasirinkimą 10 mm teigiama Y kryptimi" + +msgid "Move selection 10mm in negative Y direction" +msgstr "Perkelti pasirinkimą 10 mm neigiama Y kryptimi" + +msgid "Rotate selection 45 degrees counterclockwise" +msgstr "" + +msgid "Rotate selection 45 degrees clockwise" +msgstr "" + +msgid "Gizmo move" +msgstr "Perkėlimo manipuliatorius" + +msgid "Gizmo rotate" +msgstr "Pasukimo manipuliatorius" + +msgid "Gizmo scale" +msgstr "Mastelio keitimo manipuliatorius" + +msgid "Gizmo place face on bed" +msgstr "Paviršiaus dėjimo ant pagrindo manipuliatorius" + +msgid "Gizmo cut" +msgstr "Pjovimo manipuliatorius" + +msgid "Gizmo mesh boolean" +msgstr "Loginių tinklelio veiksmų (Boolean) manipuliatorius" + +msgid "Gizmo FDM paint-on supports" +msgstr "" + +msgid "Gizmo FDM paint-on seam" +msgstr "FDM užtepamos siūlės (seam) manipuliatorius" + +msgid "Gizmo FDM paint-on fuzzy skin" +msgstr "FDM užtepamo grublėto paviršiaus (fuzzy skin) manipuliatorius" + +msgid "Gizmo multi-material painting" +msgstr "" + +msgid "Gizmo text emboss/engrave" +msgstr "Teksto iškėlimo ir įspaudimo (emboss/engrave) manipuliatorius" + +msgid "Gizmo measure" +msgstr "Matavimo manipuliatorius" + +msgid "Gizmo assemble" +msgstr "Surinkimo manipuliatorius" + +msgid "Gizmo brim ears" +msgstr "Krašto „auselių“ (brim ears) manipuliatorius" + +msgid "Vertical slider - Move active thumb Up" +msgstr "Vertikalus slankiklis – kelti aktyvų žymeklį aukštyn" + +msgid "Vertical slider - Move active thumb Down" +msgstr "Vertikalus slankiklis – nuleisti aktyvų žymeklį žemyn" + +msgid "Horizontal slider - Move active thumb Left" +msgstr "Horizontalus slankiklis – stumti aktyvų žymeklį kairėn" + +msgid "Horizontal slider - Move active thumb Right" +msgstr "Horizontalus slankiklis – stumti aktyvų žymeklį dešinėn" + +msgid "Horizontal slider - Move to start position" +msgstr "Horizontalus slankiklis – perkelti į pradinę padėtį" + +msgid "Horizontal slider - Move to last position" +msgstr "Horizontalus slankiklis – perkelti į paskutinę padėtį" + +msgid "Camera view - Default" +msgstr "Kameros vaizdas - Numatytasis" + +msgid "Camera view - Top" +msgstr "Kameros vaizdas - Viršus" + +msgid "Camera view - Bottom" +msgstr "Kameros vaizdas - Apačia" + +msgid "Camera view - Front" +msgstr "Kameros vaizdas - Priekis" + +msgid "Camera view - Behind" +msgstr "Kameros vaizdas – iš galo" + +msgid "Camera Angle - Left side" +msgstr "Kameros kampas – iš kairės" + +msgid "Camera Angle - Right side" +msgstr "Kameros kampas – iš dešinės" + +msgid "Camera view - Current plate" +msgstr "" + +msgid "Zoom in" +msgstr "Padidinti" + +msgid "Zoom out" +msgstr "Nutolinti" + +msgid "Show/Hide 3Dconnexion devices settings dialog" +msgstr "Rodyti/slėpti 3DConnexion įrenginių nustatymų dialogo langą" + +msgid "Show/Hide wireframe" +msgstr "" + +msgid "On/Off G-code window" +msgstr "G-kodo lango įjungimas / išjungimas" + +msgid "On/Off one layer mode of the vertical slider" +msgstr "Vertikalaus slankiklio vieno sluoksnio režimas įjungimas / išjungimas" + +msgid "Switch between Prepare/Preview" +msgstr "Perjungimas tarp Paruošti / Peržiūrėti" + +msgid "Collapse/Expand the sidebar" +msgstr "Sutraukti / išskleisti šoninę juostą" + +msgid "Open the speed dial" +msgstr "" + +msgid "Reload the device page" +msgstr "" + +msgid "Show keyboard shortcuts list" +msgstr "Rodyti sparčiųjų klavišų sąrašą" + +msgid "Slicing and printing" +msgstr "" + +msgid "Editing" +msgstr "" + +msgid "Placement" +msgstr "" + +msgid "Gizmos" +msgstr "" + +msgid "Sliders" +msgstr "" + +msgid "Painting tools" +msgstr "" + +msgid "Application" +msgstr "" + #: resources/data/hints.ini: [hint:Precise wall] msgid "" "Precise wall\n" @@ -24514,6 +24672,62 @@ msgstr "" "Venkite deformacijų (warping)\n" "Ar žinojote, kad spausdinant medžiagas, kurios yra linkusios trauktis ir riestis (pvz., ABS), tinkamas kaitinamojo pagrindo temperatūros padidinimas gali sumažinti deformacijų (warping) tikimybę?" +#~ msgid "Tab" +#~ msgstr "Tab" + +#~ msgid "Displays current viewport FPS in the top-right corner." +#~ msgstr "Viršutiniame dešiniajame kampe rodo esamą vaizdo srities kadrų dažnį." + +# AI Translated +#~ msgid "Publish 3MF Wiki" +#~ msgstr "3MF talpinimo wiki" + +# AI Translated +#~ msgid "Publish 3MF Video Guide" +#~ msgstr "3MF talpinimo vaizdo vadovas" + +#~ msgid "Toolbar" +#~ msgstr "Įrankių juosta" + +#~ msgid "Switch table page" +#~ msgstr "Perjungti lentelės puslapį" + +#~ msgid "Global shortcuts" +#~ msgstr "Bendrieji spartieji klavišai" + +#~ msgid "Middle mouse button" +#~ msgstr "Vidurinis pelės mygtukas" + +#~ msgid "Auto orients selected objects or all objects. If there are selected objects, it just orients the selected ones. Otherwise, it will orient all objects in the current project." +#~ msgstr "Automatiškai orientuoja pasirinktus objektus arba visus objektus. Jei yra pasirinkti objektai, orientuoja tik pasirinktus. Kitais atvejais orientuoja visus esamo projekto objektus." + +#~ msgid "Auto orients all objects on the active plate." +#~ msgstr "Automatiškai orientuoja visus objektus aktyvioje plokštėje." + +#~ msgid "Any arrow" +#~ msgstr "Bet kuri rodyklė" + +#~ msgid "Gizmo SLA support points" +#~ msgstr "SLA atramų taškų manipuliatorius" + +#~ msgid "Plater" +#~ msgstr "Plokštė" + +#~ msgid "Gizmo" +#~ msgstr "Manipuliatorius" + +#~ msgid "Delete objects, parts, modifiers" +#~ msgstr "Ištrinti objektus, dalis, modifikatorius" + +#~ msgid "Objects List" +#~ msgstr "Objektų sąrašas" + +#~ msgid "G-code written at the very top of the output file, before any other content. Useful for adding metadata that printer firmware reads from the first lines of the file (e.g. estimated print time, filament usage). Supports placeholders like {print_time_sec} and {used_filament_length}." +#~ msgstr "G-kodas, įrašomas pačiame išvesties failo viršuje, prieš bet kokį kitą turinį. Naudingas įterpti metaduomenims, kuriuos spausdintuvo aparatinė programinė įranga nuskaito iš pirmųjų failo eilučių (pvz., numatomą spausdinimo laiką, gijos sąnaudas). Palaiko kintamuosius (placeholders), tokius kaip {print_time_sec} ir {used_filament_length}." + +#~ msgid "Print time (seconds)" +#~ msgstr "Spausdinimo laikas (sekundėmis)" + # AI Translated #~ msgid "Open actions speed dial" #~ msgstr "Atidaryti veiksmų greitosios prieigos meniu" diff --git a/localization/i18n/nl/OrcaSlicer_nl.po b/localization/i18n/nl/OrcaSlicer_nl.po index 685be64863..2800bcda36 100644 --- a/localization/i18n/nl/OrcaSlicer_nl.po +++ b/localization/i18n/nl/OrcaSlicer_nl.po @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-09-18 15:50+0800\n" +"POT-Creation-Date: 2026-09-22 12:39+0800\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: \n" @@ -6454,12 +6454,15 @@ msgctxt "Camera View" msgid "Right" msgstr "Rechts" -msgid "Add" -msgstr "Toevoegen" - msgid "Add plate" msgstr "Printbed toevoegen" +msgid "Split to objects" +msgstr "Opsplitsen in objecten" + +msgid "Add" +msgstr "Toevoegen" + msgid "Auto orient all/selected objects" msgstr "Automatisch oriënteren alle/geselecteerde objecten" @@ -6472,9 +6475,6 @@ msgstr "Alle objecten rangschikken" msgid "Arrange objects on selected plates" msgstr "Rangschikt de objecten op de gelecteerde printbedden" -msgid "Split to objects" -msgstr "Opsplitsen in objecten" - msgid "Assembly View" msgstr "Montageweergave" @@ -6533,6 +6533,9 @@ msgstr "Omtrek" msgid "Wireframe" msgstr "Draadmodel" +msgid "X-Ray" +msgstr "" + # AI Translated msgid "Realistic View" msgstr "Realistische weergave" @@ -7119,7 +7122,7 @@ msgstr "Toon een omtrek rond het geselecteerde object in de 3D-scène." msgid "Preferences" msgstr "Voorkeuren" -msgid "Open speed dial..." +msgid "Open speed dial" msgstr "" # AI Translated @@ -9088,10 +9091,6 @@ msgstr "Zijbalk uitklappen" msgid "Collapse sidebar" msgstr "Zijbalk inklappen" -# AI Translated -msgid "Tab" -msgstr "Tab" - #, c-format, boost-format msgid "Loading file: %s" msgstr "Bestand laden: %s" @@ -10218,10 +10217,10 @@ msgstr "Beheer van meerdere apparaten" msgid "With this option enabled, you can send a task to multiple devices at the same time and manage multiple devices." msgstr "Met deze optie ingeschakeld kunt u een taak tegelijkertijd naar meerdere apparaten sturen en meerdere apparaten beheren." -msgid "Open the Speed Dial with the Space key" +msgid "Open the Speed Dial from the keyboard" msgstr "" -msgid "When enabled, pressing Space (with no other key held) opens the Speed Dial action search from any page." +msgid "When enabled, the Speed Dial keyboard shortcut (Space by default) opens the action search from any page." msgstr "" msgid "Recent actions" @@ -10371,6 +10370,15 @@ msgstr "Slepen met rechtermuisknop" msgid "Set the action that dragging the right mouse button should perform." msgstr "Stel de actie in die het slepen met de rechtermuisknop moet uitvoeren." +msgid "Keyboard" +msgstr "" + +msgid "Keyboard shortcuts" +msgstr "" + +msgid "Choose the key for each action." +msgstr "" + # AI Translated msgid "Clear my choice on..." msgstr "Mijn keuze wissen voor..." @@ -10500,13 +10508,40 @@ msgstr "" "Beperkt de framesnelheid van de viewport om de GPU-belasting en het stroomverbruik te verlagen.\n" "Stel in op 0 voor een onbeperkte framesnelheid." +msgid "Reuse the 3D scene while idle" +msgstr "" + +msgid "" +"Skips redrawing the 3D scene when only the mouse cursor moves over the viewport,\n" +"and reuses the previous frame's scene instead. Reduces GPU load.\n" +"Disable it if the viewport shows stale or missing contents.\n" +"\n" +"Takes effect immediately." +msgstr "" + +msgid "Skip unchanged frames" +msgstr "" + +msgid "" +"Skips drawing a frame altogether when it would be identical to the one already on screen.\n" +"Only applies to frames that reuse the 3D scene, so it needs Reuse the 3D scene while idle.\n" +"Disable it if a hover highlight, tooltip or animation stops updating.\n" +"\n" +"Takes effect immediately." +msgstr "" + # AI Translated msgid "Show FPS overlay" msgstr "FPS-overlay tonen" -# AI Translated -msgid "Displays current viewport FPS in the top-right corner." -msgstr "Toont de huidige FPS van de viewport in de rechterbovenhoek." +msgid "Displays rendering counts in the top-right corner of the viewport." +msgstr "" + +msgid "FPS: frames presented to the screen per second." +msgstr "" + +msgid "3D: frames per second that redrew the 3D scene." +msgstr "" # AI Translated msgid "G-code Preview" @@ -11006,13 +11041,8 @@ msgstr "3MF publiceren..." msgid "Select which settings to be published in the 3MF file" msgstr "Selecteer welke instellingen in het 3MF-bestand worden gepubliceerd" -# AI Translated -msgid "Publish 3MF Wiki" -msgstr "Wiki over 3MF publiceren" - -# AI Translated -msgid "Publish 3MF Video Guide" -msgstr "Videohandleiding over 3MF publiceren" +msgid "Video Guide" +msgstr "" # AI Translated msgid "Mixed filament - published as a whole when \"Enable\" above is selected" @@ -11215,6 +11245,14 @@ msgstr "" msgid "No wiki page for this action" msgstr "" +# AI Translated +msgid "Show details" +msgstr "Details tonen" + +# AI Translated +msgid "Hide details" +msgstr "Details verbergen" + #, c-format, boost-format msgid "\"%s\" is a Developer setting. Enable Developer mode to edit it?" msgstr "" @@ -13238,71 +13276,39 @@ msgstr "Het configuratiebestand is aangepast in de vorige Config Guide" msgid "Configuration package changed" msgstr "Het configuratiepakket is gewijzigd" -msgid "Toolbar" -msgstr "Gereedschapsbalk" - -msgid "Objects list" -msgstr "Object lijst" - -# AI Translated -msgid "Import geometry data from STL/STEP/3MF/OBJ/AMF files" -msgstr "Importeer geometriegegevens uit STL-/STEP-/3MF-/OBJ-/AMF-bestanden" - -msgid "Paste from clipboard" -msgstr "Plakken vanuit klembord" - -msgid "Show/Hide 3Dconnexion devices settings dialog" -msgstr "Dialoogvenster met instellingen voor 3Dconnexion-apparaten weergeven/verbergen" - -msgid "Switch table page" -msgstr "Schakeltabel pagina" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Space" -msgstr "Spatie" - -msgid "Open speed dial" -msgstr "" - -msgid "Run a Speed Dial favourite (while the Speed Dial is open)" -msgstr "" - -msgid "Show keyboard shortcuts list" -msgstr "Toon lijst met sneltoetsen" - -msgid "Global shortcuts" -msgstr "Globale snelkoppelingen" - msgid "Pan View" msgstr "Panweergave" msgid "Rotate View" msgstr "Weergave roteren" -# AI Translated -msgid "Middle mouse button" -msgstr "Middelste muisknop" +#, c-format, boost-format +msgid "Use %s or %s, or a key that does not type a character." +msgstr "" -msgid "Zoom View" -msgstr "Zoom weergave" +msgctxt "Keyboard Shortcut" +msgid "Key" +msgstr "" -msgid "Auto orients selected objects or all objects. If there are selected objects, it just orients the selected ones. Otherwise, it will orient all objects in the current project." -msgstr "Oriënteert automatisch geselecteerde objecten of alle objecten. Als er geselecteerde objecten zijn, oriënteert het alleen de geselecteerde objecten. Anders worden alle objecten van het project georiënteerd." +msgid "Left mouse" +msgstr "" + +msgid "Available anywhere in the window, even while typing in a text field." +msgstr "" + +msgid "Run a speed dial favorite while the dial is open" +msgstr "" # AI Translated -msgid "Auto orients all objects on the active plate." -msgstr "Oriënteert alle objecten op het actieve printbed automatisch." +msgctxt "Keyboard Shortcut" +msgid "Tab" +msgstr "Tab" -msgid "Collapse/Expand the sidebar" -msgstr "De menubalk in-/uitschuiven" +msgid "Switch to the next main tab" +msgstr "" -# AI Translated -msgid "Any arrow" -msgstr "Willekeurige pijltoets" - -msgid "Movement in camera space" -msgstr "Beweging in cameragebied" +msgid "Available while the 3D view on the Prepare tab has focus." +msgstr "" msgid "Select a part" msgstr "Selecteer een onderdeel" @@ -13313,130 +13319,29 @@ msgstr "Selecteer meerdere objecten" msgid "Select objects by rectangle" msgstr "Objecten selecteren door rechthoek" -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Arrow Up" -msgstr "Pijl omhoog" - -msgid "Move selection 10mm in positive Y direction" -msgstr "Verplaats de selectie 10mm in een positieve Y richting" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Arrow Down" -msgstr "Pijl omlaag" - -msgid "Move selection 10mm in negative Y direction" -msgstr "Verplaats de selectie 10mm in een negatieve Y richting" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Arrow Left" -msgstr "Pijl links" - -msgid "Move selection 10mm in negative X direction" -msgstr "Verplaats de selectie 10mm in een negatieve X richting" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Arrow Right" -msgstr "Pijl rechts" - -msgid "Move selection 10mm in positive X direction" -msgstr "Verplaats de selectie 10mm in een positieve X richting" +msgid "Keyboard 1-9: set filament for object/part" +msgstr "Toets 1-9: kies filament voor het object/onderdeel" msgid "Movement step set to 1mm" msgstr "Bewegingsinterval ingesteld op 1mm" -msgid "Keyboard 1-9: set filament for object/part" -msgstr "Toets 1-9: kies filament voor het object/onderdeel" +msgid "Movement in camera space" +msgstr "Beweging in cameragebied" -msgid "Camera view - Default" -msgstr "Camera hoek - Standaard" +msgid "Middle mouse" +msgstr "" -msgid "Camera view - Top" -msgstr "Camera hoek - Bovenkant" +msgid "Right mouse" +msgstr "" -msgid "Camera view - Bottom" -msgstr "Camera hoek - Onderkant" +msgid "Zoom View" +msgstr "Zoom weergave" -msgid "Camera view - Front" -msgstr "Camera hoek - Voorkant" +msgid "Painting" +msgstr "" -msgid "Camera view - Behind" -msgstr "Camera hoek - Achter" - -msgid "Camera Angle - Left side" -msgstr "Camera hoek - Linker zijde" - -msgid "Camera Angle - Right side" -msgstr "Camera hoek - Rechter zijde" - -msgid "Select all objects" -msgstr "Selecteer alle objecten" - -msgid "Gizmo move" -msgstr "Gizmo bewegen" - -msgid "Gizmo rotate" -msgstr "Gizmo roteren" - -msgid "Gizmo scale" -msgstr "Gizmo schalen" - -msgid "Gizmo place face on bed" -msgstr "Gizmo plaats gebied op het bed" - -msgid "Gizmo cut" -msgstr "Gizmo snijden" - -msgid "Gizmo mesh boolean" -msgstr "Gizmo mesh booleaan" - -# AI Translated -msgid "Gizmo FDM paint-on fuzzy skin" -msgstr "Gizmo FDM vage buitenkant schilderen" - -msgid "Gizmo SLA support points" -msgstr "Gizmo SLA-ondersteuningspunten" - -msgid "Gizmo FDM paint-on seam" -msgstr "Gizmo FDM seam schilderen" - -msgid "Gizmo text emboss/engrave" -msgstr "Gizmo tekst reliëf/graveren" - -msgid "Gizmo measure" -msgstr "Gizmo maatregel" - -msgid "Gizmo assemble" -msgstr "Gizmo monteren" - -msgid "Gizmo brim ears" -msgstr "Gizmo rand oren" - -# AI Translated -msgid "Zoom in" -msgstr "Inzoomen" - -msgid "Zoom out" -msgstr "Zoom uit" - -# AI Translated -msgid "Toggle printable for object/part" -msgstr "Printbaar in-/uitschakelen voor object/onderdeel" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Tab" -msgstr "Tab" - -# AI Translated -msgid "Switch between Prepare/Preview" -msgstr "Wisselen tussen Voorbereiden/Voorvertoning" - -msgid "Plater" -msgstr "Plaat" +msgid "Available while a painting gizmo is open: supports, seam, fuzzy skin or color painting." +msgstr "" msgid "Move: press to snap by 1mm" msgstr "Verplaatsen: druk om 1 mm te verplaatsen" @@ -13447,15 +13352,19 @@ msgstr "Support/kleur intekenen: pas de pen diameter aan" msgid "Support/Color Painting: adjust section position" msgstr "Support/kleur intekenen: pas de sectie positie aan" -# AI Translated -msgid "Gizmo" -msgstr "Gizmo" +msgid "Objects list" +msgstr "Object lijst" + +msgid "Available while the object list has focus." +msgstr "" msgid "Set extruder number for the objects and parts" msgstr "Stel het extrudernnumer in voor de objecten en onderdelen" -msgid "Delete objects, parts, modifiers" -msgstr "Verwijder objecten, onderdelen, aanpassingen" +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Space" +msgstr "Spatie" msgid "Select the object/part and press space to change the name" msgstr "Selecteer het object/onderdeel en druk op de spatiebalk om de naam aan te passen" @@ -13466,48 +13375,48 @@ msgstr "Muisklik" msgid "Select the object/part and mouse click to change the name" msgstr "Selecteer het object/onderdeel en rechtermuisklik om de naam aan te passen" -msgid "Objects List" -msgstr "Objecten lijst" - -msgid "Vertical slider - Move active thumb Up" -msgstr "Verticale schuifregelaar - Actieve thumb omhoog bewegen" - -msgid "Vertical slider - Move active thumb Down" -msgstr "Verticale schuifregelaar - Actieve thumb omlaag bewegen" - -msgid "Horizontal slider - Move active thumb Left" -msgstr "Horizontale schuifbalk - Beweeg actieve duim naar links" - -msgid "Horizontal slider - Move active thumb Right" -msgstr "Horizontale schuifbalk - Beweeg actieve duim naar rechts" - -msgid "On/Off one layer mode of the vertical slider" -msgstr "Aan/uit één laagmodus van de verticale schuifregelaar" - -# AI Translated -msgid "On/Off G-code window" -msgstr "G-code-venster aan/uit" +msgid "Available while the 3D view on the Preview tab has focus." +msgstr "" msgid "Move slider 5x faster" msgstr "Schuifregelaar 5x sneller verplaatsen" -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Home" -msgstr "Home" +msgid "Scroll slider 5x faster" +msgstr "" -# AI Translated -msgid "Horizontal slider - Move to start position" -msgstr "Horizontale schuifregelaar - Naar de startpositie" +msgid "Not customizable" +msgstr "" -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "End" -msgstr "End" +#, c-format, boost-format +msgid "%s is assigned to %s. Reassign it to %s?" +msgstr "" -# AI Translated -msgid "Horizontal slider - Move to last position" -msgstr "Horizontale schuifregelaar - Naar de laatste positie" +#, c-format, boost-format +msgid "The default %s is assigned to %s. Reassign it to %s?" +msgstr "" + +msgid "Global shortcuts also apply while typing." +msgstr "" + +msgid "A key that types a character cannot be a global shortcut." +msgstr "" + +msgid "Esc cancels, Enter confirms." +msgstr "" + +#, c-format, boost-format +msgid "" +"Press the new shortcut for\n" +"\"%s\"" +msgstr "" + +#, c-format, boost-format +msgid "Already used as a step of %s." +msgstr "" + +#, c-format, boost-format +msgid "Already assigned to %s. Press OK to reassign it." +msgstr "" msgid "Release Note" msgstr "Release-opmerkingen" @@ -18992,9 +18901,8 @@ msgstr "Voorverwarmstappen" msgid "Insert multiple preheat commands (e.g. M104.1). Only useful for Prusa XL. For other printers, please set it to 1." msgstr "Voeg meerdere voorverwarmopdrachten in (bijv. M104.1). Alleen nuttig voor de Prusa XL. Stel dit voor andere printers in op 1." -# AI Translated -msgid "G-code written at the very top of the output file, before any other content. Useful for adding metadata that printer firmware reads from the first lines of the file (e.g. estimated print time, filament usage). Supports placeholders like {print_time_sec} and {used_filament_length}." -msgstr "G-code die helemaal bovenaan het uitvoerbestand wordt geschreven, vóór alle andere inhoud. Nuttig voor het toevoegen van metagegevens die de printerfirmware uit de eerste regels van het bestand leest (bijv. geschatte printtijd, filamentverbruik). Ondersteunt plaatshouders zoals {print_time_sec} en {used_filament_length}." +msgid "G-code written at the very top of the output file, before any other content. Useful for adding metadata that printer firmware reads from the first lines of the file (e.g. estimated print time, filament usage). Supports placeholders like {print_time_total_sec}, {print_time_day}, {print_time_hour}, {print_time_minute}, {print_time_sec} and {used_filament_length}." +msgstr "" # AI Translated msgid "Start G-code" @@ -20730,14 +20638,37 @@ msgstr "Verbruikt filament" msgid "Total length of filament used in the print." msgstr "Totale lengte filament die in de print is gebruikt." -# AI Translated -msgid "Print time (seconds)" -msgstr "Printtijd (seconden)" +msgid "Print time (total seconds)" +msgstr "" # AI Translated msgid "Total estimated print time in seconds. Replaced with actual value during post-processing." msgstr "Totale geschatte printtijd in seconden. Wordt tijdens de nabewerking vervangen door de werkelijke waarde." +msgid "Print time (days component)" +msgstr "" + +msgid "Estimated print time day component (normal mode). Replaced with actual value during post-processing." +msgstr "" + +msgid "Print time (hours component)" +msgstr "" + +msgid "Estimated print time hour component (normal mode). Replaced with actual value during post-processing." +msgstr "" + +msgid "Print time (minutes component)" +msgstr "" + +msgid "Estimated print time minute component (normal mode). Replaced with actual value during post-processing." +msgstr "" + +msgid "Print time (seconds component)" +msgstr "" + +msgid "Estimated print time second component (normal mode). Replaced with actual value during post-processing." +msgstr "" + # AI Translated msgid "Filament length (meters)" msgstr "Filamentlengte (meters)" @@ -22761,6 +22692,9 @@ msgstr "Er is geen geldige sessie gedetecteerd. Doorgaan met inloggen op 3DPrint msgid "Success!" msgstr "Succes!" +msgid "Generate API Key" +msgstr "" + msgid "Are you sure to log out?" msgstr "Weet u zeker dat u wilt uitloggen?" @@ -23943,14 +23877,6 @@ msgstr "De Bambu-netwerkplug-in is vereist voor cloudfuncties, het vinden van pr msgid "Error: %s" msgstr "Fout: %s" -# AI Translated -msgid "Show details" -msgstr "Details tonen" - -# AI Translated -msgid "Hide details" -msgstr "Details verbergen" - # AI Translated msgid "Version to install:" msgstr "Te installeren versie:" @@ -26633,6 +26559,12 @@ msgstr "" msgid "No binding for that field" msgstr "" +msgid "Enter a number" +msgstr "" + +msgid "Not a number" +msgstr "" + msgid "Primitive" msgstr "" @@ -26645,6 +26577,224 @@ msgstr "" msgid "Clear All" msgstr "" +msgctxt "Keyboard Shortcut" +msgid "Ins" +msgstr "" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Home" +msgstr "Home" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "End" +msgstr "End" + +msgctxt "Keyboard Shortcut" +msgid "PgUp" +msgstr "" + +msgctxt "Keyboard Shortcut" +msgid "PgDn" +msgstr "" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Arrow Left" +msgstr "Pijl links" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Arrow Right" +msgstr "Pijl rechts" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Arrow Up" +msgstr "Pijl omhoog" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Arrow Down" +msgstr "Pijl omlaag" + +# AI Translated +msgid "Import geometry data from STL/STEP/3MF/OBJ/AMF files" +msgstr "Importeer geometriegegevens uit STL-/STEP-/3MF-/OBJ-/AMF-bestanden" + +msgid "Select all objects" +msgstr "Selecteer alle objecten" + +msgid "Paste from clipboard" +msgstr "Plakken vanuit klembord" + +# AI Translated +msgid "Toggle printable for object/part" +msgstr "Printbaar in-/uitschakelen voor object/onderdeel" + +msgid "Move selection 10mm in negative X direction" +msgstr "Verplaats de selectie 10mm in een negatieve X richting" + +msgid "Move selection 10mm in positive X direction" +msgstr "Verplaats de selectie 10mm in een positieve X richting" + +msgid "Move selection 10mm in positive Y direction" +msgstr "Verplaats de selectie 10mm in een positieve Y richting" + +msgid "Move selection 10mm in negative Y direction" +msgstr "Verplaats de selectie 10mm in een negatieve Y richting" + +msgid "Rotate selection 45 degrees counterclockwise" +msgstr "" + +msgid "Rotate selection 45 degrees clockwise" +msgstr "" + +msgid "Gizmo move" +msgstr "Gizmo bewegen" + +msgid "Gizmo rotate" +msgstr "Gizmo roteren" + +msgid "Gizmo scale" +msgstr "Gizmo schalen" + +msgid "Gizmo place face on bed" +msgstr "Gizmo plaats gebied op het bed" + +msgid "Gizmo cut" +msgstr "Gizmo snijden" + +msgid "Gizmo mesh boolean" +msgstr "Gizmo mesh booleaan" + +msgid "Gizmo FDM paint-on supports" +msgstr "" + +msgid "Gizmo FDM paint-on seam" +msgstr "Gizmo FDM seam schilderen" + +# AI Translated +msgid "Gizmo FDM paint-on fuzzy skin" +msgstr "Gizmo FDM vage buitenkant schilderen" + +msgid "Gizmo multi-material painting" +msgstr "" + +msgid "Gizmo text emboss/engrave" +msgstr "Gizmo tekst reliëf/graveren" + +msgid "Gizmo measure" +msgstr "Gizmo maatregel" + +msgid "Gizmo assemble" +msgstr "Gizmo monteren" + +msgid "Gizmo brim ears" +msgstr "Gizmo rand oren" + +msgid "Vertical slider - Move active thumb Up" +msgstr "Verticale schuifregelaar - Actieve thumb omhoog bewegen" + +msgid "Vertical slider - Move active thumb Down" +msgstr "Verticale schuifregelaar - Actieve thumb omlaag bewegen" + +msgid "Horizontal slider - Move active thumb Left" +msgstr "Horizontale schuifbalk - Beweeg actieve duim naar links" + +msgid "Horizontal slider - Move active thumb Right" +msgstr "Horizontale schuifbalk - Beweeg actieve duim naar rechts" + +# AI Translated +msgid "Horizontal slider - Move to start position" +msgstr "Horizontale schuifregelaar - Naar de startpositie" + +# AI Translated +msgid "Horizontal slider - Move to last position" +msgstr "Horizontale schuifregelaar - Naar de laatste positie" + +msgid "Camera view - Default" +msgstr "Camera hoek - Standaard" + +msgid "Camera view - Top" +msgstr "Camera hoek - Bovenkant" + +msgid "Camera view - Bottom" +msgstr "Camera hoek - Onderkant" + +msgid "Camera view - Front" +msgstr "Camera hoek - Voorkant" + +msgid "Camera view - Behind" +msgstr "Camera hoek - Achter" + +msgid "Camera Angle - Left side" +msgstr "Camera hoek - Linker zijde" + +msgid "Camera Angle - Right side" +msgstr "Camera hoek - Rechter zijde" + +msgid "Camera view - Current plate" +msgstr "" + +# AI Translated +msgid "Zoom in" +msgstr "Inzoomen" + +msgid "Zoom out" +msgstr "Zoom uit" + +msgid "Show/Hide 3Dconnexion devices settings dialog" +msgstr "Dialoogvenster met instellingen voor 3Dconnexion-apparaten weergeven/verbergen" + +msgid "Show/Hide wireframe" +msgstr "" + +# AI Translated +msgid "On/Off G-code window" +msgstr "G-code-venster aan/uit" + +msgid "On/Off one layer mode of the vertical slider" +msgstr "Aan/uit één laagmodus van de verticale schuifregelaar" + +# AI Translated +msgid "Switch between Prepare/Preview" +msgstr "Wisselen tussen Voorbereiden/Voorvertoning" + +msgid "Collapse/Expand the sidebar" +msgstr "De menubalk in-/uitschuiven" + +msgid "Open the speed dial" +msgstr "" + +msgid "Reload the device page" +msgstr "" + +msgid "Show keyboard shortcuts list" +msgstr "Toon lijst met sneltoetsen" + +msgid "Slicing and printing" +msgstr "" + +msgid "Editing" +msgstr "" + +msgid "Placement" +msgstr "" + +msgid "Gizmos" +msgstr "" + +msgid "Sliders" +msgstr "" + +msgid "Painting tools" +msgstr "" + +msgid "Application" +msgstr "" + #: resources/data/hints.ini: [hint:Precise wall] msgid "" "Precise wall\n" @@ -26946,6 +27096,70 @@ msgstr "" "Kromtrekken voorkomen\n" "Wist je dat bij het printen van materialen die gevoelig zijn voor kromtrekken, zoals ABS, een juiste verhoging van de temperatuur van het warmtebed de kans op kromtrekken kan verkleinen?" +# AI Translated +#~ msgid "Tab" +#~ msgstr "Tab" + +# AI Translated +#~ msgid "Displays current viewport FPS in the top-right corner." +#~ msgstr "Toont de huidige FPS van de viewport in de rechterbovenhoek." + +# AI Translated +#~ msgid "Publish 3MF Wiki" +#~ msgstr "Wiki over 3MF publiceren" + +# AI Translated +#~ msgid "Publish 3MF Video Guide" +#~ msgstr "Videohandleiding over 3MF publiceren" + +#~ msgid "Toolbar" +#~ msgstr "Gereedschapsbalk" + +#~ msgid "Switch table page" +#~ msgstr "Schakeltabel pagina" + +#~ msgid "Global shortcuts" +#~ msgstr "Globale snelkoppelingen" + +# AI Translated +#~ msgid "Middle mouse button" +#~ msgstr "Middelste muisknop" + +#~ msgid "Auto orients selected objects or all objects. If there are selected objects, it just orients the selected ones. Otherwise, it will orient all objects in the current project." +#~ msgstr "Oriënteert automatisch geselecteerde objecten of alle objecten. Als er geselecteerde objecten zijn, oriënteert het alleen de geselecteerde objecten. Anders worden alle objecten van het project georiënteerd." + +# AI Translated +#~ msgid "Auto orients all objects on the active plate." +#~ msgstr "Oriënteert alle objecten op het actieve printbed automatisch." + +# AI Translated +#~ msgid "Any arrow" +#~ msgstr "Willekeurige pijltoets" + +#~ msgid "Gizmo SLA support points" +#~ msgstr "Gizmo SLA-ondersteuningspunten" + +#~ msgid "Plater" +#~ msgstr "Plaat" + +# AI Translated +#~ msgid "Gizmo" +#~ msgstr "Gizmo" + +#~ msgid "Delete objects, parts, modifiers" +#~ msgstr "Verwijder objecten, onderdelen, aanpassingen" + +#~ msgid "Objects List" +#~ msgstr "Objecten lijst" + +# AI Translated +#~ msgid "G-code written at the very top of the output file, before any other content. Useful for adding metadata that printer firmware reads from the first lines of the file (e.g. estimated print time, filament usage). Supports placeholders like {print_time_sec} and {used_filament_length}." +#~ msgstr "G-code die helemaal bovenaan het uitvoerbestand wordt geschreven, vóór alle andere inhoud. Nuttig voor het toevoegen van metagegevens die de printerfirmware uit de eerste regels van het bestand leest (bijv. geschatte printtijd, filamentverbruik). Ondersteunt plaatshouders zoals {print_time_sec} en {used_filament_length}." + +# AI Translated +#~ msgid "Print time (seconds)" +#~ msgstr "Printtijd (seconden)" + # AI Translated #~ msgid "Open actions speed dial" #~ msgstr "Snelmenu met acties openen" diff --git a/localization/i18n/pl/OrcaSlicer_pl.po b/localization/i18n/pl/OrcaSlicer_pl.po index 25b5b664cf..c00b9df1c3 100644 --- a/localization/i18n/pl/OrcaSlicer_pl.po +++ b/localization/i18n/pl/OrcaSlicer_pl.po @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: OrcaSlicer 2.3.0-rc\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-09-18 15:50+0800\n" +"POT-Creation-Date: 2026-09-22 12:39+0800\n" "PO-Revision-Date: \n" "Last-Translator: Krzysztof Morga <>\n" "Language-Team: \n" @@ -6047,12 +6047,15 @@ msgctxt "Camera View" msgid "Right" msgstr "Prawy" -msgid "Add" -msgstr "Dodaj" - msgid "Add plate" msgstr "Dodaj płytę" +msgid "Split to objects" +msgstr "Podziel na obiekty" + +msgid "Add" +msgstr "Dodaj" + msgid "Auto orient all/selected objects" msgstr "Automatyczna orientacja wszystkie/wybrane obiekty" @@ -6065,9 +6068,6 @@ msgstr "Rozmieść wszystkie obiekty" msgid "Arrange objects on selected plates" msgstr "Rozmieść obiekty na wybranych płytach" -msgid "Split to objects" -msgstr "Podziel na obiekty" - msgid "Assembly View" msgstr "Widok montażu" @@ -6130,6 +6130,9 @@ msgstr "kontur" msgid "Wireframe" msgstr "Siatka" +msgid "X-Ray" +msgstr "" + # AI Translated msgid "Realistic View" msgstr "Widok realistyczny" @@ -6686,7 +6689,7 @@ msgstr "Przełącza wyświetlanie konturu wokół zaznaczonego obiektu w scenie msgid "Preferences" msgstr "Preferencje" -msgid "Open speed dial..." +msgid "Open speed dial" msgstr "" # AI Translated @@ -8546,9 +8549,6 @@ msgstr "Rozwiń pasek boczny" msgid "Collapse sidebar" msgstr "Zwiń pasek boczny" -msgid "Tab" -msgstr "Karty" - #, c-format, boost-format msgid "Loading file: %s" msgstr "Wczytywanie pliku: %s" @@ -9626,10 +9626,10 @@ msgstr "Obsługiwanie wielu urządzeń" msgid "With this option enabled, you can send a task to multiple devices at the same time and manage multiple devices." msgstr "Umożliwia wysyłanie zadania do wielu urządzeń jednocześnie i zarządzanie nimi." -msgid "Open the Speed Dial with the Space key" +msgid "Open the Speed Dial from the keyboard" msgstr "" -msgid "When enabled, pressing Space (with no other key held) opens the Speed Dial action search from any page." +msgid "When enabled, the Speed Dial keyboard shortcut (Space by default) opens the action search from any page." msgstr "" msgid "Recent actions" @@ -9777,6 +9777,15 @@ msgstr "Przeciąganie prawym przyciskiem myszy" msgid "Set the action that dragging the right mouse button should perform." msgstr "Ustaw akcję wykonywaną przy przeciąganiu prawym przyciskiem myszy." +msgid "Keyboard" +msgstr "" + +msgid "Keyboard shortcuts" +msgstr "" + +msgid "Choose the key for each action." +msgstr "" + # AI Translated msgid "Clear my choice on..." msgstr "Wyczyść mój wybór dla..." @@ -9905,13 +9914,40 @@ msgstr "" "Ogranicza liczbę klatek w widoku, aby zmniejszyć obciążenie GPU i zużycie energii.\n" "Ustaw 0, aby nie ograniczać liczby klatek." +msgid "Reuse the 3D scene while idle" +msgstr "" + +msgid "" +"Skips redrawing the 3D scene when only the mouse cursor moves over the viewport,\n" +"and reuses the previous frame's scene instead. Reduces GPU load.\n" +"Disable it if the viewport shows stale or missing contents.\n" +"\n" +"Takes effect immediately." +msgstr "" + +msgid "Skip unchanged frames" +msgstr "" + +msgid "" +"Skips drawing a frame altogether when it would be identical to the one already on screen.\n" +"Only applies to frames that reuse the 3D scene, so it needs Reuse the 3D scene while idle.\n" +"Disable it if a hover highlight, tooltip or animation stops updating.\n" +"\n" +"Takes effect immediately." +msgstr "" + # AI Translated msgid "Show FPS overlay" msgstr "Pokaż nakładkę FPS" -# AI Translated -msgid "Displays current viewport FPS in the top-right corner." -msgstr "Wyświetla bieżącą wartość FPS widoku w prawym górnym rogu." +msgid "Displays rendering counts in the top-right corner of the viewport." +msgstr "" + +msgid "FPS: frames presented to the screen per second." +msgstr "" + +msgid "3D: frames per second that redrew the 3D scene." +msgstr "" # AI Translated msgid "G-code Preview" @@ -10403,13 +10439,8 @@ msgstr "Opublikuj 3MF..." msgid "Select which settings to be published in the 3MF file" msgstr "Wybierz, które ustawienia zostaną opublikowane w pliku 3MF" -# AI Translated -msgid "Publish 3MF Wiki" -msgstr "Wiki publikowania 3MF" - -# AI Translated -msgid "Publish 3MF Video Guide" -msgstr "Poradnik wideo publikowania 3MF" +msgid "Video Guide" +msgstr "" # AI Translated msgid "Mixed filament - published as a whole when \"Enable\" above is selected" @@ -10612,6 +10643,14 @@ msgstr "" msgid "No wiki page for this action" msgstr "" +# AI Translated +msgid "Show details" +msgstr "Pokaż szczegóły" + +# AI Translated +msgid "Hide details" +msgstr "Ukryj szczegóły" + #, c-format, boost-format msgid "\"%s\" is a Developer setting. Enable Developer mode to edit it?" msgstr "" @@ -12518,68 +12557,39 @@ msgstr "Pakiet konfiguracyjny został zmieniony w poprzednim Przewodniku konfigu msgid "Configuration package changed" msgstr "Zmieniono pakiet konfiguracyjny" -msgid "Toolbar" -msgstr "Pasek narzędzi" - -msgid "Objects list" -msgstr "Lista obiektów" - -msgid "Import geometry data from STL/STEP/3MF/OBJ/AMF files" -msgstr "Import danych geometrycznych z plików STL/STEP/3MF/OBJ/AMF" - -msgid "Paste from clipboard" -msgstr "Wklej z schowka" - -msgid "Show/Hide 3Dconnexion devices settings dialog" -msgstr "Pokaż/ukryj okno dialogowe ustawień urządzeń 3Dconnexion" - -msgid "Switch table page" -msgstr "Przełącz stronę tabeli" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Space" -msgstr "Spacja" - -msgid "Open speed dial" -msgstr "" - -msgid "Run a Speed Dial favourite (while the Speed Dial is open)" -msgstr "" - -msgid "Show keyboard shortcuts list" -msgstr "Pokaż listę skrótów klawiszowych" - -msgid "Global shortcuts" -msgstr "Globalne skróty" - msgid "Pan View" msgstr "Przesuń widok" msgid "Rotate View" msgstr "Obróć widok" +#, c-format, boost-format +msgid "Use %s or %s, or a key that does not type a character." +msgstr "" + +msgctxt "Keyboard Shortcut" +msgid "Key" +msgstr "" + +msgid "Left mouse" +msgstr "" + +msgid "Available anywhere in the window, even while typing in a text field." +msgstr "" + +msgid "Run a speed dial favorite while the dial is open" +msgstr "" + # AI Translated -msgid "Middle mouse button" -msgstr "Środkowy przycisk myszy" +msgctxt "Keyboard Shortcut" +msgid "Tab" +msgstr "Tab" -msgid "Zoom View" -msgstr "Powiększ widok" +msgid "Switch to the next main tab" +msgstr "" -msgid "Auto orients selected objects or all objects. If there are selected objects, it just orients the selected ones. Otherwise, it will orient all objects in the current project." -msgstr "Ta funkcja automatycznie ustawia orientację zaznaczonych lub wszystkich obiektów. Jeśli są wybrane obiekty, ustawi tylko te wybrane. W przeciwnym razie ustawi wszystkie obiekty bieżącego projektu." - -msgid "Auto orients all objects on the active plate." -msgstr "Ta funkcja automatycznie ustawia orientację wszystkie obiekty na aktualnej płycie roboczej." - -msgid "Collapse/Expand the sidebar" -msgstr "Zwiń/Rozwiń pasek boczny" - -msgid "Any arrow" -msgstr "Dowolna strzałka" - -msgid "Movement in camera space" -msgstr "Ruch w przestrzeni kamery" +msgid "Available while the 3D view on the Prepare tab has focus." +msgstr "" msgid "Select a part" msgstr "Wybierz część" @@ -12590,127 +12600,29 @@ msgstr "Wybierz wiele obiektów" msgid "Select objects by rectangle" msgstr "Wybierz obiekty prostokątem" -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Arrow Up" -msgstr "Strzałka w górę" - -msgid "Move selection 10mm in positive Y direction" -msgstr "Przesuń wybrane o 10 mm w kierunku dodatnim osi Y" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Arrow Down" -msgstr "Strzałka w dół" - -msgid "Move selection 10mm in negative Y direction" -msgstr "Przesuń wybrane o 10 mm w kierunku ujemnym osi Y" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Arrow Left" -msgstr "Strzałka w lewo" - -msgid "Move selection 10mm in negative X direction" -msgstr "Przesuń wybrane o 10 mm w kierunku ujemnym osi X" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Arrow Right" -msgstr "Strzałka w prawo" - -msgid "Move selection 10mm in positive X direction" -msgstr "Przesuń wybrane o 10 mm w kierunku dodatnim osi X" +msgid "Keyboard 1-9: set filament for object/part" +msgstr "klawiatura 1-9: ustaw filament dla obiektu/części" msgid "Movement step set to 1mm" msgstr "Ustaw krok ruchu na 1 mm" -msgid "Keyboard 1-9: set filament for object/part" -msgstr "klawiatura 1-9: ustaw filament dla obiektu/części" +msgid "Movement in camera space" +msgstr "Ruch w przestrzeni kamery" -msgid "Camera view - Default" -msgstr "Widok kamery - Domyślny" +msgid "Middle mouse" +msgstr "" -msgid "Camera view - Top" -msgstr "Widok kamery - Z góry" +msgid "Right mouse" +msgstr "" -msgid "Camera view - Bottom" -msgstr "Widok kamery - Z dołu" +msgid "Zoom View" +msgstr "Powiększ widok" -msgid "Camera view - Front" -msgstr "Widok kamery - Z przodu" +msgid "Painting" +msgstr "" -msgid "Camera view - Behind" -msgstr "Widok kamery - Z tyłu" - -msgid "Camera Angle - Left side" -msgstr "Kąt kamery - Lewa strona" - -msgid "Camera Angle - Right side" -msgstr "Kąt kamery - Prawa strona" - -msgid "Select all objects" -msgstr "Wybierz wszystkie obiekty" - -msgid "Gizmo move" -msgstr "Przenoszenie za pomocą „uchwytów”" - -msgid "Gizmo rotate" -msgstr "Obracanie za pomocą „uchwytów”" - -msgid "Gizmo scale" -msgstr "Skalowanie za pomocą „uchwytów”" - -msgid "Gizmo place face on bed" -msgstr "Położenie na płaszczyźnie za pomocą „uchwytów”" - -msgid "Gizmo cut" -msgstr "Cięcie za pomocą „uchwytów”" - -msgid "Gizmo mesh boolean" -msgstr "Gizmo operacje boolowskie na siatce" - -msgid "Gizmo FDM paint-on fuzzy skin" -msgstr "Uchwyt malowania Fuzzy Skin FDM" - -msgid "Gizmo SLA support points" -msgstr "Punkty podpór SLA za pomocą „uchwytów”" - -msgid "Gizmo FDM paint-on seam" -msgstr "Uchwyt malowania szwu FDM" - -msgid "Gizmo text emboss/engrave" -msgstr "Uchwyt wytłaczania/grawerowania tekstu" - -msgid "Gizmo measure" -msgstr "Gizmo mierzyć" - -msgid "Gizmo assemble" -msgstr "Gizmo montować" - -msgid "Gizmo brim ears" -msgstr "Gizmo uszy brim" - -msgid "Zoom in" -msgstr "Przybliżenie" - -msgid "Zoom out" -msgstr "Oddalenie" - -# AI Translated -msgid "Toggle printable for object/part" -msgstr "Przełącz drukowalność obiektu/części" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Tab" -msgstr "Tab" - -msgid "Switch between Prepare/Preview" -msgstr "Przełączanie między przygotowaniem/podglądem" - -msgid "Plater" -msgstr "Płyta" +msgid "Available while a painting gizmo is open: supports, seam, fuzzy skin or color painting." +msgstr "" msgid "Move: press to snap by 1mm" msgstr "Przesuń: naciśnij, aby przyciągnąć co 1 mm" @@ -12721,14 +12633,19 @@ msgstr "Podpory/Kolorowanie: dostosuj promień pędzla" msgid "Support/Color Painting: adjust section position" msgstr "Podpory/Kolorowanie: dostosuj pozycję sekcji" -msgid "Gizmo" -msgstr "Uchwyt" +msgid "Objects list" +msgstr "Lista obiektów" + +msgid "Available while the object list has focus." +msgstr "" msgid "Set extruder number for the objects and parts" msgstr "Ustaw numer extrudera dla obiektów i części" -msgid "Delete objects, parts, modifiers" -msgstr "Usuń obiekty, części, modyfikatory" +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Space" +msgstr "Spacja" msgid "Select the object/part and press space to change the name" msgstr "Wybierz obiekt/część i naciśnij spację, aby zmienić nazwę" @@ -12739,45 +12656,48 @@ msgstr "Kliknięcie myszą" msgid "Select the object/part and mouse click to change the name" msgstr "Wybierz obiekt/część i kliknij myszą, aby zmienić nazwę" -msgid "Objects List" -msgstr "Lista obiektów" - -msgid "Vertical slider - Move active thumb Up" -msgstr "Pionowy suwak - Przesuń aktywny punkt w górę" - -msgid "Vertical slider - Move active thumb Down" -msgstr "Pionowy suwak - Przesuń aktywny punkt w dół" - -msgid "Horizontal slider - Move active thumb Left" -msgstr "Poziomy suwak - Przesuń aktywny punkt w lewo" - -msgid "Horizontal slider - Move active thumb Right" -msgstr "Poziomy suwak - Przesuń aktywny punkt w prawo" - -msgid "On/Off one layer mode of the vertical slider" -msgstr "Włącz/wyłącz wyświetlanie jednej warstwy suwaka pionowego" - -msgid "On/Off G-code window" -msgstr "Włącz/Wyłącz okno G-code" +msgid "Available while the 3D view on the Preview tab has focus." +msgstr "" msgid "Move slider 5x faster" msgstr "Przesuń suwak 5x szybciej" -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Home" -msgstr "Home" +msgid "Scroll slider 5x faster" +msgstr "" -msgid "Horizontal slider - Move to start position" -msgstr "Suwak poziomy - Przesuń do pozycji początkowej" +msgid "Not customizable" +msgstr "" -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "End" -msgstr "End" +#, c-format, boost-format +msgid "%s is assigned to %s. Reassign it to %s?" +msgstr "" -msgid "Horizontal slider - Move to last position" -msgstr "Suwak poziomy - Przesuń do ostatniej pozycji" +#, c-format, boost-format +msgid "The default %s is assigned to %s. Reassign it to %s?" +msgstr "" + +msgid "Global shortcuts also apply while typing." +msgstr "" + +msgid "A key that types a character cannot be a global shortcut." +msgstr "" + +msgid "Esc cancels, Enter confirms." +msgstr "" + +#, c-format, boost-format +msgid "" +"Press the new shortcut for\n" +"\"%s\"" +msgstr "" + +#, c-format, boost-format +msgid "Already used as a step of %s." +msgstr "" + +#, c-format, boost-format +msgid "Already assigned to %s. Press OK to reassign it." +msgstr "" msgid "Release Note" msgstr "Informacje o wydaniu" @@ -17852,9 +17772,8 @@ msgstr "Kroki wstępnego podgrzewania" msgid "Insert multiple preheat commands (e.g. M104.1). Only useful for Prusa XL. For other printers, please set it to 1." msgstr "Wprowadź wiele poleceń dotyczących podgrzewania (np. M104.1). Funkcja ta działa tylko w drukarce Prusa XL. Dla pozostałych drukarek ustaw wartość na 1." -# AI Translated -msgid "G-code written at the very top of the output file, before any other content. Useful for adding metadata that printer firmware reads from the first lines of the file (e.g. estimated print time, filament usage). Supports placeholders like {print_time_sec} and {used_filament_length}." -msgstr "G-code zapisywany na samej górze pliku wyjściowego, przed jakąkolwiek inną treścią. Przydatny do dodawania metadanych, które oprogramowanie sprzętowe drukarki odczytuje z pierwszych wierszy pliku (np. szacowany czas druku, zużycie filamentu). Obsługuje symbole zastępcze, takie jak {print_time_sec} i {used_filament_length}." +msgid "G-code written at the very top of the output file, before any other content. Useful for adding metadata that printer firmware reads from the first lines of the file (e.g. estimated print time, filament usage). Supports placeholders like {print_time_total_sec}, {print_time_day}, {print_time_hour}, {print_time_minute}, {print_time_sec} and {used_filament_length}." +msgstr "" msgid "Start G-code" msgstr "Początkowy G-code" @@ -19433,14 +19352,37 @@ msgstr "Użyty filament" msgid "Total length of filament used in the print." msgstr "Całkowita długość filamentu użytego w wydruku." -# AI Translated -msgid "Print time (seconds)" -msgstr "Czas druku (sekundy)" +msgid "Print time (total seconds)" +msgstr "" # AI Translated msgid "Total estimated print time in seconds. Replaced with actual value during post-processing." msgstr "Całkowity szacowany czas druku w sekundach. Zastępowany rzeczywistą wartością podczas postprocessingu." +msgid "Print time (days component)" +msgstr "" + +msgid "Estimated print time day component (normal mode). Replaced with actual value during post-processing." +msgstr "" + +msgid "Print time (hours component)" +msgstr "" + +msgid "Estimated print time hour component (normal mode). Replaced with actual value during post-processing." +msgstr "" + +msgid "Print time (minutes component)" +msgstr "" + +msgid "Estimated print time minute component (normal mode). Replaced with actual value during post-processing." +msgstr "" + +msgid "Print time (seconds component)" +msgstr "" + +msgid "Estimated print time second component (normal mode). Replaced with actual value during post-processing." +msgstr "" + # AI Translated msgid "Filament length (meters)" msgstr "Długość filamentu (metry)" @@ -21356,6 +21298,9 @@ msgstr "Nie wykryto prawidłowej sesji. Kontynuować logowaniem do 3DPrinterOS?" msgid "Success!" msgstr "Powodzenie!" +msgid "Generate API Key" +msgstr "" + msgid "Are you sure to log out?" msgstr "Czy na pewno wylogować?" @@ -22427,14 +22372,6 @@ msgstr "Wtyczka Bambu Network jest wymagana do funkcji chmurowych, wykrywania dr msgid "Error: %s" msgstr "Błąd: %s" -# AI Translated -msgid "Show details" -msgstr "Pokaż szczegóły" - -# AI Translated -msgid "Hide details" -msgstr "Ukryj szczegóły" - # AI Translated msgid "Version to install:" msgstr "Wersja do zainstalowania:" @@ -25096,6 +25033,12 @@ msgstr "" msgid "No binding for that field" msgstr "" +msgid "Enter a number" +msgstr "" + +msgid "Not a number" +msgstr "" + msgid "Primitive" msgstr "" @@ -25108,6 +25051,217 @@ msgstr "" msgid "Clear All" msgstr "" +msgctxt "Keyboard Shortcut" +msgid "Ins" +msgstr "" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Home" +msgstr "Home" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "End" +msgstr "End" + +msgctxt "Keyboard Shortcut" +msgid "PgUp" +msgstr "" + +msgctxt "Keyboard Shortcut" +msgid "PgDn" +msgstr "" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Arrow Left" +msgstr "Strzałka w lewo" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Arrow Right" +msgstr "Strzałka w prawo" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Arrow Up" +msgstr "Strzałka w górę" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Arrow Down" +msgstr "Strzałka w dół" + +msgid "Import geometry data from STL/STEP/3MF/OBJ/AMF files" +msgstr "Import danych geometrycznych z plików STL/STEP/3MF/OBJ/AMF" + +msgid "Select all objects" +msgstr "Wybierz wszystkie obiekty" + +msgid "Paste from clipboard" +msgstr "Wklej z schowka" + +# AI Translated +msgid "Toggle printable for object/part" +msgstr "Przełącz drukowalność obiektu/części" + +msgid "Move selection 10mm in negative X direction" +msgstr "Przesuń wybrane o 10 mm w kierunku ujemnym osi X" + +msgid "Move selection 10mm in positive X direction" +msgstr "Przesuń wybrane o 10 mm w kierunku dodatnim osi X" + +msgid "Move selection 10mm in positive Y direction" +msgstr "Przesuń wybrane o 10 mm w kierunku dodatnim osi Y" + +msgid "Move selection 10mm in negative Y direction" +msgstr "Przesuń wybrane o 10 mm w kierunku ujemnym osi Y" + +msgid "Rotate selection 45 degrees counterclockwise" +msgstr "" + +msgid "Rotate selection 45 degrees clockwise" +msgstr "" + +msgid "Gizmo move" +msgstr "Przenoszenie za pomocą „uchwytów”" + +msgid "Gizmo rotate" +msgstr "Obracanie za pomocą „uchwytów”" + +msgid "Gizmo scale" +msgstr "Skalowanie za pomocą „uchwytów”" + +msgid "Gizmo place face on bed" +msgstr "Położenie na płaszczyźnie za pomocą „uchwytów”" + +msgid "Gizmo cut" +msgstr "Cięcie za pomocą „uchwytów”" + +msgid "Gizmo mesh boolean" +msgstr "Gizmo operacje boolowskie na siatce" + +msgid "Gizmo FDM paint-on supports" +msgstr "" + +msgid "Gizmo FDM paint-on seam" +msgstr "Uchwyt malowania szwu FDM" + +msgid "Gizmo FDM paint-on fuzzy skin" +msgstr "Uchwyt malowania Fuzzy Skin FDM" + +msgid "Gizmo multi-material painting" +msgstr "" + +msgid "Gizmo text emboss/engrave" +msgstr "Uchwyt wytłaczania/grawerowania tekstu" + +msgid "Gizmo measure" +msgstr "Gizmo mierzyć" + +msgid "Gizmo assemble" +msgstr "Gizmo montować" + +msgid "Gizmo brim ears" +msgstr "Gizmo uszy brim" + +msgid "Vertical slider - Move active thumb Up" +msgstr "Pionowy suwak - Przesuń aktywny punkt w górę" + +msgid "Vertical slider - Move active thumb Down" +msgstr "Pionowy suwak - Przesuń aktywny punkt w dół" + +msgid "Horizontal slider - Move active thumb Left" +msgstr "Poziomy suwak - Przesuń aktywny punkt w lewo" + +msgid "Horizontal slider - Move active thumb Right" +msgstr "Poziomy suwak - Przesuń aktywny punkt w prawo" + +msgid "Horizontal slider - Move to start position" +msgstr "Suwak poziomy - Przesuń do pozycji początkowej" + +msgid "Horizontal slider - Move to last position" +msgstr "Suwak poziomy - Przesuń do ostatniej pozycji" + +msgid "Camera view - Default" +msgstr "Widok kamery - Domyślny" + +msgid "Camera view - Top" +msgstr "Widok kamery - Z góry" + +msgid "Camera view - Bottom" +msgstr "Widok kamery - Z dołu" + +msgid "Camera view - Front" +msgstr "Widok kamery - Z przodu" + +msgid "Camera view - Behind" +msgstr "Widok kamery - Z tyłu" + +msgid "Camera Angle - Left side" +msgstr "Kąt kamery - Lewa strona" + +msgid "Camera Angle - Right side" +msgstr "Kąt kamery - Prawa strona" + +msgid "Camera view - Current plate" +msgstr "" + +msgid "Zoom in" +msgstr "Przybliżenie" + +msgid "Zoom out" +msgstr "Oddalenie" + +msgid "Show/Hide 3Dconnexion devices settings dialog" +msgstr "Pokaż/ukryj okno dialogowe ustawień urządzeń 3Dconnexion" + +msgid "Show/Hide wireframe" +msgstr "" + +msgid "On/Off G-code window" +msgstr "Włącz/Wyłącz okno G-code" + +msgid "On/Off one layer mode of the vertical slider" +msgstr "Włącz/wyłącz wyświetlanie jednej warstwy suwaka pionowego" + +msgid "Switch between Prepare/Preview" +msgstr "Przełączanie między przygotowaniem/podglądem" + +msgid "Collapse/Expand the sidebar" +msgstr "Zwiń/Rozwiń pasek boczny" + +msgid "Open the speed dial" +msgstr "" + +msgid "Reload the device page" +msgstr "" + +msgid "Show keyboard shortcuts list" +msgstr "Pokaż listę skrótów klawiszowych" + +msgid "Slicing and printing" +msgstr "" + +msgid "Editing" +msgstr "" + +msgid "Placement" +msgstr "" + +msgid "Gizmos" +msgstr "" + +msgid "Sliders" +msgstr "" + +msgid "Painting tools" +msgstr "" + +msgid "Application" +msgstr "" + #: resources/data/hints.ini: [hint:Precise wall] msgid "" "Precise wall\n" @@ -25409,6 +25563,66 @@ msgstr "" "Unikaj odkształceń\n" "Czy wiesz, że podczas drukowania filamentami podatnymi na odkształcenia, takimi jak ABS, odpowiednie zwiększenie temperatury podgrzewanej płyty może zmniejszyć prawdopodobieństwo odkształceń?" +#~ msgid "Tab" +#~ msgstr "Karty" + +# AI Translated +#~ msgid "Displays current viewport FPS in the top-right corner." +#~ msgstr "Wyświetla bieżącą wartość FPS widoku w prawym górnym rogu." + +# AI Translated +#~ msgid "Publish 3MF Wiki" +#~ msgstr "Wiki publikowania 3MF" + +# AI Translated +#~ msgid "Publish 3MF Video Guide" +#~ msgstr "Poradnik wideo publikowania 3MF" + +#~ msgid "Toolbar" +#~ msgstr "Pasek narzędzi" + +#~ msgid "Switch table page" +#~ msgstr "Przełącz stronę tabeli" + +#~ msgid "Global shortcuts" +#~ msgstr "Globalne skróty" + +# AI Translated +#~ msgid "Middle mouse button" +#~ msgstr "Środkowy przycisk myszy" + +#~ msgid "Auto orients selected objects or all objects. If there are selected objects, it just orients the selected ones. Otherwise, it will orient all objects in the current project." +#~ msgstr "Ta funkcja automatycznie ustawia orientację zaznaczonych lub wszystkich obiektów. Jeśli są wybrane obiekty, ustawi tylko te wybrane. W przeciwnym razie ustawi wszystkie obiekty bieżącego projektu." + +#~ msgid "Auto orients all objects on the active plate." +#~ msgstr "Ta funkcja automatycznie ustawia orientację wszystkie obiekty na aktualnej płycie roboczej." + +#~ msgid "Any arrow" +#~ msgstr "Dowolna strzałka" + +#~ msgid "Gizmo SLA support points" +#~ msgstr "Punkty podpór SLA za pomocą „uchwytów”" + +#~ msgid "Plater" +#~ msgstr "Płyta" + +#~ msgid "Gizmo" +#~ msgstr "Uchwyt" + +#~ msgid "Delete objects, parts, modifiers" +#~ msgstr "Usuń obiekty, części, modyfikatory" + +#~ msgid "Objects List" +#~ msgstr "Lista obiektów" + +# AI Translated +#~ msgid "G-code written at the very top of the output file, before any other content. Useful for adding metadata that printer firmware reads from the first lines of the file (e.g. estimated print time, filament usage). Supports placeholders like {print_time_sec} and {used_filament_length}." +#~ msgstr "G-code zapisywany na samej górze pliku wyjściowego, przed jakąkolwiek inną treścią. Przydatny do dodawania metadanych, które oprogramowanie sprzętowe drukarki odczytuje z pierwszych wierszy pliku (np. szacowany czas druku, zużycie filamentu). Obsługuje symbole zastępcze, takie jak {print_time_sec} i {used_filament_length}." + +# AI Translated +#~ msgid "Print time (seconds)" +#~ msgstr "Czas druku (sekundy)" + # AI Translated #~ msgid "Open actions speed dial" #~ msgstr "Otwórz szybkie menu akcji" diff --git a/localization/i18n/pt_BR/OrcaSlicer_pt_BR.po b/localization/i18n/pt_BR/OrcaSlicer_pt_BR.po index db28922786..3deb6bc7d0 100644 --- a/localization/i18n/pt_BR/OrcaSlicer_pt_BR.po +++ b/localization/i18n/pt_BR/OrcaSlicer_pt_BR.po @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-09-18 15:50+0800\n" +"POT-Creation-Date: 2026-09-22 12:39+0800\n" "PO-Revision-Date: 2026-07-26 11:14-0300\n" "Last-Translator: Alexandre Folle de Menezes\n" "Language-Team: Portuguese, Brazilian\n" @@ -5745,12 +5745,15 @@ msgctxt "Camera View" msgid "Right" msgstr "Direita" -msgid "Add" -msgstr "Adicionar" - msgid "Add plate" msgstr "Adicionar placa" +msgid "Split to objects" +msgstr "Dividir em objetos" + +msgid "Add" +msgstr "Adicionar" + msgid "Auto orient all/selected objects" msgstr "Orientação automática todos/selecionados objetos" @@ -5763,9 +5766,6 @@ msgstr "Organizar todos os objetos" msgid "Arrange objects on selected plates" msgstr "Organizar objetos nas placas selecionadas" -msgid "Split to objects" -msgstr "Dividir em objetos" - msgid "Assembly View" msgstr "Vista de Montagem" @@ -5821,6 +5821,9 @@ msgstr "Contorno" msgid "Wireframe" msgstr "Malha" +msgid "X-Ray" +msgstr "" + msgid "Realistic View" msgstr "Visualização Realista" @@ -6360,7 +6363,7 @@ msgstr "Mostrar contorno ao redor do objeto selecionado na cena 3D." msgid "Preferences" msgstr "Preferências" -msgid "Open speed dial..." +msgid "Open speed dial" msgstr "" msgctxt "Menu" @@ -8142,9 +8145,6 @@ msgstr "Expandir barra lateral" msgid "Collapse sidebar" msgstr "Recolher barra lateral" -msgid "Tab" -msgstr "Tab" - #, c-format, boost-format msgid "Loading file: %s" msgstr "Carregando arquivo: %s" @@ -9154,10 +9154,10 @@ msgstr "Gerenciamento de multi dispositivos" msgid "With this option enabled, you can send a task to multiple devices at the same time and manage multiple devices." msgstr "Com esta opção habilitada, você pode enviar uma tarefa para vários dispositivos ao mesmo tempo e gerenciar vários dispositivos." -msgid "Open the Speed Dial with the Space key" +msgid "Open the Speed Dial from the keyboard" msgstr "" -msgid "When enabled, pressing Space (with no other key held) opens the Speed Dial action search from any page." +msgid "When enabled, the Speed Dial keyboard shortcut (Space by default) opens the action search from any page." msgstr "" msgid "Recent actions" @@ -9289,6 +9289,15 @@ msgstr "Arrastar com Mouse Direito" msgid "Set the action that dragging the right mouse button should perform." msgstr "Defina a ação que arrastar com o botão direito do mouse deve executar." +msgid "Keyboard" +msgstr "" + +msgid "Keyboard shortcuts" +msgstr "" + +msgid "Choose the key for each action." +msgstr "" + msgid "Clear my choice on..." msgstr "Limpar minha escolha em…" @@ -9399,11 +9408,39 @@ msgstr "" "Limita a taxa de quadros da janela de visualização para reduzir a carga da GPU e o consumo de energia.\n" "Defina como 0 para taxa de quadros ilimitada." +msgid "Reuse the 3D scene while idle" +msgstr "" + +msgid "" +"Skips redrawing the 3D scene when only the mouse cursor moves over the viewport,\n" +"and reuses the previous frame's scene instead. Reduces GPU load.\n" +"Disable it if the viewport shows stale or missing contents.\n" +"\n" +"Takes effect immediately." +msgstr "" + +msgid "Skip unchanged frames" +msgstr "" + +msgid "" +"Skips drawing a frame altogether when it would be identical to the one already on screen.\n" +"Only applies to frames that reuse the 3D scene, so it needs Reuse the 3D scene while idle.\n" +"Disable it if a hover highlight, tooltip or animation stops updating.\n" +"\n" +"Takes effect immediately." +msgstr "" + msgid "Show FPS overlay" msgstr "Mostrar painel de FPS" -msgid "Displays current viewport FPS in the top-right corner." -msgstr "Exibe o FPS atual da janela de visualização no canto superior direito." +msgid "Displays rendering counts in the top-right corner of the viewport." +msgstr "" + +msgid "FPS: frames presented to the screen per second." +msgstr "" + +msgid "3D: frames per second that redrew the 3D scene." +msgstr "" msgid "G-code Preview" msgstr "Pré-visualização de G-code" @@ -9859,13 +9896,8 @@ msgstr "Publicar 3MF..." msgid "Select which settings to be published in the 3MF file" msgstr "Selecione quais configurações serão publicadas no arquivo 3MF" -# AI Translated -msgid "Publish 3MF Wiki" -msgstr "Documentação de Publicar 3MF" - -# AI Translated -msgid "Publish 3MF Video Guide" -msgstr "Guia em vídeo de Publicar 3MF" +msgid "Video Guide" +msgstr "" # AI Translated msgid "Mixed filament - published as a whole when \"Enable\" above is selected" @@ -10067,6 +10099,12 @@ msgstr "" msgid "No wiki page for this action" msgstr "" +msgid "Show details" +msgstr "Mostrar detalhes" + +msgid "Hide details" +msgstr "Esconder detalhes" + #, c-format, boost-format msgid "\"%s\" is a Developer setting. Enable Developer mode to edit it?" msgstr "" @@ -11853,66 +11891,38 @@ msgstr "O pacote de configuração é alterado no Guia de Configuração anterio msgid "Configuration package changed" msgstr "Pacote de configuração alterado" -msgid "Toolbar" -msgstr "Barra de Ferramentas" - -msgid "Objects list" -msgstr "Lista de objetos" - -msgid "Import geometry data from STL/STEP/3MF/OBJ/AMF files" -msgstr "Importar dados de geometria de arquivos STL/STEP/3MF/OBJ/AMF" - -msgid "Paste from clipboard" -msgstr "Colar da área de transferência" - -msgid "Show/Hide 3Dconnexion devices settings dialog" -msgstr "Mostrar/Ocultar diálogo de configurações de dispositivos 3Dconnexion" - -msgid "Switch table page" -msgstr "Trocar página da tabela" - -msgctxt "Keyboard Shortcut" -msgid "Space" -msgstr "Espaço" - -msgid "Open speed dial" -msgstr "" - -msgid "Run a Speed Dial favourite (while the Speed Dial is open)" -msgstr "" - -msgid "Show keyboard shortcuts list" -msgstr "Mostrar lista de atalhos de teclado" - -msgid "Global shortcuts" -msgstr "Atalhos globais" - msgid "Pan View" msgstr "Mover Vista" msgid "Rotate View" msgstr "Rotacionar Vista" -msgid "Middle mouse button" -msgstr "Botão do meio do mouse" +#, c-format, boost-format +msgid "Use %s or %s, or a key that does not type a character." +msgstr "" -msgid "Zoom View" -msgstr "Aproximar Vista" +msgctxt "Keyboard Shortcut" +msgid "Key" +msgstr "" -msgid "Auto orients selected objects or all objects. If there are selected objects, it just orients the selected ones. Otherwise, it will orient all objects in the current project." -msgstr "Orienta automaticamente os objetos selecionados ou todos os objetos. Se houver objetos selecionados, ele apenas orientará os selecionados. Caso contrário, ele orientará todos os objetos do projeto atual." +msgid "Left mouse" +msgstr "" -msgid "Auto orients all objects on the active plate." -msgstr "Orienta automaticamente todos os objetos na placa atual." +msgid "Available anywhere in the window, even while typing in a text field." +msgstr "" -msgid "Collapse/Expand the sidebar" -msgstr "Recolher/Expandir a barra lateral" +msgid "Run a speed dial favorite while the dial is open" +msgstr "" -msgid "Any arrow" -msgstr "Qualquer seta" +msgctxt "Keyboard Shortcut" +msgid "Tab" +msgstr "Tab" -msgid "Movement in camera space" -msgstr "Movimento no espaço da câmera" +msgid "Switch to the next main tab" +msgstr "" + +msgid "Available while the 3D view on the Prepare tab has focus." +msgstr "" msgid "Select a part" msgstr "Selecionar uma peça" @@ -11923,121 +11933,29 @@ msgstr "Selecionar vários objetos" msgid "Select objects by rectangle" msgstr "Selecionar objetos por retângulo" -msgctxt "Keyboard Shortcut" -msgid "Arrow Up" -msgstr "Seta para Cima" - -msgid "Move selection 10mm in positive Y direction" -msgstr "Mover seleção 10mm na direção Y positiva" - -msgctxt "Keyboard Shortcut" -msgid "Arrow Down" -msgstr "Seta para Baixo" - -msgid "Move selection 10mm in negative Y direction" -msgstr "Mover seleção 10mm na direção Y negativa" - -msgctxt "Keyboard Shortcut" -msgid "Arrow Left" -msgstr "Seta para Esquerda" - -msgid "Move selection 10mm in negative X direction" -msgstr "Mover seleção 10mm na direção X negativa" - -msgctxt "Keyboard Shortcut" -msgid "Arrow Right" -msgstr "Seta para Direita" - -msgid "Move selection 10mm in positive X direction" -msgstr "Mover seleção 10mm na direção X positiva" +msgid "Keyboard 1-9: set filament for object/part" +msgstr "Teclado 1-9: ajustar filamento para objeto/peça" msgid "Movement step set to 1mm" msgstr "Passo de movimento definido para 1mm" -msgid "Keyboard 1-9: set filament for object/part" -msgstr "Teclado 1-9: ajustar filamento para objeto/peça" +msgid "Movement in camera space" +msgstr "Movimento no espaço da câmera" -msgid "Camera view - Default" -msgstr "Vista da câmera - Padrão" +msgid "Middle mouse" +msgstr "" -msgid "Camera view - Top" -msgstr "Vista da câmera - Superior" +msgid "Right mouse" +msgstr "" -msgid "Camera view - Bottom" -msgstr "Vista da câmera - Inferior" +msgid "Zoom View" +msgstr "Aproximar Vista" -msgid "Camera view - Front" -msgstr "Vista da câmera - Frontal" +msgid "Painting" +msgstr "" -msgid "Camera view - Behind" -msgstr "Vista da câmera - Posterior" - -msgid "Camera Angle - Left side" -msgstr "Ângulo da câmera - Lado esquerdo" - -msgid "Camera Angle - Right side" -msgstr "Ângulo da câmera - Lado direito" - -msgid "Select all objects" -msgstr "Selecionar todos os objetos" - -msgid "Gizmo move" -msgstr "Gizmo mover" - -msgid "Gizmo rotate" -msgstr "Gizmo rotacionar" - -msgid "Gizmo scale" -msgstr "Gizmo escala" - -msgid "Gizmo place face on bed" -msgstr "Gizmo posicionar face na mesa" - -msgid "Gizmo cut" -msgstr "Gizmo cortar" - -msgid "Gizmo mesh boolean" -msgstr "Gizmo malha booleana" - -msgid "Gizmo FDM paint-on fuzzy skin" -msgstr "Gizmo de pintura de textura difusa FDM" - -msgid "Gizmo SLA support points" -msgstr "Gizmo de pontos de suporte SLA" - -msgid "Gizmo FDM paint-on seam" -msgstr "Gizmo de pintura de costura FDM" - -msgid "Gizmo text emboss/engrave" -msgstr "Gizmo Texturizar/gravar texto" - -msgid "Gizmo measure" -msgstr "Gizmo medir" - -msgid "Gizmo assemble" -msgstr "Gizmo montar" - -msgid "Gizmo brim ears" -msgstr "Gizmo orelhas da borda" - -msgid "Zoom in" -msgstr "Aproximar zoom" - -msgid "Zoom out" -msgstr "Afastar zoom" - -msgid "Toggle printable for object/part" -msgstr "Alternar modo de impressão para objeto/peça" - -msgctxt "Keyboard Shortcut" -msgid "Tab" -msgstr "Tab" - -msgid "Switch between Prepare/Preview" -msgstr "Alternar entre Preparar/Pré-visualizar" - -msgid "Plater" -msgstr "Mesa" +msgid "Available while a painting gizmo is open: supports, seam, fuzzy skin or color painting." +msgstr "" msgid "Move: press to snap by 1mm" msgstr "Mover: pressione para ajustar em 1mm" @@ -12048,14 +11966,18 @@ msgstr "Suporte/Pintura em cores: ajustar o raio da caneta" msgid "Support/Color Painting: adjust section position" msgstr "Suporte/Pintura em cores: ajustar a posição da seção" -msgid "Gizmo" -msgstr "Gizmo" +msgid "Objects list" +msgstr "Lista de objetos" + +msgid "Available while the object list has focus." +msgstr "" msgid "Set extruder number for the objects and parts" msgstr "Definir o número da extrusora para os objetos e peças" -msgid "Delete objects, parts, modifiers" -msgstr "Excluir objetos, peças, modificadores" +msgctxt "Keyboard Shortcut" +msgid "Space" +msgstr "Espaço" msgid "Select the object/part and press space to change the name" msgstr "Selecione o objeto/peça e pressione espaço para mudar o nome" @@ -12066,43 +11988,48 @@ msgstr "Clique do mouse" msgid "Select the object/part and mouse click to change the name" msgstr "Selecione o objeto/peça e clique do mouse para mudar o nome" -msgid "Objects List" -msgstr "Lista de Objetos" - -msgid "Vertical slider - Move active thumb Up" -msgstr "Controle deslizante vertical - Mover o polegar ativo para cima" - -msgid "Vertical slider - Move active thumb Down" -msgstr "Controle deslizante vertical - Mover o polegar ativo para baixo" - -msgid "Horizontal slider - Move active thumb Left" -msgstr "Controle deslizante horizontal - Mover o polegar ativo para a esquerda" - -msgid "Horizontal slider - Move active thumb Right" -msgstr "Controle deslizante horizontal - Mover o polegar ativo para a direita" - -msgid "On/Off one layer mode of the vertical slider" -msgstr "Ativar/Desativar modo de uma camada do controle deslizante vertical" - -msgid "On/Off G-code window" -msgstr "Ativar/Desativar janela de G-code" +msgid "Available while the 3D view on the Preview tab has focus." +msgstr "" msgid "Move slider 5x faster" msgstr "Mover o controle deslizante 5 vezes mais rápido" -msgctxt "Keyboard Shortcut" -msgid "Home" -msgstr "Home" +msgid "Scroll slider 5x faster" +msgstr "" -msgid "Horizontal slider - Move to start position" -msgstr "Barra deslizante horizontal — Mover para a posição inicial" +msgid "Not customizable" +msgstr "" -msgctxt "Keyboard Shortcut" -msgid "End" -msgstr "End" +#, c-format, boost-format +msgid "%s is assigned to %s. Reassign it to %s?" +msgstr "" -msgid "Horizontal slider - Move to last position" -msgstr "Barra deslizante horizontal — Mover para a última posição" +#, c-format, boost-format +msgid "The default %s is assigned to %s. Reassign it to %s?" +msgstr "" + +msgid "Global shortcuts also apply while typing." +msgstr "" + +msgid "A key that types a character cannot be a global shortcut." +msgstr "" + +msgid "Esc cancels, Enter confirms." +msgstr "" + +#, c-format, boost-format +msgid "" +"Press the new shortcut for\n" +"\"%s\"" +msgstr "" + +#, c-format, boost-format +msgid "Already used as a step of %s." +msgstr "" + +#, c-format, boost-format +msgid "Already assigned to %s. Press OK to reassign it." +msgstr "" msgid "Release Note" msgstr "Nota de lançamento" @@ -16888,8 +16815,8 @@ msgstr "Passos de pré-aquecimento" msgid "Insert multiple preheat commands (e.g. M104.1). Only useful for Prusa XL. For other printers, please set it to 1." msgstr "Insire múltiplos comandos de pré-aquecimento (ex.: M104.1). Útil apenas para Prusa XL. Para outras impressoras, defina como 1." -msgid "G-code written at the very top of the output file, before any other content. Useful for adding metadata that printer firmware reads from the first lines of the file (e.g. estimated print time, filament usage). Supports placeholders like {print_time_sec} and {used_filament_length}." -msgstr "Código G escrito no início do arquivo de saída, antes de qualquer outro conteúdo. Útil para adicionar metadados que o firmware da impressora lê das primeiras linhas do arquivo (ex.: tempo estimado de impressão, consumo de filamento). Suporta marcadores como {print_time_sec} e {used_filament_length}." +msgid "G-code written at the very top of the output file, before any other content. Useful for adding metadata that printer firmware reads from the first lines of the file (e.g. estimated print time, filament usage). Supports placeholders like {print_time_total_sec}, {print_time_day}, {print_time_hour}, {print_time_minute}, {print_time_sec} and {used_filament_length}." +msgstr "" msgid "Start G-code" msgstr "G-code Inicial" @@ -18389,12 +18316,36 @@ msgstr "Fil. usado" msgid "Total length of filament used in the print." msgstr "Comprimento total de filamento usado na impressão." -msgid "Print time (seconds)" -msgstr "Tempo de impressão (segundos)" +msgid "Print time (total seconds)" +msgstr "" msgid "Total estimated print time in seconds. Replaced with actual value during post-processing." msgstr "Tempo total estimado de impressão em segundos. Substituído pelo valor real durante o pós-processamento." +msgid "Print time (days component)" +msgstr "" + +msgid "Estimated print time day component (normal mode). Replaced with actual value during post-processing." +msgstr "" + +msgid "Print time (hours component)" +msgstr "" + +msgid "Estimated print time hour component (normal mode). Replaced with actual value during post-processing." +msgstr "" + +msgid "Print time (minutes component)" +msgstr "" + +msgid "Estimated print time minute component (normal mode). Replaced with actual value during post-processing." +msgstr "" + +msgid "Print time (seconds component)" +msgstr "" + +msgid "Estimated print time second component (normal mode). Replaced with actual value during post-processing." +msgstr "" + msgid "Filament length (meters)" msgstr "Comprimento do filamento (metros)" @@ -20218,6 +20169,9 @@ msgstr "Sessão válida não detectada. Prosseguir com o login no 3DPrinterOS?" msgid "Success!" msgstr "Sucesso!" +msgid "Generate API Key" +msgstr "" + msgid "Are you sure to log out?" msgstr "Tem certeza de que deseja sair?" @@ -21167,12 +21121,6 @@ msgstr "O Plug-in de Rede Bambu é necessário para recursos de nuvem, detecçã msgid "Error: %s" msgstr "Erro: %s" -msgid "Show details" -msgstr "Mostrar detalhes" - -msgid "Hide details" -msgstr "Esconder detalhes" - msgid "Version to install:" msgstr "Versão para instalar:" @@ -23756,6 +23704,12 @@ msgstr "" msgid "No binding for that field" msgstr "" +msgid "Enter a number" +msgstr "" + +msgid "Not a number" +msgstr "" + msgid "Primitive" msgstr "" @@ -23768,6 +23722,210 @@ msgstr "" msgid "Clear All" msgstr "" +msgctxt "Keyboard Shortcut" +msgid "Ins" +msgstr "" + +msgctxt "Keyboard Shortcut" +msgid "Home" +msgstr "Home" + +msgctxt "Keyboard Shortcut" +msgid "End" +msgstr "End" + +msgctxt "Keyboard Shortcut" +msgid "PgUp" +msgstr "" + +msgctxt "Keyboard Shortcut" +msgid "PgDn" +msgstr "" + +msgctxt "Keyboard Shortcut" +msgid "Arrow Left" +msgstr "Seta para Esquerda" + +msgctxt "Keyboard Shortcut" +msgid "Arrow Right" +msgstr "Seta para Direita" + +msgctxt "Keyboard Shortcut" +msgid "Arrow Up" +msgstr "Seta para Cima" + +msgctxt "Keyboard Shortcut" +msgid "Arrow Down" +msgstr "Seta para Baixo" + +msgid "Import geometry data from STL/STEP/3MF/OBJ/AMF files" +msgstr "Importar dados de geometria de arquivos STL/STEP/3MF/OBJ/AMF" + +msgid "Select all objects" +msgstr "Selecionar todos os objetos" + +msgid "Paste from clipboard" +msgstr "Colar da área de transferência" + +msgid "Toggle printable for object/part" +msgstr "Alternar modo de impressão para objeto/peça" + +msgid "Move selection 10mm in negative X direction" +msgstr "Mover seleção 10mm na direção X negativa" + +msgid "Move selection 10mm in positive X direction" +msgstr "Mover seleção 10mm na direção X positiva" + +msgid "Move selection 10mm in positive Y direction" +msgstr "Mover seleção 10mm na direção Y positiva" + +msgid "Move selection 10mm in negative Y direction" +msgstr "Mover seleção 10mm na direção Y negativa" + +msgid "Rotate selection 45 degrees counterclockwise" +msgstr "" + +msgid "Rotate selection 45 degrees clockwise" +msgstr "" + +msgid "Gizmo move" +msgstr "Gizmo mover" + +msgid "Gizmo rotate" +msgstr "Gizmo rotacionar" + +msgid "Gizmo scale" +msgstr "Gizmo escala" + +msgid "Gizmo place face on bed" +msgstr "Gizmo posicionar face na mesa" + +msgid "Gizmo cut" +msgstr "Gizmo cortar" + +msgid "Gizmo mesh boolean" +msgstr "Gizmo malha booleana" + +msgid "Gizmo FDM paint-on supports" +msgstr "" + +msgid "Gizmo FDM paint-on seam" +msgstr "Gizmo de pintura de costura FDM" + +msgid "Gizmo FDM paint-on fuzzy skin" +msgstr "Gizmo de pintura de textura difusa FDM" + +msgid "Gizmo multi-material painting" +msgstr "" + +msgid "Gizmo text emboss/engrave" +msgstr "Gizmo Texturizar/gravar texto" + +msgid "Gizmo measure" +msgstr "Gizmo medir" + +msgid "Gizmo assemble" +msgstr "Gizmo montar" + +msgid "Gizmo brim ears" +msgstr "Gizmo orelhas da borda" + +msgid "Vertical slider - Move active thumb Up" +msgstr "Controle deslizante vertical - Mover o polegar ativo para cima" + +msgid "Vertical slider - Move active thumb Down" +msgstr "Controle deslizante vertical - Mover o polegar ativo para baixo" + +msgid "Horizontal slider - Move active thumb Left" +msgstr "Controle deslizante horizontal - Mover o polegar ativo para a esquerda" + +msgid "Horizontal slider - Move active thumb Right" +msgstr "Controle deslizante horizontal - Mover o polegar ativo para a direita" + +msgid "Horizontal slider - Move to start position" +msgstr "Barra deslizante horizontal — Mover para a posição inicial" + +msgid "Horizontal slider - Move to last position" +msgstr "Barra deslizante horizontal — Mover para a última posição" + +msgid "Camera view - Default" +msgstr "Vista da câmera - Padrão" + +msgid "Camera view - Top" +msgstr "Vista da câmera - Superior" + +msgid "Camera view - Bottom" +msgstr "Vista da câmera - Inferior" + +msgid "Camera view - Front" +msgstr "Vista da câmera - Frontal" + +msgid "Camera view - Behind" +msgstr "Vista da câmera - Posterior" + +msgid "Camera Angle - Left side" +msgstr "Ângulo da câmera - Lado esquerdo" + +msgid "Camera Angle - Right side" +msgstr "Ângulo da câmera - Lado direito" + +msgid "Camera view - Current plate" +msgstr "" + +msgid "Zoom in" +msgstr "Aproximar zoom" + +msgid "Zoom out" +msgstr "Afastar zoom" + +msgid "Show/Hide 3Dconnexion devices settings dialog" +msgstr "Mostrar/Ocultar diálogo de configurações de dispositivos 3Dconnexion" + +msgid "Show/Hide wireframe" +msgstr "" + +msgid "On/Off G-code window" +msgstr "Ativar/Desativar janela de G-code" + +msgid "On/Off one layer mode of the vertical slider" +msgstr "Ativar/Desativar modo de uma camada do controle deslizante vertical" + +msgid "Switch between Prepare/Preview" +msgstr "Alternar entre Preparar/Pré-visualizar" + +msgid "Collapse/Expand the sidebar" +msgstr "Recolher/Expandir a barra lateral" + +msgid "Open the speed dial" +msgstr "" + +msgid "Reload the device page" +msgstr "" + +msgid "Show keyboard shortcuts list" +msgstr "Mostrar lista de atalhos de teclado" + +msgid "Slicing and printing" +msgstr "" + +msgid "Editing" +msgstr "" + +msgid "Placement" +msgstr "" + +msgid "Gizmos" +msgstr "" + +msgid "Sliders" +msgstr "" + +msgid "Painting tools" +msgstr "" + +msgid "Application" +msgstr "" + #: resources/data/hints.ini: [hint:Precise wall] msgid "" "Precise wall\n" @@ -24068,6 +24226,62 @@ msgstr "" "Evitar empenamento\n" "Você sabia que ao imprimir materiais propensos ao empenamento como ABS, aumentar adequadamente a temperatura da mesa aquecida pode reduzir a probabilidade de empenamento?" +#~ msgid "Tab" +#~ msgstr "Tab" + +#~ msgid "Displays current viewport FPS in the top-right corner." +#~ msgstr "Exibe o FPS atual da janela de visualização no canto superior direito." + +# AI Translated +#~ msgid "Publish 3MF Wiki" +#~ msgstr "Documentação de Publicar 3MF" + +# AI Translated +#~ msgid "Publish 3MF Video Guide" +#~ msgstr "Guia em vídeo de Publicar 3MF" + +#~ msgid "Toolbar" +#~ msgstr "Barra de Ferramentas" + +#~ msgid "Switch table page" +#~ msgstr "Trocar página da tabela" + +#~ msgid "Global shortcuts" +#~ msgstr "Atalhos globais" + +#~ msgid "Middle mouse button" +#~ msgstr "Botão do meio do mouse" + +#~ msgid "Auto orients selected objects or all objects. If there are selected objects, it just orients the selected ones. Otherwise, it will orient all objects in the current project." +#~ msgstr "Orienta automaticamente os objetos selecionados ou todos os objetos. Se houver objetos selecionados, ele apenas orientará os selecionados. Caso contrário, ele orientará todos os objetos do projeto atual." + +#~ msgid "Auto orients all objects on the active plate." +#~ msgstr "Orienta automaticamente todos os objetos na placa atual." + +#~ msgid "Any arrow" +#~ msgstr "Qualquer seta" + +#~ msgid "Gizmo SLA support points" +#~ msgstr "Gizmo de pontos de suporte SLA" + +#~ msgid "Plater" +#~ msgstr "Mesa" + +#~ msgid "Gizmo" +#~ msgstr "Gizmo" + +#~ msgid "Delete objects, parts, modifiers" +#~ msgstr "Excluir objetos, peças, modificadores" + +#~ msgid "Objects List" +#~ msgstr "Lista de Objetos" + +#~ msgid "G-code written at the very top of the output file, before any other content. Useful for adding metadata that printer firmware reads from the first lines of the file (e.g. estimated print time, filament usage). Supports placeholders like {print_time_sec} and {used_filament_length}." +#~ msgstr "Código G escrito no início do arquivo de saída, antes de qualquer outro conteúdo. Útil para adicionar metadados que o firmware da impressora lê das primeiras linhas do arquivo (ex.: tempo estimado de impressão, consumo de filamento). Suporta marcadores como {print_time_sec} e {used_filament_length}." + +#~ msgid "Print time (seconds)" +#~ msgstr "Tempo de impressão (segundos)" + #~ msgid "Open actions speed dial" #~ msgstr "Abrir menu rápido de ações" diff --git a/localization/i18n/ru/OrcaSlicer_ru.po b/localization/i18n/ru/OrcaSlicer_ru.po index 6b28f87f7e..4abcbda540 100644 --- a/localization/i18n/ru/OrcaSlicer_ru.po +++ b/localization/i18n/ru/OrcaSlicer_ru.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: OrcaSlicer V2.5.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-09-18 15:50+0800\n" +"POT-Creation-Date: 2026-09-22 12:39+0800\n" "PO-Revision-Date: 2026-02-25 13:38+0300\n" "Last-Translator: Felix14_v2\n" "Language-Team: Felix14_v2 (ДС/ТГ: @felix14_v2, почта: aleks111001@list.ru), Andylg \n" @@ -5938,12 +5938,15 @@ msgctxt "Camera View" msgid "Right" msgstr "Справа" -msgid "Add" -msgstr "Добавить" - msgid "Add plate" msgstr "Добавить стол" +msgid "Split to objects" +msgstr "Разделить на модели" + +msgid "Add" +msgstr "Добавить" + msgid "Auto orient all/selected objects" msgstr "Положить все/выбранные модели" @@ -5956,9 +5959,6 @@ msgstr "Расставить все модели" msgid "Arrange objects on selected plates" msgstr "Расставить модели на активном столе" -msgid "Split to objects" -msgstr "Разделить на модели" - msgid "Assembly View" msgstr "Сборочный вид" @@ -6018,6 +6018,9 @@ msgstr "Обводка выбранного" msgid "Wireframe" msgstr "Сетка модели" +msgid "X-Ray" +msgstr "" + msgid "Realistic View" msgstr "Продвинутая графика" @@ -6594,7 +6597,7 @@ msgstr "Отображение контура вокруг выбранных м msgid "Preferences" msgstr "Настройки" -msgid "Open speed dial..." +msgid "Open speed dial" msgstr "" msgctxt "Menu" @@ -8405,11 +8408,6 @@ msgstr "Развернуть боковую панель" msgid "Collapse sidebar" msgstr "Свернуть боковую панель" -# Название кнопки на клавиатуре, на момент 2.3.2 используется в 5 местах в -# значении названия кнопки -msgid "Tab" -msgstr "Tab" - #, c-format, boost-format msgid "Loading file: %s" msgstr "Загрузка файла: %s" @@ -9433,10 +9431,10 @@ msgstr "Управление несколькими устройствами Bam msgid "With this option enabled, you can send a task to multiple devices at the same time and manage multiple devices." msgstr "Если включено, вы сможете управлять несколькими устройствами и отправлять задания на печать на несколько устройств одновременно." -msgid "Open the Speed Dial with the Space key" +msgid "Open the Speed Dial from the keyboard" msgstr "" -msgid "When enabled, pressing Space (with no other key held) opens the Speed Dial action search from any page." +msgid "When enabled, the Speed Dial keyboard shortcut (Space by default) opens the action search from any page." msgstr "" msgid "Recent actions" @@ -9571,6 +9569,15 @@ msgstr "Перетаскивание правой кнопкой мыши" msgid "Set the action that dragging the right mouse button should perform." msgstr "Действие при перемещении курсора с зажатой правой кнопкой мыши." +msgid "Keyboard" +msgstr "" + +msgid "Keyboard shortcuts" +msgstr "" + +msgid "Choose the key for each action." +msgstr "" + msgid "Clear my choice on..." msgstr "Сброс выбора по умолчанию" @@ -9685,11 +9692,39 @@ msgstr "" "Ограничить частоту отрисовки рабочего пространства для снижения энергопотребления и нагрузки на ГП.\n" "0 – не ограничивать частоту кадров." +msgid "Reuse the 3D scene while idle" +msgstr "" + +msgid "" +"Skips redrawing the 3D scene when only the mouse cursor moves over the viewport,\n" +"and reuses the previous frame's scene instead. Reduces GPU load.\n" +"Disable it if the viewport shows stale or missing contents.\n" +"\n" +"Takes effect immediately." +msgstr "" + +msgid "Skip unchanged frames" +msgstr "" + +msgid "" +"Skips drawing a frame altogether when it would be identical to the one already on screen.\n" +"Only applies to frames that reuse the 3D scene, so it needs Reuse the 3D scene while idle.\n" +"Disable it if a hover highlight, tooltip or animation stops updating.\n" +"\n" +"Takes effect immediately." +msgstr "" + msgid "Show FPS overlay" msgstr "Отображать частоту кадров" -msgid "Displays current viewport FPS in the top-right corner." -msgstr "Выводить частоту кадров рабочего пространства в правом верхнем углу." +msgid "Displays rendering counts in the top-right corner of the viewport." +msgstr "" + +msgid "FPS: frames presented to the screen per second." +msgstr "" + +msgid "3D: frames per second that redrew the 3D scene." +msgstr "" msgid "G-code Preview" msgstr "Просмотр нарезки" @@ -10151,13 +10186,8 @@ msgstr "Опубликовать 3MF..." msgid "Select which settings to be published in the 3MF file" msgstr "Выберите, какие настройки будут опубликованы в файле 3MF" -# AI Translated -msgid "Publish 3MF Wiki" -msgstr "Wiki по публикации 3MF" - -# AI Translated -msgid "Publish 3MF Video Guide" -msgstr "Видеоруководство по публикации 3MF" +msgid "Video Guide" +msgstr "" # AI Translated msgid "Mixed filament - published as a whole when \"Enable\" above is selected" @@ -10363,6 +10393,13 @@ msgstr "" msgid "No wiki page for this action" msgstr "" +msgid "Show details" +msgstr "Подробнее" + +# В информации о сетевом плагине +msgid "Hide details" +msgstr "Скрыть подробности" + #, c-format, boost-format msgid "\"%s\" is a Developer setting. Enable Developer mode to edit it?" msgstr "" @@ -12206,66 +12243,38 @@ msgstr "Пакет профилей был изменён при предыду msgid "Configuration package changed" msgstr "Пакет профилей изменён" -msgid "Toolbar" -msgstr "Панель инструментов" - -msgid "Objects list" -msgstr "Список моделей" - -msgid "Import geometry data from STL/STEP/3MF/OBJ/AMF files" -msgstr "Импорт геометрических данных из STL/STEP/3MF/OBJ/AMF файлов" - -msgid "Paste from clipboard" -msgstr "Вставить из буфера обмена" - -msgid "Show/Hide 3Dconnexion devices settings dialog" -msgstr "Показать/скрыть диалоговое окно настроек и устройств 3Dconnexion" - -msgid "Switch table page" -msgstr "Переключение между вкладками" - -msgctxt "Keyboard Shortcut" -msgid "Space" -msgstr "Пробел" - -msgid "Open speed dial" -msgstr "" - -msgid "Run a Speed Dial favourite (while the Speed Dial is open)" -msgstr "" - -msgid "Show keyboard shortcuts list" -msgstr "Показать список сочетаний клавиш" - -msgid "Global shortcuts" -msgstr "Глобальные горячие клавиши" - msgid "Pan View" msgstr "Перемещение камеры" msgid "Rotate View" msgstr "Вращение камеры" -msgid "Middle mouse button" -msgstr "Средняя кнопка мыши" +#, c-format, boost-format +msgid "Use %s or %s, or a key that does not type a character." +msgstr "" -msgid "Zoom View" -msgstr "Масштабирование вида" +msgctxt "Keyboard Shortcut" +msgid "Key" +msgstr "" -msgid "Auto orients selected objects or all objects. If there are selected objects, it just orients the selected ones. Otherwise, it will orient all objects in the current project." -msgstr "Попытаться положить модели на стол. При выборе отдельных моделей операция применяется только к ним." +msgid "Left mouse" +msgstr "" -msgid "Auto orients all objects on the active plate." -msgstr "Положить все модели только на активном столе" +msgid "Available anywhere in the window, even while typing in a text field." +msgstr "" -msgid "Collapse/Expand the sidebar" -msgstr "Свернуть/развернуть боковую панель" +msgid "Run a speed dial favorite while the dial is open" +msgstr "" -msgid "Any arrow" -msgstr "Любая стрелка" +msgctxt "Keyboard Shortcut" +msgid "Tab" +msgstr "Tab" -msgid "Movement in camera space" -msgstr "Перемещение выбранного по отношению к камере" +msgid "Switch to the next main tab" +msgstr "" + +msgid "Available while the 3D view on the Prepare tab has focus." +msgstr "" msgid "Select a part" msgstr "Выбор части модели" @@ -12276,123 +12285,29 @@ msgstr "Выбор нескольких моделей" msgid "Select objects by rectangle" msgstr "Выбор прямоугольником" -msgctxt "Keyboard Shortcut" -msgid "Arrow Up" -msgstr "Стрелка вверх" - -msgid "Move selection 10mm in positive Y direction" -msgstr "Перемещение выбранного на +10 мм по оси Y" - -msgctxt "Keyboard Shortcut" -msgid "Arrow Down" -msgstr "Стрелка вниз" - -msgid "Move selection 10mm in negative Y direction" -msgstr "Перемещение выбранного на -10 мм по оси Y" - -msgctxt "Keyboard Shortcut" -msgid "Arrow Left" -msgstr "Стрелка влево" - -msgid "Move selection 10mm in negative X direction" -msgstr "Перемещение выбранного на -10 мм по оси X" - -msgctxt "Keyboard Shortcut" -msgid "Arrow Right" -msgstr "Стрелка вправо" - -msgid "Move selection 10mm in positive X direction" -msgstr "Перемещение выбранного на +10 мм по оси X" +msgid "Keyboard 1-9: set filament for object/part" +msgstr "Клавиши 1-9: задать материал для модели/части модели" msgid "Movement step set to 1mm" msgstr "Зафиксировать шаг перемещения на 1 мм" -msgid "Keyboard 1-9: set filament for object/part" -msgstr "Клавиши 1-9: задать материал для модели/части модели" +msgid "Movement in camera space" +msgstr "Перемещение выбранного по отношению к камере" -msgid "Camera view - Default" -msgstr "Камера по умолчанию" +msgid "Middle mouse" +msgstr "" -msgid "Camera view - Top" -msgstr "Камера сверху" +msgid "Right mouse" +msgstr "" -msgid "Camera view - Bottom" -msgstr "Камера снизу" +msgid "Zoom View" +msgstr "Масштабирование вида" -msgid "Camera view - Front" -msgstr "Камера спереди" +msgid "Painting" +msgstr "" -msgid "Camera view - Behind" -msgstr "Камера сзади" - -msgid "Camera Angle - Left side" -msgstr "Камера слева" - -msgid "Camera Angle - Right side" -msgstr "Камера справа" - -msgid "Select all objects" -msgstr "Выбрать все модели" - -msgid "Gizmo move" -msgstr "Инструмент перемещения" - -msgid "Gizmo rotate" -msgstr "Инструмент вращения" - -msgid "Gizmo scale" -msgstr "Инструмент масштабирования" - -msgid "Gizmo place face on bed" -msgstr "Выбор контактной поверхности" - -msgid "Gizmo cut" -msgstr "Инструмент разрезания" - -msgid "Gizmo mesh boolean" -msgstr "Булевы операции" - -msgid "Gizmo FDM paint-on fuzzy skin" -msgstr "Рисование нечёткой оболочки" - -msgid "Gizmo SLA support points" -msgstr "Размещение поддержек (SLA)" - -msgid "Gizmo FDM paint-on seam" -msgstr "Рисование шва (FDM)" - -msgid "Gizmo text emboss/engrave" -msgstr "Инструмент размещения текста" - -msgid "Gizmo measure" -msgstr "Инструмент измерения" - -msgid "Gizmo assemble" -msgstr "Размещение частей сборки" - -msgid "Gizmo brim ears" -msgstr "Размещение «мышиных ушек»" - -msgid "Zoom in" -msgstr "Приблизить" - -msgid "Zoom out" -msgstr "Отдалить" - -# Ошибка в оригинале – переключить печать частей невозможно, функция работает только для всей сборки -msgid "Toggle printable for object/part" -msgstr "Переключить печать модели" - -msgctxt "Keyboard Shortcut" -msgid "Tab" -msgstr "Tab" - -msgid "Switch between Prepare/Preview" -msgstr "Переключение между подготовкой и просмотром нарезки" - -# Plater – это название библиотеки. Используется в меню горячих клавиш в качестве заголовка сочетаний клавиш, которые работают внутри пространства Plater. Как минимум на Windows не отображается. -msgid "Plater" -msgstr "Рабочая область" +msgid "Available while a painting gizmo is open: supports, seam, fuzzy skin or color painting." +msgstr "" msgid "Move: press to snap by 1mm" msgstr "Перемещение: Фиксация перемещения на 1 мм" @@ -12403,14 +12318,18 @@ msgstr "Рисование поддержек/Шва/Покраски: регу msgid "Support/Color Painting: adjust section position" msgstr "Рисование поддержек/Шва/Покраски: регулировка положения сечения" -msgid "Gizmo" -msgstr "Инструмент" +msgid "Objects list" +msgstr "Список моделей" + +msgid "Available while the object list has focus." +msgstr "" msgid "Set extruder number for the objects and parts" msgstr "Задать номер экструдера для моделей/частей" -msgid "Delete objects, parts, modifiers" -msgstr "Удаление моделей, частей, модификаторов" +msgctxt "Keyboard Shortcut" +msgid "Space" +msgstr "Пробел" msgid "Select the object/part and press space to change the name" msgstr "Выберите модель/часть и нажмите пробел, чтобы изменить имя" @@ -12421,43 +12340,48 @@ msgstr "Левая кнопка мыши" msgid "Select the object/part and mouse click to change the name" msgstr "Выберите модель/часть и нажмите левую клавишу мыши, чтобы изменить имя" -msgid "Objects List" -msgstr "Список моделей" - -msgid "Vertical slider - Move active thumb Up" -msgstr "Вертикальный ползунок - Сдвинуть активный ползунок вверх" - -msgid "Vertical slider - Move active thumb Down" -msgstr "Вертикальный ползунок - Сдвинуть активный ползунок вниз" - -msgid "Horizontal slider - Move active thumb Left" -msgstr "Горизонтальный ползунок - Сдвинуть активный ползунок влево" - -msgid "Horizontal slider - Move active thumb Right" -msgstr "Горизонтальный ползунок - Сдвинуть активный ползунок вправо" - -msgid "On/Off one layer mode of the vertical slider" -msgstr "Включение/отключение функции «Режим одного слоя» у вертикального ползунка" - -msgid "On/Off G-code window" -msgstr "Показать/скрыть окно отображения G-кода" +msgid "Available while the 3D view on the Preview tab has focus." +msgstr "" msgid "Move slider 5x faster" msgstr "Перемещение ползунка быстрее в 5 раз" -msgctxt "Keyboard Shortcut" -msgid "Home" -msgstr "Home" +msgid "Scroll slider 5x faster" +msgstr "" -msgid "Horizontal slider - Move to start position" -msgstr "Горизонтальный ползунок - перемещение в начальную позицию" +msgid "Not customizable" +msgstr "" -msgctxt "Keyboard Shortcut" -msgid "End" -msgstr "End" +#, c-format, boost-format +msgid "%s is assigned to %s. Reassign it to %s?" +msgstr "" -msgid "Horizontal slider - Move to last position" -msgstr "Горизонтальный ползунок - перемещение в конечную позицию" +#, c-format, boost-format +msgid "The default %s is assigned to %s. Reassign it to %s?" +msgstr "" + +msgid "Global shortcuts also apply while typing." +msgstr "" + +msgid "A key that types a character cannot be a global shortcut." +msgstr "" + +msgid "Esc cancels, Enter confirms." +msgstr "" + +#, c-format, boost-format +msgid "" +"Press the new shortcut for\n" +"\"%s\"" +msgstr "" + +#, c-format, boost-format +msgid "Already used as a step of %s." +msgstr "" + +#, c-format, boost-format +msgid "Already assigned to %s. Press OK to reassign it." +msgstr "" msgid "Release Note" msgstr "Информация о версии" @@ -17716,8 +17640,8 @@ msgstr "Шагов преднагрева" msgid "Insert multiple preheat commands (e.g. M104.1). Only useful for Prusa XL. For other printers, please set it to 1." msgstr "Задание нескольких команд преднагрева (например, M104.1). Полезно только для Prusa XL. Для других принтеров установите значение 1." -msgid "G-code written at the very top of the output file, before any other content. Useful for adding metadata that printer firmware reads from the first lines of the file (e.g. estimated print time, filament usage). Supports placeholders like {print_time_sec} and {used_filament_length}." -msgstr "Код для вставки в первые строки файла (перед началом всего остального содержимого). Полезно для добавления метаданных для считывания прошивкой принтера, таких как время печати или расход материала. Можно использовать вставку переменных (например, {print_time_sec} и {used_filament_length} соответственно)." +msgid "G-code written at the very top of the output file, before any other content. Useful for adding metadata that printer firmware reads from the first lines of the file (e.g. estimated print time, filament usage). Supports placeholders like {print_time_total_sec}, {print_time_day}, {print_time_hour}, {print_time_minute}, {print_time_sec} and {used_filament_length}." +msgstr "" msgid "Start G-code" msgstr "Стартовый G-код" @@ -19394,8 +19318,8 @@ msgstr "Расход прутка" msgid "Total length of filament used in the print." msgstr "Общая длина прутка, затрачиваемая для печати." -msgid "Print time (seconds)" -msgstr "Время печати (в секундах)" +msgid "Print time (total seconds)" +msgstr "" # Пользователи даже не знают, что и как там слайсер у себя под капотом пост- # процессит после генерации кода до его парсинга и визуализации, не нужно этим @@ -19403,6 +19327,30 @@ msgstr "Время печати (в секундах)" msgid "Total estimated print time in seconds. Replaced with actual value during post-processing." msgstr "Оценка полного времени печати (в секундах). Заменяется числом при генерации G-кода." +msgid "Print time (days component)" +msgstr "" + +msgid "Estimated print time day component (normal mode). Replaced with actual value during post-processing." +msgstr "" + +msgid "Print time (hours component)" +msgstr "" + +msgid "Estimated print time hour component (normal mode). Replaced with actual value during post-processing." +msgstr "" + +msgid "Print time (minutes component)" +msgstr "" + +msgid "Estimated print time minute component (normal mode). Replaced with actual value during post-processing." +msgstr "" + +msgid "Print time (seconds component)" +msgstr "" + +msgid "Estimated print time second component (normal mode). Replaced with actual value during post-processing." +msgstr "" + msgid "Filament length (meters)" msgstr "Длина материала (в метрах)" @@ -21277,6 +21225,9 @@ msgstr "Недействительная сессия. Выполнить вхо msgid "Success!" msgstr "Успешно!" +msgid "Generate API Key" +msgstr "" + # ??? Вы уверены, что хотите разлогиниться, Вы уверены, что хотите выйти из # аккаунта?" msgid "Are you sure to log out?" @@ -22243,13 +22194,6 @@ msgstr "Для удалённой печати, облачных функций msgid "Error: %s" msgstr "Ошибка: %s" -msgid "Show details" -msgstr "Подробнее" - -# В информации о сетевом плагине -msgid "Hide details" -msgstr "Скрыть подробности" - msgid "Version to install:" msgstr "Версия для установки:" @@ -24855,6 +24799,12 @@ msgstr "" msgid "No binding for that field" msgstr "" +msgid "Enter a number" +msgstr "" + +msgid "Not a number" +msgstr "" + msgid "Primitive" msgstr "" @@ -24867,6 +24817,211 @@ msgstr "" msgid "Clear All" msgstr "" +msgctxt "Keyboard Shortcut" +msgid "Ins" +msgstr "" + +msgctxt "Keyboard Shortcut" +msgid "Home" +msgstr "Home" + +msgctxt "Keyboard Shortcut" +msgid "End" +msgstr "End" + +msgctxt "Keyboard Shortcut" +msgid "PgUp" +msgstr "" + +msgctxt "Keyboard Shortcut" +msgid "PgDn" +msgstr "" + +msgctxt "Keyboard Shortcut" +msgid "Arrow Left" +msgstr "Стрелка влево" + +msgctxt "Keyboard Shortcut" +msgid "Arrow Right" +msgstr "Стрелка вправо" + +msgctxt "Keyboard Shortcut" +msgid "Arrow Up" +msgstr "Стрелка вверх" + +msgctxt "Keyboard Shortcut" +msgid "Arrow Down" +msgstr "Стрелка вниз" + +msgid "Import geometry data from STL/STEP/3MF/OBJ/AMF files" +msgstr "Импорт геометрических данных из STL/STEP/3MF/OBJ/AMF файлов" + +msgid "Select all objects" +msgstr "Выбрать все модели" + +msgid "Paste from clipboard" +msgstr "Вставить из буфера обмена" + +# Ошибка в оригинале – переключить печать частей невозможно, функция работает только для всей сборки +msgid "Toggle printable for object/part" +msgstr "Переключить печать модели" + +msgid "Move selection 10mm in negative X direction" +msgstr "Перемещение выбранного на -10 мм по оси X" + +msgid "Move selection 10mm in positive X direction" +msgstr "Перемещение выбранного на +10 мм по оси X" + +msgid "Move selection 10mm in positive Y direction" +msgstr "Перемещение выбранного на +10 мм по оси Y" + +msgid "Move selection 10mm in negative Y direction" +msgstr "Перемещение выбранного на -10 мм по оси Y" + +msgid "Rotate selection 45 degrees counterclockwise" +msgstr "" + +msgid "Rotate selection 45 degrees clockwise" +msgstr "" + +msgid "Gizmo move" +msgstr "Инструмент перемещения" + +msgid "Gizmo rotate" +msgstr "Инструмент вращения" + +msgid "Gizmo scale" +msgstr "Инструмент масштабирования" + +msgid "Gizmo place face on bed" +msgstr "Выбор контактной поверхности" + +msgid "Gizmo cut" +msgstr "Инструмент разрезания" + +msgid "Gizmo mesh boolean" +msgstr "Булевы операции" + +msgid "Gizmo FDM paint-on supports" +msgstr "" + +msgid "Gizmo FDM paint-on seam" +msgstr "Рисование шва (FDM)" + +msgid "Gizmo FDM paint-on fuzzy skin" +msgstr "Рисование нечёткой оболочки" + +msgid "Gizmo multi-material painting" +msgstr "" + +msgid "Gizmo text emboss/engrave" +msgstr "Инструмент размещения текста" + +msgid "Gizmo measure" +msgstr "Инструмент измерения" + +msgid "Gizmo assemble" +msgstr "Размещение частей сборки" + +msgid "Gizmo brim ears" +msgstr "Размещение «мышиных ушек»" + +msgid "Vertical slider - Move active thumb Up" +msgstr "Вертикальный ползунок - Сдвинуть активный ползунок вверх" + +msgid "Vertical slider - Move active thumb Down" +msgstr "Вертикальный ползунок - Сдвинуть активный ползунок вниз" + +msgid "Horizontal slider - Move active thumb Left" +msgstr "Горизонтальный ползунок - Сдвинуть активный ползунок влево" + +msgid "Horizontal slider - Move active thumb Right" +msgstr "Горизонтальный ползунок - Сдвинуть активный ползунок вправо" + +msgid "Horizontal slider - Move to start position" +msgstr "Горизонтальный ползунок - перемещение в начальную позицию" + +msgid "Horizontal slider - Move to last position" +msgstr "Горизонтальный ползунок - перемещение в конечную позицию" + +msgid "Camera view - Default" +msgstr "Камера по умолчанию" + +msgid "Camera view - Top" +msgstr "Камера сверху" + +msgid "Camera view - Bottom" +msgstr "Камера снизу" + +msgid "Camera view - Front" +msgstr "Камера спереди" + +msgid "Camera view - Behind" +msgstr "Камера сзади" + +msgid "Camera Angle - Left side" +msgstr "Камера слева" + +msgid "Camera Angle - Right side" +msgstr "Камера справа" + +msgid "Camera view - Current plate" +msgstr "" + +msgid "Zoom in" +msgstr "Приблизить" + +msgid "Zoom out" +msgstr "Отдалить" + +msgid "Show/Hide 3Dconnexion devices settings dialog" +msgstr "Показать/скрыть диалоговое окно настроек и устройств 3Dconnexion" + +msgid "Show/Hide wireframe" +msgstr "" + +msgid "On/Off G-code window" +msgstr "Показать/скрыть окно отображения G-кода" + +msgid "On/Off one layer mode of the vertical slider" +msgstr "Включение/отключение функции «Режим одного слоя» у вертикального ползунка" + +msgid "Switch between Prepare/Preview" +msgstr "Переключение между подготовкой и просмотром нарезки" + +msgid "Collapse/Expand the sidebar" +msgstr "Свернуть/развернуть боковую панель" + +msgid "Open the speed dial" +msgstr "" + +msgid "Reload the device page" +msgstr "" + +msgid "Show keyboard shortcuts list" +msgstr "Показать список сочетаний клавиш" + +msgid "Slicing and printing" +msgstr "" + +msgid "Editing" +msgstr "" + +msgid "Placement" +msgstr "" + +msgid "Gizmos" +msgstr "" + +msgid "Sliders" +msgstr "" + +msgid "Painting tools" +msgstr "" + +msgid "Application" +msgstr "" + #: resources/data/hints.ini: [hint:Precise wall] msgid "" "Precise wall\n" @@ -25165,6 +25320,65 @@ msgstr "" "Предотвращение коробления материала\n" "Знаете ли вы, что при печати материалами, склонными к короблению, таких как ABS, повышение температуры подогреваемого стола может снизить эту вероятность?" +# Название кнопки на клавиатуре, на момент 2.3.2 используется в 5 местах в +# значении названия кнопки +#~ msgid "Tab" +#~ msgstr "Tab" + +#~ msgid "Displays current viewport FPS in the top-right corner." +#~ msgstr "Выводить частоту кадров рабочего пространства в правом верхнем углу." + +# AI Translated +#~ msgid "Publish 3MF Wiki" +#~ msgstr "Wiki по публикации 3MF" + +# AI Translated +#~ msgid "Publish 3MF Video Guide" +#~ msgstr "Видеоруководство по публикации 3MF" + +#~ msgid "Toolbar" +#~ msgstr "Панель инструментов" + +#~ msgid "Switch table page" +#~ msgstr "Переключение между вкладками" + +#~ msgid "Global shortcuts" +#~ msgstr "Глобальные горячие клавиши" + +#~ msgid "Middle mouse button" +#~ msgstr "Средняя кнопка мыши" + +#~ msgid "Auto orients selected objects or all objects. If there are selected objects, it just orients the selected ones. Otherwise, it will orient all objects in the current project." +#~ msgstr "Попытаться положить модели на стол. При выборе отдельных моделей операция применяется только к ним." + +#~ msgid "Auto orients all objects on the active plate." +#~ msgstr "Положить все модели только на активном столе" + +#~ msgid "Any arrow" +#~ msgstr "Любая стрелка" + +#~ msgid "Gizmo SLA support points" +#~ msgstr "Размещение поддержек (SLA)" + +# Plater – это название библиотеки. Используется в меню горячих клавиш в качестве заголовка сочетаний клавиш, которые работают внутри пространства Plater. Как минимум на Windows не отображается. +#~ msgid "Plater" +#~ msgstr "Рабочая область" + +#~ msgid "Gizmo" +#~ msgstr "Инструмент" + +#~ msgid "Delete objects, parts, modifiers" +#~ msgstr "Удаление моделей, частей, модификаторов" + +#~ msgid "Objects List" +#~ msgstr "Список моделей" + +#~ msgid "G-code written at the very top of the output file, before any other content. Useful for adding metadata that printer firmware reads from the first lines of the file (e.g. estimated print time, filament usage). Supports placeholders like {print_time_sec} and {used_filament_length}." +#~ msgstr "Код для вставки в первые строки файла (перед началом всего остального содержимого). Полезно для добавления метаданных для считывания прошивкой принтера, таких как время печати или расход материала. Можно использовать вставку переменных (например, {print_time_sec} и {used_filament_length} соответственно)." + +#~ msgid "Print time (seconds)" +#~ msgstr "Время печати (в секундах)" + #~ msgid "Open actions speed dial" #~ msgstr "Открыть строку быстрых действий" diff --git a/localization/i18n/sv/OrcaSlicer_sv.po b/localization/i18n/sv/OrcaSlicer_sv.po index e4f3079704..3ac55320d9 100644 --- a/localization/i18n/sv/OrcaSlicer_sv.po +++ b/localization/i18n/sv/OrcaSlicer_sv.po @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-09-18 15:50+0800\n" +"POT-Creation-Date: 2026-09-22 12:39+0800\n" "Language: sv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -6535,12 +6535,15 @@ msgctxt "Camera View" msgid "Right" msgstr "Höger" -msgid "Add" -msgstr "Lägg till" - msgid "Add plate" msgstr "Lägg till byggplata" +msgid "Split to objects" +msgstr "Dela upp till objekt" + +msgid "Add" +msgstr "Lägg till" + msgid "Auto orient all/selected objects" msgstr "Autoorientering alla/valda objekt" @@ -6553,9 +6556,6 @@ msgstr "Ordna alla objekt" msgid "Arrange objects on selected plates" msgstr "Ordna alla objekt på vald platta" -msgid "Split to objects" -msgstr "Dela upp till objekt" - msgid "Assembly View" msgstr "Monterings vy" @@ -6617,6 +6617,9 @@ msgstr "Kontur" msgid "Wireframe" msgstr "Trådram" +msgid "X-Ray" +msgstr "" + # AI Translated msgid "Realistic View" msgstr "Realistisk vy" @@ -7202,7 +7205,7 @@ msgstr "Visa en kontur runt det markerade objektet i 3D-scenen." msgid "Preferences" msgstr "Inställningar" -msgid "Open speed dial..." +msgid "Open speed dial" msgstr "" # AI Translated @@ -9182,10 +9185,6 @@ msgstr "Expandera sidopanelen" msgid "Collapse sidebar" msgstr "Fäll ihop sidopanelen" -# AI Translated -msgid "Tab" -msgstr "Tabb" - #, c-format, boost-format msgid "Loading file: %s" msgstr "Laddar fil: %s" @@ -10324,10 +10323,10 @@ msgstr "Hantering av flera enheter" msgid "With this option enabled, you can send a task to multiple devices at the same time and manage multiple devices." msgstr "Med det här alternativet aktiverat kan du skicka en uppgift till flera enheter samtidigt och hantera flera enheter." -msgid "Open the Speed Dial with the Space key" +msgid "Open the Speed Dial from the keyboard" msgstr "" -msgid "When enabled, pressing Space (with no other key held) opens the Speed Dial action search from any page." +msgid "When enabled, the Speed Dial keyboard shortcut (Space by default) opens the action search from any page." msgstr "" msgid "Recent actions" @@ -10481,6 +10480,15 @@ msgstr "Dra med höger musknapp" msgid "Set the action that dragging the right mouse button should perform." msgstr "Ange vilken åtgärd som ska utföras när du drar med höger musknapp." +msgid "Keyboard" +msgstr "" + +msgid "Keyboard shortcuts" +msgstr "" + +msgid "Choose the key for each action." +msgstr "" + # AI Translated msgid "Clear my choice on..." msgstr "Rensa mitt val för..." @@ -10611,13 +10619,40 @@ msgstr "" "Begränsar vyns bildfrekvens för att minska GPU-belastning och strömförbrukning.\n" "Sätt till 0 för obegränsad bildfrekvens." +msgid "Reuse the 3D scene while idle" +msgstr "" + +msgid "" +"Skips redrawing the 3D scene when only the mouse cursor moves over the viewport,\n" +"and reuses the previous frame's scene instead. Reduces GPU load.\n" +"Disable it if the viewport shows stale or missing contents.\n" +"\n" +"Takes effect immediately." +msgstr "" + +msgid "Skip unchanged frames" +msgstr "" + +msgid "" +"Skips drawing a frame altogether when it would be identical to the one already on screen.\n" +"Only applies to frames that reuse the 3D scene, so it needs Reuse the 3D scene while idle.\n" +"Disable it if a hover highlight, tooltip or animation stops updating.\n" +"\n" +"Takes effect immediately." +msgstr "" + # AI Translated msgid "Show FPS overlay" msgstr "Visa FPS-överlägg" -# AI Translated -msgid "Displays current viewport FPS in the top-right corner." -msgstr "Visar vyns aktuella FPS i det övre högra hörnet." +msgid "Displays rendering counts in the top-right corner of the viewport." +msgstr "" + +msgid "FPS: frames presented to the screen per second." +msgstr "" + +msgid "3D: frames per second that redrew the 3D scene." +msgstr "" # AI Translated msgid "G-code Preview" @@ -11120,13 +11155,8 @@ msgstr "Publicera 3MF..." msgid "Select which settings to be published in the 3MF file" msgstr "Välj vilka inställningar som ska publiceras i 3MF-filen" -# AI Translated -msgid "Publish 3MF Wiki" -msgstr "Wiki för Publicera 3MF" - -# AI Translated -msgid "Publish 3MF Video Guide" -msgstr "Videoguide för Publicera 3MF" +msgid "Video Guide" +msgstr "" # AI Translated msgid "Mixed filament - published as a whole when \"Enable\" above is selected" @@ -11329,6 +11359,14 @@ msgstr "" msgid "No wiki page for this action" msgstr "" +# AI Translated +msgid "Show details" +msgstr "Visa detaljer" + +# AI Translated +msgid "Hide details" +msgstr "Dölj detaljer" + #, c-format, boost-format msgid "\"%s\" is a Developer setting. Enable Developer mode to edit it?" msgstr "" @@ -13403,69 +13441,39 @@ msgstr "Konfigurations paketet är ändrat i föregående Kofigurations Guide" msgid "Configuration package changed" msgstr "Konfigurations paketet är ändrat" -msgid "Toolbar" -msgstr "Verktygsfält" - -msgid "Objects list" -msgstr "Objektlista" - -msgid "Import geometry data from STL/STEP/3MF/OBJ/AMF files" -msgstr "Importera geometri data från STL/STEP/3MF/OBJ/AMF filer" - -msgid "Paste from clipboard" -msgstr "Klistra in ifrån urklipp" - -msgid "Show/Hide 3Dconnexion devices settings dialog" -msgstr "Visa/Dölj 3Dconnexion enheternas inställnings dialogruta" - -msgid "Switch table page" -msgstr "Byt tabellsida" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Space" -msgstr "Blanksteg" - -msgid "Open speed dial" -msgstr "" - -msgid "Run a Speed Dial favourite (while the Speed Dial is open)" -msgstr "" - -msgid "Show keyboard shortcuts list" -msgstr "Visa tangentbordets genvägs lista" - -msgid "Global shortcuts" -msgstr "Övergripande genvägar" - msgid "Pan View" msgstr "Panoreringsvy" msgid "Rotate View" msgstr "Rotera vy" -# AI Translated -msgid "Middle mouse button" -msgstr "Mittersta musknappen" +#, c-format, boost-format +msgid "Use %s or %s, or a key that does not type a character." +msgstr "" -msgid "Zoom View" -msgstr "Zoomvy" +msgctxt "Keyboard Shortcut" +msgid "Key" +msgstr "" -msgid "Auto orients selected objects or all objects. If there are selected objects, it just orients the selected ones. Otherwise, it will orient all objects in the current project." -msgstr "Auto placera valda objekt eller alla objekt. Om det finns valda objekt så placeras endast dem. Annars kommer den att orientera alla objekt i det aktuella projektet." +msgid "Left mouse" +msgstr "" -msgid "Auto orients all objects on the active plate." -msgstr "Placera alla föremål automatiskt på aktuell tallrik." +msgid "Available anywhere in the window, even while typing in a text field." +msgstr "" -msgid "Collapse/Expand the sidebar" -msgstr "Dölj/Visa meny" +msgid "Run a speed dial favorite while the dial is open" +msgstr "" # AI Translated -msgid "Any arrow" -msgstr "Valfri piltangent" +msgctxt "Keyboard Shortcut" +msgid "Tab" +msgstr "Tabb" -msgid "Movement in camera space" -msgstr "Rörelse i kamera område" +msgid "Switch to the next main tab" +msgstr "" + +msgid "Available while the 3D view on the Prepare tab has focus." +msgstr "" msgid "Select a part" msgstr "Välj del" @@ -13476,129 +13484,29 @@ msgstr "Välj flera objekt" msgid "Select objects by rectangle" msgstr "Välj objekt efter rektangel" -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Arrow Up" -msgstr "Uppåtpil" - -msgid "Move selection 10mm in positive Y direction" -msgstr "Flytta markeringen 10mm i positiv Y riktning" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Arrow Down" -msgstr "Nedåtpil" - -msgid "Move selection 10mm in negative Y direction" -msgstr "Flytta markeringen 10mm i negativ Y riktning" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Arrow Left" -msgstr "Vänsterpil" - -msgid "Move selection 10mm in negative X direction" -msgstr "Flytta markeringen 10mm i negativ X riktning" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Arrow Right" -msgstr "Högerpil" - -msgid "Move selection 10mm in positive X direction" -msgstr "Flytta markeringen 10mm i positiv X riktning" +msgid "Keyboard 1-9: set filament for object/part" +msgstr "tangentbord 1-9: fastställer filament för objekt/del" msgid "Movement step set to 1mm" msgstr "Rörelse steg är vald till 1mm" -msgid "Keyboard 1-9: set filament for object/part" -msgstr "tangentbord 1-9: fastställer filament för objekt/del" +msgid "Movement in camera space" +msgstr "Rörelse i kamera område" -msgid "Camera view - Default" -msgstr "Kamera vy - Standard" +msgid "Middle mouse" +msgstr "" -msgid "Camera view - Top" -msgstr "Kamera vy - Topp" +msgid "Right mouse" +msgstr "" -msgid "Camera view - Bottom" -msgstr "Kamera vy - Botten" +msgid "Zoom View" +msgstr "Zoomvy" -msgid "Camera view - Front" -msgstr "Kamera vy - Fram" +msgid "Painting" +msgstr "" -msgid "Camera view - Behind" -msgstr "Kamera vy - Bakom" - -msgid "Camera Angle - Left side" -msgstr "Kamera vy - Vänster sida" - -msgid "Camera Angle - Right side" -msgstr "Kamera vy - Höger sida" - -msgid "Select all objects" -msgstr "Välj alla objekt" - -msgid "Gizmo move" -msgstr "Gizmo flytta" - -msgid "Gizmo rotate" -msgstr "Gizmo rotera" - -msgid "Gizmo scale" -msgstr "Gizmo skala" - -msgid "Gizmo place face on bed" -msgstr "Gizmo placera ansiktet på byggytan" - -msgid "Gizmo cut" -msgstr "Gizmo skär" - -# AI Translated -msgid "Gizmo mesh boolean" -msgstr "Gizmo boolesk mesh-operation" - -# AI Translated -msgid "Gizmo FDM paint-on fuzzy skin" -msgstr "Gizmo FDM måla ojämn yta" - -msgid "Gizmo SLA support points" -msgstr "Gizmo SLA support punkter" - -msgid "Gizmo FDM paint-on seam" -msgstr "Gizmo FDM målad söm" - -msgid "Gizmo text emboss/engrave" -msgstr "Gizmo textprägling/gravering" - -msgid "Gizmo measure" -msgstr "Gizmo mäta" - -msgid "Gizmo assemble" -msgstr "Gizmo montera" - -msgid "Gizmo brim ears" -msgstr "Gizmo brätte öron" - -msgid "Zoom in" -msgstr "Zooma in" - -msgid "Zoom out" -msgstr "Zooma ut" - -# AI Translated -msgid "Toggle printable for object/part" -msgstr "Växla utskrivbar för objekt/del" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Tab" -msgstr "Tabb" - -msgid "Switch between Prepare/Preview" -msgstr "Växla mellan Förbered/Förhandsgranska" - -msgid "Plater" -msgstr "Plätering/Förgyllning" +msgid "Available while a painting gizmo is open: supports, seam, fuzzy skin or color painting." +msgstr "" msgid "Move: press to snap by 1mm" msgstr "Flytta: tryck för att låsa med 1mm" @@ -13609,15 +13517,19 @@ msgstr "Support/Färgläggning: justera penn radie" msgid "Support/Color Painting: adjust section position" msgstr "Support/Färgläggning:justera sektions positionen" -# AI Translated -msgid "Gizmo" -msgstr "Gizmo" +msgid "Objects list" +msgstr "Objektlista" + +msgid "Available while the object list has focus." +msgstr "" msgid "Set extruder number for the objects and parts" msgstr "Välj extruder nummer för objekten och delarna" -msgid "Delete objects, parts, modifiers" -msgstr "Radera objekten, delarna och anpassningar" +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Space" +msgstr "Blanksteg" msgid "Select the object/part and press space to change the name" msgstr "Välj objektet/delen och tryck space för att ändra namnet" @@ -13628,48 +13540,48 @@ msgstr "Mus klick" msgid "Select the object/part and mouse click to change the name" msgstr "Välj objektet/delen och mus klicka för att ändra namnet" -msgid "Objects List" -msgstr "Objekts lista" - -msgid "Vertical slider - Move active thumb Up" -msgstr "Vertikal reglage - Flytta aktivt tryck Upp" - -msgid "Vertical slider - Move active thumb Down" -msgstr "Vertikal reglage - Flytta aktivt tryck Ner" - -msgid "Horizontal slider - Move active thumb Left" -msgstr "Horisontell reglage - Flytta aktivt tryck Vänster" - -msgid "Horizontal slider - Move active thumb Right" -msgstr "Horisontell reglage - Flytta aktivt tryck Höger" - -msgid "On/Off one layer mode of the vertical slider" -msgstr "På/Av 1 lager läge för det vertikala reglaget" - -# AI Translated -msgid "On/Off G-code window" -msgstr "På/av för G-code-fönstret" +msgid "Available while the 3D view on the Preview tab has focus." +msgstr "" msgid "Move slider 5x faster" msgstr "Flytta reglage 5x snabbare" -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Home" -msgstr "Home" +msgid "Scroll slider 5x faster" +msgstr "" -# AI Translated -msgid "Horizontal slider - Move to start position" -msgstr "Horisontellt reglage – flytta till startpositionen" +msgid "Not customizable" +msgstr "" -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "End" -msgstr "End" +#, c-format, boost-format +msgid "%s is assigned to %s. Reassign it to %s?" +msgstr "" -# AI Translated -msgid "Horizontal slider - Move to last position" -msgstr "Horisontellt reglage – flytta till sista positionen" +#, c-format, boost-format +msgid "The default %s is assigned to %s. Reassign it to %s?" +msgstr "" + +msgid "Global shortcuts also apply while typing." +msgstr "" + +msgid "A key that types a character cannot be a global shortcut." +msgstr "" + +msgid "Esc cancels, Enter confirms." +msgstr "" + +#, c-format, boost-format +msgid "" +"Press the new shortcut for\n" +"\"%s\"" +msgstr "" + +#, c-format, boost-format +msgid "Already used as a step of %s." +msgstr "" + +#, c-format, boost-format +msgid "Already assigned to %s. Press OK to reassign it." +msgstr "" msgid "Release Note" msgstr "Meddelande om utgåvan" @@ -19215,9 +19127,8 @@ msgstr "Förvärmningssteg" msgid "Insert multiple preheat commands (e.g. M104.1). Only useful for Prusa XL. For other printers, please set it to 1." msgstr "Infoga flera förvärmningskommandon (t.ex. M104.1). Endast användbart för Prusa XL. Ställ in det på 1 för andra skrivare." -# AI Translated -msgid "G-code written at the very top of the output file, before any other content. Useful for adding metadata that printer firmware reads from the first lines of the file (e.g. estimated print time, filament usage). Supports placeholders like {print_time_sec} and {used_filament_length}." -msgstr "G-code som skrivs allra överst i utdatafilen, före allt annat innehåll. Användbart för att lägga till metadata som skrivarens fasta programvara läser från filens första rader (t.ex. beräknad utskriftstid, filamentåtgång). Stöder platshållare som {print_time_sec} och {used_filament_length}." +msgid "G-code written at the very top of the output file, before any other content. Useful for adding metadata that printer firmware reads from the first lines of the file (e.g. estimated print time, filament usage). Supports placeholders like {print_time_total_sec}, {print_time_day}, {print_time_hour}, {print_time_minute}, {print_time_sec} and {used_filament_length}." +msgstr "" msgid "Start G-code" msgstr "Starta G-kod" @@ -20963,14 +20874,37 @@ msgstr "Använt filament" msgid "Total length of filament used in the print." msgstr "Total längd filament som används i utskriften." -# AI Translated -msgid "Print time (seconds)" -msgstr "Utskriftstid (sekunder)" +msgid "Print time (total seconds)" +msgstr "" # AI Translated msgid "Total estimated print time in seconds. Replaced with actual value during post-processing." msgstr "Total beräknad utskriftstid i sekunder. Ersätts med det faktiska värdet under efterbearbetningen." +msgid "Print time (days component)" +msgstr "" + +msgid "Estimated print time day component (normal mode). Replaced with actual value during post-processing." +msgstr "" + +msgid "Print time (hours component)" +msgstr "" + +msgid "Estimated print time hour component (normal mode). Replaced with actual value during post-processing." +msgstr "" + +msgid "Print time (minutes component)" +msgstr "" + +msgid "Estimated print time minute component (normal mode). Replaced with actual value during post-processing." +msgstr "" + +msgid "Print time (seconds component)" +msgstr "" + +msgid "Estimated print time second component (normal mode). Replaced with actual value during post-processing." +msgstr "" + # AI Translated msgid "Filament length (meters)" msgstr "Filamentlängd (meter)" @@ -23000,6 +22934,9 @@ msgstr "Ingen giltig session upptäcktes. Vill du fortsätta med inloggning till msgid "Success!" msgstr "Lyckades!" +msgid "Generate API Key" +msgstr "" + # AI Translated msgid "Are you sure to log out?" msgstr "Är du säker på att du vill logga ut?" @@ -24215,14 +24152,6 @@ msgstr "Bambu Network Plug-in krävs för molnfunktioner, upptäckt av skrivare msgid "Error: %s" msgstr "Fel: %s" -# AI Translated -msgid "Show details" -msgstr "Visa detaljer" - -# AI Translated -msgid "Hide details" -msgstr "Dölj detaljer" - # AI Translated msgid "Version to install:" msgstr "Version att installera:" @@ -26906,6 +26835,12 @@ msgstr "" msgid "No binding for that field" msgstr "" +msgid "Enter a number" +msgstr "" + +msgid "Not a number" +msgstr "" + msgid "Primitive" msgstr "" @@ -26918,6 +26853,222 @@ msgstr "" msgid "Clear All" msgstr "" +msgctxt "Keyboard Shortcut" +msgid "Ins" +msgstr "" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Home" +msgstr "Home" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "End" +msgstr "End" + +msgctxt "Keyboard Shortcut" +msgid "PgUp" +msgstr "" + +msgctxt "Keyboard Shortcut" +msgid "PgDn" +msgstr "" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Arrow Left" +msgstr "Vänsterpil" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Arrow Right" +msgstr "Högerpil" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Arrow Up" +msgstr "Uppåtpil" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Arrow Down" +msgstr "Nedåtpil" + +msgid "Import geometry data from STL/STEP/3MF/OBJ/AMF files" +msgstr "Importera geometri data från STL/STEP/3MF/OBJ/AMF filer" + +msgid "Select all objects" +msgstr "Välj alla objekt" + +msgid "Paste from clipboard" +msgstr "Klistra in ifrån urklipp" + +# AI Translated +msgid "Toggle printable for object/part" +msgstr "Växla utskrivbar för objekt/del" + +msgid "Move selection 10mm in negative X direction" +msgstr "Flytta markeringen 10mm i negativ X riktning" + +msgid "Move selection 10mm in positive X direction" +msgstr "Flytta markeringen 10mm i positiv X riktning" + +msgid "Move selection 10mm in positive Y direction" +msgstr "Flytta markeringen 10mm i positiv Y riktning" + +msgid "Move selection 10mm in negative Y direction" +msgstr "Flytta markeringen 10mm i negativ Y riktning" + +msgid "Rotate selection 45 degrees counterclockwise" +msgstr "" + +msgid "Rotate selection 45 degrees clockwise" +msgstr "" + +msgid "Gizmo move" +msgstr "Gizmo flytta" + +msgid "Gizmo rotate" +msgstr "Gizmo rotera" + +msgid "Gizmo scale" +msgstr "Gizmo skala" + +msgid "Gizmo place face on bed" +msgstr "Gizmo placera ansiktet på byggytan" + +msgid "Gizmo cut" +msgstr "Gizmo skär" + +# AI Translated +msgid "Gizmo mesh boolean" +msgstr "Gizmo boolesk mesh-operation" + +msgid "Gizmo FDM paint-on supports" +msgstr "" + +msgid "Gizmo FDM paint-on seam" +msgstr "Gizmo FDM målad söm" + +# AI Translated +msgid "Gizmo FDM paint-on fuzzy skin" +msgstr "Gizmo FDM måla ojämn yta" + +msgid "Gizmo multi-material painting" +msgstr "" + +msgid "Gizmo text emboss/engrave" +msgstr "Gizmo textprägling/gravering" + +msgid "Gizmo measure" +msgstr "Gizmo mäta" + +msgid "Gizmo assemble" +msgstr "Gizmo montera" + +msgid "Gizmo brim ears" +msgstr "Gizmo brätte öron" + +msgid "Vertical slider - Move active thumb Up" +msgstr "Vertikal reglage - Flytta aktivt tryck Upp" + +msgid "Vertical slider - Move active thumb Down" +msgstr "Vertikal reglage - Flytta aktivt tryck Ner" + +msgid "Horizontal slider - Move active thumb Left" +msgstr "Horisontell reglage - Flytta aktivt tryck Vänster" + +msgid "Horizontal slider - Move active thumb Right" +msgstr "Horisontell reglage - Flytta aktivt tryck Höger" + +# AI Translated +msgid "Horizontal slider - Move to start position" +msgstr "Horisontellt reglage – flytta till startpositionen" + +# AI Translated +msgid "Horizontal slider - Move to last position" +msgstr "Horisontellt reglage – flytta till sista positionen" + +msgid "Camera view - Default" +msgstr "Kamera vy - Standard" + +msgid "Camera view - Top" +msgstr "Kamera vy - Topp" + +msgid "Camera view - Bottom" +msgstr "Kamera vy - Botten" + +msgid "Camera view - Front" +msgstr "Kamera vy - Fram" + +msgid "Camera view - Behind" +msgstr "Kamera vy - Bakom" + +msgid "Camera Angle - Left side" +msgstr "Kamera vy - Vänster sida" + +msgid "Camera Angle - Right side" +msgstr "Kamera vy - Höger sida" + +msgid "Camera view - Current plate" +msgstr "" + +msgid "Zoom in" +msgstr "Zooma in" + +msgid "Zoom out" +msgstr "Zooma ut" + +msgid "Show/Hide 3Dconnexion devices settings dialog" +msgstr "Visa/Dölj 3Dconnexion enheternas inställnings dialogruta" + +msgid "Show/Hide wireframe" +msgstr "" + +# AI Translated +msgid "On/Off G-code window" +msgstr "På/av för G-code-fönstret" + +msgid "On/Off one layer mode of the vertical slider" +msgstr "På/Av 1 lager läge för det vertikala reglaget" + +msgid "Switch between Prepare/Preview" +msgstr "Växla mellan Förbered/Förhandsgranska" + +msgid "Collapse/Expand the sidebar" +msgstr "Dölj/Visa meny" + +msgid "Open the speed dial" +msgstr "" + +msgid "Reload the device page" +msgstr "" + +msgid "Show keyboard shortcuts list" +msgstr "Visa tangentbordets genvägs lista" + +msgid "Slicing and printing" +msgstr "" + +msgid "Editing" +msgstr "" + +msgid "Placement" +msgstr "" + +msgid "Gizmos" +msgstr "" + +msgid "Sliders" +msgstr "" + +msgid "Painting tools" +msgstr "" + +msgid "Application" +msgstr "" + # AI Translated #: resources/data/hints.ini: [hint:Precise wall] msgid "" @@ -27233,6 +27384,69 @@ msgstr "" "Undvik vridning\n" "Visste du att när du skriver ut material som är benägna att vrida, såsom ABS, kan en lämplig ökning av värmebäddens temperatur minska sannolikheten för vridning?" +# AI Translated +#~ msgid "Tab" +#~ msgstr "Tabb" + +# AI Translated +#~ msgid "Displays current viewport FPS in the top-right corner." +#~ msgstr "Visar vyns aktuella FPS i det övre högra hörnet." + +# AI Translated +#~ msgid "Publish 3MF Wiki" +#~ msgstr "Wiki för Publicera 3MF" + +# AI Translated +#~ msgid "Publish 3MF Video Guide" +#~ msgstr "Videoguide för Publicera 3MF" + +#~ msgid "Toolbar" +#~ msgstr "Verktygsfält" + +#~ msgid "Switch table page" +#~ msgstr "Byt tabellsida" + +#~ msgid "Global shortcuts" +#~ msgstr "Övergripande genvägar" + +# AI Translated +#~ msgid "Middle mouse button" +#~ msgstr "Mittersta musknappen" + +#~ msgid "Auto orients selected objects or all objects. If there are selected objects, it just orients the selected ones. Otherwise, it will orient all objects in the current project." +#~ msgstr "Auto placera valda objekt eller alla objekt. Om det finns valda objekt så placeras endast dem. Annars kommer den att orientera alla objekt i det aktuella projektet." + +#~ msgid "Auto orients all objects on the active plate." +#~ msgstr "Placera alla föremål automatiskt på aktuell tallrik." + +# AI Translated +#~ msgid "Any arrow" +#~ msgstr "Valfri piltangent" + +#~ msgid "Gizmo SLA support points" +#~ msgstr "Gizmo SLA support punkter" + +#~ msgid "Plater" +#~ msgstr "Plätering/Förgyllning" + +# AI Translated +#~ msgid "Gizmo" +#~ msgstr "Gizmo" + +#~ msgid "Delete objects, parts, modifiers" +#~ msgstr "Radera objekten, delarna och anpassningar" + +#~ msgid "Objects List" +#~ msgstr "Objekts lista" + +# AI Translated +#~ msgid "G-code written at the very top of the output file, before any other content. Useful for adding metadata that printer firmware reads from the first lines of the file (e.g. estimated print time, filament usage). Supports placeholders like {print_time_sec} and {used_filament_length}." +#~ msgstr "G-code som skrivs allra överst i utdatafilen, före allt annat innehåll. Användbart för att lägga till metadata som skrivarens fasta programvara läser från filens första rader (t.ex. beräknad utskriftstid, filamentåtgång). Stöder platshållare som {print_time_sec} och {used_filament_length}." + +# AI Translated +#~ msgid "Print time (seconds)" +#~ msgstr "Utskriftstid (sekunder)" + # AI Translated #~ msgid "Open actions speed dial" #~ msgstr "Öppna snabbvalsmenyn för åtgärder" diff --git a/localization/i18n/th/OrcaSlicer_th.po b/localization/i18n/th/OrcaSlicer_th.po index 47aa50fb13..d946726cba 100644 --- a/localization/i18n/th/OrcaSlicer_th.po +++ b/localization/i18n/th/OrcaSlicer_th.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-09-18 15:50+0800\n" +"POT-Creation-Date: 2026-09-22 12:39+0800\n" "PO-Revision-Date: 2026-06-19 13:40+0700\n" "Last-Translator: Icezaza\n" "Language-Team: Thai\n" @@ -5901,12 +5901,15 @@ msgctxt "Camera View" msgid "Right" msgstr "ขวา" -msgid "Add" -msgstr "เพิ่ม" - msgid "Add plate" msgstr "เพิ่มจาน" +msgid "Split to objects" +msgstr "แยกเป็นวัตถุ" + +msgid "Add" +msgstr "เพิ่ม" + msgid "Auto orient all/selected objects" msgstr "ปรับทิศทางวัตถุทั้งหมด/ที่เลือกโดยอัตโนมัติ" @@ -5919,9 +5922,6 @@ msgstr "จัดเรียงวัตถุทั้งหมด" msgid "Arrange objects on selected plates" msgstr "จัดเรียงวัตถุบนจานที่เลือก" -msgid "Split to objects" -msgstr "แยกเป็นวัตถุ" - msgid "Assembly View" msgstr "มุมมองการประกอบ" @@ -5978,6 +5978,9 @@ msgstr "เส้นขอบ" msgid "Wireframe" msgstr "โครงลวด" +msgid "X-Ray" +msgstr "" + msgid "Realistic View" msgstr "มุมมองสมจริง" @@ -6517,7 +6520,7 @@ msgstr "แสดงเค้าร่างรอบๆ วัตถุที msgid "Preferences" msgstr "การตั้งค่า" -msgid "Open speed dial..." +msgid "Open speed dial" msgstr "" # AI Translated @@ -8318,9 +8321,6 @@ msgstr "ขยายแถบด้านข้าง" msgid "Collapse sidebar" msgstr "ยุบแถบด้านข้าง" -msgid "Tab" -msgstr "แท็บ" - #, c-format, boost-format msgid "Loading file: %s" msgstr "กำลังโหลดไฟล์: %s" @@ -9338,10 +9338,10 @@ msgstr "การจัดการอุปกรณ์หลายเครื msgid "With this option enabled, you can send a task to multiple devices at the same time and manage multiple devices." msgstr "เมื่อเปิดใช้งานตัวเลือกนี้ คุณสามารถส่งงานไปยังอุปกรณ์หลายเครื่องพร้อมกันและจัดการอุปกรณ์หลายเครื่องได้" -msgid "Open the Speed Dial with the Space key" +msgid "Open the Speed Dial from the keyboard" msgstr "" -msgid "When enabled, pressing Space (with no other key held) opens the Speed Dial action search from any page." +msgid "When enabled, the Speed Dial keyboard shortcut (Space by default) opens the action search from any page." msgstr "" msgid "Recent actions" @@ -9473,6 +9473,15 @@ msgstr "ลากเมาส์ขวา" msgid "Set the action that dragging the right mouse button should perform." msgstr "ตั้งค่าการดำเนินการที่ควรดำเนินการด้วยการลากปุ่มเมาส์ขวา" +msgid "Keyboard" +msgstr "" + +msgid "Keyboard shortcuts" +msgstr "" + +msgid "Choose the key for each action." +msgstr "" + msgid "Clear my choice on..." msgstr "ล้างตัวเลือกของฉันใน..." @@ -9583,11 +9592,39 @@ msgstr "" "จำกัดอัตราเฟรมวิวพอร์ตเพื่อลดภาระของ GPU และการใช้พลังงาน\n" "ตั้งค่าเป็น 0 สำหรับอัตราเฟรมไม่จำกัด" +msgid "Reuse the 3D scene while idle" +msgstr "" + +msgid "" +"Skips redrawing the 3D scene when only the mouse cursor moves over the viewport,\n" +"and reuses the previous frame's scene instead. Reduces GPU load.\n" +"Disable it if the viewport shows stale or missing contents.\n" +"\n" +"Takes effect immediately." +msgstr "" + +msgid "Skip unchanged frames" +msgstr "" + +msgid "" +"Skips drawing a frame altogether when it would be identical to the one already on screen.\n" +"Only applies to frames that reuse the 3D scene, so it needs Reuse the 3D scene while idle.\n" +"Disable it if a hover highlight, tooltip or animation stops updating.\n" +"\n" +"Takes effect immediately." +msgstr "" + msgid "Show FPS overlay" msgstr "แสดงการซ้อนทับ FPS" -msgid "Displays current viewport FPS in the top-right corner." -msgstr "แสดงวิวพอร์ต FPS ปัจจุบันที่มุมขวาบน" +msgid "Displays rendering counts in the top-right corner of the viewport." +msgstr "" + +msgid "FPS: frames presented to the screen per second." +msgstr "" + +msgid "3D: frames per second that redrew the 3D scene." +msgstr "" # AI Translated msgid "G-code Preview" @@ -10047,13 +10084,8 @@ msgstr "เผยแพร่ 3MF..." msgid "Select which settings to be published in the 3MF file" msgstr "เลือกว่าจะเผยแพร่การตั้งค่าใดในไฟล์ 3MF" -# AI Translated -msgid "Publish 3MF Wiki" -msgstr "วิกิการเผยแพร่ 3MF" - -# AI Translated -msgid "Publish 3MF Video Guide" -msgstr "คู่มือวีดีโอการเผยแพร่ 3MF" +msgid "Video Guide" +msgstr "" # AI Translated msgid "Mixed filament - published as a whole when \"Enable\" above is selected" @@ -10255,6 +10287,13 @@ msgstr "" msgid "No wiki page for this action" msgstr "" +msgid "Show details" +msgstr "แสดงรายละเอียด" + +# AI Translated +msgid "Hide details" +msgstr "ซ่อนรายละเอียด" + #, c-format, boost-format msgid "\"%s\" is a Developer setting. Enable Developer mode to edit it?" msgstr "" @@ -12087,67 +12126,39 @@ msgstr "แพ็คเกจการกำหนดค่ามีการเ msgid "Configuration package changed" msgstr "แพ็คเกจการกำหนดค่ามีการเปลี่ยนแปลง" -msgid "Toolbar" -msgstr "แถบเครื่องมือ" - -msgid "Objects list" -msgstr "รายการวัตถุ" - -msgid "Import geometry data from STL/STEP/3MF/OBJ/AMF files" -msgstr "นำเข้าข้อมูลเรขาคณิตจากไฟล์ STL/STEP/3MF/OBJ/AMF" - -msgid "Paste from clipboard" -msgstr "วางจากคลิปบอร์ด" - -msgid "Show/Hide 3Dconnexion devices settings dialog" -msgstr "แสดง/ซ่อนกล่องโต้ตอบการตั้งค่าอุปกรณ์ 3Dconnexion" - -msgid "Switch table page" -msgstr "สลับหน้าตาราง" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Space" -msgstr "Space" - -msgid "Open speed dial" -msgstr "" - -msgid "Run a Speed Dial favourite (while the Speed Dial is open)" -msgstr "" - -msgid "Show keyboard shortcuts list" -msgstr "แสดงรายการแป้นพิมพ์ลัด" - -msgid "Global shortcuts" -msgstr "ทางลัดทั่วโลก" - msgid "Pan View" msgstr "แพนวิว" msgid "Rotate View" msgstr "หมุนมุมมอง" -msgid "Middle mouse button" -msgstr "ปุ่มกลางของเมาส์" +#, c-format, boost-format +msgid "Use %s or %s, or a key that does not type a character." +msgstr "" -msgid "Zoom View" -msgstr "ซูมดู" +msgctxt "Keyboard Shortcut" +msgid "Key" +msgstr "" -msgid "Auto orients selected objects or all objects. If there are selected objects, it just orients the selected ones. Otherwise, it will orient all objects in the current project." -msgstr "ปรับทิศทางวัตถุที่เลือกหรือวัตถุทั้งหมดโดยอัตโนมัติ หากมีวัตถุที่เลือกไว้ วัตถุนั้นจะปรับทิศทางวัตถุที่เลือกเท่านั้น มิฉะนั้นจะวางแนววัตถุทั้งหมดในโปรเจ็กต์ปัจจุบัน" +msgid "Left mouse" +msgstr "" -msgid "Auto orients all objects on the active plate." -msgstr "ปรับทิศทางวัตถุทั้งหมดบนเพลตที่ใช้งานอยู่โดยอัตโนมัติ" +msgid "Available anywhere in the window, even while typing in a text field." +msgstr "" -msgid "Collapse/Expand the sidebar" -msgstr "ยุบ/ขยายแถบด้านข้าง" +msgid "Run a speed dial favorite while the dial is open" +msgstr "" -msgid "Any arrow" -msgstr "ลูกศรอะไรก็ได้" +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Tab" +msgstr "Tab" -msgid "Movement in camera space" -msgstr "การเคลื่อนไหวในพื้นที่กล้อง" +msgid "Switch to the next main tab" +msgstr "" + +msgid "Available while the 3D view on the Prepare tab has focus." +msgstr "" msgid "Select a part" msgstr "เลือกส่วนหนึ่ง" @@ -12158,126 +12169,29 @@ msgstr "เลือกหลายวัตถุ" msgid "Select objects by rectangle" msgstr "เลือกวัตถุตามสี่เหลี่ยม" -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Arrow Up" -msgstr "ลูกศรขึ้น" - -msgid "Move selection 10mm in positive Y direction" -msgstr "เลื่อนส่วนที่เลือกไป 10 มม. ในทิศทางบวก Y" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Arrow Down" -msgstr "ลูกศรลง" - -msgid "Move selection 10mm in negative Y direction" -msgstr "ย้ายส่วนที่เลือกไป 10 มม. ในทิศทางลบ Y" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Arrow Left" -msgstr "ลูกศรซ้าย" - -msgid "Move selection 10mm in negative X direction" -msgstr "ย้ายส่วนที่เลือกไป 10 มม. ในทิศทาง X ลบ" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Arrow Right" -msgstr "ลูกศรขวา" - -msgid "Move selection 10mm in positive X direction" -msgstr "เลื่อนส่วนที่เลือกไป 10 มม. ในทิศทาง X บวก" +msgid "Keyboard 1-9: set filament for object/part" +msgstr "แป้นพิมพ์ 1-9: ตั้งค่าเส้นพลาสติกสำหรับวัตถุ/ชิ้นส่วน" msgid "Movement step set to 1mm" msgstr "ตั้งระยะขยับเป็น 1 มม." -msgid "Keyboard 1-9: set filament for object/part" -msgstr "แป้นพิมพ์ 1-9: ตั้งค่าเส้นพลาสติกสำหรับวัตถุ/ชิ้นส่วน" +msgid "Movement in camera space" +msgstr "การเคลื่อนไหวในพื้นที่กล้อง" -msgid "Camera view - Default" -msgstr "มุมมองกล้อง - ค่าเริ่มต้น" +msgid "Middle mouse" +msgstr "" -msgid "Camera view - Top" -msgstr "มุมมองกล้อง - ด้านบน" +msgid "Right mouse" +msgstr "" -msgid "Camera view - Bottom" -msgstr "มุมมองกล้อง - ด้านล่าง" +msgid "Zoom View" +msgstr "ซูมดู" -msgid "Camera view - Front" -msgstr "มุมมองกล้อง - ด้านหน้า" +msgid "Painting" +msgstr "" -msgid "Camera view - Behind" -msgstr "มุมมองกล้อง - ด้านหลัง" - -msgid "Camera Angle - Left side" -msgstr "มุมกล้อง - ด้านซ้าย" - -msgid "Camera Angle - Right side" -msgstr "มุมกล้อง - ด้านขวา" - -msgid "Select all objects" -msgstr "เลือกวัตถุทั้งหมด" - -msgid "Gizmo move" -msgstr "กิสโม่ย้าย" - -msgid "Gizmo rotate" -msgstr "กิสโม่หมุน" - -msgid "Gizmo scale" -msgstr "ขนาดกิสโม่" - -msgid "Gizmo place face on bed" -msgstr "กิสโมวางหน้าบนฐานพิมพ์" - -msgid "Gizmo cut" -msgstr "กิสโม่ตัด" - -msgid "Gizmo mesh boolean" -msgstr "Gizmo mesh บูลีน" - -msgid "Gizmo FDM paint-on fuzzy skin" -msgstr "Gizmo FDM เพ้นท์ผิวฟัซซี" - -msgid "Gizmo SLA support points" -msgstr "จุดส่วนรองรับ Gizmo SLA" - -msgid "Gizmo FDM paint-on seam" -msgstr "รอยตะเข็บทาสี Gizmo FDM" - -msgid "Gizmo text emboss/engrave" -msgstr "ข้อความ Gizmo นูน/แกะสลัก" - -msgid "Gizmo measure" -msgstr "เครื่องวัดกิสโม่" - -msgid "Gizmo assemble" -msgstr "กิสโมประกอบ" - -msgid "Gizmo brim ears" -msgstr "Gizmo หูขอบยึดชิ้นงาน (Brim Ears)" - -msgid "Zoom in" -msgstr "ซูมเข้า" - -msgid "Zoom out" -msgstr "ซูมออก" - -msgid "Toggle printable for object/part" -msgstr "สลับการพิมพ์สำหรับวัตถุ/ชิ้นส่วน" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Tab" -msgstr "Tab" - -msgid "Switch between Prepare/Preview" -msgstr "สลับระหว่างการเตรียม/ดูตัวอย่าง" - -msgid "Plater" -msgstr "เพลเตอร์" +msgid "Available while a painting gizmo is open: supports, seam, fuzzy skin or color painting." +msgstr "" msgid "Move: press to snap by 1mm" msgstr "ย้าย: กดเพื่อสแน็ป 1 มม" @@ -12288,14 +12202,19 @@ msgstr "ส่วนรองรับ / การวาดภาพสี: ป msgid "Support/Color Painting: adjust section position" msgstr "ส่วนรองรับ / การวาดภาพสี: ปรับตำแหน่งส่วน" -msgid "Gizmo" -msgstr "กิสโม่" +msgid "Objects list" +msgstr "รายการวัตถุ" + +msgid "Available while the object list has focus." +msgstr "" msgid "Set extruder number for the objects and parts" msgstr "กำหนดหมายเลขชุดดันเส้นสำหรับวัตถุและชิ้นส่วน" -msgid "Delete objects, parts, modifiers" -msgstr "ลบวัตถุ ชิ้นส่วน ตัวดัดแปลง" +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Space" +msgstr "Space" msgid "Select the object/part and press space to change the name" msgstr "เลือกวัตถุ/ชิ้นส่วนแล้วกด Space เพื่อเปลี่ยนชื่อ" @@ -12306,45 +12225,48 @@ msgstr "คลิกเมาส์" msgid "Select the object/part and mouse click to change the name" msgstr "เลือกวัตถุ/ชิ้นส่วนแล้วคลิกเมาส์เพื่อเปลี่ยนชื่อ" -msgid "Objects List" -msgstr "รายการวัตถุ" - -msgid "Vertical slider - Move active thumb Up" -msgstr "แถบเลื่อนแนวตั้ง - เลื่อนนิ้วโป้งที่ใช้งานอยู่ขึ้น" - -msgid "Vertical slider - Move active thumb Down" -msgstr "แถบเลื่อนแนวตั้ง - เลื่อนนิ้วโป้งที่ใช้งานอยู่ลง" - -msgid "Horizontal slider - Move active thumb Left" -msgstr "แถบเลื่อนแนวนอน - เลื่อนนิ้วหัวแม่มือที่ใช้งานไปทางซ้าย" - -msgid "Horizontal slider - Move active thumb Right" -msgstr "แถบเลื่อนแนวนอน - เลื่อนนิ้วหัวแม่มือที่ใช้งานไปทางขวา" - -msgid "On/Off one layer mode of the vertical slider" -msgstr "เปิด/ปิดโหมดเลเยอร์เดียวของแถบเลื่อนแนวตั้ง" - -msgid "On/Off G-code window" -msgstr "เปิด/ปิดหน้าต่างรหัส G" +msgid "Available while the 3D view on the Preview tab has focus." +msgstr "" msgid "Move slider 5x faster" msgstr "เลื่อนตัวเลื่อนเร็วขึ้น 5 เท่า" -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Home" -msgstr "Home" +msgid "Scroll slider 5x faster" +msgstr "" -msgid "Horizontal slider - Move to start position" -msgstr "แถบเลื่อนแนวนอน - เลื่อนไปยังตำแหน่งเริ่มต้น" +msgid "Not customizable" +msgstr "" -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "End" -msgstr "End" +#, c-format, boost-format +msgid "%s is assigned to %s. Reassign it to %s?" +msgstr "" -msgid "Horizontal slider - Move to last position" -msgstr "แถบเลื่อนแนวนอน - เลื่อนไปยังตำแหน่งสุดท้าย" +#, c-format, boost-format +msgid "The default %s is assigned to %s. Reassign it to %s?" +msgstr "" + +msgid "Global shortcuts also apply while typing." +msgstr "" + +msgid "A key that types a character cannot be a global shortcut." +msgstr "" + +msgid "Esc cancels, Enter confirms." +msgstr "" + +#, c-format, boost-format +msgid "" +"Press the new shortcut for\n" +"\"%s\"" +msgstr "" + +#, c-format, boost-format +msgid "Already used as a step of %s." +msgstr "" + +#, c-format, boost-format +msgid "Already assigned to %s. Press OK to reassign it." +msgstr "" msgid "Release Note" msgstr "บันทึกประจำรุ่น" @@ -17213,8 +17135,8 @@ msgstr "อุ่นเครื่องตามขั้นตอน" msgid "Insert multiple preheat commands (e.g. M104.1). Only useful for Prusa XL. For other printers, please set it to 1." msgstr "ใส่คำสั่งอุ่นล่วงหน้าหลายคำสั่ง (เช่น M104.1) มีประโยชน์สำหรับ Prusa XL เท่านั้น สำหรับเครื่องพิมพ์อื่นๆ โปรดตั้งค่าเป็น 1" -msgid "G-code written at the very top of the output file, before any other content. Useful for adding metadata that printer firmware reads from the first lines of the file (e.g. estimated print time, filament usage). Supports placeholders like {print_time_sec} and {used_filament_length}." -msgstr "G-code เขียนไว้ที่ด้านบนสุดของไฟล์เอาต์พุต ก่อนเนื้อหาอื่นๆ มีประโยชน์สำหรับการเพิ่มข้อมูลเมตาที่เฟิร์มแวร์เครื่องพิมพ์อ่านจากบรรทัดแรกของไฟล์ (เช่น เวลาในการพิมพ์โดยประมาณ การใช้เส้นพลาสติก) รองรับตัวยึดตำแหน่ง เช่น {print_time_sec} และ {used_filament_length}" +msgid "G-code written at the very top of the output file, before any other content. Useful for adding metadata that printer firmware reads from the first lines of the file (e.g. estimated print time, filament usage). Supports placeholders like {print_time_total_sec}, {print_time_day}, {print_time_hour}, {print_time_minute}, {print_time_sec} and {used_filament_length}." +msgstr "" msgid "Start G-code" msgstr "เริ่ม G-code" @@ -18753,12 +18675,36 @@ msgstr "เส้นพลาสติกที่ใช้แล้ว" msgid "Total length of filament used in the print." msgstr "ความยาวรวมของเส้นพลาสติกที่ใช้ในการพิมพ์" -msgid "Print time (seconds)" -msgstr "เวลาในการพิมพ์ (วินาที)" +msgid "Print time (total seconds)" +msgstr "" msgid "Total estimated print time in seconds. Replaced with actual value during post-processing." msgstr "เวลาพิมพ์ทั้งหมดโดยประมาณเป็นวินาที แทนที่ด้วยค่าจริงระหว่างการประมวลผลภายหลัง" +msgid "Print time (days component)" +msgstr "" + +msgid "Estimated print time day component (normal mode). Replaced with actual value during post-processing." +msgstr "" + +msgid "Print time (hours component)" +msgstr "" + +msgid "Estimated print time hour component (normal mode). Replaced with actual value during post-processing." +msgstr "" + +msgid "Print time (minutes component)" +msgstr "" + +msgid "Estimated print time minute component (normal mode). Replaced with actual value during post-processing." +msgstr "" + +msgid "Print time (seconds component)" +msgstr "" + +msgid "Estimated print time second component (normal mode). Replaced with actual value during post-processing." +msgstr "" + msgid "Filament length (meters)" msgstr "ความยาวเส้นพลาสติก (เมตร)" @@ -20592,6 +20538,9 @@ msgstr "ไม่พบเซสชันที่ถูกต้อง ดำ msgid "Success!" msgstr "สำเร็จ!" +msgid "Generate API Key" +msgstr "" + msgid "Are you sure to log out?" msgstr "คุณแน่ใจหรือว่าจะออกจากระบบ?" @@ -21591,13 +21540,6 @@ msgstr "ปลั๊กอินเครือข่าย Bambu จำเป msgid "Error: %s" msgstr "ข้อผิดพลาด: %s" -msgid "Show details" -msgstr "แสดงรายละเอียด" - -# AI Translated -msgid "Hide details" -msgstr "ซ่อนรายละเอียด" - msgid "Version to install:" msgstr "เวอร์ชันที่จะติดตั้ง:" @@ -24228,6 +24170,12 @@ msgstr "" msgid "No binding for that field" msgstr "" +msgid "Enter a number" +msgstr "" + +msgid "Not a number" +msgstr "" + msgid "Primitive" msgstr "" @@ -24240,6 +24188,216 @@ msgstr "" msgid "Clear All" msgstr "" +msgctxt "Keyboard Shortcut" +msgid "Ins" +msgstr "" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Home" +msgstr "Home" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "End" +msgstr "End" + +msgctxt "Keyboard Shortcut" +msgid "PgUp" +msgstr "" + +msgctxt "Keyboard Shortcut" +msgid "PgDn" +msgstr "" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Arrow Left" +msgstr "ลูกศรซ้าย" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Arrow Right" +msgstr "ลูกศรขวา" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Arrow Up" +msgstr "ลูกศรขึ้น" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Arrow Down" +msgstr "ลูกศรลง" + +msgid "Import geometry data from STL/STEP/3MF/OBJ/AMF files" +msgstr "นำเข้าข้อมูลเรขาคณิตจากไฟล์ STL/STEP/3MF/OBJ/AMF" + +msgid "Select all objects" +msgstr "เลือกวัตถุทั้งหมด" + +msgid "Paste from clipboard" +msgstr "วางจากคลิปบอร์ด" + +msgid "Toggle printable for object/part" +msgstr "สลับการพิมพ์สำหรับวัตถุ/ชิ้นส่วน" + +msgid "Move selection 10mm in negative X direction" +msgstr "ย้ายส่วนที่เลือกไป 10 มม. ในทิศทาง X ลบ" + +msgid "Move selection 10mm in positive X direction" +msgstr "เลื่อนส่วนที่เลือกไป 10 มม. ในทิศทาง X บวก" + +msgid "Move selection 10mm in positive Y direction" +msgstr "เลื่อนส่วนที่เลือกไป 10 มม. ในทิศทางบวก Y" + +msgid "Move selection 10mm in negative Y direction" +msgstr "ย้ายส่วนที่เลือกไป 10 มม. ในทิศทางลบ Y" + +msgid "Rotate selection 45 degrees counterclockwise" +msgstr "" + +msgid "Rotate selection 45 degrees clockwise" +msgstr "" + +msgid "Gizmo move" +msgstr "กิสโม่ย้าย" + +msgid "Gizmo rotate" +msgstr "กิสโม่หมุน" + +msgid "Gizmo scale" +msgstr "ขนาดกิสโม่" + +msgid "Gizmo place face on bed" +msgstr "กิสโมวางหน้าบนฐานพิมพ์" + +msgid "Gizmo cut" +msgstr "กิสโม่ตัด" + +msgid "Gizmo mesh boolean" +msgstr "Gizmo mesh บูลีน" + +msgid "Gizmo FDM paint-on supports" +msgstr "" + +msgid "Gizmo FDM paint-on seam" +msgstr "รอยตะเข็บทาสี Gizmo FDM" + +msgid "Gizmo FDM paint-on fuzzy skin" +msgstr "Gizmo FDM เพ้นท์ผิวฟัซซี" + +msgid "Gizmo multi-material painting" +msgstr "" + +msgid "Gizmo text emboss/engrave" +msgstr "ข้อความ Gizmo นูน/แกะสลัก" + +msgid "Gizmo measure" +msgstr "เครื่องวัดกิสโม่" + +msgid "Gizmo assemble" +msgstr "กิสโมประกอบ" + +msgid "Gizmo brim ears" +msgstr "Gizmo หูขอบยึดชิ้นงาน (Brim Ears)" + +msgid "Vertical slider - Move active thumb Up" +msgstr "แถบเลื่อนแนวตั้ง - เลื่อนนิ้วโป้งที่ใช้งานอยู่ขึ้น" + +msgid "Vertical slider - Move active thumb Down" +msgstr "แถบเลื่อนแนวตั้ง - เลื่อนนิ้วโป้งที่ใช้งานอยู่ลง" + +msgid "Horizontal slider - Move active thumb Left" +msgstr "แถบเลื่อนแนวนอน - เลื่อนนิ้วหัวแม่มือที่ใช้งานไปทางซ้าย" + +msgid "Horizontal slider - Move active thumb Right" +msgstr "แถบเลื่อนแนวนอน - เลื่อนนิ้วหัวแม่มือที่ใช้งานไปทางขวา" + +msgid "Horizontal slider - Move to start position" +msgstr "แถบเลื่อนแนวนอน - เลื่อนไปยังตำแหน่งเริ่มต้น" + +msgid "Horizontal slider - Move to last position" +msgstr "แถบเลื่อนแนวนอน - เลื่อนไปยังตำแหน่งสุดท้าย" + +msgid "Camera view - Default" +msgstr "มุมมองกล้อง - ค่าเริ่มต้น" + +msgid "Camera view - Top" +msgstr "มุมมองกล้อง - ด้านบน" + +msgid "Camera view - Bottom" +msgstr "มุมมองกล้อง - ด้านล่าง" + +msgid "Camera view - Front" +msgstr "มุมมองกล้อง - ด้านหน้า" + +msgid "Camera view - Behind" +msgstr "มุมมองกล้อง - ด้านหลัง" + +msgid "Camera Angle - Left side" +msgstr "มุมกล้อง - ด้านซ้าย" + +msgid "Camera Angle - Right side" +msgstr "มุมกล้อง - ด้านขวา" + +msgid "Camera view - Current plate" +msgstr "" + +msgid "Zoom in" +msgstr "ซูมเข้า" + +msgid "Zoom out" +msgstr "ซูมออก" + +msgid "Show/Hide 3Dconnexion devices settings dialog" +msgstr "แสดง/ซ่อนกล่องโต้ตอบการตั้งค่าอุปกรณ์ 3Dconnexion" + +msgid "Show/Hide wireframe" +msgstr "" + +msgid "On/Off G-code window" +msgstr "เปิด/ปิดหน้าต่างรหัส G" + +msgid "On/Off one layer mode of the vertical slider" +msgstr "เปิด/ปิดโหมดเลเยอร์เดียวของแถบเลื่อนแนวตั้ง" + +msgid "Switch between Prepare/Preview" +msgstr "สลับระหว่างการเตรียม/ดูตัวอย่าง" + +msgid "Collapse/Expand the sidebar" +msgstr "ยุบ/ขยายแถบด้านข้าง" + +msgid "Open the speed dial" +msgstr "" + +msgid "Reload the device page" +msgstr "" + +msgid "Show keyboard shortcuts list" +msgstr "แสดงรายการแป้นพิมพ์ลัด" + +msgid "Slicing and printing" +msgstr "" + +msgid "Editing" +msgstr "" + +msgid "Placement" +msgstr "" + +msgid "Gizmos" +msgstr "" + +msgid "Sliders" +msgstr "" + +msgid "Painting tools" +msgstr "" + +msgid "Application" +msgstr "" + #: resources/data/hints.ini: [hint:Precise wall] msgid "" "Precise wall\n" @@ -24540,6 +24698,62 @@ msgstr "" "หลีกเลี่ยงการบิดเบี้ยว\n" "คุณรู้หรือไม่ว่าเมื่อพิมพ์วัสดุที่มีแนวโน้มที่จะเกิดการบิดเบี้ยว เช่น ABS การเพิ่มอุณหภูมิฐานพิมพ์อย่างเหมาะสมสามารถลดความน่าจะเป็นของการบิดเบี้ยวได้" +#~ msgid "Tab" +#~ msgstr "แท็บ" + +#~ msgid "Displays current viewport FPS in the top-right corner." +#~ msgstr "แสดงวิวพอร์ต FPS ปัจจุบันที่มุมขวาบน" + +# AI Translated +#~ msgid "Publish 3MF Wiki" +#~ msgstr "วิกิการเผยแพร่ 3MF" + +# AI Translated +#~ msgid "Publish 3MF Video Guide" +#~ msgstr "คู่มือวีดีโอการเผยแพร่ 3MF" + +#~ msgid "Toolbar" +#~ msgstr "แถบเครื่องมือ" + +#~ msgid "Switch table page" +#~ msgstr "สลับหน้าตาราง" + +#~ msgid "Global shortcuts" +#~ msgstr "ทางลัดทั่วโลก" + +#~ msgid "Middle mouse button" +#~ msgstr "ปุ่มกลางของเมาส์" + +#~ msgid "Auto orients selected objects or all objects. If there are selected objects, it just orients the selected ones. Otherwise, it will orient all objects in the current project." +#~ msgstr "ปรับทิศทางวัตถุที่เลือกหรือวัตถุทั้งหมดโดยอัตโนมัติ หากมีวัตถุที่เลือกไว้ วัตถุนั้นจะปรับทิศทางวัตถุที่เลือกเท่านั้น มิฉะนั้นจะวางแนววัตถุทั้งหมดในโปรเจ็กต์ปัจจุบัน" + +#~ msgid "Auto orients all objects on the active plate." +#~ msgstr "ปรับทิศทางวัตถุทั้งหมดบนเพลตที่ใช้งานอยู่โดยอัตโนมัติ" + +#~ msgid "Any arrow" +#~ msgstr "ลูกศรอะไรก็ได้" + +#~ msgid "Gizmo SLA support points" +#~ msgstr "จุดส่วนรองรับ Gizmo SLA" + +#~ msgid "Plater" +#~ msgstr "เพลเตอร์" + +#~ msgid "Gizmo" +#~ msgstr "กิสโม่" + +#~ msgid "Delete objects, parts, modifiers" +#~ msgstr "ลบวัตถุ ชิ้นส่วน ตัวดัดแปลง" + +#~ msgid "Objects List" +#~ msgstr "รายการวัตถุ" + +#~ msgid "G-code written at the very top of the output file, before any other content. Useful for adding metadata that printer firmware reads from the first lines of the file (e.g. estimated print time, filament usage). Supports placeholders like {print_time_sec} and {used_filament_length}." +#~ msgstr "G-code เขียนไว้ที่ด้านบนสุดของไฟล์เอาต์พุต ก่อนเนื้อหาอื่นๆ มีประโยชน์สำหรับการเพิ่มข้อมูลเมตาที่เฟิร์มแวร์เครื่องพิมพ์อ่านจากบรรทัดแรกของไฟล์ (เช่น เวลาในการพิมพ์โดยประมาณ การใช้เส้นพลาสติก) รองรับตัวยึดตำแหน่ง เช่น {print_time_sec} และ {used_filament_length}" + +#~ msgid "Print time (seconds)" +#~ msgstr "เวลาในการพิมพ์ (วินาที)" + # AI Translated #~ msgid "Open actions speed dial" #~ msgstr "เปิดสปีดไดอัลการดำเนินการ" diff --git a/localization/i18n/tr/OrcaSlicer_tr.po b/localization/i18n/tr/OrcaSlicer_tr.po index 91c5660328..34bee95de3 100644 --- a/localization/i18n/tr/OrcaSlicer_tr.po +++ b/localization/i18n/tr/OrcaSlicer_tr.po @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-09-18 15:50+0800\n" +"POT-Creation-Date: 2026-09-22 12:39+0800\n" "PO-Revision-Date: 2026-08-21 23:18+0300\n" "Last-Translator: GlauTech\n" "Language-Team: \n" @@ -5967,12 +5967,15 @@ msgctxt "Camera View" msgid "Right" msgstr "Sağ" -msgid "Add" -msgstr "Ekle" - msgid "Add plate" msgstr "Plaka ekle" +msgid "Split to objects" +msgstr "Nesnelere böl" + +msgid "Add" +msgstr "Ekle" + msgid "Auto orient all/selected objects" msgstr "Otomatik yönlendir tüm/seçili nesneler" @@ -5985,9 +5988,6 @@ msgstr "Tüm nesneleri hizala" msgid "Arrange objects on selected plates" msgstr "Seçilen plakalardaki nesneleri hizala" -msgid "Split to objects" -msgstr "Nesnelere böl" - msgid "Assembly View" msgstr "Montaj görünümü" @@ -6044,6 +6044,9 @@ msgstr "Taslak" msgid "Wireframe" msgstr "Wireframe" +msgid "X-Ray" +msgstr "" + # AI Translated msgid "Realistic View" msgstr "Gerçekçi Görünüm" @@ -6585,7 +6588,7 @@ msgstr "3D sahnede seçilen nesnenin etrafındaki ana hatları göster." msgid "Preferences" msgstr "Tercihler" -msgid "Open speed dial..." +msgid "Open speed dial" msgstr "" # AI Translated @@ -8409,10 +8412,6 @@ msgstr "Kenar çubuğunu genişlet" msgid "Collapse sidebar" msgstr "Kenar çubuğunu daralt" -# AI Translated -msgid "Tab" -msgstr "Sekme" - #, c-format, boost-format msgid "Loading file: %s" msgstr "Dosya yükleniyor: %s" @@ -9444,10 +9443,10 @@ msgstr "Çoklu cihaz yönetimi" msgid "With this option enabled, you can send a task to multiple devices at the same time and manage multiple devices." msgstr "Bu seçenek etkinleştirildiğinde, aynı anda birden fazla cihaza bir görev gönderebilir ve birden fazla cihazı yönetebilirsiniz." -msgid "Open the Speed Dial with the Space key" +msgid "Open the Speed Dial from the keyboard" msgstr "" -msgid "When enabled, pressing Space (with no other key held) opens the Speed Dial action search from any page." +msgid "When enabled, the Speed Dial keyboard shortcut (Space by default) opens the action search from any page." msgstr "" msgid "Recent actions" @@ -9586,6 +9585,15 @@ msgstr "Sağ fare sürükleme" msgid "Set the action that dragging the right mouse button should perform." msgstr "Sağ fare düğmesiyle sürüklemenin gerçekleştireceği eylemi ayarlayın." +msgid "Keyboard" +msgstr "" + +msgid "Keyboard shortcuts" +msgstr "" + +msgid "Choose the key for each action." +msgstr "" + msgid "Clear my choice on..." msgstr "Seçimimi Temizle" @@ -9710,13 +9718,40 @@ msgstr "" "GPU yükünü ve güç tüketimini azaltmak için görünüm penceresinin kare hızını sınırlar.\n" "Sınırsız kare hızı için 0 olarak ayarlayın." +msgid "Reuse the 3D scene while idle" +msgstr "" + +msgid "" +"Skips redrawing the 3D scene when only the mouse cursor moves over the viewport,\n" +"and reuses the previous frame's scene instead. Reduces GPU load.\n" +"Disable it if the viewport shows stale or missing contents.\n" +"\n" +"Takes effect immediately." +msgstr "" + +msgid "Skip unchanged frames" +msgstr "" + +msgid "" +"Skips drawing a frame altogether when it would be identical to the one already on screen.\n" +"Only applies to frames that reuse the 3D scene, so it needs Reuse the 3D scene while idle.\n" +"Disable it if a hover highlight, tooltip or animation stops updating.\n" +"\n" +"Takes effect immediately." +msgstr "" + # AI Translated msgid "Show FPS overlay" msgstr "FPS göstergesini göster" -# AI Translated -msgid "Displays current viewport FPS in the top-right corner." -msgstr "Geçerli görünüm penceresinin FPS değerini sağ üst köşede gösterir." +msgid "Displays rendering counts in the top-right corner of the viewport." +msgstr "" + +msgid "FPS: frames presented to the screen per second." +msgstr "" + +msgid "3D: frames per second that redrew the 3D scene." +msgstr "" # AI Translated msgid "G-code Preview" @@ -10192,13 +10227,8 @@ msgstr "3MF Yayınla..." msgid "Select which settings to be published in the 3MF file" msgstr "3MF dosyasında hangi ayarların yayınlanacağını seçin" -# AI Translated -msgid "Publish 3MF Wiki" -msgstr "3MF Yayınlama Wiki" - -# AI Translated -msgid "Publish 3MF Video Guide" -msgstr "3MF Yayınlama Video Kılavuzu" +msgid "Video Guide" +msgstr "" # AI Translated msgid "Mixed filament - published as a whole when \"Enable\" above is selected" @@ -10400,6 +10430,13 @@ msgstr "" msgid "No wiki page for this action" msgstr "" +msgid "Show details" +msgstr "Ayrıntıları göster" + +# AI Translated +msgid "Hide details" +msgstr "Ayrıntıları gizle" + #, c-format, boost-format msgid "\"%s\" is a Developer setting. Enable Developer mode to edit it?" msgstr "" @@ -12274,68 +12311,39 @@ msgstr "Yapılandırma paketi önceki Yapılandırma Kılavuzu'nda değiştirild msgid "Configuration package changed" msgstr "Yapılandırma paketi değiştirildi" -msgid "Toolbar" -msgstr "Araç Çubuğu" - -msgid "Objects list" -msgstr "Nesne listesi" - -msgid "Import geometry data from STL/STEP/3MF/OBJ/AMF files" -msgstr "STL/STEP/3MF/OBJ/AMF dosyalarından geometri verilerini içe aktarın" - -msgid "Paste from clipboard" -msgstr "Panodan yapıştır" - -msgid "Show/Hide 3Dconnexion devices settings dialog" -msgstr "3Dconnexion cihazları ayarları iletişim kutusunu Göster/Gizle" - -msgid "Switch table page" -msgstr "Tablo sayfasını değiştir" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Space" -msgstr "Boşluk" - -msgid "Open speed dial" -msgstr "" - -msgid "Run a Speed Dial favourite (while the Speed Dial is open)" -msgstr "" - -msgid "Show keyboard shortcuts list" -msgstr "Klavye kısayolları listesini göster" - -msgid "Global shortcuts" -msgstr "Genel kısayollar" - msgid "Pan View" msgstr "Pan Görünümü" msgid "Rotate View" msgstr "Görüntüyü döndür" +#, c-format, boost-format +msgid "Use %s or %s, or a key that does not type a character." +msgstr "" + +msgctxt "Keyboard Shortcut" +msgid "Key" +msgstr "" + +msgid "Left mouse" +msgstr "" + +msgid "Available anywhere in the window, even while typing in a text field." +msgstr "" + +msgid "Run a speed dial favorite while the dial is open" +msgstr "" + # AI Translated -msgid "Middle mouse button" -msgstr "Orta fare düğmesi" +msgctxt "Keyboard Shortcut" +msgid "Tab" +msgstr "Tab" -msgid "Zoom View" -msgstr "Zoom Görünümü" +msgid "Switch to the next main tab" +msgstr "" -msgid "Auto orients selected objects or all objects. If there are selected objects, it just orients the selected ones. Otherwise, it will orient all objects in the current project." -msgstr "Seçilen nesneleri veya tüm nesneleri otomatik olarak yönlendirir. Seçilen nesneler varsa, yalnızca seçilenleri yönlendirir. Aksi takdirde mevcut projedeki tüm nesneler yönlendirilecektir." - -msgid "Auto orients all objects on the active plate." -msgstr "Aktif plakadaki tüm nesneleri otomatik olarak yönlendirir." - -msgid "Collapse/Expand the sidebar" -msgstr "Kenar çubuğunu daralt/genişlet" - -msgid "Any arrow" -msgstr "Herhangi bir ok" - -msgid "Movement in camera space" -msgstr "Kamera alanında hareket" +msgid "Available while the 3D view on the Prepare tab has focus." +msgstr "" msgid "Select a part" msgstr "Parça seçin" @@ -12346,127 +12354,29 @@ msgstr "Birden fazla nesne seç" msgid "Select objects by rectangle" msgstr "Nesneleri dikdörtgene göre seç" -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Arrow Up" -msgstr "Yukarı Ok" - -msgid "Move selection 10mm in positive Y direction" -msgstr "Seçimi pozitif Y yönünde 10 mm taşı" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Arrow Down" -msgstr "Aşağı Ok" - -msgid "Move selection 10mm in negative Y direction" -msgstr "Seçimi negatif Y yönünde 10 mm taşı" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Arrow Left" -msgstr "Sol Ok" - -msgid "Move selection 10mm in negative X direction" -msgstr "Seçimi negatif X yönünde 10 mm taşı" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Arrow Right" -msgstr "Sağ Ok" - -msgid "Move selection 10mm in positive X direction" -msgstr "Seçimi pozitif X yönünde 10 mm taşı" +msgid "Keyboard 1-9: set filament for object/part" +msgstr "Klavye 1-9: nesneye/parçaya filament ata" msgid "Movement step set to 1mm" msgstr "Hareket adımı 1 mm'ye ayarlandı" -msgid "Keyboard 1-9: set filament for object/part" -msgstr "Klavye 1-9: nesneye/parçaya filament ata" +msgid "Movement in camera space" +msgstr "Kamera alanında hareket" -msgid "Camera view - Default" -msgstr "Kamera görünümü - Varsayılan" +msgid "Middle mouse" +msgstr "" -msgid "Camera view - Top" -msgstr "Kamera görünümü - Üst" +msgid "Right mouse" +msgstr "" -msgid "Camera view - Bottom" -msgstr "Kamera görünümü - Alt" +msgid "Zoom View" +msgstr "Zoom Görünümü" -msgid "Camera view - Front" -msgstr "Kamera görünümü - Ön" +msgid "Painting" +msgstr "" -msgid "Camera view - Behind" -msgstr "Kamera görünümü - Arka" - -msgid "Camera Angle - Left side" -msgstr "Kamera Açısı - Sol" - -msgid "Camera Angle - Right side" -msgstr "Kamera Açısı - Sağ" - -msgid "Select all objects" -msgstr "Tüm nesneleri seç" - -msgid "Gizmo move" -msgstr "Gizmo hareket" - -msgid "Gizmo rotate" -msgstr "Gizmo döndürme" - -msgid "Gizmo scale" -msgstr "Gizmo ölçek" - -msgid "Gizmo place face on bed" -msgstr "Gizmo yüzünüzü yatağa yerleştirin" - -msgid "Gizmo cut" -msgstr "Gizmo kesim" - -msgid "Gizmo mesh boolean" -msgstr "Gizmo mesh bölme" - -msgid "Gizmo FDM paint-on fuzzy skin" -msgstr "Gizmo FDM boyama ile uygulanan pütürlü yüzey" - -msgid "Gizmo SLA support points" -msgstr "Gizmo SLA destek noktaları" - -msgid "Gizmo FDM paint-on seam" -msgstr "Gizmo FDM boyalı dikiş" - -msgid "Gizmo text emboss/engrave" -msgstr "Gizmo metin kabartma/kazıma" - -msgid "Gizmo measure" -msgstr "Gizmo ölçüm" - -msgid "Gizmo assemble" -msgstr "Gizmo birleştir" - -msgid "Gizmo brim ears" -msgstr "Gizmo lenarlık kulakları" - -msgid "Zoom in" -msgstr "Yakınlaştır" - -msgid "Zoom out" -msgstr "Uzaklaştır" - -# AI Translated -msgid "Toggle printable for object/part" -msgstr "Nesne/parça için yazdırılabilirliği aç/kapat" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Tab" -msgstr "Tab" - -msgid "Switch between Prepare/Preview" -msgstr "Hazırlama/Önizleme arasında geçiş yap" - -msgid "Plater" -msgstr "Plakacı" +msgid "Available while a painting gizmo is open: supports, seam, fuzzy skin or color painting." +msgstr "" msgid "Move: press to snap by 1mm" msgstr "Hareket Ettir: 1 mm kadar yaslamak için basın" @@ -12477,15 +12387,19 @@ msgstr "Destek/Renkli Boyama: kalem yarıçapını ayarlayın" msgid "Support/Color Painting: adjust section position" msgstr "Destek/Renkli Boyama: bölüm konumunu ayarlayın" -# AI Translated -msgid "Gizmo" -msgstr "Gizmo" +msgid "Objects list" +msgstr "Nesne listesi" + +msgid "Available while the object list has focus." +msgstr "" msgid "Set extruder number for the objects and parts" msgstr "Nesneler ve parçalar için ekstruder numarasını ayarlayın" -msgid "Delete objects, parts, modifiers" -msgstr "Nesneleri, parçaları, değiştiricileri silin" +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Space" +msgstr "Boşluk" msgid "Select the object/part and press space to change the name" msgstr "Nesneyi/parçayı seçin ve adını değiştirmek için boşluk tuşuna basın" @@ -12496,45 +12410,48 @@ msgstr "Fare tıklaması" msgid "Select the object/part and mouse click to change the name" msgstr "Nesneyi/parçayı seçin ve adını değiştirmek için fareye tıklayın" -msgid "Objects List" -msgstr "Nesne Listesi" - -msgid "Vertical slider - Move active thumb Up" -msgstr "Dikey kaydırıcı - Etkin başparmağı yukarı hareket ettir" - -msgid "Vertical slider - Move active thumb Down" -msgstr "Dikey kaydırıcı - Etkin başparmağı Aşağı hareket ettir" - -msgid "Horizontal slider - Move active thumb Left" -msgstr "Yatay kaydırıcı - Etkin başparmağı sola taşı" - -msgid "Horizontal slider - Move active thumb Right" -msgstr "Yatay kaydırıcı - Etkin başparmağı sağa taşı" - -msgid "On/Off one layer mode of the vertical slider" -msgstr "Dikey kaydırıcının tek katman modunu açma/kapama" - -msgid "On/Off G-code window" -msgstr "G-code penceresini aç/kapat" +msgid "Available while the 3D view on the Preview tab has focus." +msgstr "" msgid "Move slider 5x faster" msgstr "Kaydırıcıyı 5 kat daha hızlı hareket ettirin" -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Home" -msgstr "Home" +msgid "Scroll slider 5x faster" +msgstr "" -msgid "Horizontal slider - Move to start position" -msgstr "Yatay kaydırıcı - Başlangıç konumuna taşıyın" +msgid "Not customizable" +msgstr "" -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "End" -msgstr "End" +#, c-format, boost-format +msgid "%s is assigned to %s. Reassign it to %s?" +msgstr "" -msgid "Horizontal slider - Move to last position" -msgstr "Yatay kaydırıcı - Son konuma git" +#, c-format, boost-format +msgid "The default %s is assigned to %s. Reassign it to %s?" +msgstr "" + +msgid "Global shortcuts also apply while typing." +msgstr "" + +msgid "A key that types a character cannot be a global shortcut." +msgstr "" + +msgid "Esc cancels, Enter confirms." +msgstr "" + +#, c-format, boost-format +msgid "" +"Press the new shortcut for\n" +"\"%s\"" +msgstr "" + +#, c-format, boost-format +msgid "Already used as a step of %s." +msgstr "" + +#, c-format, boost-format +msgid "Already assigned to %s. Press OK to reassign it." +msgstr "" msgid "Release Note" msgstr "Sürüm notu" @@ -17528,8 +17445,8 @@ msgstr "Ön ısıtma adımları" msgid "Insert multiple preheat commands (e.g. M104.1). Only useful for Prusa XL. For other printers, please set it to 1." msgstr "Birden fazla ön ısıtma komutu ekleyin (örn. M104.1). Yalnızca Prusa XL için kullanışlıdır. Diğer yazıcılar için lütfen 1’e ayarlayın." -msgid "G-code written at the very top of the output file, before any other content. Useful for adding metadata that printer firmware reads from the first lines of the file (e.g. estimated print time, filament usage). Supports placeholders like {print_time_sec} and {used_filament_length}." -msgstr "G-code, çıktı dosyasının en üstünde, diğer içeriklerden önce yazılır. Yazıcı ürün yazılımının dosyanın ilk satırlarından okuduğu meta verileri (ör. tahmini yazdırma süresi, filament kullanımı) eklemek için kullanışlıdır. {print_time_sec} ve {used_filament_length} gibi yer tutucuları destekler." +msgid "G-code written at the very top of the output file, before any other content. Useful for adding metadata that printer firmware reads from the first lines of the file (e.g. estimated print time, filament usage). Supports placeholders like {print_time_total_sec}, {print_time_day}, {print_time_hour}, {print_time_minute}, {print_time_sec} and {used_filament_length}." +msgstr "" msgid "Start G-code" msgstr "Başlangıç G-code" @@ -19087,12 +19004,36 @@ msgstr "Kullanılan" msgid "Total length of filament used in the print." msgstr "Baskıda kullanılan filamentin toplam uzunluğu." -msgid "Print time (seconds)" -msgstr "Yazdırma süresi (saniye)" +msgid "Print time (total seconds)" +msgstr "" msgid "Total estimated print time in seconds. Replaced with actual value during post-processing." msgstr "Saniye cinsinden toplam tahmini yazdırma süresi. Son işlem sırasında gerçek değerle değiştirilir." +msgid "Print time (days component)" +msgstr "" + +msgid "Estimated print time day component (normal mode). Replaced with actual value during post-processing." +msgstr "" + +msgid "Print time (hours component)" +msgstr "" + +msgid "Estimated print time hour component (normal mode). Replaced with actual value during post-processing." +msgstr "" + +msgid "Print time (minutes component)" +msgstr "" + +msgid "Estimated print time minute component (normal mode). Replaced with actual value during post-processing." +msgstr "" + +msgid "Print time (seconds component)" +msgstr "" + +msgid "Estimated print time second component (normal mode). Replaced with actual value during post-processing." +msgstr "" + msgid "Filament length (meters)" msgstr "Filament uzunluğu (metre)" @@ -20965,6 +20906,9 @@ msgstr "Geçerli oturum algılanmadı. 3DPrinterOS'a giriş yapılsın mı?" msgid "Success!" msgstr "Başarılı!" +msgid "Generate API Key" +msgstr "" + msgid "Are you sure to log out?" msgstr "Çıkış yaptığınızdan emin misiniz?" @@ -22018,13 +21962,6 @@ msgstr "Bulut özellikleri, yazıcı keşfi ve uzaktan yazdırma için Bambu Ağ msgid "Error: %s" msgstr "Hata: %s" -msgid "Show details" -msgstr "Ayrıntıları göster" - -# AI Translated -msgid "Hide details" -msgstr "Ayrıntıları gizle" - msgid "Version to install:" msgstr "Yüklenecek sürüm:" @@ -24681,6 +24618,12 @@ msgstr "" msgid "No binding for that field" msgstr "" +msgid "Enter a number" +msgstr "" + +msgid "Not a number" +msgstr "" + msgid "Primitive" msgstr "" @@ -24693,6 +24636,217 @@ msgstr "" msgid "Clear All" msgstr "" +msgctxt "Keyboard Shortcut" +msgid "Ins" +msgstr "" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Home" +msgstr "Home" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "End" +msgstr "End" + +msgctxt "Keyboard Shortcut" +msgid "PgUp" +msgstr "" + +msgctxt "Keyboard Shortcut" +msgid "PgDn" +msgstr "" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Arrow Left" +msgstr "Sol Ok" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Arrow Right" +msgstr "Sağ Ok" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Arrow Up" +msgstr "Yukarı Ok" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Arrow Down" +msgstr "Aşağı Ok" + +msgid "Import geometry data from STL/STEP/3MF/OBJ/AMF files" +msgstr "STL/STEP/3MF/OBJ/AMF dosyalarından geometri verilerini içe aktarın" + +msgid "Select all objects" +msgstr "Tüm nesneleri seç" + +msgid "Paste from clipboard" +msgstr "Panodan yapıştır" + +# AI Translated +msgid "Toggle printable for object/part" +msgstr "Nesne/parça için yazdırılabilirliği aç/kapat" + +msgid "Move selection 10mm in negative X direction" +msgstr "Seçimi negatif X yönünde 10 mm taşı" + +msgid "Move selection 10mm in positive X direction" +msgstr "Seçimi pozitif X yönünde 10 mm taşı" + +msgid "Move selection 10mm in positive Y direction" +msgstr "Seçimi pozitif Y yönünde 10 mm taşı" + +msgid "Move selection 10mm in negative Y direction" +msgstr "Seçimi negatif Y yönünde 10 mm taşı" + +msgid "Rotate selection 45 degrees counterclockwise" +msgstr "" + +msgid "Rotate selection 45 degrees clockwise" +msgstr "" + +msgid "Gizmo move" +msgstr "Gizmo hareket" + +msgid "Gizmo rotate" +msgstr "Gizmo döndürme" + +msgid "Gizmo scale" +msgstr "Gizmo ölçek" + +msgid "Gizmo place face on bed" +msgstr "Gizmo yüzünüzü yatağa yerleştirin" + +msgid "Gizmo cut" +msgstr "Gizmo kesim" + +msgid "Gizmo mesh boolean" +msgstr "Gizmo mesh bölme" + +msgid "Gizmo FDM paint-on supports" +msgstr "" + +msgid "Gizmo FDM paint-on seam" +msgstr "Gizmo FDM boyalı dikiş" + +msgid "Gizmo FDM paint-on fuzzy skin" +msgstr "Gizmo FDM boyama ile uygulanan pütürlü yüzey" + +msgid "Gizmo multi-material painting" +msgstr "" + +msgid "Gizmo text emboss/engrave" +msgstr "Gizmo metin kabartma/kazıma" + +msgid "Gizmo measure" +msgstr "Gizmo ölçüm" + +msgid "Gizmo assemble" +msgstr "Gizmo birleştir" + +msgid "Gizmo brim ears" +msgstr "Gizmo lenarlık kulakları" + +msgid "Vertical slider - Move active thumb Up" +msgstr "Dikey kaydırıcı - Etkin başparmağı yukarı hareket ettir" + +msgid "Vertical slider - Move active thumb Down" +msgstr "Dikey kaydırıcı - Etkin başparmağı Aşağı hareket ettir" + +msgid "Horizontal slider - Move active thumb Left" +msgstr "Yatay kaydırıcı - Etkin başparmağı sola taşı" + +msgid "Horizontal slider - Move active thumb Right" +msgstr "Yatay kaydırıcı - Etkin başparmağı sağa taşı" + +msgid "Horizontal slider - Move to start position" +msgstr "Yatay kaydırıcı - Başlangıç konumuna taşıyın" + +msgid "Horizontal slider - Move to last position" +msgstr "Yatay kaydırıcı - Son konuma git" + +msgid "Camera view - Default" +msgstr "Kamera görünümü - Varsayılan" + +msgid "Camera view - Top" +msgstr "Kamera görünümü - Üst" + +msgid "Camera view - Bottom" +msgstr "Kamera görünümü - Alt" + +msgid "Camera view - Front" +msgstr "Kamera görünümü - Ön" + +msgid "Camera view - Behind" +msgstr "Kamera görünümü - Arka" + +msgid "Camera Angle - Left side" +msgstr "Kamera Açısı - Sol" + +msgid "Camera Angle - Right side" +msgstr "Kamera Açısı - Sağ" + +msgid "Camera view - Current plate" +msgstr "" + +msgid "Zoom in" +msgstr "Yakınlaştır" + +msgid "Zoom out" +msgstr "Uzaklaştır" + +msgid "Show/Hide 3Dconnexion devices settings dialog" +msgstr "3Dconnexion cihazları ayarları iletişim kutusunu Göster/Gizle" + +msgid "Show/Hide wireframe" +msgstr "" + +msgid "On/Off G-code window" +msgstr "G-code penceresini aç/kapat" + +msgid "On/Off one layer mode of the vertical slider" +msgstr "Dikey kaydırıcının tek katman modunu açma/kapama" + +msgid "Switch between Prepare/Preview" +msgstr "Hazırlama/Önizleme arasında geçiş yap" + +msgid "Collapse/Expand the sidebar" +msgstr "Kenar çubuğunu daralt/genişlet" + +msgid "Open the speed dial" +msgstr "" + +msgid "Reload the device page" +msgstr "" + +msgid "Show keyboard shortcuts list" +msgstr "Klavye kısayolları listesini göster" + +msgid "Slicing and printing" +msgstr "" + +msgid "Editing" +msgstr "" + +msgid "Placement" +msgstr "" + +msgid "Gizmos" +msgstr "" + +msgid "Sliders" +msgstr "" + +msgid "Painting tools" +msgstr "" + +msgid "Application" +msgstr "" + #: resources/data/hints.ini: [hint:Precise wall] msgid "" "Precise wall\n" @@ -24995,6 +25149,66 @@ msgstr "" "Eğilmeyi önleyin\n" "ABS gibi bükülmeye yatkın malzemelere baskı yaparken, ısıtma yatağı sıcaklığının uygun şekilde arttırılmasının bükülme olasılığını azaltabileceğini biliyor muydunuz?" +# AI Translated +#~ msgid "Tab" +#~ msgstr "Sekme" + +# AI Translated +#~ msgid "Displays current viewport FPS in the top-right corner." +#~ msgstr "Geçerli görünüm penceresinin FPS değerini sağ üst köşede gösterir." + +# AI Translated +#~ msgid "Publish 3MF Wiki" +#~ msgstr "3MF Yayınlama Wiki" + +# AI Translated +#~ msgid "Publish 3MF Video Guide" +#~ msgstr "3MF Yayınlama Video Kılavuzu" + +#~ msgid "Toolbar" +#~ msgstr "Araç Çubuğu" + +#~ msgid "Switch table page" +#~ msgstr "Tablo sayfasını değiştir" + +#~ msgid "Global shortcuts" +#~ msgstr "Genel kısayollar" + +# AI Translated +#~ msgid "Middle mouse button" +#~ msgstr "Orta fare düğmesi" + +#~ msgid "Auto orients selected objects or all objects. If there are selected objects, it just orients the selected ones. Otherwise, it will orient all objects in the current project." +#~ msgstr "Seçilen nesneleri veya tüm nesneleri otomatik olarak yönlendirir. Seçilen nesneler varsa, yalnızca seçilenleri yönlendirir. Aksi takdirde mevcut projedeki tüm nesneler yönlendirilecektir." + +#~ msgid "Auto orients all objects on the active plate." +#~ msgstr "Aktif plakadaki tüm nesneleri otomatik olarak yönlendirir." + +#~ msgid "Any arrow" +#~ msgstr "Herhangi bir ok" + +#~ msgid "Gizmo SLA support points" +#~ msgstr "Gizmo SLA destek noktaları" + +#~ msgid "Plater" +#~ msgstr "Plakacı" + +# AI Translated +#~ msgid "Gizmo" +#~ msgstr "Gizmo" + +#~ msgid "Delete objects, parts, modifiers" +#~ msgstr "Nesneleri, parçaları, değiştiricileri silin" + +#~ msgid "Objects List" +#~ msgstr "Nesne Listesi" + +#~ msgid "G-code written at the very top of the output file, before any other content. Useful for adding metadata that printer firmware reads from the first lines of the file (e.g. estimated print time, filament usage). Supports placeholders like {print_time_sec} and {used_filament_length}." +#~ msgstr "G-code, çıktı dosyasının en üstünde, diğer içeriklerden önce yazılır. Yazıcı ürün yazılımının dosyanın ilk satırlarından okuduğu meta verileri (ör. tahmini yazdırma süresi, filament kullanımı) eklemek için kullanışlıdır. {print_time_sec} ve {used_filament_length} gibi yer tutucuları destekler." + +#~ msgid "Print time (seconds)" +#~ msgstr "Yazdırma süresi (saniye)" + # AI Translated #~ msgid "Open actions speed dial" #~ msgstr "Eylem hızlı erişim menüsünü aç" diff --git a/localization/i18n/uk/OrcaSlicer_uk.po b/localization/i18n/uk/OrcaSlicer_uk.po index ffa055a2ff..20de6f7523 100644 --- a/localization/i18n/uk/OrcaSlicer_uk.po +++ b/localization/i18n/uk/OrcaSlicer_uk.po @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: orcaslicerua\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-09-18 15:50+0800\n" +"POT-Creation-Date: 2026-09-22 12:39+0800\n" "PO-Revision-Date: 2026-07-17 16:25+0300\n" "Last-Translator: Andrij Mizyk \n" "Language-Team: Ukrainian\n" @@ -5926,12 +5926,15 @@ msgctxt "Camera View" msgid "Right" msgstr "Право" -msgid "Add" -msgstr "Додати" - msgid "Add plate" msgstr "Додати пластину" +msgid "Split to objects" +msgstr "Розділити на обʼєкти" + +msgid "Add" +msgstr "Додати" + msgid "Auto orient all/selected objects" msgstr "Автоорієнтація всі/вибрані обʼєкти" @@ -5944,9 +5947,6 @@ msgstr "Впорядкувати всі обʼєкти" msgid "Arrange objects on selected plates" msgstr "Впорядкувати обʼєкти на вибраних пластинах" -msgid "Split to objects" -msgstr "Розділити на обʼєкти" - msgid "Assembly View" msgstr "Вигляд збирання" @@ -6002,6 +6002,9 @@ msgstr "Контур" msgid "Wireframe" msgstr "Каркас" +msgid "X-Ray" +msgstr "" + msgid "Realistic View" msgstr "Реалістичний вигляд" @@ -6554,7 +6557,7 @@ msgstr "Показувати контур навколо виділеного о msgid "Preferences" msgstr "Налаштування" -msgid "Open speed dial..." +msgid "Open speed dial" msgstr "" # AI Translated @@ -8411,9 +8414,6 @@ msgstr "Розгорнути бічну панель" msgid "Collapse sidebar" msgstr "Згорнути бічну панель" -msgid "Tab" -msgstr "Табуляції" - #, c-format, boost-format msgid "Loading file: %s" msgstr "Завантаження файлу: %s" @@ -9462,10 +9462,10 @@ msgstr "Керування кількома пристроями" msgid "With this option enabled, you can send a task to multiple devices at the same time and manage multiple devices." msgstr "З цією опцією ввімкненою, ви можете відправляти завдання на кілька пристроїв одночасно та керувати декількома пристроями." -msgid "Open the Speed Dial with the Space key" +msgid "Open the Speed Dial from the keyboard" msgstr "" -msgid "When enabled, pressing Space (with no other key held) opens the Speed Dial action search from any page." +msgid "When enabled, the Speed Dial keyboard shortcut (Space by default) opens the action search from any page." msgstr "" msgid "Recent actions" @@ -9609,6 +9609,15 @@ msgstr "Перетягування правою кнопкою миші" msgid "Set the action that dragging the right mouse button should perform." msgstr "Задає дію, яку має виконувати перетягування правою кнопкою миші." +msgid "Keyboard" +msgstr "" + +msgid "Keyboard shortcuts" +msgstr "" + +msgid "Choose the key for each action." +msgstr "" + # AI Translated msgid "Clear my choice on..." msgstr "Очистити мій вибір для..." @@ -9723,13 +9732,40 @@ msgstr "" "Обмежує частоту кадрів вікна перегляду, щоб зменшити навантаження на GPU та енергоспоживання.\n" "Встановіть 0 для необмеженої частоти кадрів." +msgid "Reuse the 3D scene while idle" +msgstr "" + +msgid "" +"Skips redrawing the 3D scene when only the mouse cursor moves over the viewport,\n" +"and reuses the previous frame's scene instead. Reduces GPU load.\n" +"Disable it if the viewport shows stale or missing contents.\n" +"\n" +"Takes effect immediately." +msgstr "" + +msgid "Skip unchanged frames" +msgstr "" + +msgid "" +"Skips drawing a frame altogether when it would be identical to the one already on screen.\n" +"Only applies to frames that reuse the 3D scene, so it needs Reuse the 3D scene while idle.\n" +"Disable it if a hover highlight, tooltip or animation stops updating.\n" +"\n" +"Takes effect immediately." +msgstr "" + # AI Translated msgid "Show FPS overlay" msgstr "Показувати накладку FPS" -# AI Translated -msgid "Displays current viewport FPS in the top-right corner." -msgstr "Показує поточний FPS вікна перегляду у верхньому правому куті." +msgid "Displays rendering counts in the top-right corner of the viewport." +msgstr "" + +msgid "FPS: frames presented to the screen per second." +msgstr "" + +msgid "3D: frames per second that redrew the 3D scene." +msgstr "" # AI Translated msgid "G-code Preview" @@ -10195,13 +10231,8 @@ msgstr "Публікувати 3MF..." msgid "Select which settings to be published in the 3MF file" msgstr "Виберіть, які налаштування буде опубліковано у файлі 3MF" -# AI Translated -msgid "Publish 3MF Wiki" -msgstr "Енциклопедія з публікації 3MF" - -# AI Translated -msgid "Publish 3MF Video Guide" -msgstr "Відеопосібник з публікації 3MF" +msgid "Video Guide" +msgstr "" # AI Translated msgid "Mixed filament - published as a whole when \"Enable\" above is selected" @@ -10404,6 +10435,13 @@ msgstr "" msgid "No wiki page for this action" msgstr "" +msgid "Show details" +msgstr "Показати подробиці" + +# AI Translated +msgid "Hide details" +msgstr "Сховати подробиці" + #, c-format, boost-format msgid "\"%s\" is a Developer setting. Enable Developer mode to edit it?" msgstr "" @@ -12338,68 +12376,39 @@ msgstr "Пакет конфігурації змінено в попереднь msgid "Configuration package changed" msgstr "Змінено пакет конфігурації" -msgid "Toolbar" -msgstr "Панель інструментів" - -msgid "Objects list" -msgstr "Список обʼєктів" - -msgid "Import geometry data from STL/STEP/3MF/OBJ/AMF files" -msgstr "Імпорт геометричних даних із файлів STL/STEP/3MF/OBJ/AMF" - -msgid "Paste from clipboard" -msgstr "Вставити з буфера обміну" - -msgid "Show/Hide 3Dconnexion devices settings dialog" -msgstr "Показати/приховати діалог налаштувань пристроїв 3Dconnexion" - -msgid "Switch table page" -msgstr "Перемкнути сторінку таблиці" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Space" -msgstr "Пробіл" - -msgid "Open speed dial" -msgstr "" - -msgid "Run a Speed Dial favourite (while the Speed Dial is open)" -msgstr "" - -msgid "Show keyboard shortcuts list" -msgstr "Показати список клавіш" - -msgid "Global shortcuts" -msgstr "Глобальні ярлики" - msgid "Pan View" msgstr "Панорамний вигляд" msgid "Rotate View" msgstr "Повернути вигляд" +#, c-format, boost-format +msgid "Use %s or %s, or a key that does not type a character." +msgstr "" + +msgctxt "Keyboard Shortcut" +msgid "Key" +msgstr "" + +msgid "Left mouse" +msgstr "" + +msgid "Available anywhere in the window, even while typing in a text field." +msgstr "" + +msgid "Run a speed dial favorite while the dial is open" +msgstr "" + # AI Translated -msgid "Middle mouse button" -msgstr "Середня кнопка миші" +msgctxt "Keyboard Shortcut" +msgid "Tab" +msgstr "Tab" -msgid "Zoom View" -msgstr "Перегляд масштабу" +msgid "Switch to the next main tab" +msgstr "" -msgid "Auto orients selected objects or all objects. If there are selected objects, it just orients the selected ones. Otherwise, it will orient all objects in the current project." -msgstr "Автоматично орієнтує вибрані обʼєкти або всі обʼєкти. Якщо вибрано обʼєкти, він просто орієнтує обрані. В іншому випадку він будеОрієнтувати всі обʼєкти на поточному проєкт." - -msgid "Auto orients all objects on the active plate." -msgstr "Автоматично орієнтує всі обʼєкти на поточному диску." - -msgid "Collapse/Expand the sidebar" -msgstr "Згорнути/розгорнути бічну панель" - -msgid "Any arrow" -msgstr "Будь-яка стрілка" - -msgid "Movement in camera space" -msgstr "Рух у просторі камери" +msgid "Available while the 3D view on the Prepare tab has focus." +msgstr "" msgid "Select a part" msgstr "Виберіть частину" @@ -12410,127 +12419,29 @@ msgstr "Вибрати кілька обʼєктів" msgid "Select objects by rectangle" msgstr "Виділити обʼєкти прямокутником" -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Arrow Up" -msgstr "Стрілка вгору" - -msgid "Move selection 10mm in positive Y direction" -msgstr "Перемістити виділення на 10 мм у позитивному напрямку Y" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Arrow Down" -msgstr "Стрілка вниз" - -msgid "Move selection 10mm in negative Y direction" -msgstr "Перемістити виділення на 10 мм у негативному напрямку Y" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Arrow Left" -msgstr "Стрілка вліво" - -msgid "Move selection 10mm in negative X direction" -msgstr "Перемістити виділення на 10 мм у негативному напрямку по осі X" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Arrow Right" -msgstr "Стрілка вправо" - -msgid "Move selection 10mm in positive X direction" -msgstr "Перемістити виділення на 10 мм у позитивному напрямку X" +msgid "Keyboard 1-9: set filament for object/part" +msgstr "клавіатура 1-9: встановити філамент для обʼєкта/деталі" msgid "Movement step set to 1mm" msgstr "Крок переміщення встановлено на 1 мм" -msgid "Keyboard 1-9: set filament for object/part" -msgstr "клавіатура 1-9: встановити філамент для обʼєкта/деталі" +msgid "Movement in camera space" +msgstr "Рух у просторі камери" -msgid "Camera view - Default" -msgstr "Вигляд камери - Типовий" +msgid "Middle mouse" +msgstr "" -msgid "Camera view - Top" -msgstr "Вигляд камери - Верх" +msgid "Right mouse" +msgstr "" -msgid "Camera view - Bottom" -msgstr "Вигляд камери - Низ" +msgid "Zoom View" +msgstr "Перегляд масштабу" -msgid "Camera view - Front" -msgstr "Вигляд камери - Перед" +msgid "Painting" +msgstr "" -msgid "Camera view - Behind" -msgstr "Вигляд камери - Зад" - -msgid "Camera Angle - Left side" -msgstr "Кут камери – Лівий бік" - -msgid "Camera Angle - Right side" -msgstr "Кут камери - Правий бік" - -msgid "Select all objects" -msgstr "Вибрати всі обʼєкти" - -msgid "Gizmo move" -msgstr "Рух Gizmo" - -msgid "Gizmo rotate" -msgstr "Поворот Gizmo" - -msgid "Gizmo scale" -msgstr "Шкала Gizmo" - -msgid "Gizmo place face on bed" -msgstr "Покласти грань на стіл Gizmo" - -msgid "Gizmo cut" -msgstr "Виріз Gizmo" - -msgid "Gizmo mesh boolean" -msgstr "Булеві операції Gizmo" - -msgid "Gizmo FDM paint-on fuzzy skin" -msgstr "Gizmo Малювання шорсткої поверхні" - -msgid "Gizmo SLA support points" -msgstr "Точки підтримки Gizmo SL" - -msgid "Gizmo FDM paint-on seam" -msgstr "Швид, що фарбується Gizmo FDM" - -msgid "Gizmo text emboss/engrave" -msgstr "Текстове тиснення/гравіювання Gizmo" - -msgid "Gizmo measure" -msgstr "виміряти Gizmo" - -msgid "Gizmo assemble" -msgstr "Зібрати Gizmo" - -msgid "Gizmo brim ears" -msgstr "Краєчки Gizmo" - -msgid "Zoom in" -msgstr "Приблизити" - -msgid "Zoom out" -msgstr "Віддалити" - -# AI Translated -msgid "Toggle printable for object/part" -msgstr "Перемкнути можливість друку для обʼєкта/частини" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Tab" -msgstr "Tab" - -msgid "Switch between Prepare/Preview" -msgstr "Переключення між Підготовка/Попередній перегляд" - -msgid "Plater" -msgstr "Тарілка" +msgid "Available while a painting gizmo is open: supports, seam, fuzzy skin or color painting." +msgstr "" msgid "Move: press to snap by 1mm" msgstr "Переміщення: натисніть для переміщення на 1 мм" @@ -12541,14 +12452,19 @@ msgstr "Підтримка/Фарбування: регулювання раді msgid "Support/Color Painting: adjust section position" msgstr "Підтримка/Фарбування: регулювання положення секцій" -msgid "Gizmo" -msgstr "Gizmo" +msgid "Objects list" +msgstr "Список обʼєктів" + +msgid "Available while the object list has focus." +msgstr "" msgid "Set extruder number for the objects and parts" msgstr "Встановіть номер екструдера для обʼєктів та деталей" -msgid "Delete objects, parts, modifiers" -msgstr "Видалення обʼєктів, частин, модифікаторів" +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Space" +msgstr "Пробіл" msgid "Select the object/part and press space to change the name" msgstr "Виберіть обʼєкт/деталь і натисніть пробіл, щоб змінити назву" @@ -12559,45 +12475,48 @@ msgstr "Клацання миші" msgid "Select the object/part and mouse click to change the name" msgstr "Виберіть обʼєкт/деталь і клацніть, щоб змінити назву" -msgid "Objects List" -msgstr "Список обʼєктів" - -msgid "Vertical slider - Move active thumb Up" -msgstr "Вертикальний повзунок - рух активного великого пальця вгору" - -msgid "Vertical slider - Move active thumb Down" -msgstr "Вертикальний повзунок - Перемістити активний палець вниз" - -msgid "Horizontal slider - Move active thumb Left" -msgstr "Горизонтальний повзунок - Перемістити активний палець вліво" - -msgid "Horizontal slider - Move active thumb Right" -msgstr "Горизонтальний повзунок - Перемістити активний палець праворуч" - -msgid "On/Off one layer mode of the vertical slider" -msgstr "Увімкнення/вимкнення одношарового режиму вертикального повзунка" - -msgid "On/Off G-code window" -msgstr "Увімкнення/вимкнення вікна G-коду" +msgid "Available while the 3D view on the Preview tab has focus." +msgstr "" msgid "Move slider 5x faster" msgstr "Переміщення повзунка в 5 разів швидше" -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Home" -msgstr "Home" +msgid "Scroll slider 5x faster" +msgstr "" -msgid "Horizontal slider - Move to start position" -msgstr "Горизонтальний повзунок - Перемістити в початкове положення" +msgid "Not customizable" +msgstr "" -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "End" -msgstr "End" +#, c-format, boost-format +msgid "%s is assigned to %s. Reassign it to %s?" +msgstr "" -msgid "Horizontal slider - Move to last position" -msgstr "Горизонтальний повзунок - Перемістити в останню позицію" +#, c-format, boost-format +msgid "The default %s is assigned to %s. Reassign it to %s?" +msgstr "" + +msgid "Global shortcuts also apply while typing." +msgstr "" + +msgid "A key that types a character cannot be a global shortcut." +msgstr "" + +msgid "Esc cancels, Enter confirms." +msgstr "" + +#, c-format, boost-format +msgid "" +"Press the new shortcut for\n" +"\"%s\"" +msgstr "" + +#, c-format, boost-format +msgid "Already used as a step of %s." +msgstr "" + +#, c-format, boost-format +msgid "Already assigned to %s. Press OK to reassign it." +msgstr "" msgid "Release Note" msgstr "Примітка до випуску" @@ -17717,9 +17636,8 @@ msgstr "Кроки підігріву" msgid "Insert multiple preheat commands (e.g. M104.1). Only useful for Prusa XL. For other printers, please set it to 1." msgstr "Вставляє кілька команд попереднього нагріву (наприклад, M104.1). Корисно лише для Prusa XL. Для інших принтерів слід встановити значення 1." -# AI Translated -msgid "G-code written at the very top of the output file, before any other content. Useful for adding metadata that printer firmware reads from the first lines of the file (e.g. estimated print time, filament usage). Supports placeholders like {print_time_sec} and {used_filament_length}." -msgstr "G-код, що записується на самому початку вихідного файлу, перед будь-яким іншим вмістом. Корисно для додавання метаданих, які прошивка принтера читає з перших рядків файлу (наприклад, орієнтовний час друку, витрата філаменту). Підтримує підстановки на кшталт {print_time_sec} та {used_filament_length}." +msgid "G-code written at the very top of the output file, before any other content. Useful for adding metadata that printer firmware reads from the first lines of the file (e.g. estimated print time, filament usage). Supports placeholders like {print_time_total_sec}, {print_time_day}, {print_time_hour}, {print_time_minute}, {print_time_sec} and {used_filament_length}." +msgstr "" msgid "Start G-code" msgstr "Початковий G-код" @@ -19307,13 +19225,37 @@ msgstr "Філамент, що використовується" msgid "Total length of filament used in the print." msgstr "Загальна довжина філаменту, використаної під час друку." -msgid "Print time (seconds)" -msgstr "Час друку (в секундах)" +msgid "Print time (total seconds)" +msgstr "" # AI Translated msgid "Total estimated print time in seconds. Replaced with actual value during post-processing." msgstr "Загальний орієнтовний час друку в секундах. Замінюється фактичним значенням під час постобробки." +msgid "Print time (days component)" +msgstr "" + +msgid "Estimated print time day component (normal mode). Replaced with actual value during post-processing." +msgstr "" + +msgid "Print time (hours component)" +msgstr "" + +msgid "Estimated print time hour component (normal mode). Replaced with actual value during post-processing." +msgstr "" + +msgid "Print time (minutes component)" +msgstr "" + +msgid "Estimated print time minute component (normal mode). Replaced with actual value during post-processing." +msgstr "" + +msgid "Print time (seconds component)" +msgstr "" + +msgid "Estimated print time second component (normal mode). Replaced with actual value during post-processing." +msgstr "" + msgid "Filament length (meters)" msgstr "Довжина філаменту (в метрах)" @@ -21216,6 +21158,9 @@ msgstr "Дійсний сеанс не виявлено. Продовжити в msgid "Success!" msgstr "Успішно!" +msgid "Generate API Key" +msgstr "" + msgid "Are you sure to log out?" msgstr "Ви впевнені, що вийшли?" @@ -22197,13 +22142,6 @@ msgstr "Мережевий плагін Bambu потрібен для можли msgid "Error: %s" msgstr "Помилка: %s" -msgid "Show details" -msgstr "Показати подробиці" - -# AI Translated -msgid "Hide details" -msgstr "Сховати подробиці" - msgid "Version to install:" msgstr "Версія для встановлення:" @@ -24841,6 +24779,12 @@ msgstr "" msgid "No binding for that field" msgstr "" +msgid "Enter a number" +msgstr "" + +msgid "Not a number" +msgstr "" + msgid "Primitive" msgstr "" @@ -24853,6 +24797,217 @@ msgstr "" msgid "Clear All" msgstr "" +msgctxt "Keyboard Shortcut" +msgid "Ins" +msgstr "" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Home" +msgstr "Home" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "End" +msgstr "End" + +msgctxt "Keyboard Shortcut" +msgid "PgUp" +msgstr "" + +msgctxt "Keyboard Shortcut" +msgid "PgDn" +msgstr "" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Arrow Left" +msgstr "Стрілка вліво" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Arrow Right" +msgstr "Стрілка вправо" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Arrow Up" +msgstr "Стрілка вгору" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Arrow Down" +msgstr "Стрілка вниз" + +msgid "Import geometry data from STL/STEP/3MF/OBJ/AMF files" +msgstr "Імпорт геометричних даних із файлів STL/STEP/3MF/OBJ/AMF" + +msgid "Select all objects" +msgstr "Вибрати всі обʼєкти" + +msgid "Paste from clipboard" +msgstr "Вставити з буфера обміну" + +# AI Translated +msgid "Toggle printable for object/part" +msgstr "Перемкнути можливість друку для обʼєкта/частини" + +msgid "Move selection 10mm in negative X direction" +msgstr "Перемістити виділення на 10 мм у негативному напрямку по осі X" + +msgid "Move selection 10mm in positive X direction" +msgstr "Перемістити виділення на 10 мм у позитивному напрямку X" + +msgid "Move selection 10mm in positive Y direction" +msgstr "Перемістити виділення на 10 мм у позитивному напрямку Y" + +msgid "Move selection 10mm in negative Y direction" +msgstr "Перемістити виділення на 10 мм у негативному напрямку Y" + +msgid "Rotate selection 45 degrees counterclockwise" +msgstr "" + +msgid "Rotate selection 45 degrees clockwise" +msgstr "" + +msgid "Gizmo move" +msgstr "Рух Gizmo" + +msgid "Gizmo rotate" +msgstr "Поворот Gizmo" + +msgid "Gizmo scale" +msgstr "Шкала Gizmo" + +msgid "Gizmo place face on bed" +msgstr "Покласти грань на стіл Gizmo" + +msgid "Gizmo cut" +msgstr "Виріз Gizmo" + +msgid "Gizmo mesh boolean" +msgstr "Булеві операції Gizmo" + +msgid "Gizmo FDM paint-on supports" +msgstr "" + +msgid "Gizmo FDM paint-on seam" +msgstr "Швид, що фарбується Gizmo FDM" + +msgid "Gizmo FDM paint-on fuzzy skin" +msgstr "Gizmo Малювання шорсткої поверхні" + +msgid "Gizmo multi-material painting" +msgstr "" + +msgid "Gizmo text emboss/engrave" +msgstr "Текстове тиснення/гравіювання Gizmo" + +msgid "Gizmo measure" +msgstr "виміряти Gizmo" + +msgid "Gizmo assemble" +msgstr "Зібрати Gizmo" + +msgid "Gizmo brim ears" +msgstr "Краєчки Gizmo" + +msgid "Vertical slider - Move active thumb Up" +msgstr "Вертикальний повзунок - рух активного великого пальця вгору" + +msgid "Vertical slider - Move active thumb Down" +msgstr "Вертикальний повзунок - Перемістити активний палець вниз" + +msgid "Horizontal slider - Move active thumb Left" +msgstr "Горизонтальний повзунок - Перемістити активний палець вліво" + +msgid "Horizontal slider - Move active thumb Right" +msgstr "Горизонтальний повзунок - Перемістити активний палець праворуч" + +msgid "Horizontal slider - Move to start position" +msgstr "Горизонтальний повзунок - Перемістити в початкове положення" + +msgid "Horizontal slider - Move to last position" +msgstr "Горизонтальний повзунок - Перемістити в останню позицію" + +msgid "Camera view - Default" +msgstr "Вигляд камери - Типовий" + +msgid "Camera view - Top" +msgstr "Вигляд камери - Верх" + +msgid "Camera view - Bottom" +msgstr "Вигляд камери - Низ" + +msgid "Camera view - Front" +msgstr "Вигляд камери - Перед" + +msgid "Camera view - Behind" +msgstr "Вигляд камери - Зад" + +msgid "Camera Angle - Left side" +msgstr "Кут камери – Лівий бік" + +msgid "Camera Angle - Right side" +msgstr "Кут камери - Правий бік" + +msgid "Camera view - Current plate" +msgstr "" + +msgid "Zoom in" +msgstr "Приблизити" + +msgid "Zoom out" +msgstr "Віддалити" + +msgid "Show/Hide 3Dconnexion devices settings dialog" +msgstr "Показати/приховати діалог налаштувань пристроїв 3Dconnexion" + +msgid "Show/Hide wireframe" +msgstr "" + +msgid "On/Off G-code window" +msgstr "Увімкнення/вимкнення вікна G-коду" + +msgid "On/Off one layer mode of the vertical slider" +msgstr "Увімкнення/вимкнення одношарового режиму вертикального повзунка" + +msgid "Switch between Prepare/Preview" +msgstr "Переключення між Підготовка/Попередній перегляд" + +msgid "Collapse/Expand the sidebar" +msgstr "Згорнути/розгорнути бічну панель" + +msgid "Open the speed dial" +msgstr "" + +msgid "Reload the device page" +msgstr "" + +msgid "Show keyboard shortcuts list" +msgstr "Показати список клавіш" + +msgid "Slicing and printing" +msgstr "" + +msgid "Editing" +msgstr "" + +msgid "Placement" +msgstr "" + +msgid "Gizmos" +msgstr "" + +msgid "Sliders" +msgstr "" + +msgid "Painting tools" +msgstr "" + +msgid "Application" +msgstr "" + #: resources/data/hints.ini: [hint:Precise wall] msgid "" "Precise wall\n" @@ -25158,6 +25313,65 @@ msgstr "" "Уникнення деформації\n" "Чи знаєте ви, що при друку матеріалами, схильними до деформації, такими як ABS, відповідне підвищення температури столу може зменшити ймовірність деформації?" +#~ msgid "Tab" +#~ msgstr "Табуляції" + +# AI Translated +#~ msgid "Displays current viewport FPS in the top-right corner." +#~ msgstr "Показує поточний FPS вікна перегляду у верхньому правому куті." + +# AI Translated +#~ msgid "Publish 3MF Wiki" +#~ msgstr "Енциклопедія з публікації 3MF" + +# AI Translated +#~ msgid "Publish 3MF Video Guide" +#~ msgstr "Відеопосібник з публікації 3MF" + +#~ msgid "Toolbar" +#~ msgstr "Панель інструментів" + +#~ msgid "Switch table page" +#~ msgstr "Перемкнути сторінку таблиці" + +#~ msgid "Global shortcuts" +#~ msgstr "Глобальні ярлики" + +# AI Translated +#~ msgid "Middle mouse button" +#~ msgstr "Середня кнопка миші" + +#~ msgid "Auto orients selected objects or all objects. If there are selected objects, it just orients the selected ones. Otherwise, it will orient all objects in the current project." +#~ msgstr "Автоматично орієнтує вибрані обʼєкти або всі обʼєкти. Якщо вибрано обʼєкти, він просто орієнтує обрані. В іншому випадку він будеОрієнтувати всі обʼєкти на поточному проєкт." + +#~ msgid "Auto orients all objects on the active plate." +#~ msgstr "Автоматично орієнтує всі обʼєкти на поточному диску." + +#~ msgid "Any arrow" +#~ msgstr "Будь-яка стрілка" + +#~ msgid "Gizmo SLA support points" +#~ msgstr "Точки підтримки Gizmo SL" + +#~ msgid "Plater" +#~ msgstr "Тарілка" + +#~ msgid "Gizmo" +#~ msgstr "Gizmo" + +#~ msgid "Delete objects, parts, modifiers" +#~ msgstr "Видалення обʼєктів, частин, модифікаторів" + +#~ msgid "Objects List" +#~ msgstr "Список обʼєктів" + +# AI Translated +#~ msgid "G-code written at the very top of the output file, before any other content. Useful for adding metadata that printer firmware reads from the first lines of the file (e.g. estimated print time, filament usage). Supports placeholders like {print_time_sec} and {used_filament_length}." +#~ msgstr "G-код, що записується на самому початку вихідного файлу, перед будь-яким іншим вмістом. Корисно для додавання метаданих, які прошивка принтера читає з перших рядків файлу (наприклад, орієнтовний час друку, витрата філаменту). Підтримує підстановки на кшталт {print_time_sec} та {used_filament_length}." + +#~ msgid "Print time (seconds)" +#~ msgstr "Час друку (в секундах)" + # AI Translated #~ msgid "Open actions speed dial" #~ msgstr "Відкрити панель швидких дій" diff --git a/localization/i18n/vi/OrcaSlicer_vi.po b/localization/i18n/vi/OrcaSlicer_vi.po index 3263e575c5..6b8451d646 100644 --- a/localization/i18n/vi/OrcaSlicer_vi.po +++ b/localization/i18n/vi/OrcaSlicer_vi.po @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-09-18 15:50+0800\n" +"POT-Creation-Date: 2026-09-22 12:39+0800\n" "PO-Revision-Date: 2025-10-02 17:43+0700\n" "Last-Translator: \n" "Language-Team: hainguyen.ts13@gmail.com\n" @@ -6253,12 +6253,15 @@ msgctxt "Camera View" msgid "Right" msgstr "Phải" -msgid "Add" -msgstr "Thêm" - msgid "Add plate" msgstr "Thêm plate" +msgid "Split to objects" +msgstr "Tách thành vật thể" + +msgid "Add" +msgstr "Thêm" + msgid "Auto orient all/selected objects" msgstr "Tự động định hướng tất cả/các vật thể đã chọn" @@ -6271,9 +6274,6 @@ msgstr "Sắp xếp tất cả vật thể" msgid "Arrange objects on selected plates" msgstr "Sắp xếp vật thể trên các plate đã chọn" -msgid "Split to objects" -msgstr "Tách thành vật thể" - msgid "Assembly View" msgstr "Chế độ xem lắp ráp" @@ -6336,6 +6336,9 @@ msgstr "Đường viền" msgid "Wireframe" msgstr "Khung dây" +msgid "X-Ray" +msgstr "" + # AI Translated msgid "Realistic View" msgstr "Chế độ xem thực tế" @@ -6904,7 +6907,7 @@ msgstr "Hiện đường viền xung quanh vật thể đã chọn trong cảnh msgid "Preferences" msgstr "Tùy chọn" -msgid "Open speed dial..." +msgid "Open speed dial" msgstr "" # AI Translated @@ -8820,10 +8823,6 @@ msgstr "Mở rộng thanh bên" msgid "Collapse sidebar" msgstr "Thu gọn thanh bên" -# AI Translated -msgid "Tab" -msgstr "Tab" - #, c-format, boost-format msgid "Loading file: %s" msgstr "Đang tải file: %s" @@ -9923,10 +9922,10 @@ msgstr "Quản lý nhiều thiết bị" msgid "With this option enabled, you can send a task to multiple devices at the same time and manage multiple devices." msgstr "Với tùy chọn này được bật, bạn có thể gửi tác vụ đến nhiều thiết bị cùng lúc và quản lý nhiều thiết bị." -msgid "Open the Speed Dial with the Space key" +msgid "Open the Speed Dial from the keyboard" msgstr "" -msgid "When enabled, pressing Space (with no other key held) opens the Speed Dial action search from any page." +msgid "When enabled, the Speed Dial keyboard shortcut (Space by default) opens the action search from any page." msgstr "" msgid "Recent actions" @@ -10074,6 +10073,15 @@ msgstr "Kéo chuột phải" msgid "Set the action that dragging the right mouse button should perform." msgstr "Đặt hành động sẽ thực hiện khi kéo nút chuột phải." +msgid "Keyboard" +msgstr "" + +msgid "Keyboard shortcuts" +msgstr "" + +msgid "Choose the key for each action." +msgstr "" + # AI Translated msgid "Clear my choice on..." msgstr "Xóa lựa chọn của tôi về..." @@ -10203,13 +10211,40 @@ msgstr "" "Giới hạn tốc độ khung hình của khung nhìn để giảm tải GPU và mức tiêu thụ điện.\n" "Đặt 0 để không giới hạn tốc độ khung hình." +msgid "Reuse the 3D scene while idle" +msgstr "" + +msgid "" +"Skips redrawing the 3D scene when only the mouse cursor moves over the viewport,\n" +"and reuses the previous frame's scene instead. Reduces GPU load.\n" +"Disable it if the viewport shows stale or missing contents.\n" +"\n" +"Takes effect immediately." +msgstr "" + +msgid "Skip unchanged frames" +msgstr "" + +msgid "" +"Skips drawing a frame altogether when it would be identical to the one already on screen.\n" +"Only applies to frames that reuse the 3D scene, so it needs Reuse the 3D scene while idle.\n" +"Disable it if a hover highlight, tooltip or animation stops updating.\n" +"\n" +"Takes effect immediately." +msgstr "" + # AI Translated msgid "Show FPS overlay" msgstr "Hiện lớp phủ FPS" -# AI Translated -msgid "Displays current viewport FPS in the top-right corner." -msgstr "Hiển thị FPS hiện tại của khung nhìn ở góc trên bên phải." +msgid "Displays rendering counts in the top-right corner of the viewport." +msgstr "" + +msgid "FPS: frames presented to the screen per second." +msgstr "" + +msgid "3D: frames per second that redrew the 3D scene." +msgstr "" # AI Translated msgid "G-code Preview" @@ -10706,13 +10741,8 @@ msgstr "Xuất bản 3MF..." msgid "Select which settings to be published in the 3MF file" msgstr "Chọn những cài đặt sẽ được xuất bản trong tệp 3MF" -# AI Translated -msgid "Publish 3MF Wiki" -msgstr "Wiki về Xuất bản 3MF" - -# AI Translated -msgid "Publish 3MF Video Guide" -msgstr "Hướng dẫn video về Xuất bản 3MF" +msgid "Video Guide" +msgstr "" # AI Translated msgid "Mixed filament - published as a whole when \"Enable\" above is selected" @@ -10915,6 +10945,14 @@ msgstr "" msgid "No wiki page for this action" msgstr "" +# AI Translated +msgid "Show details" +msgstr "Hiện chi tiết" + +# AI Translated +msgid "Hide details" +msgstr "Ẩn chi tiết" + #, c-format, boost-format msgid "\"%s\" is a Developer setting. Enable Developer mode to edit it?" msgstr "" @@ -12886,41 +12924,6 @@ msgstr "Gói cấu hình đã được thay đổi trong hướng dẫn cấu h msgid "Configuration package changed" msgstr "Gói cấu hình đã thay đổi" -msgid "Toolbar" -msgstr "Thanh công cụ" - -msgid "Objects list" -msgstr "Danh sách đối tượng" - -msgid "Import geometry data from STL/STEP/3MF/OBJ/AMF files" -msgstr "Nhập dữ liệu hình học từ file STL/STEP/3MF/OBJ/AMF" - -msgid "Paste from clipboard" -msgstr "Dán từ clipboard" - -msgid "Show/Hide 3Dconnexion devices settings dialog" -msgstr "Hiển thị/Ẩn hộp thoại cài đặt thiết bị 3Dconnexion" - -msgid "Switch table page" -msgstr "Chuyển trang bảng" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Space" -msgstr "Space" - -msgid "Open speed dial" -msgstr "" - -msgid "Run a Speed Dial favourite (while the Speed Dial is open)" -msgstr "" - -msgid "Show keyboard shortcuts list" -msgstr "Hiển thị danh sách phím tắt" - -msgid "Global shortcuts" -msgstr "Phím tắt toàn cục" - # AI Translated msgid "Pan View" msgstr "Di chuyển khung nhìn" @@ -12929,28 +12932,33 @@ msgstr "Di chuyển khung nhìn" msgid "Rotate View" msgstr "Xoay khung nhìn" -# AI Translated -msgid "Middle mouse button" -msgstr "Nút chuột giữa" +#, c-format, boost-format +msgid "Use %s or %s, or a key that does not type a character." +msgstr "" + +msgctxt "Keyboard Shortcut" +msgid "Key" +msgstr "" + +msgid "Left mouse" +msgstr "" + +msgid "Available anywhere in the window, even while typing in a text field." +msgstr "" + +msgid "Run a speed dial favorite while the dial is open" +msgstr "" # AI Translated -msgid "Zoom View" -msgstr "Thu phóng khung nhìn" +msgctxt "Keyboard Shortcut" +msgid "Tab" +msgstr "Tab" -msgid "Auto orients selected objects or all objects. If there are selected objects, it just orients the selected ones. Otherwise, it will orient all objects in the current project." -msgstr "Tự động định hướng đối tượng đã chọn hoặc tất cả đối tượng. Nếu có đối tượng đã chọn, nó chỉ định hướng những đối tượng đã chọn. Nếu không, nó sẽ định hướng tất cả đối tượng trong dự án hiện tại." +msgid "Switch to the next main tab" +msgstr "" -msgid "Auto orients all objects on the active plate." -msgstr "Tự động định hướng tất cả đối tượng trên bản đang hoạt động." - -msgid "Collapse/Expand the sidebar" -msgstr "Thu gọn/Mở rộng thanh bên" - -msgid "Any arrow" -msgstr "Phím mũi tên bất kỳ" - -msgid "Movement in camera space" -msgstr "Di chuyển trong không gian camera" +msgid "Available while the 3D view on the Prepare tab has focus." +msgstr "" msgid "Select a part" msgstr "Chọn một phần" @@ -12961,128 +12969,30 @@ msgstr "Chọn nhiều đối tượng" msgid "Select objects by rectangle" msgstr "Chọn đối tượng bằng hình chữ nhật" -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Arrow Up" -msgstr "Mũi tên lên" - -msgid "Move selection 10mm in positive Y direction" -msgstr "Di chuyển lựa chọn 10 mm theo hướng Y dương" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Arrow Down" -msgstr "Mũi tên xuống" - -msgid "Move selection 10mm in negative Y direction" -msgstr "Di chuyển lựa chọn 10 mm theo hướng Y âm" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Arrow Left" -msgstr "Mũi tên trái" - -msgid "Move selection 10mm in negative X direction" -msgstr "Di chuyển lựa chọn 10 mm theo hướng X âm" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Arrow Right" -msgstr "Mũi tên phải" - -msgid "Move selection 10mm in positive X direction" -msgstr "Di chuyển lựa chọn 10 mm theo hướng X dương" +msgid "Keyboard 1-9: set filament for object/part" +msgstr "bàn phím 1-9: đặt filament cho đối tượng/phần" msgid "Movement step set to 1mm" msgstr "Bước di chuyển được đặt thành 1 mm" -msgid "Keyboard 1-9: set filament for object/part" -msgstr "bàn phím 1-9: đặt filament cho đối tượng/phần" +msgid "Movement in camera space" +msgstr "Di chuyển trong không gian camera" -msgid "Camera view - Default" -msgstr "Chế độ xem camera - Mặc định" +msgid "Middle mouse" +msgstr "" -msgid "Camera view - Top" -msgstr "Chế độ xem camera - Trên" - -msgid "Camera view - Bottom" -msgstr "Chế độ xem camera - Dưới" - -msgid "Camera view - Front" -msgstr "Chế độ xem camera - Trước" - -msgid "Camera view - Behind" -msgstr "Chế độ xem camera - Sau" - -msgid "Camera Angle - Left side" -msgstr "Góc camera - Bên trái" - -msgid "Camera Angle - Right side" -msgstr "Góc camera - Bên phải" - -msgid "Select all objects" -msgstr "Chọn tất cả đối tượng" - -msgid "Gizmo move" -msgstr "Gizmo di chuyển" - -msgid "Gizmo rotate" -msgstr "Gizmo xoay" - -msgid "Gizmo scale" -msgstr "Gizmo tỷ lệ" - -msgid "Gizmo place face on bed" -msgstr "Gizmo đặt mặt lên bàn" - -msgid "Gizmo cut" -msgstr "Gizmo cắt" +msgid "Right mouse" +msgstr "" # AI Translated -msgid "Gizmo mesh boolean" -msgstr "Gizmo boolean lưới" +msgid "Zoom View" +msgstr "Thu phóng khung nhìn" -msgid "Gizmo FDM paint-on fuzzy skin" -msgstr "Gizmo FDM tô fuzzy skin" +msgid "Painting" +msgstr "" -msgid "Gizmo SLA support points" -msgstr "Gizmo điểm support SLA" - -msgid "Gizmo FDM paint-on seam" -msgstr "Gizmo FDM tô seam" - -msgid "Gizmo text emboss/engrave" -msgstr "Gizmo văn bản emboss/khắc" - -msgid "Gizmo measure" -msgstr "Gizmo đo" - -msgid "Gizmo assemble" -msgstr "Gizmo lắp ráp" - -msgid "Gizmo brim ears" -msgstr "Gizmo tai viền" - -msgid "Zoom in" -msgstr "Phóng to" - -msgid "Zoom out" -msgstr "Thu nhỏ" - -# AI Translated -msgid "Toggle printable for object/part" -msgstr "Bật/tắt khả năng in cho vật thể/phần" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Tab" -msgstr "Tab" - -msgid "Switch between Prepare/Preview" -msgstr "Chuyển đổi giữa Chuẩn bị/Xem trước" - -msgid "Plater" -msgstr "Bàn in" +msgid "Available while a painting gizmo is open: supports, seam, fuzzy skin or color painting." +msgstr "" msgid "Move: press to snap by 1mm" msgstr "Di chuyển: nhấn để bám theo 1mm" @@ -13093,15 +13003,19 @@ msgstr "Tô support/màu: điều chỉnh bán kính bút" msgid "Support/Color Painting: adjust section position" msgstr "Tô support/màu: điều chỉnh vị trí phần" -# AI Translated -msgid "Gizmo" -msgstr "Gizmo" +msgid "Objects list" +msgstr "Danh sách đối tượng" + +msgid "Available while the object list has focus." +msgstr "" msgid "Set extruder number for the objects and parts" msgstr "Đặt số extruder cho đối tượng và phần" -msgid "Delete objects, parts, modifiers" -msgstr "Xóa đối tượng, phần, modifier" +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Space" +msgstr "Space" msgid "Select the object/part and press space to change the name" msgstr "Chọn đối tượng/phần và nhấn phím cách để thay đổi tên" @@ -13112,45 +13026,48 @@ msgstr "Nhấp chuột" msgid "Select the object/part and mouse click to change the name" msgstr "Chọn đối tượng/phần và nhấp chuột để thay đổi tên" -msgid "Objects List" -msgstr "Danh sách đối tượng" - -msgid "Vertical slider - Move active thumb Up" -msgstr "Thanh trượt dọc - Di chuyển nút hoạt động lên" - -msgid "Vertical slider - Move active thumb Down" -msgstr "Thanh trượt dọc - Di chuyển nút hoạt động xuống" - -msgid "Horizontal slider - Move active thumb Left" -msgstr "Thanh trượt ngang - Di chuyển nút hoạt động sang trái" - -msgid "Horizontal slider - Move active thumb Right" -msgstr "Thanh trượt ngang - Di chuyển nút hoạt động sang phải" - -msgid "On/Off one layer mode of the vertical slider" -msgstr "Bật/Tắt chế độ một lớp của thanh trượt dọc" - -msgid "On/Off G-code window" -msgstr "Bật/Tắt cửa sổ G-code" +msgid "Available while the 3D view on the Preview tab has focus." +msgstr "" msgid "Move slider 5x faster" msgstr "Di chuyển thanh trượt nhanh hơn 5 lần" -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Home" -msgstr "Home" +msgid "Scroll slider 5x faster" +msgstr "" -msgid "Horizontal slider - Move to start position" -msgstr "Thanh trượt ngang - Di chuyển đến vị trí bắt đầu" +msgid "Not customizable" +msgstr "" -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "End" -msgstr "End" +#, c-format, boost-format +msgid "%s is assigned to %s. Reassign it to %s?" +msgstr "" -msgid "Horizontal slider - Move to last position" -msgstr "Thanh trượt ngang - Di chuyển đến vị trí cuối cùng" +#, c-format, boost-format +msgid "The default %s is assigned to %s. Reassign it to %s?" +msgstr "" + +msgid "Global shortcuts also apply while typing." +msgstr "" + +msgid "A key that types a character cannot be a global shortcut." +msgstr "" + +msgid "Esc cancels, Enter confirms." +msgstr "" + +#, c-format, boost-format +msgid "" +"Press the new shortcut for\n" +"\"%s\"" +msgstr "" + +#, c-format, boost-format +msgid "Already used as a step of %s." +msgstr "" + +#, c-format, boost-format +msgid "Already assigned to %s. Press OK to reassign it." +msgstr "" msgid "Release Note" msgstr "Ghi chú phát hành" @@ -18243,9 +18160,8 @@ msgstr "Bước làm nóng trước" msgid "Insert multiple preheat commands (e.g. M104.1). Only useful for Prusa XL. For other printers, please set it to 1." msgstr "Chèn nhiều lệnh làm nóng trước (ví dụ M104.1). Chỉ hữu ích cho Prusa XL. Đối với các máy in khác, vui lòng đặt nó thành 1." -# AI Translated -msgid "G-code written at the very top of the output file, before any other content. Useful for adding metadata that printer firmware reads from the first lines of the file (e.g. estimated print time, filament usage). Supports placeholders like {print_time_sec} and {used_filament_length}." -msgstr "G-code được ghi ở ngay đầu file xuất, trước mọi nội dung khác. Hữu ích để thêm siêu dữ liệu mà firmware máy in đọc từ những dòng đầu tiên của file (ví dụ thời gian in ước tính, lượng filament sử dụng). Hỗ trợ các trình giữ chỗ như {print_time_sec} và {used_filament_length}." +msgid "G-code written at the very top of the output file, before any other content. Useful for adding metadata that printer firmware reads from the first lines of the file (e.g. estimated print time, filament usage). Supports placeholders like {print_time_total_sec}, {print_time_day}, {print_time_hour}, {print_time_minute}, {print_time_sec} and {used_filament_length}." +msgstr "" msgid "Start G-code" msgstr "G-code bắt đầu" @@ -19832,14 +19748,37 @@ msgstr "Filament đã dùng" msgid "Total length of filament used in the print." msgstr "Tổng độ dài filament dùng trong bản in." -# AI Translated -msgid "Print time (seconds)" -msgstr "Thời gian in (giây)" +msgid "Print time (total seconds)" +msgstr "" # AI Translated msgid "Total estimated print time in seconds. Replaced with actual value during post-processing." msgstr "Tổng thời gian in ước tính tính bằng giây. Được thay bằng giá trị thực tế trong quá trình hậu xử lý." +msgid "Print time (days component)" +msgstr "" + +msgid "Estimated print time day component (normal mode). Replaced with actual value during post-processing." +msgstr "" + +msgid "Print time (hours component)" +msgstr "" + +msgid "Estimated print time hour component (normal mode). Replaced with actual value during post-processing." +msgstr "" + +msgid "Print time (minutes component)" +msgstr "" + +msgid "Estimated print time minute component (normal mode). Replaced with actual value during post-processing." +msgstr "" + +msgid "Print time (seconds component)" +msgstr "" + +msgid "Estimated print time second component (normal mode). Replaced with actual value during post-processing." +msgstr "" + # AI Translated msgid "Filament length (meters)" msgstr "Độ dài filament (mét)" @@ -21758,6 +21697,9 @@ msgstr "Không phát hiện phiên hợp lệ. Tiếp tục đăng nhập vào 3 msgid "Success!" msgstr "Thành công!" +msgid "Generate API Key" +msgstr "" + msgid "Are you sure to log out?" msgstr "Bạn có chắc chắn đăng xuất không?" @@ -22871,14 +22813,6 @@ msgstr "Bambu Network Plug-in là bắt buộc cho các tính năng cloud, phát msgid "Error: %s" msgstr "Lỗi: %s" -# AI Translated -msgid "Show details" -msgstr "Hiện chi tiết" - -# AI Translated -msgid "Hide details" -msgstr "Ẩn chi tiết" - # AI Translated msgid "Version to install:" msgstr "Phiên bản sẽ cài đặt:" @@ -25562,6 +25496,12 @@ msgstr "" msgid "No binding for that field" msgstr "" +msgid "Enter a number" +msgstr "" + +msgid "Not a number" +msgstr "" + msgid "Primitive" msgstr "" @@ -25574,6 +25514,218 @@ msgstr "" msgid "Clear All" msgstr "" +msgctxt "Keyboard Shortcut" +msgid "Ins" +msgstr "" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Home" +msgstr "Home" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "End" +msgstr "End" + +msgctxt "Keyboard Shortcut" +msgid "PgUp" +msgstr "" + +msgctxt "Keyboard Shortcut" +msgid "PgDn" +msgstr "" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Arrow Left" +msgstr "Mũi tên trái" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Arrow Right" +msgstr "Mũi tên phải" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Arrow Up" +msgstr "Mũi tên lên" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Arrow Down" +msgstr "Mũi tên xuống" + +msgid "Import geometry data from STL/STEP/3MF/OBJ/AMF files" +msgstr "Nhập dữ liệu hình học từ file STL/STEP/3MF/OBJ/AMF" + +msgid "Select all objects" +msgstr "Chọn tất cả đối tượng" + +msgid "Paste from clipboard" +msgstr "Dán từ clipboard" + +# AI Translated +msgid "Toggle printable for object/part" +msgstr "Bật/tắt khả năng in cho vật thể/phần" + +msgid "Move selection 10mm in negative X direction" +msgstr "Di chuyển lựa chọn 10 mm theo hướng X âm" + +msgid "Move selection 10mm in positive X direction" +msgstr "Di chuyển lựa chọn 10 mm theo hướng X dương" + +msgid "Move selection 10mm in positive Y direction" +msgstr "Di chuyển lựa chọn 10 mm theo hướng Y dương" + +msgid "Move selection 10mm in negative Y direction" +msgstr "Di chuyển lựa chọn 10 mm theo hướng Y âm" + +msgid "Rotate selection 45 degrees counterclockwise" +msgstr "" + +msgid "Rotate selection 45 degrees clockwise" +msgstr "" + +msgid "Gizmo move" +msgstr "Gizmo di chuyển" + +msgid "Gizmo rotate" +msgstr "Gizmo xoay" + +msgid "Gizmo scale" +msgstr "Gizmo tỷ lệ" + +msgid "Gizmo place face on bed" +msgstr "Gizmo đặt mặt lên bàn" + +msgid "Gizmo cut" +msgstr "Gizmo cắt" + +# AI Translated +msgid "Gizmo mesh boolean" +msgstr "Gizmo boolean lưới" + +msgid "Gizmo FDM paint-on supports" +msgstr "" + +msgid "Gizmo FDM paint-on seam" +msgstr "Gizmo FDM tô seam" + +msgid "Gizmo FDM paint-on fuzzy skin" +msgstr "Gizmo FDM tô fuzzy skin" + +msgid "Gizmo multi-material painting" +msgstr "" + +msgid "Gizmo text emboss/engrave" +msgstr "Gizmo văn bản emboss/khắc" + +msgid "Gizmo measure" +msgstr "Gizmo đo" + +msgid "Gizmo assemble" +msgstr "Gizmo lắp ráp" + +msgid "Gizmo brim ears" +msgstr "Gizmo tai viền" + +msgid "Vertical slider - Move active thumb Up" +msgstr "Thanh trượt dọc - Di chuyển nút hoạt động lên" + +msgid "Vertical slider - Move active thumb Down" +msgstr "Thanh trượt dọc - Di chuyển nút hoạt động xuống" + +msgid "Horizontal slider - Move active thumb Left" +msgstr "Thanh trượt ngang - Di chuyển nút hoạt động sang trái" + +msgid "Horizontal slider - Move active thumb Right" +msgstr "Thanh trượt ngang - Di chuyển nút hoạt động sang phải" + +msgid "Horizontal slider - Move to start position" +msgstr "Thanh trượt ngang - Di chuyển đến vị trí bắt đầu" + +msgid "Horizontal slider - Move to last position" +msgstr "Thanh trượt ngang - Di chuyển đến vị trí cuối cùng" + +msgid "Camera view - Default" +msgstr "Chế độ xem camera - Mặc định" + +msgid "Camera view - Top" +msgstr "Chế độ xem camera - Trên" + +msgid "Camera view - Bottom" +msgstr "Chế độ xem camera - Dưới" + +msgid "Camera view - Front" +msgstr "Chế độ xem camera - Trước" + +msgid "Camera view - Behind" +msgstr "Chế độ xem camera - Sau" + +msgid "Camera Angle - Left side" +msgstr "Góc camera - Bên trái" + +msgid "Camera Angle - Right side" +msgstr "Góc camera - Bên phải" + +msgid "Camera view - Current plate" +msgstr "" + +msgid "Zoom in" +msgstr "Phóng to" + +msgid "Zoom out" +msgstr "Thu nhỏ" + +msgid "Show/Hide 3Dconnexion devices settings dialog" +msgstr "Hiển thị/Ẩn hộp thoại cài đặt thiết bị 3Dconnexion" + +msgid "Show/Hide wireframe" +msgstr "" + +msgid "On/Off G-code window" +msgstr "Bật/Tắt cửa sổ G-code" + +msgid "On/Off one layer mode of the vertical slider" +msgstr "Bật/Tắt chế độ một lớp của thanh trượt dọc" + +msgid "Switch between Prepare/Preview" +msgstr "Chuyển đổi giữa Chuẩn bị/Xem trước" + +msgid "Collapse/Expand the sidebar" +msgstr "Thu gọn/Mở rộng thanh bên" + +msgid "Open the speed dial" +msgstr "" + +msgid "Reload the device page" +msgstr "" + +msgid "Show keyboard shortcuts list" +msgstr "Hiển thị danh sách phím tắt" + +msgid "Slicing and printing" +msgstr "" + +msgid "Editing" +msgstr "" + +msgid "Placement" +msgstr "" + +msgid "Gizmos" +msgstr "" + +msgid "Sliders" +msgstr "" + +msgid "Painting tools" +msgstr "" + +msgid "Application" +msgstr "" + #: resources/data/hints.ini: [hint:Precise wall] msgid "" "Precise wall\n" @@ -25875,6 +26027,68 @@ msgstr "" "Tránh cong vênh\n" "Bạn có biết rằng khi in vật liệu dễ cong vênh như ABS, tăng nhiệt độ bàn nóng một cách thích hợp có thể giảm xác suất cong vênh không?" +# AI Translated +#~ msgid "Tab" +#~ msgstr "Tab" + +# AI Translated +#~ msgid "Displays current viewport FPS in the top-right corner." +#~ msgstr "Hiển thị FPS hiện tại của khung nhìn ở góc trên bên phải." + +# AI Translated +#~ msgid "Publish 3MF Wiki" +#~ msgstr "Wiki về Xuất bản 3MF" + +# AI Translated +#~ msgid "Publish 3MF Video Guide" +#~ msgstr "Hướng dẫn video về Xuất bản 3MF" + +#~ msgid "Toolbar" +#~ msgstr "Thanh công cụ" + +#~ msgid "Switch table page" +#~ msgstr "Chuyển trang bảng" + +#~ msgid "Global shortcuts" +#~ msgstr "Phím tắt toàn cục" + +# AI Translated +#~ msgid "Middle mouse button" +#~ msgstr "Nút chuột giữa" + +#~ msgid "Auto orients selected objects or all objects. If there are selected objects, it just orients the selected ones. Otherwise, it will orient all objects in the current project." +#~ msgstr "Tự động định hướng đối tượng đã chọn hoặc tất cả đối tượng. Nếu có đối tượng đã chọn, nó chỉ định hướng những đối tượng đã chọn. Nếu không, nó sẽ định hướng tất cả đối tượng trong dự án hiện tại." + +#~ msgid "Auto orients all objects on the active plate." +#~ msgstr "Tự động định hướng tất cả đối tượng trên bản đang hoạt động." + +#~ msgid "Any arrow" +#~ msgstr "Phím mũi tên bất kỳ" + +#~ msgid "Gizmo SLA support points" +#~ msgstr "Gizmo điểm support SLA" + +#~ msgid "Plater" +#~ msgstr "Bàn in" + +# AI Translated +#~ msgid "Gizmo" +#~ msgstr "Gizmo" + +#~ msgid "Delete objects, parts, modifiers" +#~ msgstr "Xóa đối tượng, phần, modifier" + +#~ msgid "Objects List" +#~ msgstr "Danh sách đối tượng" + +# AI Translated +#~ msgid "G-code written at the very top of the output file, before any other content. Useful for adding metadata that printer firmware reads from the first lines of the file (e.g. estimated print time, filament usage). Supports placeholders like {print_time_sec} and {used_filament_length}." +#~ msgstr "G-code được ghi ở ngay đầu file xuất, trước mọi nội dung khác. Hữu ích để thêm siêu dữ liệu mà firmware máy in đọc từ những dòng đầu tiên của file (ví dụ thời gian in ước tính, lượng filament sử dụng). Hỗ trợ các trình giữ chỗ như {print_time_sec} và {used_filament_length}." + +# AI Translated +#~ msgid "Print time (seconds)" +#~ msgstr "Thời gian in (giây)" + # AI Translated #~ msgid "Open actions speed dial" #~ msgstr "Mở vòng quay thao tác nhanh" diff --git a/localization/i18n/zh_CN/OrcaSlicer_zh_CN.po b/localization/i18n/zh_CN/OrcaSlicer_zh_CN.po index d3c0b03ec1..b61846f434 100644 --- a/localization/i18n/zh_CN/OrcaSlicer_zh_CN.po +++ b/localization/i18n/zh_CN/OrcaSlicer_zh_CN.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Slic3rPE\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-09-18 15:50+0800\n" +"POT-Creation-Date: 2026-09-22 12:39+0800\n" "PO-Revision-Date: 2026-06-11 12:37-0300\n" "Last-Translator: Handle \n" "Language-Team: \n" @@ -5757,12 +5757,15 @@ msgctxt "Camera View" msgid "Right" msgstr "右" -msgid "Add" -msgstr "添加" - msgid "Add plate" msgstr "添加新盘" +msgid "Split to objects" +msgstr "拆分为对象" + +msgid "Add" +msgstr "添加" + msgid "Auto orient all/selected objects" msgstr "自动定位所有/选定的对象" @@ -5775,9 +5778,6 @@ msgstr "全局整理" msgid "Arrange objects on selected plates" msgstr "单盘整理" -msgid "Split to objects" -msgstr "拆分为对象" - msgid "Assembly View" msgstr "装配体视图" @@ -5833,6 +5833,9 @@ msgstr "轮廓线" msgid "Wireframe" msgstr "线框" +msgid "X-Ray" +msgstr "" + msgid "Realistic View" msgstr "写实渲染" @@ -6372,7 +6375,7 @@ msgstr "在3D场景中显示选中对象的轮廓" msgid "Preferences" msgstr "偏好设置" -msgid "Open speed dial..." +msgid "Open speed dial" msgstr "" # AI Translated @@ -8147,9 +8150,6 @@ msgstr "展开侧边栏" msgid "Collapse sidebar" msgstr "折叠边栏" -msgid "Tab" -msgstr "标签" - #, c-format, boost-format msgid "Loading file: %s" msgstr "加载文件:%s" @@ -9160,10 +9160,10 @@ msgstr "多设备管理" msgid "With this option enabled, you can send a task to multiple devices at the same time and manage multiple devices." msgstr "启用此选项后,您可以同时向多个设备发送任务并管理多个设备。" -msgid "Open the Speed Dial with the Space key" +msgid "Open the Speed Dial from the keyboard" msgstr "" -msgid "When enabled, pressing Space (with no other key held) opens the Speed Dial action search from any page." +msgid "When enabled, the Speed Dial keyboard shortcut (Space by default) opens the action search from any page." msgstr "" msgid "Recent actions" @@ -9295,6 +9295,15 @@ msgstr "鼠标右键拖动" msgid "Set the action that dragging the right mouse button should perform." msgstr "设置拖动鼠标右键时应执行的操作。" +msgid "Keyboard" +msgstr "" + +msgid "Keyboard shortcuts" +msgstr "" + +msgid "Choose the key for each action." +msgstr "" + msgid "Clear my choice on..." msgstr "清除我的选择..." @@ -9405,11 +9414,39 @@ msgstr "" "限制视口帧率以降低 GPU 负载和功耗。\n" "设置为 0 表示不限制帧率。" +msgid "Reuse the 3D scene while idle" +msgstr "" + +msgid "" +"Skips redrawing the 3D scene when only the mouse cursor moves over the viewport,\n" +"and reuses the previous frame's scene instead. Reduces GPU load.\n" +"Disable it if the viewport shows stale or missing contents.\n" +"\n" +"Takes effect immediately." +msgstr "" + +msgid "Skip unchanged frames" +msgstr "" + +msgid "" +"Skips drawing a frame altogether when it would be identical to the one already on screen.\n" +"Only applies to frames that reuse the 3D scene, so it needs Reuse the 3D scene while idle.\n" +"Disable it if a hover highlight, tooltip or animation stops updating.\n" +"\n" +"Takes effect immediately." +msgstr "" + msgid "Show FPS overlay" msgstr "显示 FPS 叠加层" -msgid "Displays current viewport FPS in the top-right corner." -msgstr "在右上角显示当前视口的 FPS。" +msgid "Displays rendering counts in the top-right corner of the viewport." +msgstr "" + +msgid "FPS: frames presented to the screen per second." +msgstr "" + +msgid "3D: frames per second that redrew the 3D scene." +msgstr "" # AI Translated msgid "G-code Preview" @@ -9869,13 +9906,8 @@ msgstr "发布 3MF..." msgid "Select which settings to be published in the 3MF file" msgstr "选择要在 3MF 文件中发布的设置" -# AI Translated -msgid "Publish 3MF Wiki" -msgstr "发布 3MF Wiki" - -# AI Translated -msgid "Publish 3MF Video Guide" -msgstr "发布 3MF 视频指南" +msgid "Video Guide" +msgstr "" # AI Translated msgid "Mixed filament - published as a whole when \"Enable\" above is selected" @@ -10077,6 +10109,13 @@ msgstr "" msgid "No wiki page for this action" msgstr "" +msgid "Show details" +msgstr "显示详情" + +# AI Translated +msgid "Hide details" +msgstr "隐藏详情" + #, c-format, boost-format msgid "\"%s\" is a Developer setting. Enable Developer mode to edit it?" msgstr "" @@ -11876,70 +11915,39 @@ msgstr "参数配置包在之前的配置向导中发生了变更" msgid "Configuration package changed" msgstr "参数配置包发生变更" -msgid "Toolbar" -msgstr "工具栏" - -msgid "Objects list" -msgstr "对象列表" - -msgid "Import geometry data from STL/STEP/3MF/OBJ/AMF files" -msgstr "从STL/STEP/3MF/OBJ/AMF文件中导入几何数据" - -msgid "Paste from clipboard" -msgstr "从剪切板粘贴" - -msgid "Show/Hide 3Dconnexion devices settings dialog" -msgstr "显示/隐藏 3Dconnexion设备的设置对话框" - -msgid "Switch table page" -msgstr "切换标签页" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Space" -msgstr "Space" - -msgid "Open speed dial" -msgstr "" - -msgid "Run a Speed Dial favourite (while the Speed Dial is open)" -msgstr "" - -msgid "Show keyboard shortcuts list" -msgstr "显示键盘快捷键列表" - -msgid "Global shortcuts" -msgstr "全局快捷键" - msgid "Pan View" msgstr "移动视角" msgid "Rotate View" msgstr "旋转视角" -msgid "Middle mouse button" -msgstr "鼠标中键" - -msgid "Zoom View" -msgstr "缩放视角" - -msgid "Auto orients selected objects or all objects. If there are selected objects, it just orients the selected ones. Otherwise, it will orient all objects in the current project." +#, c-format, boost-format +msgid "Use %s or %s, or a key that does not type a character." msgstr "" -"自动调整选定零件/所有零件的方向,\n" -"有选定零件时调整选定零件的朝向,\n" -"没有选择零件时调整当项目所有零件的朝向" -msgid "Auto orients all objects on the active plate." -msgstr "自动调整活动盘上的所有物体的方向。" +msgctxt "Keyboard Shortcut" +msgid "Key" +msgstr "" -msgid "Collapse/Expand the sidebar" -msgstr "收起/展开 侧边栏" +msgid "Left mouse" +msgstr "" -msgid "Any arrow" -msgstr "任意箭头" +msgid "Available anywhere in the window, even while typing in a text field." +msgstr "" -msgid "Movement in camera space" -msgstr "沿相机视角移动对象" +msgid "Run a speed dial favorite while the dial is open" +msgstr "" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Tab" +msgstr "Tab" + +msgid "Switch to the next main tab" +msgstr "" + +msgid "Available while the 3D view on the Prepare tab has focus." +msgstr "" msgid "Select a part" msgstr "选择单个零件" @@ -11950,130 +11958,29 @@ msgstr "选择多个对象" msgid "Select objects by rectangle" msgstr "框选多个零件" -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Arrow Up" -msgstr "↑" - -# AI Translated -msgid "Move selection 10mm in positive Y direction" -msgstr "将所选项沿 Y 轴正方向移动 10mm" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Arrow Down" -msgstr "↓" - -# AI Translated -msgid "Move selection 10mm in negative Y direction" -msgstr "将所选项沿 Y 轴负方向移动 10mm" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Arrow Left" -msgstr "←" - -# AI Translated -msgid "Move selection 10mm in negative X direction" -msgstr "将所选项沿 X 轴负方向移动 10mm" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Arrow Right" -msgstr "→" - -# AI Translated -msgid "Move selection 10mm in positive X direction" -msgstr "将所选项沿 X 轴正方向移动 10mm" +msgid "Keyboard 1-9: set filament for object/part" +msgstr "按键1-9:设置对象/零件的耗材丝" msgid "Movement step set to 1mm" msgstr "沿X、Y轴以1mm为步进移动对象" -msgid "Keyboard 1-9: set filament for object/part" -msgstr "按键1-9:设置对象/零件的耗材丝" +msgid "Movement in camera space" +msgstr "沿相机视角移动对象" -msgid "Camera view - Default" -msgstr "摄像机视角 - 默认" +msgid "Middle mouse" +msgstr "" -msgid "Camera view - Top" -msgstr "摄像机视角 - 顶部" +msgid "Right mouse" +msgstr "" -msgid "Camera view - Bottom" -msgstr "摄像机视角 - 底部" +msgid "Zoom View" +msgstr "缩放视角" -msgid "Camera view - Front" -msgstr "摄像机视角 - 正面" +msgid "Painting" +msgstr "" -msgid "Camera view - Behind" -msgstr "摄像机视角 - 后面" - -msgid "Camera Angle - Left side" -msgstr "摄像机视角 - 左面" - -msgid "Camera Angle - Right side" -msgstr "摄像机视角 - 右面" - -msgid "Select all objects" -msgstr "选择所有对象" - -msgid "Gizmo move" -msgstr "线框移动" - -msgid "Gizmo rotate" -msgstr "旋转物件" - -msgid "Gizmo scale" -msgstr "线框缩放" - -msgid "Gizmo place face on bed" -msgstr "选择底面" - -msgid "Gizmo cut" -msgstr "剪切物件" - -msgid "Gizmo mesh boolean" -msgstr "线框网格布尔操作" - -msgid "Gizmo FDM paint-on fuzzy skin" -msgstr "Gizmo FDM手绘绒毛表面" - -msgid "Gizmo SLA support points" -msgstr "SLA支撑点" - -msgid "Gizmo FDM paint-on seam" -msgstr "FDM涂装接缝" - -msgid "Gizmo text emboss/engrave" -msgstr "线框文本浮雕/雕刻" - -msgid "Gizmo measure" -msgstr "线框测量" - -msgid "Gizmo assemble" -msgstr "线框组合" - -msgid "Gizmo brim ears" -msgstr "线框耳状帽檐" - -msgid "Zoom in" -msgstr "放大" - -msgid "Zoom out" -msgstr "缩小" - -msgid "Toggle printable for object/part" -msgstr "切换对象/零件的可打印状态" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Tab" -msgstr "Tab" - -msgid "Switch between Prepare/Preview" -msgstr "准备/预览之间的切换" - -msgid "Plater" -msgstr "准备" +msgid "Available while a painting gizmo is open: supports, seam, fuzzy skin or color painting." +msgstr "" msgid "Move: press to snap by 1mm" msgstr "移动:以1mm为步进移动" @@ -12084,14 +11991,19 @@ msgstr "支撑/颜色绘制:调节画笔半径" msgid "Support/Color Painting: adjust section position" msgstr "支撑/色彩绘制:调节剖面位置" -msgid "Gizmo" -msgstr "小工具" +msgid "Objects list" +msgstr "对象列表" + +msgid "Available while the object list has focus." +msgstr "" msgid "Set extruder number for the objects and parts" msgstr "设置对象、零件使用的挤出机编号" -msgid "Delete objects, parts, modifiers" -msgstr "删除对象、零件、修改器" +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Space" +msgstr "Space" msgid "Select the object/part and press space to change the name" msgstr "选中对象、零件,按空格可修改名称" @@ -12102,45 +12014,48 @@ msgstr "鼠标点击" msgid "Select the object/part and mouse click to change the name" msgstr "选中对象、零件,双击零件名可修改名称" -msgid "Objects List" -msgstr "对象列表" - -msgid "Vertical slider - Move active thumb Up" -msgstr "垂直滑动条 - 向上移动一层" - -msgid "Vertical slider - Move active thumb Down" -msgstr "垂直滑动条 - 向下移动一层" - -msgid "Horizontal slider - Move active thumb Left" -msgstr "水平滑动条 - 向左移动一步" - -msgid "Horizontal slider - Move active thumb Right" -msgstr "水平滑动条 - 向右移动一步" - -msgid "On/Off one layer mode of the vertical slider" -msgstr "开启/关闭垂直滑动条的单层模式" - -msgid "On/Off G-code window" -msgstr "开启/关闭G-code窗口" +msgid "Available while the 3D view on the Preview tab has focus." +msgstr "" msgid "Move slider 5x faster" msgstr "5倍速移动滑动条" -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Home" -msgstr "Home" +msgid "Scroll slider 5x faster" +msgstr "" -msgid "Horizontal slider - Move to start position" -msgstr "水平滑块 - 移动到起始位置" +msgid "Not customizable" +msgstr "" -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "End" -msgstr "End" +#, c-format, boost-format +msgid "%s is assigned to %s. Reassign it to %s?" +msgstr "" -msgid "Horizontal slider - Move to last position" -msgstr "水平滑块 - 移动到末尾位置" +#, c-format, boost-format +msgid "The default %s is assigned to %s. Reassign it to %s?" +msgstr "" + +msgid "Global shortcuts also apply while typing." +msgstr "" + +msgid "A key that types a character cannot be a global shortcut." +msgstr "" + +msgid "Esc cancels, Enter confirms." +msgstr "" + +#, c-format, boost-format +msgid "" +"Press the new shortcut for\n" +"\"%s\"" +msgstr "" + +#, c-format, boost-format +msgid "Already used as a step of %s." +msgstr "" + +#, c-format, boost-format +msgid "Already assigned to %s. Press OK to reassign it." +msgstr "" msgid "Release Note" msgstr "更新说明" @@ -16971,8 +16886,8 @@ msgstr "预热步骤" msgid "Insert multiple preheat commands (e.g. M104.1). Only useful for Prusa XL. For other printers, please set it to 1." msgstr "插入多个预热命令(例如 M104.1)。仅适用于 Prusa XL。对于其他打印机,请将其设置为 1。" -msgid "G-code written at the very top of the output file, before any other content. Useful for adding metadata that printer firmware reads from the first lines of the file (e.g. estimated print time, filament usage). Supports placeholders like {print_time_sec} and {used_filament_length}." -msgstr "G-code 写在输出文件的最顶部,位于任何其他内容之前。对于添加打印机固件从文件第一行读取的元数据(例如估计打印时间、耗材使用情况)很有用。支持 {print_time_sec} 和 {used_filament_length} 等占位符。" +msgid "G-code written at the very top of the output file, before any other content. Useful for adding metadata that printer firmware reads from the first lines of the file (e.g. estimated print time, filament usage). Supports placeholders like {print_time_total_sec}, {print_time_day}, {print_time_hour}, {print_time_minute}, {print_time_sec} and {used_filament_length}." +msgstr "" msgid "Start G-code" msgstr "起始G-code" @@ -18504,12 +18419,36 @@ msgstr "已用耗材" msgid "Total length of filament used in the print." msgstr "打印中使用的耗材的总长度。" -msgid "Print time (seconds)" -msgstr "打印耗时(秒)" +msgid "Print time (total seconds)" +msgstr "" msgid "Total estimated print time in seconds. Replaced with actual value during post-processing." msgstr "预计总打印耗时(以秒为单位)。在后处理时将替换为实际值。" +msgid "Print time (days component)" +msgstr "" + +msgid "Estimated print time day component (normal mode). Replaced with actual value during post-processing." +msgstr "" + +msgid "Print time (hours component)" +msgstr "" + +msgid "Estimated print time hour component (normal mode). Replaced with actual value during post-processing." +msgstr "" + +msgid "Print time (minutes component)" +msgstr "" + +msgid "Estimated print time minute component (normal mode). Replaced with actual value during post-processing." +msgstr "" + +msgid "Print time (seconds component)" +msgstr "" + +msgid "Estimated print time second component (normal mode). Replaced with actual value during post-processing." +msgstr "" + msgid "Filament length (meters)" msgstr "耗材长度(米)" @@ -20342,6 +20281,9 @@ msgstr "未检测到有效会话。是否继续登录 3DPrinterOS?" msgid "Success!" msgstr "成功!" +msgid "Generate API Key" +msgstr "" + msgid "Are you sure to log out?" msgstr "您确定要登出吗?" @@ -21339,13 +21281,6 @@ msgstr "Bambu 网络插件用于云功能、打印机发现和远程打印。" msgid "Error: %s" msgstr "错误:%s" -msgid "Show details" -msgstr "显示详情" - -# AI Translated -msgid "Hide details" -msgstr "隐藏详情" - msgid "Version to install:" msgstr "将安装的版本:" @@ -23976,6 +23911,12 @@ msgstr "" msgid "No binding for that field" msgstr "" +msgid "Enter a number" +msgstr "" + +msgid "Not a number" +msgstr "" + msgid "Primitive" msgstr "" @@ -23988,6 +23929,220 @@ msgstr "" msgid "Clear All" msgstr "" +msgctxt "Keyboard Shortcut" +msgid "Ins" +msgstr "" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Home" +msgstr "Home" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "End" +msgstr "End" + +msgctxt "Keyboard Shortcut" +msgid "PgUp" +msgstr "" + +msgctxt "Keyboard Shortcut" +msgid "PgDn" +msgstr "" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Arrow Left" +msgstr "←" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Arrow Right" +msgstr "→" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Arrow Up" +msgstr "↑" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Arrow Down" +msgstr "↓" + +msgid "Import geometry data from STL/STEP/3MF/OBJ/AMF files" +msgstr "从STL/STEP/3MF/OBJ/AMF文件中导入几何数据" + +msgid "Select all objects" +msgstr "选择所有对象" + +msgid "Paste from clipboard" +msgstr "从剪切板粘贴" + +msgid "Toggle printable for object/part" +msgstr "切换对象/零件的可打印状态" + +# AI Translated +msgid "Move selection 10mm in negative X direction" +msgstr "将所选项沿 X 轴负方向移动 10mm" + +# AI Translated +msgid "Move selection 10mm in positive X direction" +msgstr "将所选项沿 X 轴正方向移动 10mm" + +# AI Translated +msgid "Move selection 10mm in positive Y direction" +msgstr "将所选项沿 Y 轴正方向移动 10mm" + +# AI Translated +msgid "Move selection 10mm in negative Y direction" +msgstr "将所选项沿 Y 轴负方向移动 10mm" + +msgid "Rotate selection 45 degrees counterclockwise" +msgstr "" + +msgid "Rotate selection 45 degrees clockwise" +msgstr "" + +msgid "Gizmo move" +msgstr "线框移动" + +msgid "Gizmo rotate" +msgstr "旋转物件" + +msgid "Gizmo scale" +msgstr "线框缩放" + +msgid "Gizmo place face on bed" +msgstr "选择底面" + +msgid "Gizmo cut" +msgstr "剪切物件" + +msgid "Gizmo mesh boolean" +msgstr "线框网格布尔操作" + +msgid "Gizmo FDM paint-on supports" +msgstr "" + +msgid "Gizmo FDM paint-on seam" +msgstr "FDM涂装接缝" + +msgid "Gizmo FDM paint-on fuzzy skin" +msgstr "Gizmo FDM手绘绒毛表面" + +msgid "Gizmo multi-material painting" +msgstr "" + +msgid "Gizmo text emboss/engrave" +msgstr "线框文本浮雕/雕刻" + +msgid "Gizmo measure" +msgstr "线框测量" + +msgid "Gizmo assemble" +msgstr "线框组合" + +msgid "Gizmo brim ears" +msgstr "线框耳状帽檐" + +msgid "Vertical slider - Move active thumb Up" +msgstr "垂直滑动条 - 向上移动一层" + +msgid "Vertical slider - Move active thumb Down" +msgstr "垂直滑动条 - 向下移动一层" + +msgid "Horizontal slider - Move active thumb Left" +msgstr "水平滑动条 - 向左移动一步" + +msgid "Horizontal slider - Move active thumb Right" +msgstr "水平滑动条 - 向右移动一步" + +msgid "Horizontal slider - Move to start position" +msgstr "水平滑块 - 移动到起始位置" + +msgid "Horizontal slider - Move to last position" +msgstr "水平滑块 - 移动到末尾位置" + +msgid "Camera view - Default" +msgstr "摄像机视角 - 默认" + +msgid "Camera view - Top" +msgstr "摄像机视角 - 顶部" + +msgid "Camera view - Bottom" +msgstr "摄像机视角 - 底部" + +msgid "Camera view - Front" +msgstr "摄像机视角 - 正面" + +msgid "Camera view - Behind" +msgstr "摄像机视角 - 后面" + +msgid "Camera Angle - Left side" +msgstr "摄像机视角 - 左面" + +msgid "Camera Angle - Right side" +msgstr "摄像机视角 - 右面" + +msgid "Camera view - Current plate" +msgstr "" + +msgid "Zoom in" +msgstr "放大" + +msgid "Zoom out" +msgstr "缩小" + +msgid "Show/Hide 3Dconnexion devices settings dialog" +msgstr "显示/隐藏 3Dconnexion设备的设置对话框" + +msgid "Show/Hide wireframe" +msgstr "" + +msgid "On/Off G-code window" +msgstr "开启/关闭G-code窗口" + +msgid "On/Off one layer mode of the vertical slider" +msgstr "开启/关闭垂直滑动条的单层模式" + +msgid "Switch between Prepare/Preview" +msgstr "准备/预览之间的切换" + +msgid "Collapse/Expand the sidebar" +msgstr "收起/展开 侧边栏" + +msgid "Open the speed dial" +msgstr "" + +msgid "Reload the device page" +msgstr "" + +msgid "Show keyboard shortcuts list" +msgstr "显示键盘快捷键列表" + +msgid "Slicing and printing" +msgstr "" + +msgid "Editing" +msgstr "" + +msgid "Placement" +msgstr "" + +msgid "Gizmos" +msgstr "" + +msgid "Sliders" +msgstr "" + +msgid "Painting tools" +msgstr "" + +msgid "Application" +msgstr "" + #: resources/data/hints.ini: [hint:Precise wall] msgid "" "Precise wall\n" @@ -24288,6 +24443,65 @@ msgstr "" "避免翘曲\n" "您知道吗?打印ABS这类易翘曲材料时,适当提高热床温度可以降低翘曲的概率。" +#~ msgid "Tab" +#~ msgstr "标签" + +#~ msgid "Displays current viewport FPS in the top-right corner." +#~ msgstr "在右上角显示当前视口的 FPS。" + +# AI Translated +#~ msgid "Publish 3MF Wiki" +#~ msgstr "发布 3MF Wiki" + +# AI Translated +#~ msgid "Publish 3MF Video Guide" +#~ msgstr "发布 3MF 视频指南" + +#~ msgid "Toolbar" +#~ msgstr "工具栏" + +#~ msgid "Switch table page" +#~ msgstr "切换标签页" + +#~ msgid "Global shortcuts" +#~ msgstr "全局快捷键" + +#~ msgid "Middle mouse button" +#~ msgstr "鼠标中键" + +#~ msgid "Auto orients selected objects or all objects. If there are selected objects, it just orients the selected ones. Otherwise, it will orient all objects in the current project." +#~ msgstr "" +#~ "自动调整选定零件/所有零件的方向,\n" +#~ "有选定零件时调整选定零件的朝向,\n" +#~ "没有选择零件时调整当项目所有零件的朝向" + +#~ msgid "Auto orients all objects on the active plate." +#~ msgstr "自动调整活动盘上的所有物体的方向。" + +#~ msgid "Any arrow" +#~ msgstr "任意箭头" + +#~ msgid "Gizmo SLA support points" +#~ msgstr "SLA支撑点" + +#~ msgid "Plater" +#~ msgstr "准备" + +#~ msgid "Gizmo" +#~ msgstr "小工具" + +#~ msgid "Delete objects, parts, modifiers" +#~ msgstr "删除对象、零件、修改器" + +#~ msgid "Objects List" +#~ msgstr "对象列表" + +#~ msgid "G-code written at the very top of the output file, before any other content. Useful for adding metadata that printer firmware reads from the first lines of the file (e.g. estimated print time, filament usage). Supports placeholders like {print_time_sec} and {used_filament_length}." +#~ msgstr "G-code 写在输出文件的最顶部,位于任何其他内容之前。对于添加打印机固件从文件第一行读取的元数据(例如估计打印时间、耗材使用情况)很有用。支持 {print_time_sec} 和 {used_filament_length} 等占位符。" + +#~ msgid "Print time (seconds)" +#~ msgstr "打印耗时(秒)" + # AI Translated #~ msgid "Open actions speed dial" #~ msgstr "打开快捷操作盘" diff --git a/localization/i18n/zh_TW/OrcaSlicer_zh_TW.po b/localization/i18n/zh_TW/OrcaSlicer_zh_TW.po index d50ec44d21..1cf114adc7 100644 --- a/localization/i18n/zh_TW/OrcaSlicer_zh_TW.po +++ b/localization/i18n/zh_TW/OrcaSlicer_zh_TW.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-09-18 15:50+0800\n" +"POT-Creation-Date: 2026-09-22 12:39+0800\n" "PO-Revision-Date: 2025-11-28 13:48-0600\n" "Last-Translator: tntchn <15895303+tntchn@users.noreply.github.com>\n" "Language-Team: \n" @@ -5886,12 +5886,15 @@ msgctxt "Camera View" msgid "Right" msgstr "右" -msgid "Add" -msgstr "新增" - msgid "Add plate" msgstr "新增列印板" +msgid "Split to objects" +msgstr "拆分為物件" + +msgid "Add" +msgstr "新增" + msgid "Auto orient all/selected objects" msgstr "自動旋轉所有/選取物件的方向" @@ -5904,9 +5907,6 @@ msgstr "全域整理" msgid "Arrange objects on selected plates" msgstr "在選定的列印板上排列物件" -msgid "Split to objects" -msgstr "拆分為物件" - msgid "Assembly View" msgstr "組裝視角" @@ -5962,6 +5962,9 @@ msgstr "輪廓線" msgid "Wireframe" msgstr "線框" +msgid "X-Ray" +msgstr "" + msgid "Realistic View" msgstr "擬真檢視" @@ -6502,7 +6505,7 @@ msgstr "在 3D 場景中顯示選定物件的輪廓" msgid "Preferences" msgstr "偏好設定" -msgid "Open speed dial..." +msgid "Open speed dial" msgstr "" # AI Translated @@ -8310,9 +8313,6 @@ msgstr "展開側邊欄" msgid "Collapse sidebar" msgstr "折疊側邊欄" -msgid "Tab" -msgstr "分頁" - #, c-format, boost-format msgid "Loading file: %s" msgstr "載入檔案:%s" @@ -9333,10 +9333,10 @@ msgstr "多臺裝置管理" msgid "With this option enabled, you can send a task to multiple devices at the same time and manage multiple devices." msgstr "啟用時可以同時傳送到並管理多個機臺。" -msgid "Open the Speed Dial with the Space key" +msgid "Open the Speed Dial from the keyboard" msgstr "" -msgid "When enabled, pressing Space (with no other key held) opens the Speed Dial action search from any page." +msgid "When enabled, the Speed Dial keyboard shortcut (Space by default) opens the action search from any page." msgstr "" msgid "Recent actions" @@ -9468,6 +9468,15 @@ msgstr "滑鼠右鍵拖曳" msgid "Set the action that dragging the right mouse button should perform." msgstr "設定拖曳滑鼠右鍵時應執行的動作。" +msgid "Keyboard" +msgstr "" + +msgid "Keyboard shortcuts" +msgstr "" + +msgid "Choose the key for each action." +msgstr "" + msgid "Clear my choice on..." msgstr "清除我的選擇於..." @@ -9578,11 +9587,39 @@ msgstr "" "限制視埠影格率以降低 GPU 負載與耗電量。\n" "設為 0 表示不限制影格率。" +msgid "Reuse the 3D scene while idle" +msgstr "" + +msgid "" +"Skips redrawing the 3D scene when only the mouse cursor moves over the viewport,\n" +"and reuses the previous frame's scene instead. Reduces GPU load.\n" +"Disable it if the viewport shows stale or missing contents.\n" +"\n" +"Takes effect immediately." +msgstr "" + +msgid "Skip unchanged frames" +msgstr "" + +msgid "" +"Skips drawing a frame altogether when it would be identical to the one already on screen.\n" +"Only applies to frames that reuse the 3D scene, so it needs Reuse the 3D scene while idle.\n" +"Disable it if a hover highlight, tooltip or animation stops updating.\n" +"\n" +"Takes effect immediately." +msgstr "" + msgid "Show FPS overlay" msgstr "顯示 FPS 疊加層" -msgid "Displays current viewport FPS in the top-right corner." -msgstr "在右上角顯示目前視埠的 FPS。" +msgid "Displays rendering counts in the top-right corner of the viewport." +msgstr "" + +msgid "FPS: frames presented to the screen per second." +msgstr "" + +msgid "3D: frames per second that redrew the 3D scene." +msgstr "" # AI Translated msgid "G-code Preview" @@ -10042,13 +10079,8 @@ msgstr "發布 3MF..." msgid "Select which settings to be published in the 3MF file" msgstr "選擇要在 3MF 檔案中發布的設定" -# AI Translated -msgid "Publish 3MF Wiki" -msgstr "發布 3MF Wiki" - -# AI Translated -msgid "Publish 3MF Video Guide" -msgstr "發布 3MF 影片指南" +msgid "Video Guide" +msgstr "" # AI Translated msgid "Mixed filament - published as a whole when \"Enable\" above is selected" @@ -10250,6 +10282,13 @@ msgstr "" msgid "No wiki page for this action" msgstr "" +msgid "Show details" +msgstr "顯示詳細資訊" + +# AI Translated +msgid "Hide details" +msgstr "隱藏詳細資料" + #, c-format, boost-format msgid "\"%s\" is a Developer setting. Enable Developer mode to edit it?" msgstr "" @@ -12084,67 +12123,39 @@ msgstr "設定檔在之前的設定引導過程中已改變" msgid "Configuration package changed" msgstr "設定檔已改變" -msgid "Toolbar" -msgstr "工具欄" - -msgid "Objects list" -msgstr "物件清單" - -msgid "Import geometry data from STL/STEP/3MF/OBJ/AMF files" -msgstr "從 STL/STEP/3MF/OBJ/AMF 檔案中匯入幾何模型" - -msgid "Paste from clipboard" -msgstr "從剪貼簿貼上" - -msgid "Show/Hide 3Dconnexion devices settings dialog" -msgstr "顯示/隱藏 3Dconnexion 裝置的設定對話框" - -msgid "Switch table page" -msgstr "切換表單頁面" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Space" -msgstr "Space" - -msgid "Open speed dial" -msgstr "" - -msgid "Run a Speed Dial favourite (while the Speed Dial is open)" -msgstr "" - -msgid "Show keyboard shortcuts list" -msgstr "顯示鍵盤快速鍵清單" - -msgid "Global shortcuts" -msgstr "全域快速鍵" - msgid "Pan View" msgstr "移動視角" msgid "Rotate View" msgstr "旋轉視角" -msgid "Middle mouse button" -msgstr "滑鼠中鍵" +#, c-format, boost-format +msgid "Use %s or %s, or a key that does not type a character." +msgstr "" -msgid "Zoom View" -msgstr "縮放視角" +msgctxt "Keyboard Shortcut" +msgid "Key" +msgstr "" -msgid "Auto orients selected objects or all objects. If there are selected objects, it just orients the selected ones. Otherwise, it will orient all objects in the current project." -msgstr "自動旋轉選取的物件或所有物件的方向。當有物件被選取時,僅自動旋轉選取的物件。無選取的物件時,會自動旋轉專案中的所有物件。" +msgid "Left mouse" +msgstr "" -msgid "Auto orients all objects on the active plate." -msgstr "自動旋轉目前板上所有物件的方向" +msgid "Available anywhere in the window, even while typing in a text field." +msgstr "" -msgid "Collapse/Expand the sidebar" -msgstr "摺疊/展開 側邊欄" +msgid "Run a speed dial favorite while the dial is open" +msgstr "" -msgid "Any arrow" -msgstr "任意方向鍵" +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Tab" +msgstr "Tab" -msgid "Movement in camera space" -msgstr "沿相機視角移動物件" +msgid "Switch to the next main tab" +msgstr "" + +msgid "Available while the 3D view on the Prepare tab has focus." +msgstr "" msgid "Select a part" msgstr "選擇單一零件" @@ -12155,130 +12166,29 @@ msgstr "選擇多個物件" msgid "Select objects by rectangle" msgstr "框選多個零件" -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Arrow Up" -msgstr "Arrow Up" - -# AI Translated -msgid "Move selection 10mm in positive Y direction" -msgstr "將選取物件沿 Y 軸正方向移動 10mm" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Arrow Down" -msgstr "Arrow Down" - -# AI Translated -msgid "Move selection 10mm in negative Y direction" -msgstr "將選取物件沿 Y 軸負方向移動 10mm" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Arrow Left" -msgstr "Arrow Left" - -# AI Translated -msgid "Move selection 10mm in negative X direction" -msgstr "將選取物件沿 X 軸負方向移動 10mm" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Arrow Right" -msgstr "Arrow Right" - -# AI Translated -msgid "Move selection 10mm in positive X direction" -msgstr "將選取物件沿 X 軸正方向移動 10mm" +msgid "Keyboard 1-9: set filament for object/part" +msgstr "按鍵 1~9:設定物件/零件的線材" msgid "Movement step set to 1mm" msgstr "沿 X、Y 軸以 1mm 為單位步進移動" -msgid "Keyboard 1-9: set filament for object/part" -msgstr "按鍵 1~9:設定物件/零件的線材" +msgid "Movement in camera space" +msgstr "沿相機視角移動物件" -msgid "Camera view - Default" -msgstr "攝影機視角 - 預設" +msgid "Middle mouse" +msgstr "" -msgid "Camera view - Top" -msgstr "攝影機視角 - 頂部" +msgid "Right mouse" +msgstr "" -msgid "Camera view - Bottom" -msgstr "攝影機視角 - 底部" +msgid "Zoom View" +msgstr "縮放視角" -msgid "Camera view - Front" -msgstr "攝影機視角 - 前面" +msgid "Painting" +msgstr "" -msgid "Camera view - Behind" -msgstr "攝影機視角 - 後面" - -msgid "Camera Angle - Left side" -msgstr "攝影機視角 - 左面" - -msgid "Camera Angle - Right side" -msgstr "攝影機視角 - 右面" - -msgid "Select all objects" -msgstr "選擇所有物件" - -msgid "Gizmo move" -msgstr "線框移動" - -msgid "Gizmo rotate" -msgstr "旋轉物件" - -msgid "Gizmo scale" -msgstr "線框縮放" - -msgid "Gizmo place face on bed" -msgstr "選擇底面" - -msgid "Gizmo cut" -msgstr "切割物件" - -msgid "Gizmo mesh boolean" -msgstr "線框網格布林運算" - -msgid "Gizmo FDM paint-on fuzzy skin" -msgstr "Gizmo FDM 塗刷絨毛表面效果" - -msgid "Gizmo SLA support points" -msgstr "SLA 支撐點" - -msgid "Gizmo FDM paint-on seam" -msgstr "FDM 塗裝接縫" - -msgid "Gizmo text emboss/engrave" -msgstr "浮雕/雕刻文字工具" - -msgid "Gizmo measure" -msgstr "測量" - -msgid "Gizmo assemble" -msgstr "組裝" - -msgid "Gizmo brim ears" -msgstr "擴邊耳工具" - -msgid "Zoom in" -msgstr "放大" - -msgid "Zoom out" -msgstr "縮小" - -msgid "Toggle printable for object/part" -msgstr "切換物件/零件的可列印屬性" - -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Tab" -msgstr "Tab" - -msgid "Switch between Prepare/Preview" -msgstr "在準備/預覽模式之中切換" - -msgid "Plater" -msgstr "準備" +msgid "Available while a painting gizmo is open: supports, seam, fuzzy skin or color painting." +msgstr "" msgid "Move: press to snap by 1mm" msgstr "移動:以 1mm 為單位步進移動" @@ -12289,14 +12199,19 @@ msgstr "支撐/顏色繪製:調整筆刷半徑" msgid "Support/Color Painting: adjust section position" msgstr "支撐/色彩繪製:調整剖面位置" -msgid "Gizmo" -msgstr "浮雕" +msgid "Objects list" +msgstr "物件清單" + +msgid "Available while the object list has focus." +msgstr "" msgid "Set extruder number for the objects and parts" msgstr "設定物件、零件使用的擠出機編號" -msgid "Delete objects, parts, modifiers" -msgstr "刪除物件、零件、修改器" +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Space" +msgstr "Space" msgid "Select the object/part and press space to change the name" msgstr "選取物件、零件,按空格可修改名稱" @@ -12307,45 +12222,48 @@ msgstr "滑鼠點選" msgid "Select the object/part and mouse click to change the name" msgstr "選取物件或零件,雙擊可修改名稱" -msgid "Objects List" -msgstr "物件清單" - -msgid "Vertical slider - Move active thumb Up" -msgstr "垂直滑動條 - 向上移動一層" - -msgid "Vertical slider - Move active thumb Down" -msgstr "垂直滑動條 - 向下移動一層" - -msgid "Horizontal slider - Move active thumb Left" -msgstr "水平滑動條 - 向左移動一步" - -msgid "Horizontal slider - Move active thumb Right" -msgstr "水平滑動條 - 向右移動一步" - -msgid "On/Off one layer mode of the vertical slider" -msgstr "開啟/關閉垂直滑動條的單層模式" - -msgid "On/Off G-code window" -msgstr "開啟/關閉 G-code 視窗" +msgid "Available while the 3D view on the Preview tab has focus." +msgstr "" msgid "Move slider 5x faster" msgstr "5 倍速移動滑動條" -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "Home" -msgstr "Home" +msgid "Scroll slider 5x faster" +msgstr "" -msgid "Horizontal slider - Move to start position" -msgstr "水平滑動條 - 移動到起始位置" +msgid "Not customizable" +msgstr "" -# AI Translated -msgctxt "Keyboard Shortcut" -msgid "End" -msgstr "End" +#, c-format, boost-format +msgid "%s is assigned to %s. Reassign it to %s?" +msgstr "" -msgid "Horizontal slider - Move to last position" -msgstr "水平滑動條 - 移動到最後位置" +#, c-format, boost-format +msgid "The default %s is assigned to %s. Reassign it to %s?" +msgstr "" + +msgid "Global shortcuts also apply while typing." +msgstr "" + +msgid "A key that types a character cannot be a global shortcut." +msgstr "" + +msgid "Esc cancels, Enter confirms." +msgstr "" + +#, c-format, boost-format +msgid "" +"Press the new shortcut for\n" +"\"%s\"" +msgstr "" + +#, c-format, boost-format +msgid "Already used as a step of %s." +msgstr "" + +#, c-format, boost-format +msgid "Already assigned to %s. Press OK to reassign it." +msgstr "" msgid "Release Note" msgstr "更新說明" @@ -17167,8 +17085,8 @@ msgstr "預熱階段" msgid "Insert multiple preheat commands (e.g. M104.1). Only useful for Prusa XL. For other printers, please set it to 1." msgstr "插入多條預熱指令(例如:M104.1)。此功能僅適用於 Prusa XL。其他列印裝置請將其設為 1。" -msgid "G-code written at the very top of the output file, before any other content. Useful for adding metadata that printer firmware reads from the first lines of the file (e.g. estimated print time, filament usage). Supports placeholders like {print_time_sec} and {used_filament_length}." -msgstr "G-code 寫在輸出檔案的最頂部,位於任何其他內容之前。對於新增列印裝置韌體從檔案第一行讀取的中繼資料(例如估計列印時間、線材使用情況)很有用。支援 {print_time_sec} 和 {used_filament_length} 等預留位置。" +msgid "G-code written at the very top of the output file, before any other content. Useful for adding metadata that printer firmware reads from the first lines of the file (e.g. estimated print time, filament usage). Supports placeholders like {print_time_total_sec}, {print_time_day}, {print_time_hour}, {print_time_minute}, {print_time_sec} and {used_filament_length}." +msgstr "" msgid "Start G-code" msgstr "起始 G-code" @@ -18691,12 +18609,36 @@ msgstr "使用的線材" msgid "Total length of filament used in the print." msgstr "列印所使用的線材總長度" -msgid "Print time (seconds)" -msgstr "列印時間(秒)" +msgid "Print time (total seconds)" +msgstr "" msgid "Total estimated print time in seconds. Replaced with actual value during post-processing." msgstr "預估列印總時間(秒)。後處理時將以實際值取代" +msgid "Print time (days component)" +msgstr "" + +msgid "Estimated print time day component (normal mode). Replaced with actual value during post-processing." +msgstr "" + +msgid "Print time (hours component)" +msgstr "" + +msgid "Estimated print time hour component (normal mode). Replaced with actual value during post-processing." +msgstr "" + +msgid "Print time (minutes component)" +msgstr "" + +msgid "Estimated print time minute component (normal mode). Replaced with actual value during post-processing." +msgstr "" + +msgid "Print time (seconds component)" +msgstr "" + +msgid "Estimated print time second component (normal mode). Replaced with actual value during post-processing." +msgstr "" + msgid "Filament length (meters)" msgstr "線材長度(公尺)" @@ -20532,6 +20474,9 @@ msgstr "未偵測到有效的工作階段。要繼續登入 3DPrinterOS 嗎?" msgid "Success!" msgstr "成功!" +msgid "Generate API Key" +msgstr "" + msgid "Are you sure to log out?" msgstr "確認要登出嗎?" @@ -21531,13 +21476,6 @@ msgstr "Bambu 網路外掛程式用於雲端功能、印表機探索和遠端列 msgid "Error: %s" msgstr "錯誤:%s" -msgid "Show details" -msgstr "顯示詳細資訊" - -# AI Translated -msgid "Hide details" -msgstr "隱藏詳細資料" - msgid "Version to install:" msgstr "將安裝的版本:" @@ -24168,6 +24106,12 @@ msgstr "" msgid "No binding for that field" msgstr "" +msgid "Enter a number" +msgstr "" + +msgid "Not a number" +msgstr "" + msgid "Primitive" msgstr "" @@ -24180,6 +24124,220 @@ msgstr "" msgid "Clear All" msgstr "" +msgctxt "Keyboard Shortcut" +msgid "Ins" +msgstr "" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Home" +msgstr "Home" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "End" +msgstr "End" + +msgctxt "Keyboard Shortcut" +msgid "PgUp" +msgstr "" + +msgctxt "Keyboard Shortcut" +msgid "PgDn" +msgstr "" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Arrow Left" +msgstr "Arrow Left" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Arrow Right" +msgstr "Arrow Right" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Arrow Up" +msgstr "Arrow Up" + +# AI Translated +msgctxt "Keyboard Shortcut" +msgid "Arrow Down" +msgstr "Arrow Down" + +msgid "Import geometry data from STL/STEP/3MF/OBJ/AMF files" +msgstr "從 STL/STEP/3MF/OBJ/AMF 檔案中匯入幾何模型" + +msgid "Select all objects" +msgstr "選擇所有物件" + +msgid "Paste from clipboard" +msgstr "從剪貼簿貼上" + +msgid "Toggle printable for object/part" +msgstr "切換物件/零件的可列印屬性" + +# AI Translated +msgid "Move selection 10mm in negative X direction" +msgstr "將選取物件沿 X 軸負方向移動 10mm" + +# AI Translated +msgid "Move selection 10mm in positive X direction" +msgstr "將選取物件沿 X 軸正方向移動 10mm" + +# AI Translated +msgid "Move selection 10mm in positive Y direction" +msgstr "將選取物件沿 Y 軸正方向移動 10mm" + +# AI Translated +msgid "Move selection 10mm in negative Y direction" +msgstr "將選取物件沿 Y 軸負方向移動 10mm" + +msgid "Rotate selection 45 degrees counterclockwise" +msgstr "" + +msgid "Rotate selection 45 degrees clockwise" +msgstr "" + +msgid "Gizmo move" +msgstr "線框移動" + +msgid "Gizmo rotate" +msgstr "旋轉物件" + +msgid "Gizmo scale" +msgstr "線框縮放" + +msgid "Gizmo place face on bed" +msgstr "選擇底面" + +msgid "Gizmo cut" +msgstr "切割物件" + +msgid "Gizmo mesh boolean" +msgstr "線框網格布林運算" + +msgid "Gizmo FDM paint-on supports" +msgstr "" + +msgid "Gizmo FDM paint-on seam" +msgstr "FDM 塗裝接縫" + +msgid "Gizmo FDM paint-on fuzzy skin" +msgstr "Gizmo FDM 塗刷絨毛表面效果" + +msgid "Gizmo multi-material painting" +msgstr "" + +msgid "Gizmo text emboss/engrave" +msgstr "浮雕/雕刻文字工具" + +msgid "Gizmo measure" +msgstr "測量" + +msgid "Gizmo assemble" +msgstr "組裝" + +msgid "Gizmo brim ears" +msgstr "擴邊耳工具" + +msgid "Vertical slider - Move active thumb Up" +msgstr "垂直滑動條 - 向上移動一層" + +msgid "Vertical slider - Move active thumb Down" +msgstr "垂直滑動條 - 向下移動一層" + +msgid "Horizontal slider - Move active thumb Left" +msgstr "水平滑動條 - 向左移動一步" + +msgid "Horizontal slider - Move active thumb Right" +msgstr "水平滑動條 - 向右移動一步" + +msgid "Horizontal slider - Move to start position" +msgstr "水平滑動條 - 移動到起始位置" + +msgid "Horizontal slider - Move to last position" +msgstr "水平滑動條 - 移動到最後位置" + +msgid "Camera view - Default" +msgstr "攝影機視角 - 預設" + +msgid "Camera view - Top" +msgstr "攝影機視角 - 頂部" + +msgid "Camera view - Bottom" +msgstr "攝影機視角 - 底部" + +msgid "Camera view - Front" +msgstr "攝影機視角 - 前面" + +msgid "Camera view - Behind" +msgstr "攝影機視角 - 後面" + +msgid "Camera Angle - Left side" +msgstr "攝影機視角 - 左面" + +msgid "Camera Angle - Right side" +msgstr "攝影機視角 - 右面" + +msgid "Camera view - Current plate" +msgstr "" + +msgid "Zoom in" +msgstr "放大" + +msgid "Zoom out" +msgstr "縮小" + +msgid "Show/Hide 3Dconnexion devices settings dialog" +msgstr "顯示/隱藏 3Dconnexion 裝置的設定對話框" + +msgid "Show/Hide wireframe" +msgstr "" + +msgid "On/Off G-code window" +msgstr "開啟/關閉 G-code 視窗" + +msgid "On/Off one layer mode of the vertical slider" +msgstr "開啟/關閉垂直滑動條的單層模式" + +msgid "Switch between Prepare/Preview" +msgstr "在準備/預覽模式之中切換" + +msgid "Collapse/Expand the sidebar" +msgstr "摺疊/展開 側邊欄" + +msgid "Open the speed dial" +msgstr "" + +msgid "Reload the device page" +msgstr "" + +msgid "Show keyboard shortcuts list" +msgstr "顯示鍵盤快速鍵清單" + +msgid "Slicing and printing" +msgstr "" + +msgid "Editing" +msgstr "" + +msgid "Placement" +msgstr "" + +msgid "Gizmos" +msgstr "" + +msgid "Sliders" +msgstr "" + +msgid "Painting tools" +msgstr "" + +msgid "Application" +msgstr "" + #: resources/data/hints.ini: [hint:Precise wall] msgid "" "Precise wall\n" @@ -24501,6 +24659,62 @@ msgstr "" "避免翹曲\n" "您知道嗎?當列印容易翹曲的材料(如 ABS)時,適當提高熱床溫度可以降低翹曲的機率。" +#~ msgid "Tab" +#~ msgstr "分頁" + +#~ msgid "Displays current viewport FPS in the top-right corner." +#~ msgstr "在右上角顯示目前視埠的 FPS。" + +# AI Translated +#~ msgid "Publish 3MF Wiki" +#~ msgstr "發布 3MF Wiki" + +# AI Translated +#~ msgid "Publish 3MF Video Guide" +#~ msgstr "發布 3MF 影片指南" + +#~ msgid "Toolbar" +#~ msgstr "工具欄" + +#~ msgid "Switch table page" +#~ msgstr "切換表單頁面" + +#~ msgid "Global shortcuts" +#~ msgstr "全域快速鍵" + +#~ msgid "Middle mouse button" +#~ msgstr "滑鼠中鍵" + +#~ msgid "Auto orients selected objects or all objects. If there are selected objects, it just orients the selected ones. Otherwise, it will orient all objects in the current project." +#~ msgstr "自動旋轉選取的物件或所有物件的方向。當有物件被選取時,僅自動旋轉選取的物件。無選取的物件時,會自動旋轉專案中的所有物件。" + +#~ msgid "Auto orients all objects on the active plate." +#~ msgstr "自動旋轉目前板上所有物件的方向" + +#~ msgid "Any arrow" +#~ msgstr "任意方向鍵" + +#~ msgid "Gizmo SLA support points" +#~ msgstr "SLA 支撐點" + +#~ msgid "Plater" +#~ msgstr "準備" + +#~ msgid "Gizmo" +#~ msgstr "浮雕" + +#~ msgid "Delete objects, parts, modifiers" +#~ msgstr "刪除物件、零件、修改器" + +#~ msgid "Objects List" +#~ msgstr "物件清單" + +#~ msgid "G-code written at the very top of the output file, before any other content. Useful for adding metadata that printer firmware reads from the first lines of the file (e.g. estimated print time, filament usage). Supports placeholders like {print_time_sec} and {used_filament_length}." +#~ msgstr "G-code 寫在輸出檔案的最頂部,位於任何其他內容之前。對於新增列印裝置韌體從檔案第一行讀取的中繼資料(例如估計列印時間、線材使用情況)很有用。支援 {print_time_sec} 和 {used_filament_length} 等預留位置。" + +#~ msgid "Print time (seconds)" +#~ msgstr "列印時間(秒)" + # AI Translated #~ msgid "Open actions speed dial" #~ msgstr "開啟操作快捷選單" diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index 38ef3141d6..546e40499c 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -3426,7 +3426,7 @@ void MainFrame::init_menubar_as_editor() "", nullptr, []() { return true; }, this, 1); parent_menu->AppendSeparator(); append_shortcut_item( - parent_menu, Shortcut::SpeedDial, false, _L("Open speed dial..."), "", + parent_menu, Shortcut::SpeedDial, false, _L("Open speed dial"), "", [](wxCommandEvent &) { wxGetApp().open_speed_dial(); }, "", nullptr, []() { return true; }, this); //parent_menu->Insert(1, preference_item); @@ -3454,7 +3454,7 @@ void MainFrame::init_menubar_as_editor() top_menu->AppendSeparator(); append_shortcut_item( - top_menu, Shortcut::SpeedDial, false, _L("Open speed dial..."), "", + top_menu, Shortcut::SpeedDial, false, _L("Open speed dial"), "", [](wxCommandEvent &) { wxGetApp().open_speed_dial(); }, "", nullptr, []() { return true; }, this); top_menu->AppendSeparator(); @@ -3561,7 +3561,7 @@ void MainFrame::init_menubar_as_editor() // On Mac, the Apple menu ignores non-standard custom items, so add Preset Bundle to the File menu fileMenu->AppendSeparator(); append_shortcut_item( - fileMenu, Shortcut::SpeedDial, false, _L("Open speed dial..."), "", + fileMenu, Shortcut::SpeedDial, false, _L("Open speed dial"), "", [](wxCommandEvent&) { wxGetApp().open_speed_dial(); }, "", nullptr, []() { return true; }, this); append_menu_item( From 55a0b51ae2d41ca4c52b807774a5db83d07f19bf Mon Sep 17 00:00:00 2001 From: Ryan Hartman Date: Mon, 21 Sep 2026 23:42:01 -0600 Subject: [PATCH 20/48] Add Polymaker PLA Pro filament profile (#15046) * Add Polymaker PLA Pro filament profile Polymaker PLA Pro is present in the tree only as printer-scoped variants under Snapmaker U1 and Anycubic Kobra S1, so it is invisible to every other printer. This adds it to the Orca Filament Library as OGFPM020 so it is selectable generally. Values are taken from the manufacturer's published print settings and cross-checked against the two existing vendor profiles: density 1.23 g/cm3 both existing profiles agree softening 55 C both existing profiles agree nozzle 220 C (210-230) manufacturer's stated range max volumetric speed 15 Snapmaker 15, Anycubic 16 Flow ratio is set to 0.96, matching the Snapmaker profile. Worth noting for review: the two existing profiles disagree here -- Snapmaker 0.96, Anycubic 0.85 -- because flow ratio depends on the extruder as much as the filament. Any single value in a vendor-neutral preset is a starting point users should calibrate; 0.96 is closer to the generic PLA baseline than 0.85 is. setting_id assigned by scripts/assign_vendor_setting_ids.py. OrcaFilamentLibrary version bumped 02.04.00.03 -> 02.04.00.04. * fix errors --------- Co-authored-by: SoftFever <103989404+SoftFever@users.noreply.github.com> Co-authored-by: SoftFever --- resources/profiles/OrcaFilamentLibrary.json | 10 +++++- .../Polymaker/Polymaker PLA Pro @System.json | 14 ++++++++ .../Polymaker/Polymaker PLA Pro @base.json | 35 +++++++++++++++++++ 3 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 resources/profiles/OrcaFilamentLibrary/filament/Polymaker/Polymaker PLA Pro @System.json create mode 100644 resources/profiles/OrcaFilamentLibrary/filament/Polymaker/Polymaker PLA Pro @base.json diff --git a/resources/profiles/OrcaFilamentLibrary.json b/resources/profiles/OrcaFilamentLibrary.json index 58abbb2be0..7dada1c2f1 100644 --- a/resources/profiles/OrcaFilamentLibrary.json +++ b/resources/profiles/OrcaFilamentLibrary.json @@ -1,6 +1,6 @@ { "name": "OrcaFilamentLibrary", - "version": "02.04.00.09", + "version": "02.04.00.10", "force_update": "0", "description": "Orca Filament Library", "filament_list": [ @@ -784,6 +784,10 @@ "name": "Polymaker HT-PLA-GF @base", "sub_path": "filament/Polymaker/Polymaker HT-PLA-GF @base.json" }, + { + "name": "Polymaker PLA Pro @base", + "sub_path": "filament/Polymaker/Polymaker PLA Pro @base.json" + }, { "name": "SUNLU PLA Marble @base", "sub_path": "filament/SUNLU/SUNLU Marble PLA @base.json" @@ -1928,6 +1932,10 @@ "name": "Polymaker HT-PLA-GF @System", "sub_path": "filament/Polymaker/Polymaker HT-PLA-GF @System.json" }, + { + "name": "Polymaker PLA Pro @System", + "sub_path": "filament/Polymaker/Polymaker PLA Pro @System.json" + }, { "name": "SUNLU PLA Marble @System", "sub_path": "filament/SUNLU/SUNLU Marble PLA @System.json" diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Polymaker/Polymaker PLA Pro @System.json b/resources/profiles/OrcaFilamentLibrary/filament/Polymaker/Polymaker PLA Pro @System.json new file mode 100644 index 0000000000..db1a73238a --- /dev/null +++ b/resources/profiles/OrcaFilamentLibrary/filament/Polymaker/Polymaker PLA Pro @System.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "name": "Polymaker PLA Pro @System", + "inherits": "Polymaker PLA Pro @base", + "from": "system", + "setting_id": "i5Fvxdl7AAJcErsv", + "instantiation": "true", + "filament_flow_ratio": [ + "0.96" + ], + "filament_max_volumetric_speed": [ + "15" + ] +} diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Polymaker/Polymaker PLA Pro @base.json b/resources/profiles/OrcaFilamentLibrary/filament/Polymaker/Polymaker PLA Pro @base.json new file mode 100644 index 0000000000..b3878553fe --- /dev/null +++ b/resources/profiles/OrcaFilamentLibrary/filament/Polymaker/Polymaker PLA Pro @base.json @@ -0,0 +1,35 @@ +{ + "type": "filament", + "name": "Polymaker PLA Pro @base", + "inherits": "fdm_filament_pla", + "from": "system", + "filament_id": "OF5oXk4M", + "instantiation": "false", + "filament_density": [ + "1.23" + ], + "filament_flow_ratio": [ + "0.96" + ], + "filament_max_volumetric_speed": [ + "15" + ], + "filament_vendor": [ + "Polymaker" + ], + "nozzle_temperature": [ + "220" + ], + "nozzle_temperature_initial_layer": [ + "220" + ], + "nozzle_temperature_range_high": [ + "230" + ], + "nozzle_temperature_range_low": [ + "210" + ], + "temperature_vitrification": [ + "55" + ] +} From b0ee2cbbef2a2234f47733075dfc3e50d1a31796 Mon Sep 17 00:00:00 2001 From: Gaston Alexis Garcia Carli <32463563+lelalexi@users.noreply.github.com> Date: Tue, 22 Sep 2026 03:15:34 -0300 Subject: [PATCH 21/48] Add PlastAR (PLA) and Printalot (ABS) filament vendors (#14825) * Add PlastAR and Printalot filament vendors Two Argentine brands from Printalot: PlastAR (budget PLA) and Printalot (ABS). Each has a tuned @base plus per-color presets covering the manufacturer's color lineup. PlastAR PLA: flow 0.98, 1.75 mm, nozzle 220 C (190-230), bed 60 C; 14 colors. Printalot ABS: flow 0.94, density 1.05, retraction 0.2 mm, max volumetric 18 mm3/s, nozzle 250 C (240-270), bed 100 C; 14 colors. Per-color presets inherit their @base (no per-color parameter changes). Passes scripts/orca_extra_profile_check.py. * Ship PlastAR and Printalot as a single Printalot filament vendor Place both Argentine lines in one OrcaFilamentLibrary/Printalot bundle and follow the library's brand shape: a non-selectable @base plus one all-printer @System per product, which is where a library preset meant for every printer belongs. The former per-color presets are dropped, leaving PlastAR PLA and Printalot ABS with their PLA and 250 C ABS material values. setting_ids are minted by the tooling; filament_ids resolve through the @base roots. --------- Co-authored-by: SoftFever <103989404+SoftFever@users.noreply.github.com> Co-authored-by: SoftFever --- resources/profiles/OrcaFilamentLibrary.json | 16 ++++++ .../Printalot/PlastAR PLA @System.json | 9 ++++ .../filament/Printalot/PlastAR PLA @base.json | 48 +++++++++++++++++ .../Printalot/Printalot ABS @System.json | 9 ++++ .../Printalot/Printalot ABS @base.json | 54 +++++++++++++++++++ 5 files changed, 136 insertions(+) create mode 100644 resources/profiles/OrcaFilamentLibrary/filament/Printalot/PlastAR PLA @System.json create mode 100644 resources/profiles/OrcaFilamentLibrary/filament/Printalot/PlastAR PLA @base.json create mode 100644 resources/profiles/OrcaFilamentLibrary/filament/Printalot/Printalot ABS @System.json create mode 100644 resources/profiles/OrcaFilamentLibrary/filament/Printalot/Printalot ABS @base.json diff --git a/resources/profiles/OrcaFilamentLibrary.json b/resources/profiles/OrcaFilamentLibrary.json index 7dada1c2f1..fa97f3492f 100644 --- a/resources/profiles/OrcaFilamentLibrary.json +++ b/resources/profiles/OrcaFilamentLibrary.json @@ -156,6 +156,10 @@ "name": "PolyLite ABS @base", "sub_path": "filament/Polymaker/PolyLite ABS @base.json" }, + { + "name": "Printalot ABS @base", + "sub_path": "filament/Printalot/Printalot ABS @base.json" + }, { "name": "Bambu ASA @base", "sub_path": "filament/Bambu/Bambu ASA @base.json" @@ -764,6 +768,10 @@ "name": "Panchroma PLA UV Shift @base", "sub_path": "filament/Polymaker/Panchroma PLA UV Shift @base.json" }, + { + "name": "PlastAR PLA @base", + "sub_path": "filament/Printalot/PlastAR PLA @base.json" + }, { "name": "PolyLite PLA @base", "sub_path": "filament/Polymaker/PolyLite PLA @base.json" @@ -1020,6 +1028,10 @@ "name": "PolyLite ABS @System", "sub_path": "filament/Polymaker/PolyLite ABS @System.json" }, + { + "name": "Printalot ABS @System", + "sub_path": "filament/Printalot/Printalot ABS @System.json" + }, { "name": "Bambu ASA @System", "sub_path": "filament/Bambu/Bambu ASA @System.json" @@ -1904,6 +1916,10 @@ "name": "Panchroma PLA UV Shift @System", "sub_path": "filament/Polymaker/Panchroma PLA UV Shift @System.json" }, + { + "name": "PlastAR PLA @System", + "sub_path": "filament/Printalot/PlastAR PLA @System.json" + }, { "name": "PolyLite Dual PLA @base", "sub_path": "filament/Polymaker/PolyLite Dual PLA @base.json" diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Printalot/PlastAR PLA @System.json b/resources/profiles/OrcaFilamentLibrary/filament/Printalot/PlastAR PLA @System.json new file mode 100644 index 0000000000..3eb8940374 --- /dev/null +++ b/resources/profiles/OrcaFilamentLibrary/filament/Printalot/PlastAR PLA @System.json @@ -0,0 +1,9 @@ +{ + "type": "filament", + "name": "PlastAR PLA @System", + "inherits": "PlastAR PLA @base", + "from": "system", + "setting_id": "BuWjJYav1gbWZacL", + "instantiation": "true", + "compatible_printers": [] +} diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Printalot/PlastAR PLA @base.json b/resources/profiles/OrcaFilamentLibrary/filament/Printalot/PlastAR PLA @base.json new file mode 100644 index 0000000000..6179da8788 --- /dev/null +++ b/resources/profiles/OrcaFilamentLibrary/filament/Printalot/PlastAR PLA @base.json @@ -0,0 +1,48 @@ +{ + "type": "filament", + "name": "PlastAR PLA @base", + "inherits": "fdm_filament_pla", + "from": "system", + "filament_id": "OFCTqYGM", + "instantiation": "false", + "filament_vendor": [ + "PlastAR" + ], + "filament_type": [ + "PLA" + ], + "filament_notes": "PlastAR PLA (Printalot budget line). Product page: https://printalot.com.ar/productos/filamentos/pla/plast-ar-pla-1-kg/ Community-contributed profile; not affiliated with or endorsed by Printalot.", + "filament_diameter": [ + "1.75" + ], + "filament_density": [ + "1.24" + ], + "filament_flow_ratio": [ + "0.98" + ], + "nozzle_temperature": [ + "220" + ], + "nozzle_temperature_initial_layer": [ + "220" + ], + "nozzle_temperature_range_low": [ + "190" + ], + "nozzle_temperature_range_high": [ + "230" + ], + "hot_plate_temp": [ + "60" + ], + "hot_plate_temp_initial_layer": [ + "60" + ], + "textured_plate_temp": [ + "60" + ], + "textured_plate_temp_initial_layer": [ + "60" + ] +} diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Printalot/Printalot ABS @System.json b/resources/profiles/OrcaFilamentLibrary/filament/Printalot/Printalot ABS @System.json new file mode 100644 index 0000000000..28dcf49bd2 --- /dev/null +++ b/resources/profiles/OrcaFilamentLibrary/filament/Printalot/Printalot ABS @System.json @@ -0,0 +1,9 @@ +{ + "type": "filament", + "name": "Printalot ABS @System", + "inherits": "Printalot ABS @base", + "from": "system", + "setting_id": "yIAtpMcQarjl45T7", + "instantiation": "true", + "compatible_printers": [] +} diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Printalot/Printalot ABS @base.json b/resources/profiles/OrcaFilamentLibrary/filament/Printalot/Printalot ABS @base.json new file mode 100644 index 0000000000..073dc5c47d --- /dev/null +++ b/resources/profiles/OrcaFilamentLibrary/filament/Printalot/Printalot ABS @base.json @@ -0,0 +1,54 @@ +{ + "type": "filament", + "name": "Printalot ABS @base", + "inherits": "fdm_filament_abs", + "from": "system", + "filament_id": "OFgq39c2", + "instantiation": "false", + "filament_vendor": [ + "Printalot" + ], + "filament_type": [ + "ABS" + ], + "filament_notes": "Printalot ABS. Product page: https://printalot.com.ar/productos/filamentos/abs/abs-1-kg/ Community-contributed profile; not affiliated with or endorsed by Printalot.", + "filament_diameter": [ + "1.75" + ], + "filament_density": [ + "1.05" + ], + "filament_flow_ratio": [ + "0.94" + ], + "filament_max_volumetric_speed": [ + "18" + ], + "filament_retraction_length": [ + "0.2" + ], + "nozzle_temperature": [ + "250" + ], + "nozzle_temperature_initial_layer": [ + "250" + ], + "nozzle_temperature_range_low": [ + "240" + ], + "nozzle_temperature_range_high": [ + "270" + ], + "hot_plate_temp": [ + "100" + ], + "hot_plate_temp_initial_layer": [ + "100" + ], + "textured_plate_temp": [ + "100" + ], + "textured_plate_temp_initial_layer": [ + "100" + ] +} From 423e7b1dbdf5064031f52a2e450f80d7d3f8b679 Mon Sep 17 00:00:00 2001 From: Lam Wei Lun Date: Tue, 22 Sep 2026 14:16:48 +0800 Subject: [PATCH 22/48] Remove duplicated speed dial menu on macOS --- src/slic3r/GUI/MainFrame.cpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index 546e40499c..ec82786432 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -3424,11 +3424,6 @@ void MainFrame::init_menubar_as_editor() wxGetApp().open_preferences(); }, "", nullptr, []() { return true; }, this, 1); - parent_menu->AppendSeparator(); - append_shortcut_item( - parent_menu, Shortcut::SpeedDial, false, _L("Open speed dial"), "", - [](wxCommandEvent &) { wxGetApp().open_speed_dial(); }, - "", nullptr, []() { return true; }, this); //parent_menu->Insert(1, preference_item); #endif // Help menu From fd9c1218a443a388ac1f01df074b585677d35e21 Mon Sep 17 00:00:00 2001 From: Hanif Koh Date: Tue, 22 Sep 2026 14:35:14 +0800 Subject: [PATCH 23/48] Keep Python Printer Agent Exceptions Out of the Host IPrinterAgent callers do not catch, so a Python raise, a missing override or a wrongly typed return from a printer agent plugin escaped into the GUI. Each trampoline operation now logs the failure and answers with NetworkAgent's no-agent value: -1 for status codes, the empty value otherwise. --- ...PrinterAgentPluginCapabilityTrampoline.hpp | 179 ++++++++---------- tests/slic3rutils/CMakeLists.txt | 1 + .../slic3rutils/test_plugin_printer_agent.cpp | 155 +++++++++++++++ 3 files changed, 237 insertions(+), 98 deletions(-) create mode 100644 tests/slic3rutils/test_plugin_printer_agent.cpp diff --git a/src/slic3r/plugin/pluginTypes/printerAgent/PrinterAgentPluginCapabilityTrampoline.hpp b/src/slic3r/plugin/pluginTypes/printerAgent/PrinterAgentPluginCapabilityTrampoline.hpp index 5491e1cef6..6331ee64a6 100644 --- a/src/slic3r/plugin/pluginTypes/printerAgent/PrinterAgentPluginCapabilityTrampoline.hpp +++ b/src/slic3r/plugin/pluginTypes/printerAgent/PrinterAgentPluginCapabilityTrampoline.hpp @@ -7,7 +7,31 @@ #include "IPrinterAgent.hpp" #include +#include + +// IPrinterAgent reports failure through its return values and its callers do not catch, so nothing +// the plugin does may leave the trampoline as an exception: a Python raise, a missing override or a +// wrongly typed return is logged and answered with what NetworkAgent returns when no agent is set. +#define ORCA_PY_AGENT_CATCH(name) \ + catch (const std::exception& ex) { this->log_failure(#name, ex.what()); } \ + catch (...) { this->log_failure(#name, "unknown error"); } + +#define ORCA_PY_AGENT_OVERRIDE(ret, name, ...) \ + try { \ + ORCA_PY_OVERRIDE_AUDITED([] {}, PYBIND11_OVERRIDE_PURE, ret, PrinterAgentPluginCapability, name, ##__VA_ARGS__); \ + } ORCA_PY_AGENT_CATCH(name) \ + return printer_agent_failure() + namespace Slic3r { +// NetworkAgent's no-agent answer: -1 for a status code, the empty value (false, "", none) otherwise. +template T printer_agent_failure() +{ + if constexpr (std::is_same_v) + return -1; + else if constexpr (!std::is_void_v) + return T{}; +} + class PyPrinterAgentPluginCapabilityTrampoline : public PyPluginCommonTrampoline { public: @@ -15,207 +39,157 @@ public: AgentInfo get_agent_info() override { - ORCA_PY_OVERRIDE_AUDITED( - [] {}, PYBIND11_OVERRIDE_PURE, AgentInfo, PrinterAgentPluginCapability, - get_agent_info); + ORCA_PY_AGENT_OVERRIDE(AgentInfo, get_agent_info); } int connect_printer(std::string dev_id, std::string dev_ip, std::string username, std::string password, bool use_ssl) override { - ORCA_PY_OVERRIDE_AUDITED( - [] {}, PYBIND11_OVERRIDE_PURE, int, PrinterAgentPluginCapability, connect_printer, dev_id, - dev_ip, username, password, use_ssl); + ORCA_PY_AGENT_OVERRIDE(int, connect_printer, dev_id, dev_ip, username, password, use_ssl); } int disconnect_printer() override { - ORCA_PY_OVERRIDE_AUDITED( - [] {}, PYBIND11_OVERRIDE_PURE, int, PrinterAgentPluginCapability, disconnect_printer); + ORCA_PY_AGENT_OVERRIDE(int, disconnect_printer); } int send_message(std::string dev_id, std::string json_str, int qos, int flag) override { - ORCA_PY_OVERRIDE_AUDITED( - [] {}, PYBIND11_OVERRIDE_PURE, int, PrinterAgentPluginCapability, send_message, dev_id, - json_str, qos, flag); + ORCA_PY_AGENT_OVERRIDE(int, send_message, dev_id, json_str, qos, flag); } int send_message_to_printer(std::string dev_id, std::string json_str, int qos, int flag) override { - ORCA_PY_OVERRIDE_AUDITED( - [] {}, PYBIND11_OVERRIDE_PURE, int, PrinterAgentPluginCapability, send_message_to_printer, - dev_id, json_str, qos, flag); + ORCA_PY_AGENT_OVERRIDE(int, send_message_to_printer, dev_id, json_str, qos, flag); } bool start_discovery(bool start, bool sending) override { - ORCA_PY_OVERRIDE_AUDITED( - [] {}, PYBIND11_OVERRIDE_PURE, bool, PrinterAgentPluginCapability, start_discovery, start, - sending); + ORCA_PY_AGENT_OVERRIDE(bool, start_discovery, start, sending); } int bind_detect(std::string dev_ip, std::string sec_link, detectResult& detect) override { - ORCA_PY_OVERRIDE_AUDITED( - [] {}, PYBIND11_OVERRIDE_PURE, int, PrinterAgentPluginCapability, bind_detect, dev_ip, - sec_link, detect); + ORCA_PY_AGENT_OVERRIDE(int, bind_detect, dev_ip, sec_link, detect); } std::string get_user_selected_machine() override { - ORCA_PY_OVERRIDE_AUDITED( - [] {}, PYBIND11_OVERRIDE_PURE, std::string, PrinterAgentPluginCapability, - get_user_selected_machine); + ORCA_PY_AGENT_OVERRIDE(std::string, get_user_selected_machine); } int set_user_selected_machine(std::string dev_id) override { - ORCA_PY_OVERRIDE_AUDITED( - [] {}, PYBIND11_OVERRIDE_PURE, int, PrinterAgentPluginCapability, - set_user_selected_machine, dev_id); + ORCA_PY_AGENT_OVERRIDE(int, set_user_selected_machine, dev_id); } int start_send_gcode_to_sdcard(PrintParams params, OnUpdateStatusFn update_fn, WasCancelledFn cancel_fn, OnWaitFn wait_fn) override { - ORCA_PY_OVERRIDE_AUDITED( - [] {}, PYBIND11_OVERRIDE_PURE, int, PrinterAgentPluginCapability, - start_send_gcode_to_sdcard, params, update_fn, cancel_fn, wait_fn); + ORCA_PY_AGENT_OVERRIDE(int, start_send_gcode_to_sdcard, params, update_fn, cancel_fn, wait_fn); } int start_local_print(PrintParams params, OnUpdateStatusFn update_fn, WasCancelledFn cancel_fn) override { - ORCA_PY_OVERRIDE_AUDITED( - [] {}, PYBIND11_OVERRIDE_PURE, int, PrinterAgentPluginCapability, start_local_print, - params, update_fn, cancel_fn); + ORCA_PY_AGENT_OVERRIDE(int, start_local_print, params, update_fn, cancel_fn); } FilamentSyncMode get_filament_sync_mode() const override { - ORCA_PY_OVERRIDE_AUDITED( - [] {}, PYBIND11_OVERRIDE_PURE, FilamentSyncMode, PrinterAgentPluginCapability, - get_filament_sync_mode); + ORCA_PY_AGENT_OVERRIDE(FilamentSyncMode, get_filament_sync_mode); } bool fetch_filament_info(std::string dev_id) override { - ORCA_PY_OVERRIDE_AUDITED( - [] {}, PYBIND11_OVERRIDE_PURE, bool, PrinterAgentPluginCapability, fetch_filament_info, dev_id); + ORCA_PY_AGENT_OVERRIDE(bool, fetch_filament_info, dev_id); } int check_cert() override { - ORCA_PY_OVERRIDE_AUDITED( - [] {}, PYBIND11_OVERRIDE_PURE, int, PrinterAgentPluginCapability, check_cert); + ORCA_PY_AGENT_OVERRIDE(int, check_cert); } void install_device_cert(std::string dev_id, bool lan_only) override { - ORCA_PY_OVERRIDE_AUDITED( - [] {}, PYBIND11_OVERRIDE_PURE, void, PrinterAgentPluginCapability, install_device_cert, dev_id, - lan_only); + ORCA_PY_AGENT_OVERRIDE(void, install_device_cert, dev_id, lan_only); } int ping_bind(std::string ping_code) override { - ORCA_PY_OVERRIDE_AUDITED( - [] {}, PYBIND11_OVERRIDE_PURE, int, PrinterAgentPluginCapability, ping_bind, ping_code); + ORCA_PY_AGENT_OVERRIDE(int, ping_bind, ping_code); } int bind(std::string dev_ip, std::string dev_id, std::string dev_model, std::string sec_link, std::string timezone, bool improved, OnUpdateStatusFn update_fn) override { - ORCA_PY_OVERRIDE_AUDITED( - [] {}, PYBIND11_OVERRIDE_PURE, int, PrinterAgentPluginCapability, bind, dev_ip, dev_id, - dev_model, sec_link, timezone, improved, update_fn); + ORCA_PY_AGENT_OVERRIDE(int, bind, dev_ip, dev_id, dev_model, sec_link, timezone, improved, update_fn); } int unbind(std::string dev_id) override { - ORCA_PY_OVERRIDE_AUDITED( - [] {}, PYBIND11_OVERRIDE_PURE, int, PrinterAgentPluginCapability, unbind, dev_id); + ORCA_PY_AGENT_OVERRIDE(int, unbind, dev_id); } int start_print(PrintParams params, OnUpdateStatusFn update_fn, WasCancelledFn cancel_fn, OnWaitFn wait_fn) override { - ORCA_PY_OVERRIDE_AUDITED( - [] {}, PYBIND11_OVERRIDE_PURE, int, PrinterAgentPluginCapability, start_print, params, - update_fn, cancel_fn, wait_fn); + ORCA_PY_AGENT_OVERRIDE(int, start_print, params, update_fn, cancel_fn, wait_fn); } int start_local_print_with_record(PrintParams params, OnUpdateStatusFn update_fn, WasCancelledFn cancel_fn, OnWaitFn wait_fn) override { - ORCA_PY_OVERRIDE_AUDITED( - [] {}, PYBIND11_OVERRIDE_PURE, int, PrinterAgentPluginCapability, - start_local_print_with_record, params, update_fn, cancel_fn, wait_fn); + ORCA_PY_AGENT_OVERRIDE(int, start_local_print_with_record, params, update_fn, cancel_fn, wait_fn); } int start_sdcard_print(PrintParams params, OnUpdateStatusFn update_fn, WasCancelledFn cancel_fn) override { - ORCA_PY_OVERRIDE_AUDITED( - [] {}, PYBIND11_OVERRIDE_PURE, int, PrinterAgentPluginCapability, start_sdcard_print, params, - update_fn, cancel_fn); + ORCA_PY_AGENT_OVERRIDE(int, start_sdcard_print, params, update_fn, cancel_fn); } int get_hms_snapshot(std::string dev_id, std::string file_name, std::function callback) override { - ORCA_PY_OVERRIDE_AUDITED( - [] {}, PYBIND11_OVERRIDE_PURE, int, PrinterAgentPluginCapability, get_hms_snapshot, dev_id, - file_name, callback); + ORCA_PY_AGENT_OVERRIDE(int, get_hms_snapshot, dev_id, file_name, callback); } int set_server_callback(OnServerErrFn fn) override { - ORCA_PY_OVERRIDE_AUDITED( - [] {}, PYBIND11_OVERRIDE_PURE, int, PrinterAgentPluginCapability, set_server_callback, fn); + ORCA_PY_AGENT_OVERRIDE(int, set_server_callback, fn); } int set_on_ssdp_msg_fn(OnMsgArrivedFn fn) override { - ORCA_PY_OVERRIDE_AUDITED( - [] {}, PYBIND11_OVERRIDE_PURE, int, PrinterAgentPluginCapability, set_on_ssdp_msg_fn, fn); + ORCA_PY_AGENT_OVERRIDE(int, set_on_ssdp_msg_fn, fn); } int set_on_printer_connected_fn(OnPrinterConnectedFn fn) override { - ORCA_PY_OVERRIDE_AUDITED( - [] {}, PYBIND11_OVERRIDE_PURE, int, PrinterAgentPluginCapability, set_on_printer_connected_fn, - fn); + ORCA_PY_AGENT_OVERRIDE(int, set_on_printer_connected_fn, fn); } int set_on_subscribe_failure_fn(GetSubscribeFailureFn fn) override { - ORCA_PY_OVERRIDE_AUDITED( - [] {}, PYBIND11_OVERRIDE_PURE, int, PrinterAgentPluginCapability, set_on_subscribe_failure_fn, - fn); + ORCA_PY_AGENT_OVERRIDE(int, set_on_subscribe_failure_fn, fn); } int set_on_message_fn(OnMessageFn fn) override { - ORCA_PY_OVERRIDE_AUDITED( - [] {}, PYBIND11_OVERRIDE_PURE, int, PrinterAgentPluginCapability, set_on_message_fn, fn); + ORCA_PY_AGENT_OVERRIDE(int, set_on_message_fn, fn); } int set_on_user_message_fn(OnMessageFn fn) override { - ORCA_PY_OVERRIDE_AUDITED( - [] {}, PYBIND11_OVERRIDE_PURE, int, PrinterAgentPluginCapability, set_on_user_message_fn, fn); + ORCA_PY_AGENT_OVERRIDE(int, set_on_user_message_fn, fn); } int set_on_local_connect_fn(OnLocalConnectedFn fn) override { - ORCA_PY_OVERRIDE_AUDITED( - [] {}, PYBIND11_OVERRIDE_PURE, int, PrinterAgentPluginCapability, set_on_local_connect_fn, fn); + ORCA_PY_AGENT_OVERRIDE(int, set_on_local_connect_fn, fn); } int set_on_local_message_fn(OnMessageFn fn) override { - ORCA_PY_OVERRIDE_AUDITED( - [] {}, PYBIND11_OVERRIDE_PURE, int, PrinterAgentPluginCapability, set_on_local_message_fn, fn); + ORCA_PY_AGENT_OVERRIDE(int, set_on_local_message_fn, fn); } int set_queue_on_main_fn(QueueOnMainFn fn) override { - ORCA_PY_OVERRIDE_AUDITED( - [] {}, PYBIND11_OVERRIDE_PURE, int, PrinterAgentPluginCapability, set_queue_on_main_fn, fn); + ORCA_PY_AGENT_OVERRIDE(int, set_queue_on_main_fn, fn); } // request_bind_ticket returns its ticket through a std::string* out-param, which pybind11 @@ -223,24 +197,33 @@ public: // returns a (result, ticket) tuple, which we unpack into the int result and the out-param. int request_bind_ticket(std::string* ticket) override { - ORCA_PY_AUDIT_SCOPE(); - ::Slic3r::PluginCapabilityInterface::RefCounter _orca_ref_counter(*this); - ::Slic3r::PythonGILState gil; - if (!gil) - throw std::runtime_error("Python interpreter is shutting down"); - pybind11::function override = - pybind11::get_override(static_cast(this), "request_bind_ticket"); - if (!override) - pybind11::pybind11_fail("Tried to call pure virtual function \"PrinterAgentPluginCapability::request_bind_ticket\""); try { - pybind11::tuple result = override().cast(); - if (ticket) - *ticket = result[1].cast(); - return result[0].cast(); - } catch (pybind11::error_already_set& err) { - ::Slic3r::log_python_exception_keep(err); - throw; - } + ORCA_PY_AUDIT_SCOPE(); + ::Slic3r::PluginCapabilityInterface::RefCounter _orca_ref_counter(*this); + ::Slic3r::PythonGILState gil; + if (!gil) + throw std::runtime_error("Python interpreter is shutting down"); + pybind11::function override = + pybind11::get_override(static_cast(this), "request_bind_ticket"); + if (!override) + pybind11::pybind11_fail("Tried to call pure virtual function \"PrinterAgentPluginCapability::request_bind_ticket\""); + try { + pybind11::tuple result = override().cast(); + if (ticket) + *ticket = result[1].cast(); + return result[0].cast(); + } catch (pybind11::error_already_set& err) { + ::Slic3r::log_python_exception_keep(err); + throw; + } + } ORCA_PY_AGENT_CATCH(request_bind_ticket) + return printer_agent_failure(); + } + +private: + void log_failure(const char* operation, const char* error) const + { + BOOST_LOG_TRIVIAL(error) << "Printer agent plugin '" << this->audit_plugin_key() << "': " << operation << " failed: " << error; } }; } // namespace Slic3r diff --git a/tests/slic3rutils/CMakeLists.txt b/tests/slic3rutils/CMakeLists.txt index 3ddacc5a1b..069d87e25b 100644 --- a/tests/slic3rutils/CMakeLists.txt +++ b/tests/slic3rutils/CMakeLists.txt @@ -13,6 +13,7 @@ add_executable(${_TEST_NAME}_tests test_plugin_capabilities_in_use.cpp test_plugin_install.cpp test_plugin_lifecycle.cpp + test_plugin_printer_agent.cpp test_slicing_pipeline_bindings.cpp test_slicing_pipeline_config.cpp test_plugin_sort.cpp diff --git a/tests/slic3rutils/test_plugin_printer_agent.cpp b/tests/slic3rutils/test_plugin_printer_agent.cpp new file mode 100644 index 0000000000..b6e5f4a36e --- /dev/null +++ b/tests/slic3rutils/test_plugin_printer_agent.cpp @@ -0,0 +1,155 @@ +#include + +#include +#include +#include +#include +#include + +#include +#include + +#include +#include + +namespace py = pybind11; +using namespace Slic3r; + +namespace { + +// Same idiom as ScopedPluginManager in test_plugin_lifecycle.cpp: the trampolines refuse to call +// into Python unless PythonInterpreter::instance() reports initialized. +struct ScopedPluginManager +{ + bool initialized = PluginManager::instance().initialize(); + + ~ScopedPluginManager() + { + PluginManager::instance().shutdown(); + PythonInterpreter::instance().shutdown(); + } +}; + +// The host reaches a printer agent plugin through IPrinterAgent, so the tests do too. The Python +// instance carries the overrides, so it has to outlive every call, as PluginInstanceHandle ensures +// in production. +struct Agent +{ + py::object instance; + std::shared_ptr agent; + + IPrinterAgent* operator->() const { return agent.get(); } + IPrinterAgent& operator*() const { return *agent; } +}; + +Agent make_agent(const std::string& body) +{ + (void) PythonPluginBridge::instance(); // force the embedded module registration into the binary + py::dict globals; + globals["orca"] = py::module_::import("orca"); + + py::exec("class Agent(orca.printer_agent.PrinterAgentBase):\n" + " def get_name(self): return 'agent'\n" + body, globals); + py::object instance = globals["Agent"](); + auto capability = instance.cast>(); + capability->set_audit_plugin_key("agent_plugin"); + return {instance, std::dynamic_pointer_cast(capability)}; +} + +// One operation per return type and dispatch shape; the rest share their macro. +const std::string OPERATIONS[] = {"get_agent_info", "disconnect_printer", "start_discovery", "get_user_selected_machine", + "get_filament_sync_mode", "install_device_cert", "start_local_print", "request_bind_ticket"}; + +// What NetworkAgent answers when no printer agent is set. +void check_answers_like_no_agent(IPrinterAgent& agent) +{ + std::string ticket = "untouched"; + + CHECK(agent.get_agent_info().id.empty()); + CHECK(agent.disconnect_printer() == -1); + CHECK_FALSE(agent.start_discovery(true, false)); + CHECK(agent.get_user_selected_machine().empty()); + CHECK(agent.get_filament_sync_mode() == FilamentSyncMode::none); + CHECK_NOTHROW(agent.install_device_cert("dev", true)); + CHECK(agent.start_local_print(PrintParams{}, nullptr, nullptr) == -1); + CHECK(agent.request_bind_ticket(&ticket) == -1); + CHECK(ticket == "untouched"); +} + +std::string define_all(const std::string& signature_tail, const std::string& statement) +{ + std::string body; + for (const std::string& operation : OPERATIONS) + body += " def " + operation + "(self" + signature_tail + "): " + statement + "\n"; + return body; +} + +} // namespace + +TEST_CASE("A printer agent operation that raises answers like a missing agent", "[PluginPrinterAgent][Python]") +{ + ScopedPluginManager plugin_system; // declared first: destroyed last + if (!plugin_system.initialized) + SKIP("Bundled Python interpreter unavailable: " + PythonInterpreter::instance().last_error()); + py::gil_scoped_acquire gil; // released before plugin_system's destructor shuts Python down + + auto agent = make_agent(define_all(", *args", "raise RuntimeError('boom')")); + REQUIRE(agent.agent); + + check_answers_like_no_agent(*agent); + + // The interpreter stays usable. + CHECK(py::eval("1 + 1").cast() == 2); +} + +TEST_CASE("A printer agent that omits its operations answers like a missing agent", "[PluginPrinterAgent][Python]") +{ + ScopedPluginManager plugin_system; + if (!plugin_system.initialized) + SKIP("Bundled Python interpreter unavailable: " + PythonInterpreter::instance().last_error()); + py::gil_scoped_acquire gil; + + auto agent = make_agent(""); + REQUIRE(agent.agent); + + check_answers_like_no_agent(*agent); +} + +TEST_CASE("A printer agent operation returning the wrong type answers like a missing agent", "[PluginPrinterAgent][Python]") +{ + ScopedPluginManager plugin_system; + if (!plugin_system.initialized) + SKIP("Bundled Python interpreter unavailable: " + PythonInterpreter::instance().last_error()); + py::gil_scoped_acquire gil; + + auto agent = make_agent(define_all(", *args", "return object()")); + REQUIRE(agent.agent); + + check_answers_like_no_agent(*agent); +} + +TEST_CASE("A working printer agent's answers reach the host unchanged", "[PluginPrinterAgent][Python]") +{ + ScopedPluginManager plugin_system; + if (!plugin_system.initialized) + SKIP("Bundled Python interpreter unavailable: " + PythonInterpreter::instance().last_error()); + py::gil_scoped_acquire gil; + + auto agent = make_agent(" def get_agent_info(self): return orca.printer_agent.AgentInfo('id', 'name', '1', 'description')\n" + " def disconnect_printer(self): return 7\n" + " def start_discovery(self, start, sending): return start and not sending\n" + " def get_user_selected_machine(self): return 'machine'\n" + " def get_filament_sync_mode(self): return orca.printer_agent.FilamentSyncMode.Pull\n" + " def request_bind_ticket(self): return (3, 'ticket')\n"); + REQUIRE(agent.agent); + + std::string ticket; + + CHECK(agent->get_agent_info().id == "id"); + CHECK(agent->disconnect_printer() == 7); + CHECK(agent->start_discovery(true, false)); + CHECK(agent->get_user_selected_machine() == "machine"); + CHECK(agent->get_filament_sync_mode() == FilamentSyncMode::pull); + CHECK(agent->request_bind_ticket(&ticket) == 3); + CHECK(ticket == "ticket"); +} From 2876374b45d17292972ce13bd9eca83f5c3461db Mon Sep 17 00:00:00 2001 From: HanifKoh <76276251+HanifKoh@users.noreply.github.com> Date: Tue, 22 Sep 2026 14:52:25 +0800 Subject: [PATCH 24/48] Add a Dockable HTML Panel API for Plugins (#15736) orca.host.ui.create_dock_panel(html, title, width, height, on_message, on_close, dock) hosts plugin HTML in a pane of the Plater's dock manager, next to the sidebar, and returns a UiDockPanel handle (post/show/hide/close/is_open). The arguments follow create_window(). The panel uses the window.orca bridge of plugin windows, restores its position and size from the saved window layout, hides with the Plater off the Prepare and Preview tabs when floating, and is closed with its plugin; plugin panes are removed in MainFrame::shutdown(). The web view hosting moves out of PluginPage into a shared WebPanel base: bootstrap page and swap to the plugin HTML, theme, element-default and bridge scripts, window.orca message parsing, delivery to the page, and live re-theming, also re-applied on every load after the swap. Pages tabs and docked panels both derive from it. Pages tabs now re-theme in place on a theme change instead of being reloaded, and a window.orca call a host does not support is logged. What the hosts share no longer lives in one of them: the bootstrap page, the base URL and the plugin-window bridge move to Widgets/WebHosting, used by WebDialog and WebPanel alike. The Plater restores plugin panes with a new saved-layout parser, GUI/AuiPaneLayout, kept in its own small header so slic3rutils can test it without pulling in the Plater. The web hosting classes carry no plugin name, so other hosts can reuse them: PluginWebDialog becomes WebDialog (its bootstrap page moves to resources/web/dialog/WebDialog), and destroy_for_plugin(), load_plugin_content() and plugin_defaults_user_script() become destroy_silently(), load_page_html() and element_defaults_user_script(). Includes a sample plugin (sandboxes/orca_dock_panel_plugin_any.py) and binding and layout-helper tests in slic3rutils. --- .../{PluginWebDialog => WebDialog}/blank.html | 2 +- sandboxes/orca_dock_panel_plugin_any.py | 146 ++++++++++++++++ src/slic3r/CMakeLists.txt | 12 +- src/slic3r/GUI/AuiPaneLayout.cpp | 20 +++ src/slic3r/GUI/AuiPaneLayout.hpp | 11 ++ src/slic3r/GUI/DockPanel.cpp | 103 +++++++++++ src/slic3r/GUI/DockPanel.hpp | 54 ++++++ src/slic3r/GUI/MainFrame.cpp | 2 + src/slic3r/GUI/Plater.cpp | 133 +++++++++++++++ src/slic3r/GUI/Plater.hpp | 11 ++ .../{PluginWebDialog.cpp => WebDialog.cpp} | 131 ++++---------- .../{PluginWebDialog.hpp => WebDialog.hpp} | 36 ++-- src/slic3r/GUI/WebPanel.cpp | 111 ++++++++++++ src/slic3r/GUI/WebPanel.hpp | 48 ++++++ src/slic3r/GUI/Widgets/WebHosting.cpp | 69 ++++++++ src/slic3r/GUI/Widgets/WebHosting.hpp | 25 +++ src/slic3r/GUI/Widgets/WebViewHostDialog.cpp | 4 +- src/slic3r/GUI/Widgets/WebViewHostDialog.hpp | 6 +- src/slic3r/plugin/host/PluginHostUi.cpp | 160 +++++++++++++++--- src/slic3r/plugin/host/PluginPages.cpp | 98 +++-------- src/slic3r/plugin/host/PluginPages.hpp | 18 +- tests/slic3rutils/test_plugin_host_api.cpp | 74 ++++++++ 22 files changed, 1038 insertions(+), 236 deletions(-) rename resources/web/dialog/{PluginWebDialog => WebDialog}/blank.html (76%) create mode 100644 sandboxes/orca_dock_panel_plugin_any.py create mode 100644 src/slic3r/GUI/AuiPaneLayout.cpp create mode 100644 src/slic3r/GUI/AuiPaneLayout.hpp create mode 100644 src/slic3r/GUI/DockPanel.cpp create mode 100644 src/slic3r/GUI/DockPanel.hpp rename src/slic3r/GUI/{PluginWebDialog.cpp => WebDialog.cpp} (53%) rename src/slic3r/GUI/{PluginWebDialog.hpp => WebDialog.hpp} (74%) create mode 100644 src/slic3r/GUI/WebPanel.cpp create mode 100644 src/slic3r/GUI/WebPanel.hpp create mode 100644 src/slic3r/GUI/Widgets/WebHosting.cpp create mode 100644 src/slic3r/GUI/Widgets/WebHosting.hpp diff --git a/resources/web/dialog/PluginWebDialog/blank.html b/resources/web/dialog/WebDialog/blank.html similarity index 76% rename from resources/web/dialog/PluginWebDialog/blank.html rename to resources/web/dialog/WebDialog/blank.html index 5047c5ba7b..928d754fab 100644 --- a/resources/web/dialog/PluginWebDialog/blank.html +++ b/resources/web/dialog/WebDialog/blank.html @@ -1,5 +1,5 @@ - diff --git a/sandboxes/orca_dock_panel_plugin_any.py b/sandboxes/orca_dock_panel_plugin_any.py new file mode 100644 index 0000000000..514f6c3068 --- /dev/null +++ b/sandboxes/orca_dock_panel_plugin_any.py @@ -0,0 +1,146 @@ +# /// script +# requires-python = ">=3.12" +# +# [tool.orcaslicer.plugin] +# name = "Dock Panel Demo" +# description = "Opens a dockable panel beside the 3D view that lists the objects on the plate." +# author = "OrcaSlicer" +# version = "0.0.1" +# /// +"""Dock Panel Demo -- orca.host.ui.create_dock_panel(). + +Run it from the Plugins dialog. It opens an HTML panel docked on the right of the 3D view, in the +same dock area as the sidebar. Drag its caption to dock it on another side (or float it, where the +platform allows), hide it from the page and run the plugin again to bring it back, or close it with +its close button or from the page. + + page --orca.postMessage({command: 'refresh'})--> plugin.on_message() + page --orca.postMessage({command: 'hide'})--> plugin.on_message() -> panel.hide() + page --orca.close()--> panel closes, plugin.on_close() + plugin --panel.post({command: 'objects', ...})--> page (orca.onMessage) +""" +import orca + +PAGE = """ + + +

Objects on the plate

+

Docked beside the 3D view. Drag the caption to move it.

+ +
+ + + +
+ + + + +
NamePartsCopies
+

Waiting for the plugin...

+ + +""" + + +def plate_objects(): + try: + model = orca.host.model() + except RuntimeError as error: + return {"command": "objects", "error": str(error)} + return { + "command": "objects", + "objects": [ + {"name": obj.name or "(unnamed)", "volumes": obj.volume_count(), "instances": obj.instance_count()} + for obj in model.objects() + ], + } + + +class DockPanelDemo(orca.script.ScriptPluginCapabilityBase): + panel = None + + def get_name(self): + return "Dock Panel Demo" + + def execute(self): + # The capability instance lives as long as the plugin, so a second run finds the open panel. + if self.panel is not None and self.panel.is_open(): + self.panel.show() + return orca.ExecutionResult.success("Dock Panel Demo is already open.") + self.panel = orca.host.ui.create_dock_panel( + html=PAGE, + title="Dock Panel Demo", + width=320, + height=480, + on_message=self.on_message, + on_close=self.on_close, + dock="right", + ) + return orca.ExecutionResult.success("Dock Panel Demo opened.") + + # Called on the UI thread when the page posts. + def on_message(self, message): + command = (message or {}).get("command") + if command == "refresh": + self.panel.post(plate_objects()) + elif command == "hide": + self.panel.hide() + + def on_close(self): + self.panel = None + + +@orca.plugin +class DockPanelDemoPlugin(orca.base): + def register_capabilities(self): + orca.register_capability(DockPanelDemo) diff --git a/src/slic3r/CMakeLists.txt b/src/slic3r/CMakeLists.txt index d925ca6333..7ac307c87b 100644 --- a/src/slic3r/CMakeLists.txt +++ b/src/slic3r/CMakeLists.txt @@ -139,8 +139,16 @@ set(SLIC3R_GUI_SOURCES GUI/TerminalDialog.hpp GUI/PluginProgressDialog.cpp GUI/PluginProgressDialog.hpp - GUI/PluginWebDialog.cpp - GUI/PluginWebDialog.hpp + GUI/WebDialog.cpp + GUI/WebDialog.hpp + GUI/DockPanel.cpp + GUI/DockPanel.hpp + GUI/WebPanel.cpp + GUI/WebPanel.hpp + GUI/Widgets/WebHosting.cpp + GUI/Widgets/WebHosting.hpp + GUI/AuiPaneLayout.cpp + GUI/AuiPaneLayout.hpp GUI/DragCanvas.cpp GUI/DragCanvas.hpp GUI/EditGCodeDialog.cpp diff --git a/src/slic3r/GUI/AuiPaneLayout.cpp b/src/slic3r/GUI/AuiPaneLayout.cpp new file mode 100644 index 0000000000..dc93352971 --- /dev/null +++ b/src/slic3r/GUI/AuiPaneLayout.cpp @@ -0,0 +1,20 @@ +#include "AuiPaneLayout.hpp" + +namespace Slic3r { namespace GUI { + +std::string aui_pane_layout_entry(const std::string& layout, const std::string& pane_name) +{ + // Panes are separated by '|'; SavePerspective() escapes a '|' inside a caption as "\|". + const std::string prefix = "name=" + pane_name + ";"; + size_t begin = 0; + for (size_t i = 0; i <= layout.size(); ++i) { + if (i < layout.size() && (layout[i] != '|' || (i > 0 && layout[i - 1] == '\\'))) + continue; + if (layout.compare(begin, prefix.size(), prefix) == 0) + return layout.substr(begin, i - begin); + begin = i + 1; + } + return {}; +} + +}} // namespace Slic3r::GUI diff --git a/src/slic3r/GUI/AuiPaneLayout.hpp b/src/slic3r/GUI/AuiPaneLayout.hpp new file mode 100644 index 0000000000..e18b5ff6e1 --- /dev/null +++ b/src/slic3r/GUI/AuiPaneLayout.hpp @@ -0,0 +1,11 @@ +#pragma once + +#include + +namespace Slic3r { namespace GUI { + +// The part a wxAuiManager layout string (wxAuiManager::SavePerspective) holds for `pane_name`, in the +// form wxAuiManager::LoadPaneInfo() takes, or empty when the layout has no such pane. +std::string aui_pane_layout_entry(const std::string& layout, const std::string& pane_name); + +}} // namespace Slic3r::GUI diff --git a/src/slic3r/GUI/DockPanel.cpp b/src/slic3r/GUI/DockPanel.cpp new file mode 100644 index 0000000000..0a5d25c4e7 --- /dev/null +++ b/src/slic3r/GUI/DockPanel.cpp @@ -0,0 +1,103 @@ +#include "DockPanel.hpp" + +#include "GUI_App.hpp" +#include "Plater.hpp" +#include "Widgets/WebHosting.hpp" + +#include + +#include +#include + +namespace Slic3r { namespace GUI { + +std::string plugin_pane_name(const std::string& plugin_key, const std::string& title) +{ + std::string name = "plugin:" + plugin_key + ":" + title; + std::replace_if(name.begin(), name.end(), [](char c) { return c == '|' || c == ';' || c == '=' || c == '\\'; }, '_'); + return name; +} + +DockPanel::DockPanel(wxWindow* parent, + const std::string& html, + MessageHandler on_message, + CloseHandler on_close, + CloseHandler on_destroyed) + : WebPanel(parent, web_hosting::orca_bridge_script()) + , m_html(html) + , m_on_message(std::move(on_message)) + , m_on_close(std::move(on_close)) + , m_on_destroyed(std::move(on_destroyed)) +{ + // A link asking for a new window has nowhere to open from a docked panel. + browser()->Bind(wxEVT_WEBVIEW_NEWWINDOW, [](wxWebViewEvent& event) { event.Veto(); }); +} + +DockPanel::~DockPanel() +{ + if (m_on_destroyed) + m_on_destroyed(); +} + +bool DockPanel::on_page_message(const std::string& kind, const nlohmann::json& data) +{ + if (kind == "message") { + if (m_on_message) + m_on_message(data); + return true; + } + if (kind == "close") { + request_close(); + return true; + } + return false; +} + +void DockPanel::push_message(const nlohmann::json& data) +{ + if (!m_closing) + post_to_page(data.dump(-1, ' ', false, nlohmann::json::error_handler_t::replace)); +} + +void DockPanel::fire_close() +{ + if (m_closing) + return; + m_closing = true; + if (m_on_close) { + CloseHandler on_close = std::move(m_on_close); + m_on_close = nullptr; + on_close(); + } +} + +void DockPanel::request_close() +{ + if (m_closing) + return; + fire_close(); + // A page-requested close arrives inside the web view's script callback, so destroy later; another + // close path may have destroyed the panel by then. + wxWeakRef self(this); + CallAfter([self]() { + if (self) + self->remove_pane(); + }); +} + +void DockPanel::destroy_silently() +{ + m_closing = true; + m_on_close = nullptr; + remove_pane(); +} + +void DockPanel::remove_pane() +{ + if (Plater* plater = wxGetApp().plater()) + plater->remove_dock_pane(this); + else + Destroy(); +} + +}} // namespace Slic3r::GUI diff --git a/src/slic3r/GUI/DockPanel.hpp b/src/slic3r/GUI/DockPanel.hpp new file mode 100644 index 0000000000..a9a0a0d6b3 --- /dev/null +++ b/src/slic3r/GUI/DockPanel.hpp @@ -0,0 +1,54 @@ +#pragma once + +#include "WebPanel.hpp" + +#include +#include + +namespace Slic3r { namespace GUI { + +// Stable across sessions so the saved layout finds the pane; free of wxAuiManager layout delimiters. +std::string plugin_pane_name(const std::string& plugin_key, const std::string& title); + +// A WebPanel docked in the Plater, on the plugin-window bridge minus submit. It can be destroyed +// without the GIL, so its hooks must not capture pybind11 objects. +class DockPanel : public WebPanel +{ +public: + using MessageHandler = std::function; + using CloseHandler = std::function; + + // on_close fires once, on a user or page close. on_destroyed runs on every destruction and must + // touch host-side state only. + DockPanel(wxWindow* parent, + const std::string& html, + MessageHandler on_message, + CloseHandler on_close, + CloseHandler on_destroyed); + ~DockPanel() override; + + // Main thread only. + void push_message(const nlohmann::json& data); + // Fires on_close, then removes the pane. + void request_close(); + // Removes the pane without on_close, for plugin unload. Destroys at once: unload always comes from + // the host, never from this panel's own callbacks. + void destroy_silently(); + // Fires on_close at most once; also run by the pane's own close button. + void fire_close(); + +protected: + std::optional page_html() override { return m_html; } + bool on_page_message(const std::string& kind, const nlohmann::json& data) override; + +private: + void remove_pane(); + + std::string m_html; + bool m_closing{false}; + MessageHandler m_on_message; + CloseHandler m_on_close; + CloseHandler m_on_destroyed; +}; + +}} // namespace Slic3r::GUI diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index ec82786432..5ac664f41c 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -1189,6 +1189,8 @@ void MainFrame::shutdown() if (m_project != nullptr) m_project->shutdown(); m_plugin_pages.shutdown(); + if (m_plater != nullptr) + m_plater->remove_dock_panes(); #ifdef __WXGTK__ // Edge panels are child windows — wxWidgets destroys them automatically. m_edge_bottom = nullptr; diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 6258cf19af..76156011dd 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -87,6 +87,7 @@ #ifdef __WXGTK__ #include "LinuxDisplayBackend.hpp" #endif +#include "AuiPaneLayout.hpp" #include "GUI_Utils.hpp" #include "GUI_Factories.hpp" #include "wxExtensions.hpp" @@ -6748,6 +6749,14 @@ struct Plater::priv // GUI elements AuiMgr m_aui_mgr; + // Live dock panes. `on_close` runs when the user closes one from its close button; `shown` is + // what the owner asked for. + struct DockPane + { + std::function on_close; + bool shown{true}; + }; + std::map m_dock_panes; wxString m_default_window_layout; wxPanel* current_panel{ nullptr }; std::vector panels; @@ -6920,6 +6929,11 @@ struct Plater::priv void update_sidebar(bool force_update = false); void reset_window_layout(); Sidebar::DockingState get_sidebar_docking_state(); + void add_dock_pane(wxWindow* window, const std::string& name, const wxString& caption, const std::string& dock, + const wxSize& size, std::function on_close); + void remove_dock_pane(wxWindow* window); + void show_dock_pane(wxWindow* window, bool show); + bool dock_pane_visible(const DockPane& dock_pane, const wxAuiPaneInfo& pane) const; bool is_view3D_layers_editing_enabled() const { return (current_panel == view3D) && view3D->get_canvas3d()->is_layers_editing_enabled(); } @@ -7500,6 +7514,18 @@ Plater::priv::priv(Plater *q, MainFrame *main_frame) panel_3d->SetSizer(panel_sizer); m_aui_mgr.AddPane(panel_3d, wxAuiPaneInfo().Name("main").CenterPane().PaneBorder(false)); + q->Bind(wxEVT_AUI_PANE_CLOSE, [this](wxAuiManagerEvent& evt) { + const wxAuiPaneInfo* pane = evt.GetPane(); + auto it = pane != nullptr ? m_dock_panes.find(pane->window) : m_dock_panes.end(); + if (it != m_dock_panes.end()) { + const std::function on_close = std::move(it->second.on_close); + m_dock_panes.erase(it); + if (on_close) + on_close(); + } + evt.Skip(); + }); + m_default_window_layout = m_aui_mgr.SavePerspective(); { @@ -8165,6 +8191,14 @@ void Plater::priv::update_sidebar(bool force_update) { } } + for (const auto& [window, dock_pane] : m_dock_panes) { + wxAuiPaneInfo& pane = m_aui_mgr.GetPane(window); + if (pane.IsOk() && pane.IsShown() != dock_pane_visible(dock_pane, pane)) { + pane.Show(!pane.IsShown()); + needs_update = true; + } + } + if (needs_update) { notification_manager->set_sidebar_collapsed(sidebar.IsShown()); m_aui_mgr.Update(); @@ -8174,10 +8208,96 @@ void Plater::priv::update_sidebar(bool force_update) { void Plater::priv::reset_window_layout() { m_aui_mgr.LoadPerspective(m_default_window_layout, false); + // Loading a layout docks and hides every pane it does not list, and the default layout lists no + // dock panes: a floating dock pane is docked again, like the rest of the window. + for (const auto& [window, dock_pane] : m_dock_panes) + if (wxAuiPaneInfo& pane = m_aui_mgr.GetPane(window); pane.IsOk()) + pane.Show(dock_pane_visible(dock_pane, pane)); sidebar_layout.is_collapsed = false; update_sidebar(true); } +bool Plater::priv::dock_pane_visible(const DockPane& dock_pane, const wxAuiPaneInfo& pane) const +{ + // A floating pane is a top-level window, so it does not hide with the Plater on other tabs. + return dock_pane.shown && (!pane.IsFloating() || sidebar_layout.show); +} + +void Plater::priv::add_dock_pane(wxWindow* window, const std::string& name, const wxString& caption, const std::string& dock, + const wxSize& size, std::function on_close) +{ + const wxString base_name = wxString::FromUTF8(name); + wxString unique_name = base_name; + for (int i = 2; m_aui_mgr.GetPane(unique_name).IsOk(); ++i) + unique_name = base_name + wxString::Format("#%d", i); + + // A restored layout below already holds pixels. + const wxSize pixels = q->FromDIP(size); + wxAuiPaneInfo info; + info.Name(unique_name).Caption(caption).BestSize(pixels).FloatingSize(pixels).DestroyOnClose(true); + if (dock == "left") + info.Left(); + else if (dock == "bottom") + info.Bottom(); + else + info.Right(); + if (dock == "float") + info.Float(); + + // Put the pane back where it was the last time the window layout was saved with it open. + const std::string saved = aui_pane_layout_entry(wxGetApp().app_config->get("window_layout"), unique_name.utf8_string()); + if (!saved.empty()) { + m_aui_mgr.LoadPaneInfo(wxString::FromUTF8(saved), info); + info.Caption(caption).DestroyOnClose(true).Show(); + } + + // Floating is disabled on Wayland. + if ((m_aui_mgr.GetFlags() & wxAUI_MGR_ALLOW_FLOATING) == 0) { + info.Dock().Floatable(false); + if (info.dock_direction == wxAUI_DOCK_NONE) + info.Right(); + } + + const DockPane& dock_pane = m_dock_panes[window] = DockPane{std::move(on_close)}; + info.Show(dock_pane_visible(dock_pane, info)); + m_aui_mgr.AddPane(window, info); + + // wxAUI does not record a dragged sash in best_size, so track the docked size like the sidebar + // does, for the saved layout. + window->Bind(wxEVT_IDLE, [this, window](wxIdleEvent& evt) { + wxAuiPaneInfo& pane = m_aui_mgr.GetPane(window); + if (pane.IsOk() && pane.IsShown() && pane.IsDocked() && pane.rect.GetWidth() > 0 && pane.rect.GetHeight() > 0) { + const bool horizontal = pane.dock_direction == wxAUI_DOCK_TOP || pane.dock_direction == wxAUI_DOCK_BOTTOM; + pane.BestSize(horizontal ? pane.best_size.GetWidth() : pane.rect.GetWidth(), + horizontal ? pane.rect.GetHeight() : pane.best_size.GetHeight()); + } + evt.Skip(); + }); + + m_aui_mgr.Update(); +} + +void Plater::priv::remove_dock_pane(wxWindow* window) +{ + m_dock_panes.erase(window); + if (m_aui_mgr.DetachPane(window)) + m_aui_mgr.Update(); + window->Destroy(); +} + +void Plater::priv::show_dock_pane(wxWindow* window, bool show) +{ + const auto it = m_dock_panes.find(window); + wxAuiPaneInfo& pane = m_aui_mgr.GetPane(window); + if (it == m_dock_panes.end() || !pane.IsOk()) + return; + it->second.shown = show; + if (pane.IsShown() == dock_pane_visible(it->second, pane)) + return; + pane.Show(!pane.IsShown()); + m_aui_mgr.Update(); +} + Sidebar::DockingState Plater::priv::get_sidebar_docking_state() { if (!sidebar_layout.is_enabled) { return Sidebar::None; @@ -17772,6 +17892,19 @@ Sidebar::DockingState Plater::get_sidebar_docking_state() const { return p->get_ void Plater::reset_window_layout() { p->reset_window_layout(); } +void Plater::add_dock_pane(wxWindow* window, const std::string& name, const wxString& caption, const std::string& dock, + const wxSize& size, std::function on_close) +{ + p->add_dock_pane(window, name, caption, dock, size, std::move(on_close)); +} +void Plater::remove_dock_pane(wxWindow* window) { p->remove_dock_pane(window); } +void Plater::remove_dock_panes() +{ + while (!p->m_dock_panes.empty()) + p->remove_dock_pane(p->m_dock_panes.begin()->first); +} +void Plater::show_dock_pane(wxWindow* window, bool show) { p->show_dock_pane(window, show); } + //BBS void Plater::select_curr_plate_all() { p->select_curr_plate_all(); } void Plater::remove_curr_plate_all() { p->remove_curr_plate_all(); } diff --git a/src/slic3r/GUI/Plater.hpp b/src/slic3r/GUI/Plater.hpp index ae70a6a0bb..b30f0298ee 100644 --- a/src/slic3r/GUI/Plater.hpp +++ b/src/slic3r/GUI/Plater.hpp @@ -476,6 +476,17 @@ public: void reset_window_layout(); + // Dock panes sit alongside the sidebar; `window` must be a child of the Plater. `dock` is + // "left", "right", "bottom" or "float", and `size` is in DIPs. A pane closed from its own close + // button is destroyed after on_close runs; remove_dock_pane() destroys it without calling on_close. + void add_dock_pane(wxWindow* window, const std::string& name, const wxString& caption, const std::string& dock, + const wxSize& size, std::function on_close); + void remove_dock_pane(wxWindow* window); + void show_dock_pane(wxWindow* window, bool show); + // Removes every dock pane without calling on_close, for MainFrame::shutdown() (app exit and a + // language switch), while the Plater and any floating frames still exist. + void remove_dock_panes(); + // Called after the Preferences dialog is closed and the program settings are saved. // Update the UI based on the current preferences. void update_ui_from_settings(); diff --git a/src/slic3r/GUI/PluginWebDialog.cpp b/src/slic3r/GUI/WebDialog.cpp similarity index 53% rename from src/slic3r/GUI/PluginWebDialog.cpp rename to src/slic3r/GUI/WebDialog.cpp index 7d696dd8db..8bcb517d87 100644 --- a/src/slic3r/GUI/PluginWebDialog.cpp +++ b/src/slic3r/GUI/WebDialog.cpp @@ -1,80 +1,23 @@ -#include "PluginWebDialog.hpp" +#include "WebDialog.hpp" -#include "slic3r/GUI/GUI.hpp" #include "slic3r/GUI/GUI_App.hpp" - -#include - -#include +#include "slic3r/GUI/Widgets/WebHosting.hpp" #include -#include #include namespace Slic3r { namespace GUI { -namespace { - -// Injected into the top-level page at document start (before the plugin's own -// scripts). Defines window.orca as the only host surface the page may use. It -// references window.wx lazily (at call time) so it never races the backend's -// deferred registration of the "wx" message handler. Guarded against -// double-injection so it is harmless if also prepended. -constexpr char ORCA_BRIDGE_JS[] = R"JS( -(function () { - if (window.top !== window.self) return; - if (window.orca) return; - var handlers = []; - function send(kind, data) { - try { - window.wx.postMessage(JSON.stringify({ - channel: 'orca', kind: kind, data: (data === undefined ? null : data) - })); - } catch (e) { /* bridge not ready yet */ } - } - window.orca = { - postMessage: function (d) { send('message', d); }, - submit: function (d) { send('submit', d); }, - close: function () { send('close'); }, - onMessage: function (cb) { if (typeof cb === 'function') handlers.push(cb); } - }; - window.__orcaDispatch = function (payload) { - var data = payload ? payload.data : null; - for (var i = 0; i < handlers.length; i++) { - try { handlers[i](data); } catch (e) {} - } - }; -})(); -)JS"; - -// file:// base URL for plugin HTML loaded via SetPage, so self-referencing -// relative URLs resolve against the bundled web resources directory. -wxString web_base_url() -{ - const std::string dir = (boost::filesystem::path(resources_dir()) / "web").make_preferred().string(); - return wxString("file://") + from_u8(dir) + "/"; -} - -// Whether a loaded document is the plugin HTML's own base URL. The web view reports the URL it -// parsed, so any fragment the page navigated to is ignored and the escaping it applies to what the -// resources path holds (a space, a non-ASCII character) is undone first. -bool is_content_url(const wxString& url) -{ - return wxURI::Unescape(url.BeforeFirst('#')) == web_base_url(); -} - -} // namespace - -PluginWebDialog::PluginWebDialog(wxWindow* parent, - const wxString& title, - const std::string& html, - const wxSize& size, - MessageHandler on_message, - SubmitHandler on_submit, - CloseHandler on_close, - CloseHandler on_destroyed, - long wx_style) +WebDialog::WebDialog(wxWindow* parent, + const wxString& title, + const std::string& html, + const wxSize& size, + MessageHandler on_message, + SubmitHandler on_submit, + CloseHandler on_close, + CloseHandler on_destroyed, + long wx_style) : WebViewHostDialog(parent, wxID_ANY, title, wxDefaultPosition, size, wx_style) , m_html(html) , m_on_message(std::move(on_message)) @@ -84,7 +27,7 @@ PluginWebDialog::PluginWebDialog(wxWindow* parent, { // A tiny bundled bootstrap page brings the webview up; the real plugin HTML // is swapped in via SetPage once the bootstrap finishes loading. - create_webview("web/dialog/PluginWebDialog/blank.html", title, size, wxSize(320, 240)); + create_webview(web_hosting::BOOTSTRAP_PAGE, title, size, wxSize(320, 240)); // Paint the window/webview in the themed background so there is no white // flash before the (transparent) bootstrap page and plugin HTML render. @@ -96,22 +39,22 @@ PluginWebDialog::PluginWebDialog(wxWindow* parent, // create_webview() via add_user_scripts(); nothing to add here. // Swap in the plugin HTML once the bootstrap page settles. Bind ERROR too so a // missing/blocked bootstrap resource (e.g. a packaged build) still triggers it. - Bind(wxEVT_WEBVIEW_LOADED, &PluginWebDialog::on_bootstrap_event, this, wv->GetId()); - Bind(wxEVT_WEBVIEW_ERROR, &PluginWebDialog::on_bootstrap_event, this, wv->GetId()); - Bind(wxEVT_WEBVIEW_NAVIGATED, &PluginWebDialog::on_navigated, this, wv->GetId()); + Bind(wxEVT_WEBVIEW_LOADED, &WebDialog::on_bootstrap_event, this, wv->GetId()); + Bind(wxEVT_WEBVIEW_ERROR, &WebDialog::on_bootstrap_event, this, wv->GetId()); + Bind(wxEVT_WEBVIEW_NAVIGATED, &WebDialog::on_navigated, this, wv->GetId()); } - Bind(wxEVT_CLOSE_WINDOW, &PluginWebDialog::on_close_window, this); + Bind(wxEVT_CLOSE_WINDOW, &WebDialog::on_close_window, this); } -void PluginWebDialog::add_user_scripts() +void WebDialog::add_user_scripts() { if (wxWebView* wv = browser()) { - wv->AddUserScript(wxString::FromUTF8(WebViewHostDialog::plugin_defaults_user_script())); - wv->AddUserScript(ORCA_BRIDGE_JS); + wv->AddUserScript(wxString::FromUTF8(WebViewHostDialog::element_defaults_user_script())); + wv->AddUserScript(wxString::FromUTF8(web_hosting::orca_bridge_script())); } } -PluginWebDialog::~PluginWebDialog() +WebDialog::~WebDialog() { // Runs on every destruction path. Deliberately NOT a wxEVT_DESTROY handler: // that event is sent from the base ~wxDialog(), after this subclass's members @@ -121,19 +64,19 @@ PluginWebDialog::~PluginWebDialog() m_on_destroyed(); } -void PluginWebDialog::post_message(PluginWebDialog* dialog, const nlohmann::json& data) +void WebDialog::post_message(WebDialog* dialog, const nlohmann::json& data) { if (dialog != nullptr && dialog->is_open()) dialog->push_message(data); } -void PluginWebDialog::request_close(PluginWebDialog* dialog) +void WebDialog::request_close(WebDialog* dialog) { if (dialog != nullptr) dialog->Close(); } -void PluginWebDialog::destroy_for_plugin(PluginWebDialog* dialog) +void WebDialog::destroy_silently(WebDialog* dialog) { if (dialog == nullptr) return; @@ -147,42 +90,42 @@ void PluginWebDialog::destroy_for_plugin(PluginWebDialog* dialog) dialog->Destroy(); } -void PluginWebDialog::on_bootstrap_event(wxWebViewEvent& event) +void WebDialog::on_bootstrap_event(wxWebViewEvent& event) { const bool loaded = event.GetEventType() == wxEVT_WEBVIEW_LOADED; // The first bootstrap load (or its error) triggers the swap to plugin HTML. if (!m_content_loaded) - load_plugin_content(); + load_page_html(); // WebKit reloads the SetPage base URL, so a committed load of it that we did not start is a reload. // A failed navigation is reported against the page that stayed but never commits. Edge ignores the // base URL and restores SetPage content itself, so nothing matches there. - else if (is_content_url(event.GetURL())) { + else if (web_hosting::is_content_url(event.GetURL())) { if (m_own_page_load) m_own_page_load = false; else if (loaded && m_content_navigated) - load_plugin_content(); + load_page_html(); } if (loaded) m_content_navigated = false; event.Skip(); } -void PluginWebDialog::on_navigated(wxWebViewEvent& event) +void WebDialog::on_navigated(wxWebViewEvent& event) { - m_content_navigated = is_content_url(event.GetURL()); + m_content_navigated = web_hosting::is_content_url(event.GetURL()); event.Skip(); } -void PluginWebDialog::load_plugin_content() +void WebDialog::load_page_html() { m_content_loaded = true; if (wxWebView* wv = browser()) { m_own_page_load = true; - wv->SetPage(wxString::FromUTF8(m_html), web_base_url()); + wv->SetPage(wxString::FromUTF8(m_html), web_hosting::content_base_url()); } } -void PluginWebDialog::on_script_message(const nlohmann::json& payload) +void WebDialog::on_script_message(const nlohmann::json& payload) { if (payload.value("channel", std::string()) == "orca") { const std::string kind = payload.value("kind", std::string()); @@ -202,7 +145,7 @@ void PluginWebDialog::on_script_message(const nlohmann::json& payload) handle_common_script_command(payload); } -void PluginWebDialog::push_message(const nlohmann::json& data) +void WebDialog::push_message(const nlohmann::json& data) { if (!m_open) return; @@ -211,7 +154,7 @@ void PluginWebDialog::push_message(const nlohmann::json& data) call_web_handler(envelope, wxT("__orcaDispatch")); } -void PluginWebDialog::finish(bool submitted, const nlohmann::json& data) +void WebDialog::finish(bool submitted, const nlohmann::json& data) { if (!m_open) return; @@ -230,7 +173,7 @@ void PluginWebDialog::finish(bool submitted, const nlohmann::json& data) Close(); } -void PluginWebDialog::on_close_window(wxCloseEvent&) +void WebDialog::on_close_window(wxCloseEvent&) { if (!m_open) { // finish() already dispatched submit/close and requested the close. @@ -250,7 +193,7 @@ void PluginWebDialog::on_close_window(wxCloseEvent&) Destroy(); } -void PluginWebDialog::fire_submit(const nlohmann::json& data) +void WebDialog::fire_submit(const nlohmann::json& data) { if (m_on_submit) { SubmitHandler cb = std::move(m_on_submit); @@ -258,7 +201,7 @@ void PluginWebDialog::fire_submit(const nlohmann::json& data) } } -void PluginWebDialog::fire_close() +void WebDialog::fire_close() { if (m_close_fired) return; diff --git a/src/slic3r/GUI/PluginWebDialog.hpp b/src/slic3r/GUI/WebDialog.hpp similarity index 74% rename from src/slic3r/GUI/PluginWebDialog.hpp rename to src/slic3r/GUI/WebDialog.hpp index a62e0b260c..aec5de18ef 100644 --- a/src/slic3r/GUI/PluginWebDialog.hpp +++ b/src/slic3r/GUI/WebDialog.hpp @@ -1,5 +1,5 @@ -#ifndef slic3r_GUI_PluginWebDialog_hpp_ -#define slic3r_GUI_PluginWebDialog_hpp_ +#ifndef slic3r_GUI_WebDialog_hpp_ +#define slic3r_GUI_WebDialog_hpp_ #include "Widgets/WebViewHostDialog.hpp" @@ -21,7 +21,7 @@ namespace Slic3r { namespace GUI { // GIL held; the plugin layer wraps any Python callables in a GIL-safe holder. // // Usable both modally (ShowModal -> read result()) and modelessly (Show()). -class PluginWebDialog : public Slic3r::GUI::WebViewHostDialog +class WebDialog : public Slic3r::GUI::WebViewHostDialog { public: using MessageHandler = std::function; @@ -32,20 +32,20 @@ public: // user/JS-initiated close (while the window is alive). on_destroyed runs from // the destructor on every path and must touch host-side state only (no Python // / no derived members). - PluginWebDialog(wxWindow* parent, - const wxString& title, - const std::string& html, - const wxSize& size, - MessageHandler on_message, - SubmitHandler on_submit, - CloseHandler on_close, - CloseHandler on_destroyed, - long wx_style = wxSYSTEM_MENU | wxCAPTION | wxCLOSE_BOX | wxMAXIMIZE_BOX | wxRESIZE_BORDER); - ~PluginWebDialog() override; + WebDialog(wxWindow* parent, + const wxString& title, + const std::string& html, + const wxSize& size, + MessageHandler on_message, + SubmitHandler on_submit, + CloseHandler on_close, + CloseHandler on_destroyed, + long wx_style = wxSYSTEM_MENU | wxCAPTION | wxCLOSE_BOX | wxMAXIMIZE_BOX | wxRESIZE_BORDER); + ~WebDialog() override; - static void post_message(PluginWebDialog* dialog, const nlohmann::json& data); - static void request_close(PluginWebDialog* dialog); - static void destroy_for_plugin(PluginWebDialog* dialog); + static void post_message(WebDialog* dialog, const nlohmann::json& data); + static void request_close(WebDialog* dialog); + static void destroy_silently(WebDialog* dialog); // Push a payload to the page; delivered to handlers registered via // window.orca.onMessage(). MAIN-THREAD ONLY (the plugin layer marshals). @@ -65,7 +65,7 @@ protected: private: void on_bootstrap_event(wxWebViewEvent& event); void on_navigated(wxWebViewEvent& event); - void load_plugin_content(); + void load_page_html(); void on_close_window(wxCloseEvent& event); void fire_submit(const nlohmann::json& data); void fire_close(); @@ -86,4 +86,4 @@ private: }} // namespace Slic3r::GUI -#endif // slic3r_GUI_PluginWebDialog_hpp_ +#endif // slic3r_GUI_WebDialog_hpp_ diff --git a/src/slic3r/GUI/WebPanel.cpp b/src/slic3r/GUI/WebPanel.cpp new file mode 100644 index 0000000000..a8cef9d941 --- /dev/null +++ b/src/slic3r/GUI/WebPanel.cpp @@ -0,0 +1,111 @@ +#include "WebPanel.hpp" + +#include "GUI_App.hpp" +#include "Widgets/WebHosting.hpp" +#include "Widgets/WebView.hpp" +#include "Widgets/WebViewHostDialog.hpp" + +#include + +#include + +namespace Slic3r { namespace GUI { + +WebPanel::WebPanel(wxWindow* parent, const char* bridge_script) + : wxPanel(parent, wxID_ANY) +{ + SetBackgroundColour(wxGetApp().get_window_default_clr()); + auto* sizer = new wxBoxSizer(wxVERTICAL); + SetSizer(sizer); + + // Never null: WebView::CreateWebView substitutes a placeholder view when no backend is available. + m_browser = WebView::CreateWebView(this, web_hosting::bootstrap_url()); + m_browser->SetBackgroundColour(GetBackgroundColour()); + m_browser->AddUserScript(wxString::FromUTF8(WebViewHostDialog::theme_user_script())); + m_browser->AddUserScript(wxString::FromUTF8(WebViewHostDialog::element_defaults_user_script())); + m_browser->AddUserScript(wxString::FromUTF8(bridge_script)); + m_browser->Bind(wxEVT_WEBVIEW_LOADED, &WebPanel::on_load_event, this); + m_browser->Bind(wxEVT_WEBVIEW_ERROR, &WebPanel::on_load_event, this); + m_browser->Bind(wxEVT_WEBVIEW_NAVIGATED, &WebPanel::on_navigated, this); + m_browser->Bind(wxEVT_WEBVIEW_SCRIPT_MESSAGE_RECEIVED, &WebPanel::on_script_message, this); + m_browser->Bind(EVT_WEBVIEW_RECREATED, &WebPanel::on_webview_recreated, this); + sizer->Add(m_browser, 1, wxEXPAND); +} + +void WebPanel::on_load_event(wxWebViewEvent& event) +{ + const bool loaded = event.GetEventType() == wxEVT_WEBVIEW_LOADED; + if (!m_content_loaded) { + // The first bootstrap load (or its error) triggers the swap to the plugin HTML. + m_content_loaded = true; + load_page_html(); + } else if (!web_hosting::is_content_url(event.GetURL())) { + // Not our document (a linked page, a substituted error page), or any document on Edge, which ignores + // the base URL and restores SetPage content on a reload itself; either way it takes the app theme. + if (loaded) + apply_theme(); + } else if (m_own_page_load) { + m_own_page_load = false; + // The document-start theme script is fixed at creation, so re-apply the app theme. + if (loaded) + apply_theme(); + } else if (loaded && m_content_navigated) { + // WebKit reloads the SetPage base URL, so a committed load of it that we did not start is a + // reload. A failed navigation is reported against the page that stayed but never commits. + load_page_html(); + } + if (loaded) + m_content_navigated = false; + event.Skip(); +} + +void WebPanel::on_navigated(wxWebViewEvent& event) +{ + m_content_navigated = web_hosting::is_content_url(event.GetURL()); + event.Skip(); +} + +void WebPanel::load_page_html() +{ + if (const std::optional html = page_html()) { + m_own_page_load = true; + m_browser->SetPage(wxString::FromUTF8(*html), web_hosting::content_base_url()); + } +} + +void WebPanel::on_script_message(wxWebViewEvent& event) +{ + const nlohmann::json payload = nlohmann::json::parse(event.GetString().utf8_string(), nullptr, false); + if (!payload.is_object() || payload.value("channel", std::string()) != "orca") + return; + + const std::string kind = payload.value("kind", std::string()); + if (!on_page_message(kind, payload.contains("data") ? payload["data"] : nlohmann::json())) + BOOST_LOG_TRIVIAL(warning) << "WebPanel ignored a window.orca '" << kind << "' call; this host does not support it"; +} + +void WebPanel::on_webview_recreated(wxCommandEvent&) +{ + SetBackgroundColour(wxGetApp().get_window_default_clr()); + m_browser->SetBackgroundColour(GetBackgroundColour()); + Refresh(); + // Handled without Skip(), so WebView::RecreateAll() does not reload the plugin page. + apply_theme(); +} + +void WebPanel::apply_theme() +{ + WebView::RunScript(m_browser, wxString::FromUTF8(WebViewHostDialog::theme_apply_script())); +} + +void WebPanel::post_to_page(const std::string& json) +{ + WebView::RunScript(m_browser, wxString::Format( + "(function dispatch(payload, attempts) {\n" + " if (typeof window.__orcaDispatch === 'function') { window.__orcaDispatch(payload); return; }\n" + " if (attempts < 100) window.setTimeout(function() { dispatch(payload, attempts + 1); }, 25);\n" + "})({data: %s}, 0);", + wxString::FromUTF8(json))); +} + +}} // namespace Slic3r::GUI diff --git a/src/slic3r/GUI/WebPanel.hpp b/src/slic3r/GUI/WebPanel.hpp new file mode 100644 index 0000000000..d4c493dbc1 --- /dev/null +++ b/src/slic3r/GUI/WebPanel.hpp @@ -0,0 +1,48 @@ +#pragma once + +#include + +#include +#include + +#include +#include + +namespace Slic3r { namespace GUI { + +// Host-supplied HTML in a web view panel, for any window that embeds or derives from it (today plugin +// Pages tabs and docked panels): bootstrap page and swap, theme and bridge scripts, live re-theming, and +// window.orca messages routed to on_page_message(). +class WebPanel : public wxPanel +{ +public: + WebPanel(wxWindow* parent, const char* bridge_script); + +protected: + wxWebView* browser() const { return m_browser; } + + // Delivers an already serialised JSON value to the page's window.orca.onMessage handlers, + // waiting briefly for the bridge while the page is still loading. Main thread only. + void post_to_page(const std::string& json); + + // The plugin HTML to show once the bootstrap page has loaded, and again when WebKit reloads it; + // std::nullopt leaves it blank. + virtual std::optional page_html() = 0; + // A window.orca message from the page; false for a kind this host does not handle (logged). + virtual bool on_page_message(const std::string& kind, const nlohmann::json& data) = 0; + +private: + void on_load_event(wxWebViewEvent& event); + void on_navigated(wxWebViewEvent& event); + void on_script_message(wxWebViewEvent& event); + void on_webview_recreated(wxCommandEvent& event); + void apply_theme(); + void load_page_html(); + + wxWebView* m_browser{nullptr}; + bool m_content_loaded{false}; + bool m_own_page_load{false}; // a SetPage of the plugin HTML is in flight + bool m_content_navigated{false}; // a navigation to the base URL has committed +}; + +}} // namespace Slic3r::GUI diff --git a/src/slic3r/GUI/Widgets/WebHosting.cpp b/src/slic3r/GUI/Widgets/WebHosting.cpp new file mode 100644 index 0000000000..a1b0df496a --- /dev/null +++ b/src/slic3r/GUI/Widgets/WebHosting.cpp @@ -0,0 +1,69 @@ +#include "WebHosting.hpp" + +#include "slic3r/GUI/GUI.hpp" + +#include + +#include + +#include + +namespace Slic3r { namespace GUI { namespace web_hosting { + +namespace { + +// Injected into the top-level page at document start (before the plugin's own +// scripts). Defines window.orca as the only host surface the page may use. It +// references window.wx lazily (at call time) so it never races the backend's +// deferred registration of the "wx" message handler. Guarded against +// double-injection so it is harmless if also prepended. +constexpr char ORCA_BRIDGE_JS[] = R"JS( +(function () { + if (window.top !== window.self) return; + if (window.orca) return; + var handlers = []; + function send(kind, data) { + try { + window.wx.postMessage(JSON.stringify({ + channel: 'orca', kind: kind, data: (data === undefined ? null : data) + })); + } catch (e) { /* bridge not ready yet */ } + } + window.orca = { + postMessage: function (d) { send('message', d); }, + submit: function (d) { send('submit', d); }, + close: function () { send('close'); }, + onMessage: function (cb) { if (typeof cb === 'function') handlers.push(cb); } + }; + window.__orcaDispatch = function (payload) { + var data = payload ? payload.data : null; + for (var i = 0; i < handlers.length; i++) { + try { handlers[i](data); } catch (e) {} + } + }; +})(); +)JS"; + +} // namespace + +wxString bootstrap_url() +{ + return wxString("file://") + from_u8((boost::filesystem::path(resources_dir()) / BOOTSTRAP_PAGE).make_preferred().string()); +} + +wxString content_base_url() +{ + const std::string dir = (boost::filesystem::path(resources_dir()) / "web").make_preferred().string(); + return wxString("file://") + from_u8(dir) + "/"; +} + +bool is_content_url(const wxString& url) +{ + // The web view reports the URL it parsed, which escapes anything the resources path holds + // (a space, a non-ASCII character), while content_base_url() is the raw path. + return wxURI::Unescape(url.BeforeFirst('#')) == content_base_url(); +} + +const char* orca_bridge_script() { return ORCA_BRIDGE_JS; } + +}}} // namespace Slic3r::GUI::web_hosting diff --git a/src/slic3r/GUI/Widgets/WebHosting.hpp b/src/slic3r/GUI/Widgets/WebHosting.hpp new file mode 100644 index 0000000000..5bf0ebc166 --- /dev/null +++ b/src/slic3r/GUI/Widgets/WebHosting.hpp @@ -0,0 +1,25 @@ +#pragma once + +#include + +namespace Slic3r { namespace GUI { namespace web_hosting { + +// Shared by the hosts that show plugin HTML: WebDialog and WebPanel. + +// The bundled blank page a plugin web view loads before the plugin HTML is swapped in. +constexpr const char* BOOTSTRAP_PAGE = "web/dialog/WebDialog/blank.html"; + +// The file:// URL of BOOTSTRAP_PAGE. +wxString bootstrap_url(); + +// The file:// base URL plugin HTML is loaded against, so relative URLs resolve to bundled resources. +wxString content_base_url(); + +// Whether `url` is the plugin HTML's base URL, ignoring any fragment. WebKit reports it for the +// injected page, a reload and a failed navigation alike, so a match alone is not a new document. +bool is_content_url(const wxString& url); + +// The window.orca bridge of plugin windows and docked panels. Pages tabs ship their own. +const char* orca_bridge_script(); + +}}} // namespace Slic3r::GUI::web_hosting diff --git a/src/slic3r/GUI/Widgets/WebViewHostDialog.cpp b/src/slic3r/GUI/Widgets/WebViewHostDialog.cpp index 044fe33cde..e4e3d2878a 100644 --- a/src/slic3r/GUI/Widgets/WebViewHostDialog.cpp +++ b/src/slic3r/GUI/Widgets/WebViewHostDialog.cpp @@ -75,6 +75,8 @@ if(document.documentElement) } // namespace +std::string WebViewHostDialog::theme_apply_script() { return host_theme_apply_js(); } + // Document-start user script: injects the contract ", ""); + webview->SetBackgroundColour(*wxBLACK); + webview->SetPage("", ""); +} + +} // namespace + +WebMediaController::WebMediaController(wxWebView* webview) + : m_webview(webview) +{ + initialize_webview(m_webview); } void WebMediaController::Load(wxURI url) diff --git a/src/slic3r/GUI/WebMediaController.hpp b/src/slic3r/GUI/WebMediaController.hpp index 566bf65e96..e7756d8977 100644 --- a/src/slic3r/GUI/WebMediaController.hpp +++ b/src/slic3r/GUI/WebMediaController.hpp @@ -23,7 +23,7 @@ public: void Stop() override; private: - wxWebView* m_webview; + wxWebView* m_webview = nullptr; std::string m_url; CameraStreamMode m_stream_mode = CameraStreamMode::http; }; diff --git a/tests/slic3rutils/CMakeLists.txt b/tests/slic3rutils/CMakeLists.txt index a89da36f53..77063c752f 100644 --- a/tests/slic3rutils/CMakeLists.txt +++ b/tests/slic3rutils/CMakeLists.txt @@ -7,6 +7,7 @@ add_executable(${_TEST_NAME}_tests test_filament_bitmap_utils.cpp test_device_progress.cpp test_device_manager_integration.cpp + test_web_media_controller.cpp test_network_versions.cpp test_action_source.cpp test_plugin_host_api.cpp diff --git a/tests/slic3rutils/test_web_media_controller.cpp b/tests/slic3rutils/test_web_media_controller.cpp new file mode 100644 index 0000000000..2933145d8d --- /dev/null +++ b/tests/slic3rutils/test_web_media_controller.cpp @@ -0,0 +1,117 @@ +#include + +#include + +#include +#include + +#include +#include + +using namespace Slic3r; +using namespace Slic3r::GUI; + +namespace { + +class StubWebView final : public wxWebView +{ +public: + bool SetBackgroundColour(const wxColour&) override + { + events.emplace_back("background"); + return true; + } + + bool Create(wxWindow*, wxWindowID, const wxString&, const wxPoint&, const wxSize&, long, const wxString&) override { return true; } + wxString GetCurrentTitle() const override { return {}; } + wxString GetCurrentURL() const override { return {}; } + bool IsBusy() const override { return false; } + bool IsEditable() const override { return false; } + void LoadURL(const wxString& url) override + { + events.emplace_back("url"); + loaded_url = url.ToStdString(); + } + void Print() override {} + void RegisterHandler(wxSharedPtr) override {} + void Reload(wxWebViewReloadFlags) override {} + void SetEditable(bool) override {} + void Stop() override { events.emplace_back("stop"); } + bool CanGoBack() const override { return false; } + bool CanGoForward() const override { return false; } + void GoBack() override {} + void GoForward() override {} + void ClearHistory() override { events.emplace_back("history"); } + void EnableHistory(bool) override {} + wxVector> GetBackwardHistory() override { return {}; } + wxVector> GetForwardHistory() override { return {}; } + void LoadHistoryItem(wxSharedPtr) override {} + bool CanSetZoomType(wxWebViewZoomType) const override { return false; } + float GetZoomFactor() const override { return 1.0f; } + wxWebViewZoomType GetZoomType() const override { return wxWEBVIEW_ZOOM_TYPE_LAYOUT; } + void SetZoomFactor(float) override {} + void SetZoomType(wxWebViewZoomType) override {} + bool CanUndo() const override { return false; } + bool CanRedo() const override { return false; } + void Undo() override {} + void Redo() override {} + void* GetNativeBackend() const override { return nullptr; } + + bool RunScript(const wxString& javascript, wxString*) const override + { + events.emplace_back("script"); + script = javascript.ToStdString(); + return true; + } + +protected: + void DoSetPage(const wxString& html, const wxString& base_url) override + { + events.emplace_back("page"); + page = html.ToStdString(); + page_base = base_url.ToStdString(); + } + +public: + mutable std::vector events; + std::string page; + std::string page_base; + mutable std::string script; + std::string loaded_url; +}; + +} // namespace + +TEST_CASE("Web media controller tears down a snapshot lifecycle", "[WebMediaController][integration]") +{ + wxInitializer wx_init; + REQUIRE(wx_init.IsOk()); + + StubWebView view; + WebMediaController controller(&view); + + controller.set_mode(CameraStreamMode::http_snapshot); + controller.Load(wxURI("http://camera.example/frame.jpg")); + controller.Play(); + + REQUIRE(view.events.size() == 3); + CHECK(view.events[0] == "background"); + CHECK(view.events[1] == "page"); + CHECK(view.events[2] == "page"); + CHECK(view.page.find("stopCameraRefresh") != std::string::npos); + CHECK(view.page.find("http://camera.example/frame.jpg") != std::string::npos); + + controller.Stop(); + + REQUIRE(view.events.size() == 7); + CHECK(view.events[3] == "script"); + CHECK(view.events[4] == "stop"); + CHECK(view.events[5] == "page"); + CHECK(view.events[6] == "history"); + CHECK(view.script == "if(typeof stopCameraRefresh==='function') stopCameraRefresh();"); + CHECK(view.page.empty()); + CHECK(view.page_base == "about:blank"); + + controller.Play(); + CHECK(view.page.find("http://camera.example/frame.jpg") == std::string::npos); +} From 33179c19028901eedb1f959fb1a418d5051ff1be Mon Sep 17 00:00:00 2001 From: Ian Chua Date: Wed, 23 Sep 2026 14:29:57 +0800 Subject: [PATCH 48/48] fix: make integration tests headless --- src/slic3r/GUI/DeviceCore/DevManager.cpp | 70 +++++++++++++------ src/slic3r/GUI/DeviceCore/DevManager.h | 14 ++-- src/slic3r/GUI/DeviceManager.cpp | 6 +- .../test_device_manager_integration.cpp | 14 +--- .../slic3rutils/test_web_media_controller.cpp | 4 -- 5 files changed, 64 insertions(+), 44 deletions(-) diff --git a/src/slic3r/GUI/DeviceCore/DevManager.cpp b/src/slic3r/GUI/DeviceCore/DevManager.cpp index 5b4746a968..f129700c5e 100644 --- a/src/slic3r/GUI/DeviceCore/DevManager.cpp +++ b/src/slic3r/GUI/DeviceCore/DevManager.cpp @@ -1,8 +1,9 @@ +#include "DevManager.h" #include #include -#include "DevManager.h" +#include #include "CloudProvider.hpp" #include "DevUtil.h" @@ -48,10 +49,12 @@ namespace { namespace Slic3r { - DeviceManager::DeviceManager(NetworkAgent* agent) + DeviceManager::DeviceManager(NetworkAgent* agent, bool enable_refresher, AppConfig* app_config) { - m_agent = agent; - m_refresher = new DeviceManagerRefresher(this); + m_agent = agent; + m_app_config = app_config; + if (enable_refresher) + m_refresher = new DeviceManagerRefresher(this); DevPrinterConfigUtil::InitFilePath(resources_dir()); @@ -62,9 +65,14 @@ namespace Slic3r } } + AppConfig* DeviceManager::get_app_config() const + { + return m_app_config ? m_app_config : GUI::wxGetApp().app_config; + } + void DeviceManager::load_local_machines_from_config() { - AppConfig* config = GUI::wxGetApp().app_config; + AppConfig* config = get_app_config(); if (!config) return; const auto local_machines = config->get_local_machines(); @@ -90,9 +98,8 @@ namespace Slic3r } } - void DeviceManager::update_local_machine(const MachineObject& m) + void DeviceManager::update_local_machine(const MachineObject& m, AppConfig* config) { - AppConfig* config = GUI::wxGetApp().app_config; if (config) { if (m.is_lan_mode_printer()) { if (m.has_access_right()) { @@ -113,7 +120,8 @@ namespace Slic3r DeviceManager::~DeviceManager() { - delete m_refresher; + if (m_refresher) + delete m_refresher; for (auto it = localMachineList.begin(); it != localMachineList.end(); it++) { @@ -173,14 +181,22 @@ namespace Slic3r return printer_agent ? printer_agent->get_agent_info().id : ""; } + std::string DeviceManager::get_current_cloud_provider() const + { + const std::string agent_id = get_current_printer_agent_id(); + if (!agent_id.empty()) + return agent_id == BBL_PRINTER_AGENT_ID ? BBL_CLOUD_PROVIDER : ORCA_CLOUD_PROVIDER; + return GUI::wxGetApp().get_printer_cloud_provider(); + } + void DeviceManager::EnableMultiMachine(bool enable) { m_agent->enable_multi_machine(enable); m_enable_mutil_machine = enable; } - void DeviceManager::start_refresher() { m_refresher->Start(); } - void DeviceManager::stop_refresher() { m_refresher->Stop(); } + void DeviceManager::start_refresher() { if (m_refresher) m_refresher->Start(); } + void DeviceManager::stop_refresher() { if (m_refresher) m_refresher->Stop(); } void DeviceManager::keep_alive() @@ -297,6 +313,8 @@ namespace Slic3r /* update localMachineList */ it = localMachineList.find(dev_id); + AppConfig* config = get_app_config(); + if (it != localMachineList.end()) { // update properties /* ip changed */ @@ -386,7 +404,6 @@ namespace Slic3r obj->m_is_online = true; //load access code - AppConfig* config = Slic3r::GUI::wxGetApp().app_config; if (config) { obj->set_access_code(get_access_code_with_legacy_fallback(config, dev_id, obj->printer_agent_id), false); } @@ -400,7 +417,7 @@ namespace Slic3r << ", ip = " << dev_ip <<", printer_name = " << dev_name << ", con_type= " << connect_type <<", signal= " << printer_signal << ", bind_state= " << bind_state; } - update_local_machine(*obj); + update_local_machine(*obj, config); } catch (...) { ; @@ -435,11 +452,16 @@ namespace Slic3r obj->last_alive = Slic3r::Utils::get_current_time_utc(); obj->set_access_code(access_code, false); - update_local_machine(*obj); + update_local_machine(*obj, get_app_config()); return obj; } + void DeviceManager::update_local_machine(const MachineObject& m) + { + update_local_machine(m, GUI::wxGetApp().app_config); + } + int DeviceManager::query_bind_status(std::string& msg, const std::string& provider) { if (!m_agent) @@ -635,7 +657,8 @@ namespace Slic3r it->second->reset(); #if !BBL_RELEASE_TO_PUBLIC - it->second->connect(Slic3r::GUI::wxGetApp().app_config->get("enable_ssl_for_mqtt") == "true" ? true : false); + AppConfig* config = get_app_config(); + it->second->connect(config && config->get("enable_ssl_for_mqtt") == "true"); #else it->second->connect(it->second->local_use_ssl); #endif @@ -661,7 +684,8 @@ namespace Slic3r BOOST_LOG_TRIVIAL(info) << "set_selected_machine: select new lan machine, dev_id =" << dev_id; it->second->reset(); #if !BBL_RELEASE_TO_PUBLIC - it->second->connect(Slic3r::GUI::wxGetApp().app_config->get("enable_ssl_for_mqtt") == "true" ? true : false); + AppConfig* config = get_app_config(); + it->second->connect(config && config->get("enable_ssl_for_mqtt") == "true"); #else it->second->connect(it->second->local_use_ssl); #endif @@ -851,14 +875,15 @@ namespace Slic3r json j = json::parse(body); const bool has_request_context = j.contains("provider") && j.contains("agent_id") && j.contains("generation"); + const std::string current_provider = get_current_cloud_provider(); const std::string provider = j.contains("provider") ? j["provider"].get() - : GUI::wxGetApp().get_printer_cloud_provider(); + : current_provider; const std::string agent_id = j.contains("agent_id") ? j["agent_id"].get() : get_current_printer_agent_id(); const std::uint64_t generation = j.value("generation", std::uint64_t(0)); if (has_request_context && - (provider != GUI::wxGetApp().get_printer_cloud_provider() || + (provider != current_provider || agent_id != get_current_printer_agent_id() || generation != (m_agent ? m_agent->get_user_machine_list_generation() : 0))) { BOOST_LOG_TRIVIAL(debug) << __FUNCTION__ << ": ignoring stale response provider=" @@ -903,7 +928,8 @@ namespace Slic3r if (obj->get_dev_ip().empty()) { - obj->get_dev_ip() = Slic3r::GUI::wxGetApp().app_config->get("ip_address", dev_id); + if (AppConfig* config = get_app_config()) + obj->get_dev_ip() = config->get("ip_address", dev_id); } userMachineList.insert(std::make_pair(dev_id, obj)); } @@ -1001,15 +1027,15 @@ namespace Slic3r void DeviceManager::record_user_last_machine(const std::string& dev_id) { - if (Slic3r::GUI::wxGetApp().app_config) { - Slic3r::GUI::wxGetApp().app_config->set("user_last_selected_machine", dev_id); + if (AppConfig* config = get_app_config()) { + config->set("user_last_selected_machine", dev_id); } } std::string DeviceManager::get_user_last_machine() const { - if (Slic3r::GUI::wxGetApp().app_config) { - const auto& user_last_machine = Slic3r::GUI::wxGetApp().app_config->get("user_last_selected_machine"); + if (AppConfig* config = get_app_config()) { + const auto& user_last_machine = config->get("user_last_selected_machine"); if (!user_last_machine.empty()) { return user_last_machine; } else if (m_agent) { diff --git a/src/slic3r/GUI/DeviceCore/DevManager.h b/src/slic3r/GUI/DeviceCore/DevManager.h index 32f93f3a1a..1ba4631881 100644 --- a/src/slic3r/GUI/DeviceCore/DevManager.h +++ b/src/slic3r/GUI/DeviceCore/DevManager.h @@ -12,6 +12,7 @@ namespace Slic3r struct BBLocalMachine; class MachineObject; class NetworkAgent; +class AppConfig; namespace GUI { class GUI_App; @@ -24,6 +25,7 @@ class DeviceManager friend class DeviceManagerRefresher; private: NetworkAgent* m_agent{ nullptr }; + AppConfig* m_app_config{ nullptr }; DeviceManagerRefresher* m_refresher{ nullptr }; bool m_enable_mutil_machine = false; @@ -35,11 +37,13 @@ private: std::map userMachineList; /* dev_id -> MachineObject* cloudMachine of User */ public: - DeviceManager(NetworkAgent* agent = nullptr); + DeviceManager(NetworkAgent* agent = nullptr, bool enable_refresher = true, + AppConfig* app_config = nullptr); ~DeviceManager(); public: NetworkAgent* get_agent() const { return m_agent; } + AppConfig* get_app_config() const; void set_agent(NetworkAgent* agent); void start_refresher(); @@ -121,6 +125,7 @@ private: void keep_alive(); void check_pushing(); + std::string get_current_cloud_provider() const; void OnMachineBindStateChanged(MachineObject* obj, const std::string& new_state); void OnSelectedMachineChanged(const std::string& pre_dev_id, const std::string& new_dev_id); @@ -133,14 +138,15 @@ public: std::string connection_type, std::string bind_state, std::string version, std::string access_code); static void update_local_machine(const MachineObject& m); + static void update_local_machine(const MachineObject& m, AppConfig* config); }; class DeviceManagerRefresher : public wxObject { - wxTimer* m_timer{ nullptr }; - int m_timer_interval_msec = 5000; + wxTimer* m_timer{nullptr}; + int m_timer_interval_msec = 5000; - DeviceManager* m_manager{ nullptr }; + DeviceManager* m_manager{nullptr}; public: DeviceManagerRefresher(DeviceManager* manger); diff --git a/src/slic3r/GUI/DeviceManager.cpp b/src/slic3r/GUI/DeviceManager.cpp index 976492d81d..b8db5c97d7 100644 --- a/src/slic3r/GUI/DeviceManager.cpp +++ b/src/slic3r/GUI/DeviceManager.cpp @@ -477,7 +477,7 @@ void MachineObject::set_access_code(std::string code, bool only_refresh) { this->access_code = code; if (only_refresh) { - AppConfig* config = GUI::wxGetApp().app_config; + AppConfig* config = m_manager ? m_manager->get_app_config() : GUI::wxGetApp().app_config; if (config) { if (is_lan_mode_printer()) { // why: LAN codes are scoped via BBLocalMachine::access_code, keyed by dev_id and @@ -490,7 +490,7 @@ void MachineObject::set_access_code(std::string code, bool only_refresh) // fresh from the cloud API's current response, so there's no cross-agent leakage // risk to guard against there. if (!code.empty()) { - DeviceManager::update_local_machine(*this); + DeviceManager::update_local_machine(*this, config); } else { // Only patch an existing record's code - don't persist a brand-new // never-bound entry just because set_access_code("") was called on it. @@ -4632,7 +4632,7 @@ int MachineObject::parse_json(std::string tunnel, std::string payload, bool key_ if (diff.count() > 10.0f) { BOOST_LOG_TRIVIAL(trace) << "parse_json timeout = " << diff.count(); } - DeviceManager::update_local_machine(*this); + DeviceManager::update_local_machine(*this, m_manager ? m_manager->get_app_config() : GUI::wxGetApp().app_config); return 0; } diff --git a/tests/slic3rutils/test_device_manager_integration.cpp b/tests/slic3rutils/test_device_manager_integration.cpp index 15f6e721cb..2b042d4f8e 100644 --- a/tests/slic3rutils/test_device_manager_integration.cpp +++ b/tests/slic3rutils/test_device_manager_integration.cpp @@ -2,14 +2,12 @@ #include #include -#include #include #include #include #include #include -#include #include #include @@ -55,9 +53,6 @@ private: struct ScopedAppConfig { AppConfig config; - - ScopedAppConfig() { GUI::wxGetApp().app_config = &config; } - ~ScopedAppConfig() { GUI::wxGetApp().app_config = nullptr; } }; std::string machine_list_response(const std::string& provider, const std::string& agent_id, @@ -99,12 +94,10 @@ TEST_CASE("Network agent stamps user-machine responses with request context", "[ TEST_CASE("Device manager ignores stale cloud machine responses", "[DeviceManager][integration]") { - wxInitializer wx_init; - REQUIRE(wx_init.IsOk()); ScopedAppConfig app_config; NetworkAgent network(nullptr, std::make_shared("integration-agent")); network.set_printer_agent(std::make_shared("integration-agent")); - DeviceManager manager(&network); + DeviceManager manager(&network, false, &app_config.config); const std::uint64_t current_generation = network.get_user_machine_list_generation(); manager.parse_user_print_info(machine_list_response(ORCA_CLOUD_PROVIDER, "integration-agent", @@ -129,12 +122,11 @@ TEST_CASE("Device manager ignores stale cloud machine responses", "[DeviceManage TEST_CASE("Device manager filters and rehomes devices by printer-agent ownership", "[DeviceManager][integration]") { - wxInitializer wx_init; - REQUIRE(wx_init.IsOk()); + ScopedAppConfig app_config; auto agent_a = std::make_shared("integration-agent-a"); auto agent_b = std::make_shared("integration-agent-b"); NetworkAgent network(nullptr, agent_a); - DeviceManager manager(&network); + DeviceManager manager(&network, false, &app_config.config); BBLocalMachine machine; machine.dev_id = "integration-lan-device"; diff --git a/tests/slic3rutils/test_web_media_controller.cpp b/tests/slic3rutils/test_web_media_controller.cpp index 2933145d8d..cdf756ca3a 100644 --- a/tests/slic3rutils/test_web_media_controller.cpp +++ b/tests/slic3rutils/test_web_media_controller.cpp @@ -2,7 +2,6 @@ #include -#include #include #include @@ -84,9 +83,6 @@ public: TEST_CASE("Web media controller tears down a snapshot lifecycle", "[WebMediaController][integration]") { - wxInitializer wx_init; - REQUIRE(wx_init.IsOk()); - StubWebView view; WebMediaController controller(&view);

<%i4Pl&&`tZ@CdthAP-&G%Vyg{jglxT`wY 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 HzXkDsxE8&z literal 0 HcmV?d00001 diff --git a/resources/profiles/RH3D/filament/Generic ABS @VIRTU E3.json b/resources/profiles/RH3D/filament/Generic ABS @VIRTU E3.json new file mode 100644 index 0000000000..be6f94b304 --- /dev/null +++ b/resources/profiles/RH3D/filament/Generic ABS @VIRTU E3.json @@ -0,0 +1,16 @@ +{ + "type": "filament", + "name": "Generic ABS @VIRTU E3", + "inherits": "fdm_filament_abs", + "from": "system", + "setting_id": "AULhQhVApTASqF2p", + "filament_id": "OFY9muEs", + "instantiation": "true", + "compatible_printers": [ + "VIRTU E3 - 0.2 nozzle", + "VIRTU E3 - 0.3 nozzle", + "VIRTU E3 - 0.4 nozzle", + "VIRTU E3 - 0.5 nozzle", + "VIRTU E3 - 0.6 nozzle" + ] +} diff --git a/resources/profiles/RH3D/filament/Generic ASA @VIRTU E3.json b/resources/profiles/RH3D/filament/Generic ASA @VIRTU E3.json new file mode 100644 index 0000000000..c2626f57c6 --- /dev/null +++ b/resources/profiles/RH3D/filament/Generic ASA @VIRTU E3.json @@ -0,0 +1,16 @@ +{ + "type": "filament", + "name": "Generic ASA @VIRTU E3", + "inherits": "fdm_filament_asa", + "from": "system", + "setting_id": "yJa8PC5f8c4uYgny", + "filament_id": "OFLPAxz3", + "instantiation": "true", + "compatible_printers": [ + "VIRTU E3 - 0.2 nozzle", + "VIRTU E3 - 0.3 nozzle", + "VIRTU E3 - 0.4 nozzle", + "VIRTU E3 - 0.5 nozzle", + "VIRTU E3 - 0.6 nozzle" + ] +} diff --git a/resources/profiles/RH3D/filament/Generic PCCF @VIRTU E3.json b/resources/profiles/RH3D/filament/Generic PCCF @VIRTU E3.json new file mode 100644 index 0000000000..c8a7f3f800 --- /dev/null +++ b/resources/profiles/RH3D/filament/Generic PCCF @VIRTU E3.json @@ -0,0 +1,13 @@ +{ + "type": "filament", + "name": "Generic PCCF @VIRTU E3", + "inherits": "fdm_filament_pccf", + "from": "system", + "setting_id": "5byL7KQPKyybDAgQ", + "filament_id": "OFC5f4Ay", + "instantiation": "true", + "compatible_printers": [ + "VIRTU E3 - 0.5 nozzle", + "VIRTU E3 - 0.6 nozzle" + ] +} diff --git a/resources/profiles/RH3D/filament/Generic PETG @VIRTU E3.json b/resources/profiles/RH3D/filament/Generic PETG @VIRTU E3.json new file mode 100644 index 0000000000..2e39f9e1d9 --- /dev/null +++ b/resources/profiles/RH3D/filament/Generic PETG @VIRTU E3.json @@ -0,0 +1,16 @@ +{ + "type": "filament", + "name": "Generic PETG @VIRTU E3", + "inherits": "fdm_filament_petg", + "from": "system", + "setting_id": "OAN1Ozk75r0ODvVw", + "filament_id": "OFYPdQJh", + "instantiation": "true", + "compatible_printers": [ + "VIRTU E3 - 0.2 nozzle", + "VIRTU E3 - 0.3 nozzle", + "VIRTU E3 - 0.4 nozzle", + "VIRTU E3 - 0.5 nozzle", + "VIRTU E3 - 0.6 nozzle" + ] +} diff --git a/resources/profiles/RH3D/filament/Generic PLA @VIRTU E3.json b/resources/profiles/RH3D/filament/Generic PLA @VIRTU E3.json new file mode 100644 index 0000000000..394a92f0c8 --- /dev/null +++ b/resources/profiles/RH3D/filament/Generic PLA @VIRTU E3.json @@ -0,0 +1,16 @@ +{ + "type": "filament", + "name": "Generic PLA @VIRTU E3", + "inherits": "fdm_filament_pla", + "from": "system", + "setting_id": "DgSFTqNWfJEp0w9f", + "filament_id": "OFDSrzZ8", + "instantiation": "true", + "compatible_printers": [ + "VIRTU E3 - 0.2 nozzle", + "VIRTU E3 - 0.3 nozzle", + "VIRTU E3 - 0.4 nozzle", + "VIRTU E3 - 0.5 nozzle", + "VIRTU E3 - 0.6 nozzle" + ] +} diff --git a/resources/profiles/RH3D/filament/Generic TPU @VIRTU E3.json b/resources/profiles/RH3D/filament/Generic TPU @VIRTU E3.json new file mode 100644 index 0000000000..ff816313da --- /dev/null +++ b/resources/profiles/RH3D/filament/Generic TPU @VIRTU E3.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "name": "Generic TPU @VIRTU E3", + "inherits": "fdm_filament_tpu", + "from": "system", + "setting_id": "ifG0f5hgJ7L9zw34", + "filament_id": "OFgbpcy9", + "instantiation": "true", + "compatible_printers": [ + "VIRTU E3 - 0.4 nozzle", + "VIRTU E3 - 0.5 nozzle", + "VIRTU E3 - 0.6 nozzle" + ] +} diff --git a/resources/profiles/RH3D/filament/fdm_filament_abs.json b/resources/profiles/RH3D/filament/fdm_filament_abs.json index f4ab005733..2aab3d25ba 100644 --- a/resources/profiles/RH3D/filament/fdm_filament_abs.json +++ b/resources/profiles/RH3D/filament/fdm_filament_abs.json @@ -26,10 +26,10 @@ "55" ], "fan_cooling_layer_time": [ - "10" + "12" ], "filament_max_volumetric_speed": [ - "32" + "24" ], "filament_type": [ "ABS" @@ -75,9 +75,9 @@ "275" ], "slow_down_min_speed": [ - "10" + "20" ], "slow_down_layer_time": [ - "2" + "4" ] } diff --git a/resources/profiles/RH3D/filament/fdm_filament_asa.json b/resources/profiles/RH3D/filament/fdm_filament_asa.json index ac03beef13..cbf4f5dc36 100644 --- a/resources/profiles/RH3D/filament/fdm_filament_asa.json +++ b/resources/profiles/RH3D/filament/fdm_filament_asa.json @@ -26,10 +26,10 @@ "55" ], "fan_cooling_layer_time": [ - "10" + "12" ], "filament_max_volumetric_speed": [ - "32" + "24" ], "filament_type": [ "ASA" @@ -54,7 +54,7 @@ "50" ], "fan_min_speed": [ - "10" + "15" ], "overhang_fan_threshold": [ "25%" @@ -75,9 +75,9 @@ "275" ], "slow_down_min_speed": [ - "10" + "20" ], "slow_down_layer_time": [ - "2" + "4" ] } diff --git a/resources/profiles/RH3D/filament/fdm_filament_common.json b/resources/profiles/RH3D/filament/fdm_filament_common.json index 576ae24a48..fe143ce05b 100644 --- a/resources/profiles/RH3D/filament/fdm_filament_common.json +++ b/resources/profiles/RH3D/filament/fdm_filament_common.json @@ -22,7 +22,7 @@ "60" ], "overhang_fan_threshold": [ - "95%" + "25%" ], "overhang_fan_speed": [ "100" @@ -40,10 +40,10 @@ "1" ], "reduce_fan_stop_start_freq": [ - "0" + "1" ], "fan_cooling_layer_time": [ - "15" + "20" ], "filament_cost": [ "0" @@ -51,6 +51,9 @@ "filament_density": [ "0" ], + "filament_change_length": [ + "0" + ], "filament_deretraction_speed": [ "nil" ], @@ -61,7 +64,7 @@ "10" ], "filament_minimal_purge_on_wipe_tower": [ - "40" + "50" ], "filament_retraction_minimum_travel": [ "nil" @@ -115,13 +118,13 @@ "100" ], "fan_min_speed": [ - "10" + "20" ], "slow_down_min_speed": [ - "10" + "20" ], "slow_down_layer_time": [ - "3" + "7" ], "filament_start_gcode": [ "; Filament gcode\n" diff --git a/resources/profiles/RH3D/filament/fdm_filament_pccf.json b/resources/profiles/RH3D/filament/fdm_filament_pccf.json index 4296da76c5..401ab2eb23 100644 --- a/resources/profiles/RH3D/filament/fdm_filament_pccf.json +++ b/resources/profiles/RH3D/filament/fdm_filament_pccf.json @@ -26,7 +26,7 @@ "55" ], "fan_cooling_layer_time": [ - "10" + "12" ], "filament_max_volumetric_speed": [ "8" @@ -75,9 +75,9 @@ "330" ], "slow_down_min_speed": [ - "10" + "20" ], "slow_down_layer_time": [ - "2" + "4" ] } diff --git a/resources/profiles/RH3D/filament/fdm_filament_petg.json b/resources/profiles/RH3D/filament/fdm_filament_petg.json index aaa0f62357..8a69c94f7d 100644 --- a/resources/profiles/RH3D/filament/fdm_filament_petg.json +++ b/resources/profiles/RH3D/filament/fdm_filament_petg.json @@ -23,10 +23,10 @@ "90" ], "fan_cooling_layer_time": [ - "10" + "15" ], "filament_max_volumetric_speed": [ - "26" + "18" ], "filament_type": [ "PETG" @@ -72,9 +72,9 @@ "260" ], "slow_down_min_speed": [ - "12" + "20" ], "slow_down_layer_time": [ - "3" + "6" ] } diff --git a/resources/profiles/RH3D/filament/fdm_filament_pla.json b/resources/profiles/RH3D/filament/fdm_filament_pla.json index 873a78461b..770af83296 100644 --- a/resources/profiles/RH3D/filament/fdm_filament_pla.json +++ b/resources/profiles/RH3D/filament/fdm_filament_pla.json @@ -72,9 +72,9 @@ "250" ], "slow_down_min_speed": [ - "10" + "20" ], "slow_down_layer_time": [ - "6" + "8" ] } diff --git a/resources/profiles/RH3D/machine/VIRTU E3 - 0.2 nozzle.json b/resources/profiles/RH3D/machine/VIRTU E3 - 0.2 nozzle.json new file mode 100644 index 0000000000..8814f25e0c --- /dev/null +++ b/resources/profiles/RH3D/machine/VIRTU E3 - 0.2 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "machine", + "name": "VIRTU E3 - 0.2 nozzle", + "printer_model": "VIRTU E3", + "inherits": "fdm_common_VIRTU E3", + "from": "system", + "setting_id": "NEqwtUJ9txtcf1vY", + "instantiation": "true", + "default_print_profile": "0.10mm Standard @VIRTU E3", + "nozzle_diameter": [ + "0.2" + ], + "printer_variant": "0.2" +} diff --git a/resources/profiles/RH3D/machine/VIRTU E3 - 0.3 nozzle.json b/resources/profiles/RH3D/machine/VIRTU E3 - 0.3 nozzle.json new file mode 100644 index 0000000000..4c27b80bb8 --- /dev/null +++ b/resources/profiles/RH3D/machine/VIRTU E3 - 0.3 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "machine", + "name": "VIRTU E3 - 0.3 nozzle", + "printer_model": "VIRTU E3", + "inherits": "fdm_common_VIRTU E3", + "from": "system", + "setting_id": "3PjlEiZxmdLJjoGw", + "instantiation": "true", + "default_print_profile": "0.15mm Standard @VIRTU E3", + "nozzle_diameter": [ + "0.3" + ], + "printer_variant": "0.3" +} diff --git a/resources/profiles/RH3D/machine/VIRTU E3 - 0.4 nozzle.json b/resources/profiles/RH3D/machine/VIRTU E3 - 0.4 nozzle.json new file mode 100644 index 0000000000..7b02993a2b --- /dev/null +++ b/resources/profiles/RH3D/machine/VIRTU E3 - 0.4 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "machine", + "name": "VIRTU E3 - 0.4 nozzle", + "printer_model": "VIRTU E3", + "inherits": "fdm_common_VIRTU E3", + "from": "system", + "setting_id": "mYCTx4ovF6z0STDL", + "instantiation": "true", + "default_print_profile": "0.20mm Standard @VIRTU E3", + "nozzle_diameter": [ + "0.4" + ], + "printer_variant": "0.4" +} diff --git a/resources/profiles/RH3D/machine/VIRTU E3 - 0.5 nozzle.json b/resources/profiles/RH3D/machine/VIRTU E3 - 0.5 nozzle.json new file mode 100644 index 0000000000..660dd35305 --- /dev/null +++ b/resources/profiles/RH3D/machine/VIRTU E3 - 0.5 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "machine", + "name": "VIRTU E3 - 0.5 nozzle", + "printer_model": "VIRTU E3", + "inherits": "fdm_common_VIRTU E3", + "from": "system", + "setting_id": "iMnENFt2zw6UTcbM", + "instantiation": "true", + "default_print_profile": "0.20mm Standard @VIRTU E3", + "nozzle_diameter": [ + "0.5" + ], + "printer_variant": "0.5" +} diff --git a/resources/profiles/RH3D/machine/VIRTU E3 - 0.6 nozzle.json b/resources/profiles/RH3D/machine/VIRTU E3 - 0.6 nozzle.json new file mode 100644 index 0000000000..bce4e91736 --- /dev/null +++ b/resources/profiles/RH3D/machine/VIRTU E3 - 0.6 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "machine", + "name": "VIRTU E3 - 0.6 nozzle", + "printer_model": "VIRTU E3", + "inherits": "fdm_common_VIRTU E3", + "from": "system", + "setting_id": "T1RuDWhyFkI1GH1h", + "instantiation": "true", + "default_print_profile": "0.25mm Standard @VIRTU E3", + "nozzle_diameter": [ + "0.6" + ], + "printer_variant": "0.6" +} diff --git a/resources/profiles/RH3D/machine/VIRTU E3.json b/resources/profiles/RH3D/machine/VIRTU E3.json new file mode 100644 index 0000000000..f34fa3aefe --- /dev/null +++ b/resources/profiles/RH3D/machine/VIRTU E3.json @@ -0,0 +1,12 @@ +{ + "type": "machine_model", + "name": "VIRTU E3", + "nozzle_diameter": "0.2;0.3;0.4;0.5;0.6", + "bed_model": "VIRTU-bed.stl", + "bed_texture": "VIRTU-bed-texture.svg", + "model_id": "VIRTUE3", + "family": "RH3D", + "hotend_model": "", + "machine_tech": "FFF", + "default_materials": "Generic ABS @VIRTU E3;Generic ASA @VIRTU E3;Generic PCCF @VIRTU E3;Generic PETG @VIRTU E3;Generic PLA @VIRTU E3;Generic TPU @VIRTU E3" +} diff --git a/resources/profiles/RH3D/machine/fdm_common_E3NG v1.2S.json b/resources/profiles/RH3D/machine/fdm_common_E3NG v1.2S.json index 0b952c73f3..8479a4e451 100644 --- a/resources/profiles/RH3D/machine/fdm_common_E3NG v1.2S.json +++ b/resources/profiles/RH3D/machine/fdm_common_E3NG v1.2S.json @@ -7,6 +7,7 @@ "extruder_clearance_height_to_lid": "140", "extruder_clearance_height_to_rod": "36", "extruder_clearance_radius": "65", + "default_filament_profile": "Generic PLA @E3NG v1.2S", "machine_max_acceleration_e": [ "7500", "7500" @@ -40,12 +41,12 @@ "25" ], "machine_max_speed_x": [ - "400", - "400" + "600", + "600" ], "machine_max_speed_y": [ - "400", - "400" + "600", + "600" ], "machine_max_speed_z": [ "12", diff --git a/resources/profiles/RH3D/machine/fdm_common_VIRTU E3.json b/resources/profiles/RH3D/machine/fdm_common_VIRTU E3.json new file mode 100644 index 0000000000..e825838811 --- /dev/null +++ b/resources/profiles/RH3D/machine/fdm_common_VIRTU E3.json @@ -0,0 +1,71 @@ +{ + "type": "machine", + "name": "fdm_common_VIRTU E3", + "inherits": "fdm_machine_common", + "from": "system", + "instantiation": "false", + "extruder_clearance_height_to_lid": "140", + "extruder_clearance_height_to_rod": "36", + "extruder_clearance_radius": "65", + "default_filament_profile": "Generic PLA @VIRTU E3", + "machine_max_acceleration_e": [ + "7500", + "7500" + ], + "machine_max_acceleration_extruding": [ + "35000", + "35000" + ], + "machine_max_acceleration_retracting": [ + "35000", + "35000" + ], + "machine_max_acceleration_travel": [ + "10000", + "10000" + ], + "machine_max_acceleration_x": [ + "35000", + "35000" + ], + "machine_max_acceleration_y": [ + "35000", + "35000" + ], + "machine_max_acceleration_z": [ + "2000", + "2000" + ], + "machine_max_speed_e": [ + "25", + "25" + ], + "machine_max_speed_x": [ + "900", + "900" + ], + "machine_max_speed_y": [ + "900", + "900" + ], + "machine_max_speed_z": [ + "400", + "400" + ], + "printable_area": [ + "0x0", + "230x0", + "230x232", + "0x232" + ], + "printable_height": "232", + "printer_model": "VIRTU E3", + "printer_notes": [ + "Design by RH3D" + ], + "retract_before_wipe": "80%", + "retract_length_toolchange": "0", + "retract_lift_below": "230", + "retraction_minimum_travel": "1.5", + "travel_slope": "1" +} diff --git a/resources/profiles/RH3D/machine/fdm_machine_common.json b/resources/profiles/RH3D/machine/fdm_machine_common.json index 4a3245b701..0f23916d97 100644 --- a/resources/profiles/RH3D/machine/fdm_machine_common.json +++ b/resources/profiles/RH3D/machine/fdm_machine_common.json @@ -5,12 +5,11 @@ "instantiation": "false", "printer_structure": "corexy", "gcode_flavor": "klipper", - "machine_start_gcode": "M104 S0 ; Stops OrcaSlicer from sending temp waits separately\nM140 S0\nPRINT_START EXTRUDER=[first_layer_temperature] BED=[first_layer_bed_temperature]\n; Start of actual GCode for the print", + "machine_start_gcode": "M104 S0 ; Stops OrcaSlicer from sending temp waits separately\nM140 S0\nPRINT_START EXTRUDER=[first_layer_temperature] BED=[first_layer_bed_temperature] CHAMBER=[chamber_temperature] PROFILE=[notes]\n; Start of actual GCode for the print", "machine_end_gcode": "PRINT_END", "extruder_colour": "#02aba2", "extruder_offset": "0x0", "emit_machine_limits_to_gcode": "0", - "default_filament_profile": "Generic PLA @E3NG v1.2S", "machine_min_extruding_rate": [ "0", "0" @@ -47,7 +46,7 @@ "320x240/PNG", "640x480/PNG" ], - "change_filament_gcode": "PAUSE\nG1 E1.0 F300 ; prime after color change", + "change_filament_gcode": "G1 E1.0 F300 ; prime after color change", "before_layer_change_gcode": ";BEFORE_LAYER_CHANGE\nG92 E0", "layer_change_gcode": ";AFTER_LAYER_CHANGE", "machine_pause_gcode": "PAUSE\n", diff --git a/resources/profiles/RH3D/process/0.10mm Fast @E3NG v1.2S.json b/resources/profiles/RH3D/process/0.10mm Fast @E3NG v1.2S.json new file mode 100644 index 0000000000..f8103a4582 --- /dev/null +++ b/resources/profiles/RH3D/process/0.10mm Fast @E3NG v1.2S.json @@ -0,0 +1,15 @@ +{ + "type": "process", + "name": "0.10mm Fast @E3NG v1.2S", + "inherits": "process_Fast_E3NG v1.2S", + "from": "system", + "setting_id": "zaYFBkbfYXxSz5eU", + "instantiation": "true", + "layer_height": "0.1", + "initial_layer_print_height": "0.15", + "compatible_printers": [ + "E3NG v1.2S - 0.2 nozzle", + "E3NG v1.2S - 0.3 nozzle", + "E3NG v1.2S - 0.4 nozzle" + ] +} diff --git a/resources/profiles/RH3D/process/0.10mm Fast @VIRTU E3.json b/resources/profiles/RH3D/process/0.10mm Fast @VIRTU E3.json new file mode 100644 index 0000000000..a72467ecfd --- /dev/null +++ b/resources/profiles/RH3D/process/0.10mm Fast @VIRTU E3.json @@ -0,0 +1,15 @@ +{ + "type": "process", + "name": "0.10mm Fast @VIRTU E3", + "inherits": "process_Fast_VIRTU E3", + "from": "system", + "setting_id": "nWpKy9NYLGggsHlM", + "instantiation": "true", + "layer_height": "0.1", + "initial_layer_print_height": "0.15", + "compatible_printers": [ + "VIRTU E3 - 0.2 nozzle", + "VIRTU E3 - 0.3 nozzle", + "VIRTU E3 - 0.4 nozzle" + ] +} diff --git a/resources/profiles/RH3D/process/0.10mm Slow @E3NG v1.2S.json b/resources/profiles/RH3D/process/0.10mm Slow @E3NG v1.2S.json new file mode 100644 index 0000000000..c853471ef9 --- /dev/null +++ b/resources/profiles/RH3D/process/0.10mm Slow @E3NG v1.2S.json @@ -0,0 +1,15 @@ +{ + "type": "process", + "name": "0.10mm Slow @E3NG v1.2S", + "inherits": "process_Slow_E3NG v1.2S", + "from": "system", + "setting_id": "W35S1kwfonBFrHAy", + "instantiation": "true", + "layer_height": "0.1", + "initial_layer_print_height": "0.15", + "compatible_printers": [ + "E3NG v1.2S - 0.2 nozzle", + "E3NG v1.2S - 0.3 nozzle", + "E3NG v1.2S - 0.4 nozzle" + ] +} diff --git a/resources/profiles/RH3D/process/0.10mm Slow @VIRTU E3.json b/resources/profiles/RH3D/process/0.10mm Slow @VIRTU E3.json new file mode 100644 index 0000000000..5c33e2e8f8 --- /dev/null +++ b/resources/profiles/RH3D/process/0.10mm Slow @VIRTU E3.json @@ -0,0 +1,15 @@ +{ + "type": "process", + "name": "0.10mm Slow @VIRTU E3", + "inherits": "process_Slow_VIRTU E3", + "from": "system", + "setting_id": "br9ISgiSBZTgKEqn", + "instantiation": "true", + "layer_height": "0.1", + "initial_layer_print_height": "0.15", + "compatible_printers": [ + "VIRTU E3 - 0.2 nozzle", + "VIRTU E3 - 0.3 nozzle", + "VIRTU E3 - 0.4 nozzle" + ] +} diff --git a/resources/profiles/RH3D/process/0.10mm Standard @E3NG v1.2S.json b/resources/profiles/RH3D/process/0.10mm Standard @E3NG v1.2S.json index dcaecb6b0b..86e7415897 100644 --- a/resources/profiles/RH3D/process/0.10mm Standard @E3NG v1.2S.json +++ b/resources/profiles/RH3D/process/0.10mm Standard @E3NG v1.2S.json @@ -1,7 +1,7 @@ { "type": "process", "name": "0.10mm Standard @E3NG v1.2S", - "inherits": "process_common_E3NG v1.2S", + "inherits": "process_Standard_E3NG v1.2S", "from": "system", "setting_id": "YhKounYUzB4FB9Em", "instantiation": "true", diff --git a/resources/profiles/RH3D/process/0.10mm Standard @VIRTU E3.json b/resources/profiles/RH3D/process/0.10mm Standard @VIRTU E3.json new file mode 100644 index 0000000000..675d8b3646 --- /dev/null +++ b/resources/profiles/RH3D/process/0.10mm Standard @VIRTU E3.json @@ -0,0 +1,15 @@ +{ + "type": "process", + "name": "0.10mm Standard @VIRTU E3", + "inherits": "process_Standard_VIRTU E3", + "from": "system", + "setting_id": "qf2uqEsVBJLb87TW", + "instantiation": "true", + "layer_height": "0.1", + "initial_layer_print_height": "0.15", + "compatible_printers": [ + "VIRTU E3 - 0.2 nozzle", + "VIRTU E3 - 0.3 nozzle", + "VIRTU E3 - 0.4 nozzle" + ] +} diff --git a/resources/profiles/RH3D/process/0.15mm Fast @E3NG v1.2S.json b/resources/profiles/RH3D/process/0.15mm Fast @E3NG v1.2S.json new file mode 100644 index 0000000000..8a301ed822 --- /dev/null +++ b/resources/profiles/RH3D/process/0.15mm Fast @E3NG v1.2S.json @@ -0,0 +1,16 @@ +{ + "type": "process", + "name": "0.15mm Fast @E3NG v1.2S", + "inherits": "process_Fast_E3NG v1.2S", + "from": "system", + "setting_id": "O4zDtFKxom68L07o", + "instantiation": "true", + "layer_height": "0.15", + "initial_layer_print_height": "0.2", + "compatible_printers": [ + "E3NG v1.2S - 0.2 nozzle", + "E3NG v1.2S - 0.3 nozzle", + "E3NG v1.2S - 0.4 nozzle", + "E3NG v1.2S - 0.5 nozzle" + ] +} diff --git a/resources/profiles/RH3D/process/0.15mm Fast @VIRTU E3.json b/resources/profiles/RH3D/process/0.15mm Fast @VIRTU E3.json new file mode 100644 index 0000000000..8c4040d1bb --- /dev/null +++ b/resources/profiles/RH3D/process/0.15mm Fast @VIRTU E3.json @@ -0,0 +1,16 @@ +{ + "type": "process", + "name": "0.15mm Fast @VIRTU E3", + "inherits": "process_Fast_VIRTU E3", + "from": "system", + "setting_id": "G0HkboSFDavmOAU4", + "instantiation": "true", + "layer_height": "0.15", + "initial_layer_print_height": "0.2", + "compatible_printers": [ + "VIRTU E3 - 0.2 nozzle", + "VIRTU E3 - 0.3 nozzle", + "VIRTU E3 - 0.4 nozzle", + "VIRTU E3 - 0.5 nozzle" + ] +} diff --git a/resources/profiles/RH3D/process/0.15mm Slow @E3NG v1.2S.json b/resources/profiles/RH3D/process/0.15mm Slow @E3NG v1.2S.json new file mode 100644 index 0000000000..f3693f8cbb --- /dev/null +++ b/resources/profiles/RH3D/process/0.15mm Slow @E3NG v1.2S.json @@ -0,0 +1,16 @@ +{ + "type": "process", + "name": "0.15mm Slow @E3NG v1.2S", + "inherits": "process_Slow_E3NG v1.2S", + "from": "system", + "setting_id": "zfmqi9qahym79w71", + "instantiation": "true", + "layer_height": "0.15", + "initial_layer_print_height": "0.2", + "compatible_printers": [ + "E3NG v1.2S - 0.2 nozzle", + "E3NG v1.2S - 0.3 nozzle", + "E3NG v1.2S - 0.4 nozzle", + "E3NG v1.2S - 0.5 nozzle" + ] +} diff --git a/resources/profiles/RH3D/process/0.15mm Slow @VIRTU E3.json b/resources/profiles/RH3D/process/0.15mm Slow @VIRTU E3.json new file mode 100644 index 0000000000..bac33744bb --- /dev/null +++ b/resources/profiles/RH3D/process/0.15mm Slow @VIRTU E3.json @@ -0,0 +1,16 @@ +{ + "type": "process", + "name": "0.15mm Slow @VIRTU E3", + "inherits": "process_Slow_VIRTU E3", + "from": "system", + "setting_id": "6RvsW4p0AVsAXYlf", + "instantiation": "true", + "layer_height": "0.15", + "initial_layer_print_height": "0.2", + "compatible_printers": [ + "VIRTU E3 - 0.2 nozzle", + "VIRTU E3 - 0.3 nozzle", + "VIRTU E3 - 0.4 nozzle", + "VIRTU E3 - 0.5 nozzle" + ] +} diff --git a/resources/profiles/RH3D/process/0.15mm Standard @E3NG v1.2S.json b/resources/profiles/RH3D/process/0.15mm Standard @E3NG v1.2S.json index deaded91ab..0c1a8367a8 100644 --- a/resources/profiles/RH3D/process/0.15mm Standard @E3NG v1.2S.json +++ b/resources/profiles/RH3D/process/0.15mm Standard @E3NG v1.2S.json @@ -1,7 +1,7 @@ { "type": "process", "name": "0.15mm Standard @E3NG v1.2S", - "inherits": "process_common_E3NG v1.2S", + "inherits": "process_Standard_E3NG v1.2S", "from": "system", "setting_id": "jYPd3BedSG1oG6S3", "instantiation": "true", diff --git a/resources/profiles/RH3D/process/0.15mm Standard @VIRTU E3.json b/resources/profiles/RH3D/process/0.15mm Standard @VIRTU E3.json new file mode 100644 index 0000000000..de6a3e1ddf --- /dev/null +++ b/resources/profiles/RH3D/process/0.15mm Standard @VIRTU E3.json @@ -0,0 +1,16 @@ +{ + "type": "process", + "name": "0.15mm Standard @VIRTU E3", + "inherits": "process_Standard_VIRTU E3", + "from": "system", + "setting_id": "NFY8TFxasqh2wUvX", + "instantiation": "true", + "layer_height": "0.15", + "initial_layer_print_height": "0.2", + "compatible_printers": [ + "VIRTU E3 - 0.2 nozzle", + "VIRTU E3 - 0.3 nozzle", + "VIRTU E3 - 0.4 nozzle", + "VIRTU E3 - 0.5 nozzle" + ] +} diff --git a/resources/profiles/RH3D/process/0.20mm Fast @E3NG v1.2S.json b/resources/profiles/RH3D/process/0.20mm Fast @E3NG v1.2S.json index bca60006c4..61fd819a39 100644 --- a/resources/profiles/RH3D/process/0.20mm Fast @E3NG v1.2S.json +++ b/resources/profiles/RH3D/process/0.20mm Fast @E3NG v1.2S.json @@ -1,49 +1,16 @@ { "type": "process", "name": "0.20mm Fast @E3NG v1.2S", - "inherits": "process_common_E3NG v1.2S", + "inherits": "process_Fast_E3NG v1.2S", "from": "system", "setting_id": "S7z7EwSYYbjVWRK0", "instantiation": "true", "layer_height": "0.2", "initial_layer_print_height": "0.2", "compatible_printers": [ + "E3NG v1.2S - 0.3 nozzle", "E3NG v1.2S - 0.4 nozzle", "E3NG v1.2S - 0.5 nozzle", "E3NG v1.2S - 0.6 nozzle" - ], - "reduce_crossing_wall": "0", - "bridge_speed": "75", - "default_acceleration": "10000", - "initial_layer_acceleration": "7500", - "top_surface_acceleration": "7500", - "travel_acceleration": "10000", - "inner_wall_acceleration": "10000", - "outer_wall_acceleration": "7500", - "bridge_acceleration": "5000", - "sparse_infill_acceleration": "12500", - "internal_solid_infill_acceleration": "10000", - "infill_combination": "1", - "ironing_speed": "150", - "overhang_1_4_speed": "100", - "overhang_2_4_speed": "50", - "overhang_3_4_speed": "30", - "overhang_4_4_speed": "15", - "support_interface_speed": "120", - "top_surface_line_width": "100%", - "sparse_infill_line_width": "125%", - "internal_solid_infill_line_width": "125%", - "seam_position": "nearest", - "initial_layer_speed": "100", - "initial_layer_infill_speed": "150", - "outer_wall_speed": "300", - "inner_wall_speed": "340", - "small_perimeter_speed": "300", - "sparse_infill_speed": "400", - "internal_solid_infill_speed": "340", - "top_surface_speed": "300", - "gap_infill_speed": "300", - "travel_speed": "400", - "only_one_wall_top": "0", - "only_one_wall_first_layer": "0" + ] } diff --git a/resources/profiles/RH3D/process/0.20mm Fast @VIRTU E3.json b/resources/profiles/RH3D/process/0.20mm Fast @VIRTU E3.json new file mode 100644 index 0000000000..1c182fd117 --- /dev/null +++ b/resources/profiles/RH3D/process/0.20mm Fast @VIRTU E3.json @@ -0,0 +1,16 @@ +{ + "type": "process", + "name": "0.20mm Fast @VIRTU E3", + "inherits": "process_Fast_VIRTU E3", + "from": "system", + "setting_id": "cSol8x6vF51GUloq", + "instantiation": "true", + "layer_height": "0.2", + "initial_layer_print_height": "0.2", + "compatible_printers": [ + "VIRTU E3 - 0.3 nozzle", + "VIRTU E3 - 0.4 nozzle", + "VIRTU E3 - 0.5 nozzle", + "VIRTU E3 - 0.6 nozzle" + ] +} diff --git a/resources/profiles/RH3D/process/0.20mm Slow @E3NG v1.2S.json b/resources/profiles/RH3D/process/0.20mm Slow @E3NG v1.2S.json index 45be150670..4894fc3637 100644 --- a/resources/profiles/RH3D/process/0.20mm Slow @E3NG v1.2S.json +++ b/resources/profiles/RH3D/process/0.20mm Slow @E3NG v1.2S.json @@ -1,49 +1,16 @@ { "type": "process", "name": "0.20mm Slow @E3NG v1.2S", - "inherits": "process_common_E3NG v1.2S", + "inherits": "process_Slow_E3NG v1.2S", "from": "system", "setting_id": "JH4jITLGT8tbtnu1", "instantiation": "true", "layer_height": "0.2", "initial_layer_print_height": "0.2", "compatible_printers": [ + "E3NG v1.2S - 0.3 nozzle", "E3NG v1.2S - 0.4 nozzle", "E3NG v1.2S - 0.5 nozzle", "E3NG v1.2S - 0.6 nozzle" - ], - "reduce_crossing_wall": "1", - "bridge_speed": "40", - "default_acceleration": "3000", - "initial_layer_acceleration": "3000", - "top_surface_acceleration": "2000", - "travel_acceleration": "3000", - "inner_wall_acceleration": "3000", - "outer_wall_acceleration": "3000", - "bridge_acceleration": "2000", - "sparse_infill_acceleration": "4000", - "internal_solid_infill_acceleration": "3000", - "infill_combination": "0", - "ironing_speed": "80", - "overhang_1_4_speed": "60", - "overhang_2_4_speed": "35", - "overhang_3_4_speed": "20", - "overhang_4_4_speed": "8", - "support_interface_speed": "60", - "top_surface_line_width": "100%", - "sparse_infill_line_width": "125%", - "internal_solid_infill_line_width": "125%", - "seam_position": "aligned", - "initial_layer_speed": "60", - "initial_layer_infill_speed": "75", - "outer_wall_speed": "140", - "inner_wall_speed": "140", - "small_perimeter_speed": "140", - "sparse_infill_speed": "140", - "internal_solid_infill_speed": "140", - "top_surface_speed": "140", - "gap_infill_speed": "140", - "travel_speed": "400", - "only_one_wall_top": "1", - "only_one_wall_first_layer": "1" + ] } diff --git a/resources/profiles/RH3D/process/0.20mm Slow @VIRTU E3.json b/resources/profiles/RH3D/process/0.20mm Slow @VIRTU E3.json new file mode 100644 index 0000000000..1ee87921aa --- /dev/null +++ b/resources/profiles/RH3D/process/0.20mm Slow @VIRTU E3.json @@ -0,0 +1,16 @@ +{ + "type": "process", + "name": "0.20mm Slow @VIRTU E3", + "inherits": "process_Slow_VIRTU E3", + "from": "system", + "setting_id": "NlGjHdIRQnp9PCfc", + "instantiation": "true", + "layer_height": "0.2", + "initial_layer_print_height": "0.2", + "compatible_printers": [ + "VIRTU E3 - 0.3 nozzle", + "VIRTU E3 - 0.4 nozzle", + "VIRTU E3 - 0.5 nozzle", + "VIRTU E3 - 0.6 nozzle" + ] +} diff --git a/resources/profiles/RH3D/process/0.20mm Standard @E3NG v1.2S.json b/resources/profiles/RH3D/process/0.20mm Standard @E3NG v1.2S.json index 92ddcd9109..95b149cfba 100644 --- a/resources/profiles/RH3D/process/0.20mm Standard @E3NG v1.2S.json +++ b/resources/profiles/RH3D/process/0.20mm Standard @E3NG v1.2S.json @@ -1,10 +1,12 @@ { "type": "process", "name": "0.20mm Standard @E3NG v1.2S", - "inherits": "process_common_E3NG v1.2S", + "inherits": "process_Standard_E3NG v1.2S", "from": "system", "setting_id": "XgaEHNWBsBQoPjbP", "instantiation": "true", + "layer_height": "0.2", + "initial_layer_print_height": "0.2", "compatible_printers": [ "E3NG v1.2S - 0.3 nozzle", "E3NG v1.2S - 0.4 nozzle", diff --git a/resources/profiles/RH3D/process/0.20mm Standard @VIRTU E3.json b/resources/profiles/RH3D/process/0.20mm Standard @VIRTU E3.json new file mode 100644 index 0000000000..ad7ac64a0b --- /dev/null +++ b/resources/profiles/RH3D/process/0.20mm Standard @VIRTU E3.json @@ -0,0 +1,16 @@ +{ + "type": "process", + "name": "0.20mm Standard @VIRTU E3", + "inherits": "process_Standard_VIRTU E3", + "from": "system", + "setting_id": "F0hx03mNji9yec5G", + "instantiation": "true", + "layer_height": "0.2", + "initial_layer_print_height": "0.2", + "compatible_printers": [ + "VIRTU E3 - 0.3 nozzle", + "VIRTU E3 - 0.4 nozzle", + "VIRTU E3 - 0.5 nozzle", + "VIRTU E3 - 0.6 nozzle" + ] +} diff --git a/resources/profiles/RH3D/process/0.25mm Fast @E3NG v1.2S.json b/resources/profiles/RH3D/process/0.25mm Fast @E3NG v1.2S.json index bf910f676a..f9442067d1 100644 --- a/resources/profiles/RH3D/process/0.25mm Fast @E3NG v1.2S.json +++ b/resources/profiles/RH3D/process/0.25mm Fast @E3NG v1.2S.json @@ -1,7 +1,7 @@ { "type": "process", "name": "0.25mm Fast @E3NG v1.2S", - "inherits": "process_common_E3NG v1.2S", + "inherits": "process_Fast_E3NG v1.2S", "from": "system", "setting_id": "QqkHiZPjk3QWyKKN", "instantiation": "true", @@ -11,39 +11,5 @@ "E3NG v1.2S - 0.4 nozzle", "E3NG v1.2S - 0.5 nozzle", "E3NG v1.2S - 0.6 nozzle" - ], - "reduce_crossing_wall": "0", - "bridge_speed": "75", - "default_acceleration": "10000", - "initial_layer_acceleration": "7500", - "top_surface_acceleration": "7500", - "travel_acceleration": "10000", - "inner_wall_acceleration": "10000", - "outer_wall_acceleration": "7500", - "bridge_acceleration": "5000", - "sparse_infill_acceleration": "12500", - "internal_solid_infill_acceleration": "10000", - "infill_combination": "1", - "ironing_speed": "150", - "overhang_1_4_speed": "100", - "overhang_2_4_speed": "50", - "overhang_3_4_speed": "30", - "overhang_4_4_speed": "15", - "support_interface_speed": "120", - "top_surface_line_width": "100%", - "sparse_infill_line_width": "125%", - "internal_solid_infill_line_width": "125%", - "seam_position": "nearest", - "initial_layer_speed": "100", - "initial_layer_infill_speed": "150", - "outer_wall_speed": "300", - "inner_wall_speed": "340", - "small_perimeter_speed": "300", - "sparse_infill_speed": "400", - "internal_solid_infill_speed": "340", - "top_surface_speed": "300", - "gap_infill_speed": "300", - "travel_speed": "400", - "only_one_wall_top": "0", - "only_one_wall_first_layer": "0" + ] } diff --git a/resources/profiles/RH3D/process/0.25mm Fast @VIRTU E3.json b/resources/profiles/RH3D/process/0.25mm Fast @VIRTU E3.json new file mode 100644 index 0000000000..0e6c3ef6eb --- /dev/null +++ b/resources/profiles/RH3D/process/0.25mm Fast @VIRTU E3.json @@ -0,0 +1,15 @@ +{ + "type": "process", + "name": "0.25mm Fast @VIRTU E3", + "inherits": "process_Fast_VIRTU E3", + "from": "system", + "setting_id": "MyqBOD8a6YOpgm8h", + "instantiation": "true", + "layer_height": "0.25", + "initial_layer_print_height": "0.25", + "compatible_printers": [ + "VIRTU E3 - 0.4 nozzle", + "VIRTU E3 - 0.5 nozzle", + "VIRTU E3 - 0.6 nozzle" + ] +} diff --git a/resources/profiles/RH3D/process/0.25mm Slow @E3NG v1.2S.json b/resources/profiles/RH3D/process/0.25mm Slow @E3NG v1.2S.json new file mode 100644 index 0000000000..65de472eec --- /dev/null +++ b/resources/profiles/RH3D/process/0.25mm Slow @E3NG v1.2S.json @@ -0,0 +1,15 @@ +{ + "type": "process", + "name": "0.25mm Slow @E3NG v1.2S", + "inherits": "process_Slow_E3NG v1.2S", + "from": "system", + "setting_id": "7sr967Tgq1J3qxTG", + "instantiation": "true", + "layer_height": "0.25", + "initial_layer_print_height": "0.25", + "compatible_printers": [ + "E3NG v1.2S - 0.4 nozzle", + "E3NG v1.2S - 0.5 nozzle", + "E3NG v1.2S - 0.6 nozzle" + ] +} diff --git a/resources/profiles/RH3D/process/0.25mm Slow @VIRTU E3.json b/resources/profiles/RH3D/process/0.25mm Slow @VIRTU E3.json new file mode 100644 index 0000000000..36ef0d460f --- /dev/null +++ b/resources/profiles/RH3D/process/0.25mm Slow @VIRTU E3.json @@ -0,0 +1,15 @@ +{ + "type": "process", + "name": "0.25mm Slow @VIRTU E3", + "inherits": "process_Slow_VIRTU E3", + "from": "system", + "setting_id": "BqoOYOcFMFNbkpAb", + "instantiation": "true", + "layer_height": "0.25", + "initial_layer_print_height": "0.25", + "compatible_printers": [ + "VIRTU E3 - 0.4 nozzle", + "VIRTU E3 - 0.5 nozzle", + "VIRTU E3 - 0.6 nozzle" + ] +} diff --git a/resources/profiles/RH3D/process/0.25mm Standard @E3NG v1.2S.json b/resources/profiles/RH3D/process/0.25mm Standard @E3NG v1.2S.json index 5ebe88f3fe..4234924db2 100644 --- a/resources/profiles/RH3D/process/0.25mm Standard @E3NG v1.2S.json +++ b/resources/profiles/RH3D/process/0.25mm Standard @E3NG v1.2S.json @@ -1,7 +1,7 @@ { "type": "process", "name": "0.25mm Standard @E3NG v1.2S", - "inherits": "process_common_E3NG v1.2S", + "inherits": "process_Standard_E3NG v1.2S", "from": "system", "setting_id": "2dPD9ljxZ8hknXZu", "instantiation": "true", diff --git a/resources/profiles/RH3D/process/0.25mm Standard @VIRTU E3.json b/resources/profiles/RH3D/process/0.25mm Standard @VIRTU E3.json new file mode 100644 index 0000000000..3aa8db5be4 --- /dev/null +++ b/resources/profiles/RH3D/process/0.25mm Standard @VIRTU E3.json @@ -0,0 +1,15 @@ +{ + "type": "process", + "name": "0.25mm Standard @VIRTU E3", + "inherits": "process_Standard_VIRTU E3", + "from": "system", + "setting_id": "uKXPx0hfphTLXfmI", + "instantiation": "true", + "layer_height": "0.25", + "initial_layer_print_height": "0.25", + "compatible_printers": [ + "VIRTU E3 - 0.4 nozzle", + "VIRTU E3 - 0.5 nozzle", + "VIRTU E3 - 0.6 nozzle" + ] +} diff --git a/resources/profiles/RH3D/process/fdm_process_common.json b/resources/profiles/RH3D/process/fdm_process_common.json index 4f02e37fa6..0f5087af8c 100644 --- a/resources/profiles/RH3D/process/fdm_process_common.json +++ b/resources/profiles/RH3D/process/fdm_process_common.json @@ -8,6 +8,7 @@ "bottom_surface_pattern": "monotonicline", "bottom_shell_thickness": "0", "bridge_speed": "50", + "brim_type": "no_brim", "brim_width": "0", "brim_object_gap": "0.1", "compatible_printers": [], @@ -22,6 +23,8 @@ "bridge_acceleration": "2500", "sparse_infill_acceleration": "8000", "internal_solid_infill_acceleration": "5000", + "accel_to_decel_enable": "0", + "accel_to_decel_factor": "100%", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.1", @@ -41,8 +44,8 @@ "reduce_infill_retraction": "1", "filename_format": "{input_filename_base}_{filament_type[0]}_{print_time}_{printer_model}.gcode", "detect_overhang_wall": "1", - "slowdown_for_curled_perimeters": "1", - "overhang_1_4_speed": "70", + "slowdown_for_curled_perimeters": "0", + "overhang_1_4_speed": "0", "overhang_2_4_speed": "40", "overhang_3_4_speed": "25", "overhang_4_4_speed": "10", @@ -102,7 +105,7 @@ "initial_layer_infill_speed": "100", "outer_wall_speed": "220", "inner_wall_speed": "220", - "small_perimeter_speed": "220", + "small_perimeter_speed": "50%", "sparse_infill_speed": "300", "internal_solid_infill_speed": "220", "top_surface_speed": "180", diff --git a/resources/profiles/RH3D/process/process_Fast_E3NG v1.2S.json b/resources/profiles/RH3D/process/process_Fast_E3NG v1.2S.json new file mode 100644 index 0000000000..73d0ae5202 --- /dev/null +++ b/resources/profiles/RH3D/process/process_Fast_E3NG v1.2S.json @@ -0,0 +1,42 @@ +{ + "type": "process", + "name": "process_Fast_E3NG v1.2S", + "inherits": "fdm_process_common", + "from": "system", + "instantiation": "false", + "reduce_crossing_wall": "0", + "bridge_speed": "75", + "default_acceleration": "10000", + "initial_layer_acceleration": "7500", + "top_surface_acceleration": "7500", + "travel_acceleration": "10000", + "inner_wall_acceleration": "10000", + "outer_wall_acceleration": "7500", + "bridge_acceleration": "5000", + "sparse_infill_acceleration": "12500", + "internal_solid_infill_acceleration": "10000", + "infill_combination": "0", + "ironing_speed": "150", + "overhang_1_4_speed": "100", + "overhang_2_4_speed": "50", + "overhang_3_4_speed": "30", + "overhang_4_4_speed": "15", + "support_interface_speed": "120", + "top_surface_line_width": "100%", + "sparse_infill_line_width": "125%", + "internal_solid_infill_line_width": "125%", + "seam_position": "nearest", + "initial_layer_speed": "100", + "initial_layer_infill_speed": "150", + "outer_wall_speed": "300", + "inner_wall_speed": "340", + "small_perimeter_speed": "300", + "sparse_infill_speed": "400", + "internal_solid_infill_speed": "340", + "top_surface_speed": "300", + "gap_infill_speed": "300", + "travel_speed": "400", + "only_one_wall_top": "0", + "only_one_wall_first_layer": "0", + "notes": "fast" +} diff --git a/resources/profiles/RH3D/process/process_Fast_VIRTU E3.json b/resources/profiles/RH3D/process/process_Fast_VIRTU E3.json new file mode 100644 index 0000000000..b981150596 --- /dev/null +++ b/resources/profiles/RH3D/process/process_Fast_VIRTU E3.json @@ -0,0 +1,42 @@ +{ + "type": "process", + "name": "process_Fast_VIRTU E3", + "inherits": "fdm_process_common", + "from": "system", + "instantiation": "false", + "reduce_crossing_wall": "0", + "bridge_speed": "75", + "default_acceleration": "20000", + "initial_layer_acceleration": "15000", + "top_surface_acceleration": "15000", + "travel_acceleration": "15000", + "inner_wall_acceleration": "25000", + "outer_wall_acceleration": "15000", + "bridge_acceleration": "10000", + "sparse_infill_acceleration": "30000", + "internal_solid_infill_acceleration": "25000", + "infill_combination": "0", + "ironing_speed": "150", + "overhang_1_4_speed": "100", + "overhang_2_4_speed": "50", + "overhang_3_4_speed": "30", + "overhang_4_4_speed": "15", + "support_interface_speed": "120", + "top_surface_line_width": "90%", + "sparse_infill_line_width": "125%", + "internal_solid_infill_line_width": "125%", + "seam_position": "nearest", + "initial_layer_speed": "100", + "initial_layer_infill_speed": "150", + "outer_wall_speed": "300", + "inner_wall_speed": "600", + "small_perimeter_speed": "300", + "sparse_infill_speed": "600", + "internal_solid_infill_speed": "500", + "top_surface_speed": "300", + "gap_infill_speed": "300", + "travel_speed": "800", + "only_one_wall_top": "0", + "only_one_wall_first_layer": "0", + "notes": "fast" +} diff --git a/resources/profiles/RH3D/process/process_Slow_E3NG v1.2S.json b/resources/profiles/RH3D/process/process_Slow_E3NG v1.2S.json new file mode 100644 index 0000000000..5cf259e378 --- /dev/null +++ b/resources/profiles/RH3D/process/process_Slow_E3NG v1.2S.json @@ -0,0 +1,42 @@ +{ + "type": "process", + "name": "process_Slow_E3NG v1.2S", + "inherits": "fdm_process_common", + "from": "system", + "instantiation": "false", + "reduce_crossing_wall": "1", + "bridge_speed": "40", + "default_acceleration": "3000", + "initial_layer_acceleration": "3000", + "top_surface_acceleration": "2000", + "travel_acceleration": "3000", + "inner_wall_acceleration": "3000", + "outer_wall_acceleration": "3000", + "bridge_acceleration": "2000", + "sparse_infill_acceleration": "4000", + "internal_solid_infill_acceleration": "3000", + "infill_combination": "0", + "ironing_speed": "80", + "overhang_1_4_speed": "60", + "overhang_2_4_speed": "35", + "overhang_3_4_speed": "20", + "overhang_4_4_speed": "8", + "support_interface_speed": "60", + "top_surface_line_width": "90%", + "sparse_infill_line_width": "125%", + "internal_solid_infill_line_width": "125%", + "seam_position": "aligned", + "initial_layer_speed": "60", + "initial_layer_infill_speed": "75", + "outer_wall_speed": "120", + "inner_wall_speed": "120", + "small_perimeter_speed": "120", + "sparse_infill_speed": "160", + "internal_solid_infill_speed": "160", + "top_surface_speed": "120", + "gap_infill_speed": "120", + "travel_speed": "400", + "only_one_wall_top": "1", + "only_one_wall_first_layer": "1", + "notes": "quiet" +} diff --git a/resources/profiles/RH3D/process/process_Slow_VIRTU E3.json b/resources/profiles/RH3D/process/process_Slow_VIRTU E3.json new file mode 100644 index 0000000000..4f7f41e5eb --- /dev/null +++ b/resources/profiles/RH3D/process/process_Slow_VIRTU E3.json @@ -0,0 +1,42 @@ +{ + "type": "process", + "name": "process_Slow_VIRTU E3", + "inherits": "fdm_process_common", + "from": "system", + "instantiation": "false", + "reduce_crossing_wall": "1", + "bridge_speed": "40", + "default_acceleration": "3000", + "initial_layer_acceleration": "3000", + "top_surface_acceleration": "2000", + "travel_acceleration": "3000", + "inner_wall_acceleration": "3000", + "outer_wall_acceleration": "3000", + "bridge_acceleration": "2000", + "sparse_infill_acceleration": "4000", + "internal_solid_infill_acceleration": "3000", + "infill_combination": "0", + "ironing_speed": "80", + "overhang_1_4_speed": "60", + "overhang_2_4_speed": "35", + "overhang_3_4_speed": "20", + "overhang_4_4_speed": "8", + "support_interface_speed": "60", + "top_surface_line_width": "90%", + "sparse_infill_line_width": "125%", + "internal_solid_infill_line_width": "125%", + "seam_position": "aligned", + "initial_layer_speed": "60", + "initial_layer_infill_speed": "75", + "outer_wall_speed": "140", + "inner_wall_speed": "140", + "small_perimeter_speed": "140", + "sparse_infill_speed": "140", + "internal_solid_infill_speed": "140", + "top_surface_speed": "140", + "gap_infill_speed": "140", + "travel_speed": "400", + "only_one_wall_top": "1", + "only_one_wall_first_layer": "1", + "notes": "quiet" +} diff --git a/resources/profiles/RH3D/process/process_Standard_E3NG v1.2S.json b/resources/profiles/RH3D/process/process_Standard_E3NG v1.2S.json new file mode 100644 index 0000000000..55828f200a --- /dev/null +++ b/resources/profiles/RH3D/process/process_Standard_E3NG v1.2S.json @@ -0,0 +1,33 @@ +{ + "type": "process", + "name": "process_Standard_E3NG v1.2S", + "inherits": "fdm_process_common", + "from": "system", + "instantiation": "false", + "default_acceleration": "10000", + "initial_layer_acceleration": "5000", + "top_surface_acceleration": "5000", + "travel_acceleration": "7500", + "inner_wall_acceleration": "10000", + "outer_wall_acceleration": "10000", + "bridge_acceleration": "3500", + "sparse_infill_acceleration": "12500", + "internal_solid_infill_acceleration": "12500", + "overhang_1_4_speed": "70", + "overhang_2_4_speed": "40", + "overhang_3_4_speed": "25", + "overhang_4_4_speed": "10", + "support_interface_speed": "100", + "support_speed": "180", + "initial_layer_speed": "90", + "initial_layer_infill_speed": "120", + "outer_wall_speed": "180", + "inner_wall_speed": "220", + "small_perimeter_speed": "180", + "sparse_infill_speed": "220", + "internal_solid_infill_speed": "220", + "top_surface_speed": "180", + "gap_infill_speed": "180", + "travel_speed": "500", + "notes": "normal" +} diff --git a/resources/profiles/RH3D/process/process_Standard_VIRTU E3.json b/resources/profiles/RH3D/process/process_Standard_VIRTU E3.json new file mode 100644 index 0000000000..d312218844 --- /dev/null +++ b/resources/profiles/RH3D/process/process_Standard_VIRTU E3.json @@ -0,0 +1,33 @@ +{ + "type": "process", + "name": "process_Standard_VIRTU E3", + "inherits": "fdm_process_common", + "from": "system", + "instantiation": "false", + "default_acceleration": "15000", + "initial_layer_acceleration": "7500", + "top_surface_acceleration": "7500", + "travel_acceleration": "10000", + "inner_wall_acceleration": "15000", + "outer_wall_acceleration": "15000", + "bridge_acceleration": "5000", + "sparse_infill_acceleration": "20000", + "internal_solid_infill_acceleration": "20000", + "overhang_1_4_speed": "70", + "overhang_2_4_speed": "40", + "overhang_3_4_speed": "25", + "overhang_4_4_speed": "10", + "support_interface_speed": "100", + "support_speed": "250", + "initial_layer_speed": "100", + "initial_layer_infill_speed": "150", + "outer_wall_speed": "260", + "inner_wall_speed": "350", + "small_perimeter_speed": "260", + "sparse_infill_speed": "350", + "internal_solid_infill_speed": "350", + "top_surface_speed": "260", + "gap_infill_speed": "260", + "travel_speed": "600", + "notes": "normal" +} diff --git a/resources/profiles/RH3D/process/process_common_E3NG v1.2S.json b/resources/profiles/RH3D/process/process_common_E3NG v1.2S.json deleted file mode 100644 index b43952fb89..0000000000 --- a/resources/profiles/RH3D/process/process_common_E3NG v1.2S.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "process", - "name": "process_common_E3NG v1.2S", - "inherits": "fdm_process_common", - "from": "system", - "instantiation": "false" -} From 61dbe5572f5d8199401b9bd8d823b9520c0eef2e Mon Sep 17 00:00:00 2001 From: Jordan Hubbard Date: Mon, 21 Sep 2026 08:19:41 -0700 Subject: [PATCH 15/48] Add Flashforge Adventurer A5 printer profiles (#14733) * Add Flashforge Adventurer A5 printer profiles Adds system profiles for the Flashforge Adventurer A5 to the existing Flashforge vendor: the machine model with 0.25/0.4/0.6/0.8 mm nozzle variants, 14 process presets, and 43 filament presets, plus the printer cover image. All presets inherit from existing Flashforge bases already in-tree (Adventurer 5M Pro nozzle profiles, AD5M Pro process/filament presets, Flashforge generics); no new base assets are introduced (the A5 reuses the existing 5M-series bed/hotend models and buildplate texture). Every inherits reference and sub_path was validated to resolve. Co-Authored-By: Claude Opus 4.8 (1M context) * Assign setting_id to Adventurer A5 presets (fix profile check) The new A5 filament and process presets were missing the deterministic setting_id required by OrcaSlicer's profile validator. Generated via scripts/assign_vendor_setting_ids.py (61 instantiated presets). Verified with scripts/orca_extra_profile_check.py: 0 errors. Co-Authored-By: Claude Opus 4.8 (1M context) * Fix Flashforge Adventurer A5 profiles so the bundle loads and validates The new A5 presets were not in canonical form, several filaments resolved no or the wrong filament_id, and the model and machines pointed at non-existent or AD5M Pro defaults. Run the standard profile tooling (normalize, update-index, generate-id), give the branded filaments the ids of their existing Flashforge products, and repoint the defaults at A5-compatible filaments and processes. Bump the Flashforge bundle version. --------- Co-authored-by: Claude Opus 4.8 (1M context) Co-authored-by: yw4z Co-authored-by: SoftFever <103989404+SoftFever@users.noreply.github.com> Co-authored-by: SoftFever --- resources/profiles/Flashforge.json | 250 +++++++++++++++++- .../Flashforge Adventurer A5_cover.png | Bin 0 -> 11981 bytes ...S Basic @FF Adventurer A5 0.25 nozzle.json | 44 +++ ...lashforge ABS Basic @FF Adventurer A5.json | 50 ++++ ...A Basic @FF Adventurer A5 0.25 nozzle.json | 44 +++ ...lashforge ASA Basic @FF Adventurer A5.json | 50 ++++ ...HS PETG @FF Adventurer A5 0.25 nozzle.json | 44 +++ .../Flashforge HS PETG @FF Adventurer A5.json | 59 +++++ ... HS PLA @FF Adventurer A5 0.25 nozzle.json | 26 ++ .../Flashforge HS PLA @FF Adventurer A5.json | 47 ++++ ...HS PLA+ @FF Adventurer A5 0.25 nozzle.json | 36 +++ .../Flashforge HS PLA+ @FF Adventurer A5.json | 50 ++++ ...G Basic @FF Adventurer A5 0.25 nozzle.json | 44 +++ ...ETG Pro @FF Adventurer A5 0.25 nozzle.json | 44 +++ ...Flashforge PETG Pro @FF Adventurer A5.json | 92 +++++++ ...sparent @FF Adventurer A5 0.25 nozzle.json | 44 +++ ...ge PETG Transparent @FF Adventurer A5.json | 92 +++++++ .../Flashforge PETG-CF @FF Adventurer A5.json | 53 ++++ ...A Basic @FF Adventurer A5 0.25 nozzle.json | 32 +++ ...lashforge PLA Basic @FF Adventurer A5.json | 47 ++++ ... Change @FF Adventurer A5 0.25 nozzle.json | 32 +++ ...ge PLA Color Change @FF Adventurer A5.json | 47 ++++ ... Galaxy @FF Adventurer A5 0.25 nozzle.json | 32 +++ ...ashforge PLA Galaxy @FF Adventurer A5.json | 47 ++++ ...LA LITE @FF Adventurer A5 0.25 nozzle.json | 36 +++ ...Flashforge PLA LITE @FF Adventurer A5.json | 50 ++++ ...uminous @FF Adventurer A5 0.25 nozzle.json | 32 +++ ...hforge PLA Luminous @FF Adventurer A5.json | 47 ++++ ...A Matte @FF Adventurer A5 0.25 nozzle.json | 32 +++ ...lashforge PLA Matte @FF Adventurer A5.json | 47 ++++ ...A Metal @FF Adventurer A5 0.25 nozzle.json | 32 +++ ...lashforge PLA Metal @FF Adventurer A5.json | 47 ++++ ...PLA Pro @FF Adventurer A5 0.25 nozzle.json | 32 +++ .../Flashforge PLA Pro @FF Adventurer A5.json | 47 ++++ ...LA Silk @FF Adventurer A5 0.25 nozzle.json | 35 +++ ...Flashforge PLA Silk @FF Adventurer A5.json | 47 ++++ ...Sparkle @FF Adventurer A5 0.25 nozzle.json | 32 +++ ...shforge PLA Sparkle @FF Adventurer A5.json | 47 ++++ .../Flashforge PLA-CF @FF Adventurer A5.json | 56 ++++ ...e R PLA @FF Adventurer A5 0.25 nozzle.json | 33 +++ .../Flashforge R PLA @FF Adventurer A5.json | 50 ++++ .../Flashforge TPU 95A @FF Adventurer A5.json | 38 +++ ...ic PETG @FF Adventurer A5 0.25 nozzle.json | 17 ++ ...ric PLA @FF Adventurer A5 0.25 nozzle.json | 35 +++ .../Kexcelled TPU 64D @FF Adventurer A5.json | 38 +++ .../Flashforge Adventurer A5 0.25 nozzle.json | 233 ++++++++++++++++ .../Flashforge Adventurer A5 0.4 nozzle.json | 233 ++++++++++++++++ .../Flashforge Adventurer A5 0.6 nozzle.json | 233 ++++++++++++++++ .../Flashforge Adventurer A5 0.8 nozzle.json | 233 ++++++++++++++++ .../machine/Flashforge Adventurer A5.json | 12 + ...tandard @FF Adventurer A5 0.25 nozzle.json | 23 ++ ...tandard @FF Adventurer A5 0.25 nozzle.json | 23 ++ ...tandard @FF Adventurer A5 0.25 nozzle.json | 23 ++ ...2mm Fine @FF Adventurer A5 0.4 nozzle.json | 24 ++ ...tandard @FF Adventurer A5 0.25 nozzle.json | 17 ++ ...tandard @FF Adventurer A5 0.25 nozzle.json | 23 ++ ...8mm Fine @FF Adventurer A5 0.6 nozzle.json | 24 ++ ...Standard @FF Adventurer A5 0.4 nozzle.json | 21 ++ ...mm Draft @FF Adventurer A5 0.4 nozzle.json | 23 ++ ...4mm Fine @FF Adventurer A5 0.8 nozzle.json | 19 ++ ...Standard @FF Adventurer A5 0.6 nozzle.json | 22 ++ ...Standard @FF Adventurer A5 0.8 nozzle.json | 18 ++ ...mm Draft @FF Adventurer A5 0.6 nozzle.json | 23 ++ ...mm Draft @FF Adventurer A5 0.8 nozzle.json | 16 ++ 64 files changed, 3378 insertions(+), 1 deletion(-) create mode 100644 resources/profiles/Flashforge/Flashforge Adventurer A5_cover.png create mode 100644 resources/profiles/Flashforge/filament/Flashforge ABS Basic @FF Adventurer A5 0.25 nozzle.json create mode 100644 resources/profiles/Flashforge/filament/Flashforge ABS Basic @FF Adventurer A5.json create mode 100644 resources/profiles/Flashforge/filament/Flashforge ASA Basic @FF Adventurer A5 0.25 nozzle.json create mode 100644 resources/profiles/Flashforge/filament/Flashforge ASA Basic @FF Adventurer A5.json create mode 100644 resources/profiles/Flashforge/filament/Flashforge HS PETG @FF Adventurer A5 0.25 nozzle.json create mode 100644 resources/profiles/Flashforge/filament/Flashforge HS PETG @FF Adventurer A5.json create mode 100644 resources/profiles/Flashforge/filament/Flashforge HS PLA @FF Adventurer A5 0.25 nozzle.json create mode 100644 resources/profiles/Flashforge/filament/Flashforge HS PLA @FF Adventurer A5.json create mode 100644 resources/profiles/Flashforge/filament/Flashforge HS PLA+ @FF Adventurer A5 0.25 nozzle.json create mode 100644 resources/profiles/Flashforge/filament/Flashforge HS PLA+ @FF Adventurer A5.json create mode 100644 resources/profiles/Flashforge/filament/Flashforge PETG Basic @FF Adventurer A5 0.25 nozzle.json create mode 100644 resources/profiles/Flashforge/filament/Flashforge PETG Pro @FF Adventurer A5 0.25 nozzle.json create mode 100644 resources/profiles/Flashforge/filament/Flashforge PETG Pro @FF Adventurer A5.json create mode 100644 resources/profiles/Flashforge/filament/Flashforge PETG Transparent @FF Adventurer A5 0.25 nozzle.json create mode 100644 resources/profiles/Flashforge/filament/Flashforge PETG Transparent @FF Adventurer A5.json create mode 100644 resources/profiles/Flashforge/filament/Flashforge PETG-CF @FF Adventurer A5.json create mode 100644 resources/profiles/Flashforge/filament/Flashforge PLA Basic @FF Adventurer A5 0.25 nozzle.json create mode 100644 resources/profiles/Flashforge/filament/Flashforge PLA Basic @FF Adventurer A5.json create mode 100644 resources/profiles/Flashforge/filament/Flashforge PLA Color Change @FF Adventurer A5 0.25 nozzle.json create mode 100644 resources/profiles/Flashforge/filament/Flashforge PLA Color Change @FF Adventurer A5.json create mode 100644 resources/profiles/Flashforge/filament/Flashforge PLA Galaxy @FF Adventurer A5 0.25 nozzle.json create mode 100644 resources/profiles/Flashforge/filament/Flashforge PLA Galaxy @FF Adventurer A5.json create mode 100644 resources/profiles/Flashforge/filament/Flashforge PLA LITE @FF Adventurer A5 0.25 nozzle.json create mode 100644 resources/profiles/Flashforge/filament/Flashforge PLA LITE @FF Adventurer A5.json create mode 100644 resources/profiles/Flashforge/filament/Flashforge PLA Luminous @FF Adventurer A5 0.25 nozzle.json create mode 100644 resources/profiles/Flashforge/filament/Flashforge PLA Luminous @FF Adventurer A5.json create mode 100644 resources/profiles/Flashforge/filament/Flashforge PLA Matte @FF Adventurer A5 0.25 nozzle.json create mode 100644 resources/profiles/Flashforge/filament/Flashforge PLA Matte @FF Adventurer A5.json create mode 100644 resources/profiles/Flashforge/filament/Flashforge PLA Metal @FF Adventurer A5 0.25 nozzle.json create mode 100644 resources/profiles/Flashforge/filament/Flashforge PLA Metal @FF Adventurer A5.json create mode 100644 resources/profiles/Flashforge/filament/Flashforge PLA Pro @FF Adventurer A5 0.25 nozzle.json create mode 100644 resources/profiles/Flashforge/filament/Flashforge PLA Pro @FF Adventurer A5.json create mode 100644 resources/profiles/Flashforge/filament/Flashforge PLA Silk @FF Adventurer A5 0.25 nozzle.json create mode 100644 resources/profiles/Flashforge/filament/Flashforge PLA Silk @FF Adventurer A5.json create mode 100644 resources/profiles/Flashforge/filament/Flashforge PLA Sparkle @FF Adventurer A5 0.25 nozzle.json create mode 100644 resources/profiles/Flashforge/filament/Flashforge PLA Sparkle @FF Adventurer A5.json create mode 100644 resources/profiles/Flashforge/filament/Flashforge PLA-CF @FF Adventurer A5.json create mode 100644 resources/profiles/Flashforge/filament/Flashforge R PLA @FF Adventurer A5 0.25 nozzle.json create mode 100644 resources/profiles/Flashforge/filament/Flashforge R PLA @FF Adventurer A5.json create mode 100644 resources/profiles/Flashforge/filament/Flashforge TPU 95A @FF Adventurer A5.json create mode 100644 resources/profiles/Flashforge/filament/Generic PETG @FF Adventurer A5 0.25 nozzle.json create mode 100644 resources/profiles/Flashforge/filament/Generic PLA @FF Adventurer A5 0.25 nozzle.json create mode 100644 resources/profiles/Flashforge/filament/Kexcelled TPU 64D @FF Adventurer A5.json create mode 100644 resources/profiles/Flashforge/machine/Flashforge Adventurer A5 0.25 nozzle.json create mode 100644 resources/profiles/Flashforge/machine/Flashforge Adventurer A5 0.4 nozzle.json create mode 100644 resources/profiles/Flashforge/machine/Flashforge Adventurer A5 0.6 nozzle.json create mode 100644 resources/profiles/Flashforge/machine/Flashforge Adventurer A5 0.8 nozzle.json create mode 100644 resources/profiles/Flashforge/machine/Flashforge Adventurer A5.json create mode 100644 resources/profiles/Flashforge/process/0.06mm Standard @FF Adventurer A5 0.25 nozzle.json create mode 100644 resources/profiles/Flashforge/process/0.08mm Standard @FF Adventurer A5 0.25 nozzle.json create mode 100644 resources/profiles/Flashforge/process/0.10mm Standard @FF Adventurer A5 0.25 nozzle.json create mode 100644 resources/profiles/Flashforge/process/0.12mm Fine @FF Adventurer A5 0.4 nozzle.json create mode 100644 resources/profiles/Flashforge/process/0.12mm Standard @FF Adventurer A5 0.25 nozzle.json create mode 100644 resources/profiles/Flashforge/process/0.14mm Standard @FF Adventurer A5 0.25 nozzle.json create mode 100644 resources/profiles/Flashforge/process/0.18mm Fine @FF Adventurer A5 0.6 nozzle.json create mode 100644 resources/profiles/Flashforge/process/0.20mm Standard @FF Adventurer A5 0.4 nozzle.json create mode 100644 resources/profiles/Flashforge/process/0.24mm Draft @FF Adventurer A5 0.4 nozzle.json create mode 100644 resources/profiles/Flashforge/process/0.24mm Fine @FF Adventurer A5 0.8 nozzle.json create mode 100644 resources/profiles/Flashforge/process/0.30mm Standard @FF Adventurer A5 0.6 nozzle.json create mode 100644 resources/profiles/Flashforge/process/0.40mm Standard @FF Adventurer A5 0.8 nozzle.json create mode 100644 resources/profiles/Flashforge/process/0.42mm Draft @FF Adventurer A5 0.6 nozzle.json create mode 100644 resources/profiles/Flashforge/process/0.56mm Draft @FF Adventurer A5 0.8 nozzle.json diff --git a/resources/profiles/Flashforge.json b/resources/profiles/Flashforge.json index 5bccaf9dfb..cda2215a33 100644 --- a/resources/profiles/Flashforge.json +++ b/resources/profiles/Flashforge.json @@ -1,7 +1,7 @@ { "name": "Flashforge", "url": "", - "version": "02.04.00.08", + "version": "02.04.00.09", "force_update": "0", "description": "Flashforge configurations", "machine_model_list": [ @@ -25,6 +25,10 @@ "name": "Flashforge Adventurer 5M Pro", "sub_path": "machine/Flashforge Adventurer 5M Pro.json" }, + { + "name": "Flashforge Adventurer A5", + "sub_path": "machine/Flashforge Adventurer A5.json" + }, { "name": "Flashforge Artemis", "sub_path": "machine/Flashforge Artemis.json" @@ -199,6 +203,10 @@ "name": "0.20mm Standard @FF AD5X", "sub_path": "process/0.20mm Standard @FF AD5X.json" }, + { + "name": "0.20mm Standard @FF Adventurer A5 0.4 nozzle", + "sub_path": "process/0.20mm Standard @FF Adventurer A5 0.4 nozzle.json" + }, { "name": "0.20mm Standard @FF C5", "sub_path": "process/0.20mm Standard @FF C5.json" @@ -311,6 +319,10 @@ "name": "0.30mm Standard @FF AD5X 0.6 nozzle", "sub_path": "process/0.30mm Standard @FF AD5X 0.6 nozzle.json" }, + { + "name": "0.30mm Standard @FF Adventurer A5 0.6 nozzle", + "sub_path": "process/0.30mm Standard @FF Adventurer A5 0.6 nozzle.json" + }, { "name": "0.40mm Standard @Flashforge AD5M Pro 0.8 Nozzle", "sub_path": "process/0.40mm Standard @Flashforge AD5M Pro 0.8 Nozzle.json" @@ -443,6 +455,10 @@ "name": "0.14mm Standard @Flashforge AD5M 0.25 Nozzle", "sub_path": "process/0.14mm Standard @Flashforge AD5M 0.25 Nozzle.json" }, + { + "name": "0.12mm Fine @FF Adventurer A5 0.4 nozzle", + "sub_path": "process/0.12mm Fine @FF Adventurer A5 0.4 nozzle.json" + }, { "name": "0.06mm Standard @Flashforge AD5M Pro 0.25 Nozzle", "sub_path": "process/0.06mm Standard @Flashforge AD5M Pro 0.25 Nozzle.json" @@ -463,6 +479,10 @@ "name": "0.10mm Standard @Flashforge AD5M Pro 0.25 Nozzle", "sub_path": "process/0.10mm Standard @Flashforge AD5M Pro 0.25 Nozzle.json" }, + { + "name": "0.12mm Standard @FF Adventurer A5 0.25 nozzle", + "sub_path": "process/0.12mm Standard @FF Adventurer A5 0.25 nozzle.json" + }, { "name": "0.12mm Standard @FF G4 0.25 nozzle", "sub_path": "process/0.12mm Standard @FF G4 0.25 nozzle.json" @@ -483,6 +503,10 @@ "name": "0.14mm Standard @Flashforge AD5M Pro 0.25 Nozzle", "sub_path": "process/0.14mm Standard @Flashforge AD5M Pro 0.25 Nozzle.json" }, + { + "name": "0.24mm Draft @FF Adventurer A5 0.4 nozzle", + "sub_path": "process/0.24mm Draft @FF Adventurer A5 0.4 nozzle.json" + }, { "name": "0.24mm Fine @Flashforge AD5M 0.8 Nozzle", "sub_path": "process/0.24mm Fine @Flashforge AD5M 0.8 Nozzle.json" @@ -495,6 +519,10 @@ "name": "0.18mm Fine @FF AD5X 0.6 nozzle", "sub_path": "process/0.18mm Fine @FF AD5X 0.6 nozzle.json" }, + { + "name": "0.18mm Fine @FF Adventurer A5 0.6 nozzle", + "sub_path": "process/0.18mm Fine @FF Adventurer A5 0.6 nozzle.json" + }, { "name": "0.24mm Fine @Flashforge AD5M Pro 0.8 Nozzle", "sub_path": "process/0.24mm Fine @Flashforge AD5M Pro 0.8 Nozzle.json" @@ -503,6 +531,10 @@ "name": "0.40mm Standard @FF AD5X 0.8 nozzle", "sub_path": "process/0.40mm Standard @FF AD5X 0.8 nozzle.json" }, + { + "name": "0.40mm Standard @FF Adventurer A5 0.8 nozzle", + "sub_path": "process/0.40mm Standard @FF Adventurer A5 0.8 nozzle.json" + }, { "name": "0.56mm Draft @Flashforge AD5M Pro 0.8 Nozzle", "sub_path": "process/0.56mm Draft @Flashforge AD5M Pro 0.8 Nozzle.json" @@ -511,6 +543,10 @@ "name": "0.42mm Draft @FF AD5X 0.6 nozzle", "sub_path": "process/0.42mm Draft @FF AD5X 0.6 nozzle.json" }, + { + "name": "0.42mm Draft @FF Adventurer A5 0.6 nozzle", + "sub_path": "process/0.42mm Draft @FF Adventurer A5 0.6 nozzle.json" + }, { "name": "0.08mm Standard @FF C5 0.25 nozzle", "sub_path": "process/0.08mm Standard @FF C5 0.25 nozzle.json" @@ -527,13 +563,37 @@ "name": "0.14mm Standard @FF C5 0.25 nozzle", "sub_path": "process/0.14mm Standard @FF C5 0.25 nozzle.json" }, + { + "name": "0.06mm Standard @FF Adventurer A5 0.25 nozzle", + "sub_path": "process/0.06mm Standard @FF Adventurer A5 0.25 nozzle.json" + }, + { + "name": "0.08mm Standard @FF Adventurer A5 0.25 nozzle", + "sub_path": "process/0.08mm Standard @FF Adventurer A5 0.25 nozzle.json" + }, + { + "name": "0.10mm Standard @FF Adventurer A5 0.25 nozzle", + "sub_path": "process/0.10mm Standard @FF Adventurer A5 0.25 nozzle.json" + }, + { + "name": "0.14mm Standard @FF Adventurer A5 0.25 nozzle", + "sub_path": "process/0.14mm Standard @FF Adventurer A5 0.25 nozzle.json" + }, { "name": "0.24mm Fine @FF AD5X 0.8 nozzle", "sub_path": "process/0.24mm Fine @FF AD5X 0.8 nozzle.json" }, + { + "name": "0.24mm Fine @FF Adventurer A5 0.8 nozzle", + "sub_path": "process/0.24mm Fine @FF Adventurer A5 0.8 nozzle.json" + }, { "name": "0.56mm Draft @FF AD5X 0.8 nozzle", "sub_path": "process/0.56mm Draft @FF AD5X 0.8 nozzle.json" + }, + { + "name": "0.56mm Draft @FF Adventurer A5 0.8 nozzle", + "sub_path": "process/0.56mm Draft @FF Adventurer A5 0.8 nozzle.json" } ], "filament_list": [ @@ -661,6 +721,10 @@ "name": "Flashforge ABS Basic @FF AD5X 0.8 nozzle", "sub_path": "filament/Flashforge ABS Basic @FF AD5X 0.8 nozzle.json" }, + { + "name": "Flashforge ABS Basic @FF Adventurer A5", + "sub_path": "filament/Flashforge ABS Basic @FF Adventurer A5.json" + }, { "name": "Flashforge ABS Basic @FF G4", "sub_path": "filament/Flashforge ABS Basic @FF G4.json" @@ -741,6 +805,10 @@ "name": "Flashforge ASA Basic", "sub_path": "filament/Flashforge ASA Basic.json" }, + { + "name": "Flashforge ASA Basic @FF Adventurer A5", + "sub_path": "filament/Flashforge ASA Basic @FF Adventurer A5.json" + }, { "name": "Generic ASA @FF AD5M 0.25 Nozzle", "sub_path": "filament/Generic ASA @FF AD5M 0.25 Nozzle.json" @@ -769,6 +837,10 @@ "name": "Flashforge HS PETG @FF AD5X 0.8 nozzle", "sub_path": "filament/Flashforge HS PETG @FF AD5X 0.8 nozzle.json" }, + { + "name": "Flashforge HS PETG @FF Adventurer A5", + "sub_path": "filament/Flashforge HS PETG @FF Adventurer A5.json" + }, { "name": "Flashforge HS PETG @FF G4", "sub_path": "filament/Flashforge HS PETG @FF G4.json" @@ -801,6 +873,10 @@ "name": "Flashforge PETG Pro @FF AD5X 0.8 nozzle", "sub_path": "filament/Flashforge PETG Pro @FF AD5X 0.8 nozzle.json" }, + { + "name": "Flashforge PETG Pro @FF Adventurer A5", + "sub_path": "filament/Flashforge PETG Pro @FF Adventurer A5.json" + }, { "name": "Flashforge PETG Pro @FF G4", "sub_path": "filament/Flashforge PETG Pro @FF G4.json" @@ -825,6 +901,10 @@ "name": "Flashforge PETG Transparent @FF AD5X 0.8 nozzle", "sub_path": "filament/Flashforge PETG Transparent @FF AD5X 0.8 nozzle.json" }, + { + "name": "Flashforge PETG Transparent @FF Adventurer A5", + "sub_path": "filament/Flashforge PETG Transparent @FF Adventurer A5.json" + }, { "name": "Flashforge PETG Transparent @FF G4", "sub_path": "filament/Flashforge PETG Transparent @FF G4.json" @@ -925,6 +1005,10 @@ "name": "Flashforge PETG-CF @FF AD5X 0.8 nozzle", "sub_path": "filament/Flashforge PETG-CF @FF AD5X 0.8 nozzle.json" }, + { + "name": "Flashforge PETG-CF @FF Adventurer A5", + "sub_path": "filament/Flashforge PETG-CF @FF Adventurer A5.json" + }, { "name": "Generic PETG-CF10 @Flashforge AD4", "sub_path": "filament/Generic PETG-CF10 @Flashforge AD4.json" @@ -1069,6 +1153,14 @@ "name": "Flashforge HS PLA @FF AD5X 0.8 nozzle", "sub_path": "filament/Flashforge HS PLA @FF AD5X 0.8 nozzle.json" }, + { + "name": "Flashforge HS PLA @FF Adventurer A5", + "sub_path": "filament/Flashforge HS PLA @FF Adventurer A5.json" + }, + { + "name": "Flashforge HS PLA+ @FF Adventurer A5", + "sub_path": "filament/Flashforge HS PLA+ @FF Adventurer A5.json" + }, { "name": "Flashforge PLA @FF AD5M 0.25 Nozzle", "sub_path": "filament/Flashforge PLA @FF AD5M 0.25 Nozzle.json" @@ -1089,6 +1181,10 @@ "name": "Flashforge PLA Basic @FF AD5X 0.8 nozzle", "sub_path": "filament/Flashforge PLA Basic @FF AD5X 0.8 nozzle.json" }, + { + "name": "Flashforge PLA Basic @FF Adventurer A5", + "sub_path": "filament/Flashforge PLA Basic @FF Adventurer A5.json" + }, { "name": "Flashforge PLA Color Change", "sub_path": "filament/Flashforge PLA Color Change.json" @@ -1105,6 +1201,10 @@ "name": "Flashforge PLA Color Change @FF AD5X 0.8 nozzle", "sub_path": "filament/Flashforge PLA Color Change @FF AD5X 0.8 nozzle.json" }, + { + "name": "Flashforge PLA Color Change @FF Adventurer A5", + "sub_path": "filament/Flashforge PLA Color Change @FF Adventurer A5.json" + }, { "name": "Flashforge PLA Galaxy", "sub_path": "filament/Flashforge PLA Galaxy.json" @@ -1121,6 +1221,14 @@ "name": "Flashforge PLA Galaxy @FF AD5X 0.8 nozzle", "sub_path": "filament/Flashforge PLA Galaxy @FF AD5X 0.8 nozzle.json" }, + { + "name": "Flashforge PLA Galaxy @FF Adventurer A5", + "sub_path": "filament/Flashforge PLA Galaxy @FF Adventurer A5.json" + }, + { + "name": "Flashforge PLA LITE @FF Adventurer A5", + "sub_path": "filament/Flashforge PLA LITE @FF Adventurer A5.json" + }, { "name": "Flashforge PLA Luminous", "sub_path": "filament/Flashforge PLA Luminous.json" @@ -1137,6 +1245,10 @@ "name": "Flashforge PLA Luminous @FF AD5X 0.8 nozzle", "sub_path": "filament/Flashforge PLA Luminous @FF AD5X 0.8 nozzle.json" }, + { + "name": "Flashforge PLA Luminous @FF Adventurer A5", + "sub_path": "filament/Flashforge PLA Luminous @FF Adventurer A5.json" + }, { "name": "Flashforge PLA Matte", "sub_path": "filament/Flashforge PLA Matte.json" @@ -1153,6 +1265,10 @@ "name": "Flashforge PLA Matte @FF AD5X 0.8 nozzle", "sub_path": "filament/Flashforge PLA Matte @FF AD5X 0.8 nozzle.json" }, + { + "name": "Flashforge PLA Matte @FF Adventurer A5", + "sub_path": "filament/Flashforge PLA Matte @FF Adventurer A5.json" + }, { "name": "Flashforge PLA Metal", "sub_path": "filament/Flashforge PLA Metal.json" @@ -1169,6 +1285,10 @@ "name": "Flashforge PLA Metal @FF AD5X 0.8 nozzle", "sub_path": "filament/Flashforge PLA Metal @FF AD5X 0.8 nozzle.json" }, + { + "name": "Flashforge PLA Metal @FF Adventurer A5", + "sub_path": "filament/Flashforge PLA Metal @FF Adventurer A5.json" + }, { "name": "Flashforge PLA Pro", "sub_path": "filament/Flashforge PLA Pro.json" @@ -1185,6 +1305,10 @@ "name": "Flashforge PLA Pro @FF AD5X 0.8 nozzle", "sub_path": "filament/Flashforge PLA Pro @FF AD5X 0.8 nozzle.json" }, + { + "name": "Flashforge PLA Pro @FF Adventurer A5", + "sub_path": "filament/Flashforge PLA Pro @FF Adventurer A5.json" + }, { "name": "Flashforge PLA Sparkle", "sub_path": "filament/Flashforge PLA Sparkle.json" @@ -1201,6 +1325,14 @@ "name": "Flashforge PLA Sparkle @FF AD5X 0.8 nozzle", "sub_path": "filament/Flashforge PLA Sparkle @FF AD5X 0.8 nozzle.json" }, + { + "name": "Flashforge PLA Sparkle @FF Adventurer A5", + "sub_path": "filament/Flashforge PLA Sparkle @FF Adventurer A5.json" + }, + { + "name": "Flashforge R PLA @FF Adventurer A5", + "sub_path": "filament/Flashforge R PLA @FF Adventurer A5.json" + }, { "name": "Generic PLA @FF AD5M 0.25 Nozzle", "sub_path": "filament/Generic PLA @FF AD5M 0.25 Nozzle.json" @@ -1269,6 +1401,10 @@ "name": "Flashforge PLA-CF @FF AD5X 0.8 nozzle", "sub_path": "filament/Flashforge PLA-CF @FF AD5X 0.8 nozzle.json" }, + { + "name": "Flashforge PLA-CF @FF Adventurer A5", + "sub_path": "filament/Flashforge PLA-CF @FF Adventurer A5.json" + }, { "name": "Flashforge PPS @FF G4", "sub_path": "filament/Flashforge PPS @FF G4.json" @@ -1313,6 +1449,10 @@ "name": "Flashforge PLA Silk @FF AD5X 0.8 nozzle", "sub_path": "filament/Flashforge PLA Silk @FF AD5X 0.8 nozzle.json" }, + { + "name": "Flashforge PLA Silk @FF Adventurer A5", + "sub_path": "filament/Flashforge PLA Silk @FF Adventurer A5.json" + }, { "name": "Flashforge PLA-SILK @FF AD5M 0.25 Nozzle", "sub_path": "filament/Flashforge PLA-SILK @FF AD5M 0.25 Nozzle.json" @@ -1413,6 +1553,10 @@ "name": "Flashforge TPU 95A @FF AD5X 0.8 nozzle", "sub_path": "filament/Flashforge TPU 95A @FF AD5X 0.8 nozzle.json" }, + { + "name": "Flashforge TPU 95A @FF Adventurer A5", + "sub_path": "filament/Flashforge TPU 95A @FF Adventurer A5.json" + }, { "name": "Flashforge TPU 95A @FF G4", "sub_path": "filament/Flashforge TPU 95A @FF G4.json" @@ -1453,6 +1597,10 @@ "name": "Generic TPU @Flashforge AD4", "sub_path": "filament/Generic TPU @Flashforge AD4.json" }, + { + "name": "Kexcelled TPU 64D @FF Adventurer A5", + "sub_path": "filament/Kexcelled TPU 64D @FF Adventurer A5.json" + }, { "name": "Flashforge ABS Basic @FF AD5M 0.25 nozzle", "sub_path": "filament/Flashforge ABS Basic @FF AD5M 0.25 nozzle.json" @@ -1949,6 +2097,10 @@ "name": "Polymaker CoPA @FF G4P 0.8 HF nozzle", "sub_path": "filament/Polymaker CoPA @FF G4P 0.8 HF nozzle.json" }, + { + "name": "Generic PETG @FF Adventurer A5 0.25 nozzle", + "sub_path": "filament/Generic PETG @FF Adventurer A5 0.25 nozzle.json" + }, { "name": "Flashforge HS PETG @FF G4 0.6 HF nozzle", "sub_path": "filament/Flashforge HS PETG @FF G4 0.6 HF nozzle.json" @@ -2045,6 +2197,10 @@ "name": "Flashforge PETG-CF @FF G4P 0.6 nozzle", "sub_path": "filament/Flashforge PETG-CF @FF G4P 0.6 nozzle.json" }, + { + "name": "Flashforge HS PLA @FF Adventurer A5 0.25 nozzle", + "sub_path": "filament/Flashforge HS PLA @FF Adventurer A5 0.25 nozzle.json" + }, { "name": "Flashforge HS PLA @FF AD5X 0.25 nozzle", "sub_path": "filament/Flashforge HS PLA @FF AD5X 0.25 nozzle.json" @@ -2057,6 +2213,10 @@ "name": "Flashforge HS PLA @FF G4P 0.25 nozzle", "sub_path": "filament/Flashforge HS PLA @FF G4P 0.25 nozzle.json" }, + { + "name": "Flashforge HS PLA+ @FF Adventurer A5 0.25 nozzle", + "sub_path": "filament/Flashforge HS PLA+ @FF Adventurer A5 0.25 nozzle.json" + }, { "name": "Flashforge PLA Basic @FF AD5M 0.25 nozzle", "sub_path": "filament/Flashforge PLA Basic @FF AD5M 0.25 nozzle.json" @@ -2105,6 +2265,10 @@ "name": "Flashforge PLA Galaxy @FF G4P 0.25 nozzle", "sub_path": "filament/Flashforge PLA Galaxy @FF G4P 0.25 nozzle.json" }, + { + "name": "Flashforge PLA LITE @FF Adventurer A5 0.25 nozzle", + "sub_path": "filament/Flashforge PLA LITE @FF Adventurer A5 0.25 nozzle.json" + }, { "name": "Flashforge PLA Luminous @FF AD5M 0.25 nozzle", "sub_path": "filament/Flashforge PLA Luminous @FF AD5M 0.25 nozzle.json" @@ -2197,6 +2361,14 @@ "name": "Flashforge PLA Sparkle @FF G4P 0.25 nozzle", "sub_path": "filament/Flashforge PLA Sparkle @FF G4P 0.25 nozzle.json" }, + { + "name": "Flashforge R PLA @FF Adventurer A5 0.25 nozzle", + "sub_path": "filament/Flashforge R PLA @FF Adventurer A5 0.25 nozzle.json" + }, + { + "name": "Generic PLA @FF Adventurer A5 0.25 nozzle", + "sub_path": "filament/Generic PLA @FF Adventurer A5 0.25 nozzle.json" + }, { "name": "Flashforge HS PLA @FF G4 0.6 HF nozzle", "sub_path": "filament/Flashforge HS PLA @FF G4 0.6 HF nozzle.json" @@ -2497,6 +2669,66 @@ "name": "Flashforge PLA Silk @FF AD5M 0.25 nozzle", "sub_path": "filament/Flashforge PLA Silk @FF AD5M 0.25 nozzle.json" }, + { + "name": "Flashforge ABS Basic @FF Adventurer A5 0.25 nozzle", + "sub_path": "filament/Flashforge ABS Basic @FF Adventurer A5 0.25 nozzle.json" + }, + { + "name": "Flashforge ASA Basic @FF Adventurer A5 0.25 nozzle", + "sub_path": "filament/Flashforge ASA Basic @FF Adventurer A5 0.25 nozzle.json" + }, + { + "name": "Flashforge HS PETG @FF Adventurer A5 0.25 nozzle", + "sub_path": "filament/Flashforge HS PETG @FF Adventurer A5 0.25 nozzle.json" + }, + { + "name": "Flashforge PETG Basic @FF Adventurer A5 0.25 nozzle", + "sub_path": "filament/Flashforge PETG Basic @FF Adventurer A5 0.25 nozzle.json" + }, + { + "name": "Flashforge PETG Pro @FF Adventurer A5 0.25 nozzle", + "sub_path": "filament/Flashforge PETG Pro @FF Adventurer A5 0.25 nozzle.json" + }, + { + "name": "Flashforge PETG Transparent @FF Adventurer A5 0.25 nozzle", + "sub_path": "filament/Flashforge PETG Transparent @FF Adventurer A5 0.25 nozzle.json" + }, + { + "name": "Flashforge PLA Basic @FF Adventurer A5 0.25 nozzle", + "sub_path": "filament/Flashforge PLA Basic @FF Adventurer A5 0.25 nozzle.json" + }, + { + "name": "Flashforge PLA Color Change @FF Adventurer A5 0.25 nozzle", + "sub_path": "filament/Flashforge PLA Color Change @FF Adventurer A5 0.25 nozzle.json" + }, + { + "name": "Flashforge PLA Galaxy @FF Adventurer A5 0.25 nozzle", + "sub_path": "filament/Flashforge PLA Galaxy @FF Adventurer A5 0.25 nozzle.json" + }, + { + "name": "Flashforge PLA Luminous @FF Adventurer A5 0.25 nozzle", + "sub_path": "filament/Flashforge PLA Luminous @FF Adventurer A5 0.25 nozzle.json" + }, + { + "name": "Flashforge PLA Matte @FF Adventurer A5 0.25 nozzle", + "sub_path": "filament/Flashforge PLA Matte @FF Adventurer A5 0.25 nozzle.json" + }, + { + "name": "Flashforge PLA Metal @FF Adventurer A5 0.25 nozzle", + "sub_path": "filament/Flashforge PLA Metal @FF Adventurer A5 0.25 nozzle.json" + }, + { + "name": "Flashforge PLA Pro @FF Adventurer A5 0.25 nozzle", + "sub_path": "filament/Flashforge PLA Pro @FF Adventurer A5 0.25 nozzle.json" + }, + { + "name": "Flashforge PLA Sparkle @FF Adventurer A5 0.25 nozzle", + "sub_path": "filament/Flashforge PLA Sparkle @FF Adventurer A5 0.25 nozzle.json" + }, + { + "name": "Flashforge PLA Silk @FF Adventurer A5 0.25 nozzle", + "sub_path": "filament/Flashforge PLA Silk @FF Adventurer A5 0.25 nozzle.json" + }, { "name": "Flashforge ABS Basic @FF C5", "sub_path": "filament/Flashforge ABS Basic @FF C5.json" @@ -2907,6 +3139,10 @@ "name": "Flashforge AD5X 0.25 nozzle", "sub_path": "machine/FlashForge AD5X 0.25 nozzle.json" }, + { + "name": "Flashforge Adventurer A5 0.25 nozzle", + "sub_path": "machine/Flashforge Adventurer A5 0.25 nozzle.json" + }, { "name": "Flashforge Guider4 0.25 nozzle", "sub_path": "machine/Flashforge Guider4 0.25 nozzle.json" @@ -2919,6 +3155,10 @@ "name": "Flashforge AD5X 0.4 nozzle", "sub_path": "machine/Flashforge AD5X 0.4 nozzle.json" }, + { + "name": "Flashforge Adventurer A5 0.4 nozzle", + "sub_path": "machine/Flashforge Adventurer A5 0.4 nozzle.json" + }, { "name": "Flashforge Creator 5 0.25 nozzle", "sub_path": "machine/Flashforge Creator 5 0.25 nozzle.json" @@ -2963,10 +3203,18 @@ "name": "Flashforge AD5X 0.6 nozzle", "sub_path": "machine/Flashforge AD5X 0.6 nozzle.json" }, + { + "name": "Flashforge Adventurer A5 0.6 nozzle", + "sub_path": "machine/Flashforge Adventurer A5 0.6 nozzle.json" + }, { "name": "Flashforge AD5X 0.8 nozzle", "sub_path": "machine/Flashforge AD5X 0.8 nozzle.json" }, + { + "name": "Flashforge Adventurer A5 0.8 nozzle", + "sub_path": "machine/Flashforge Adventurer A5 0.8 nozzle.json" + }, { "name": "Flashforge Guider4 0.4 HF nozzle", "sub_path": "machine/Flashforge Guider4 0.4 HF nozzle.json" diff --git a/resources/profiles/Flashforge/Flashforge Adventurer A5_cover.png b/resources/profiles/Flashforge/Flashforge Adventurer A5_cover.png new file mode 100644 index 0000000000000000000000000000000000000000..70966ac6856d4a4c678b166cfa9e0656ee865d17 GIT binary patch literal 11981 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 S;r%bB4k0hCB2_D468t}qAyz;D literal 0 HcmV?d00001 diff --git a/resources/profiles/Flashforge/filament/Flashforge ABS Basic @FF Adventurer A5 0.25 nozzle.json b/resources/profiles/Flashforge/filament/Flashforge ABS Basic @FF Adventurer A5 0.25 nozzle.json new file mode 100644 index 0000000000..08b228c11a --- /dev/null +++ b/resources/profiles/Flashforge/filament/Flashforge ABS Basic @FF Adventurer A5 0.25 nozzle.json @@ -0,0 +1,44 @@ +{ + "type": "filament", + "name": "Flashforge ABS Basic @FF Adventurer A5 0.25 nozzle", + "inherits": "Flashforge ABS Basic @FF AD5M 0.25 nozzle", + "from": "system", + "setting_id": "jRIJ0cO4GhaMg2By", + "instantiation": "true", + "cool_plate_temp": [ + "0" + ], + "cool_plate_temp_initial_layer": [ + "0" + ], + "eng_plate_temp": [ + "105" + ], + "eng_plate_temp_initial_layer": [ + "105" + ], + "filament_settings_id": [ + "Flashforge ABS Basic @FF Adventurer A5 0.25 nozzle" + ], + "compatible_printers": [ + "Flashforge Adventurer A5 0.25 nozzle" + ], + "supertack_plate_temp": [ + "0" + ], + "supertack_plate_temp_initial_layer": [ + "0" + ], + "textured_cool_plate_temp": [ + "0" + ], + "textured_cool_plate_temp_initial_layer": [ + "0" + ], + "textured_plate_temp": [ + "105" + ], + "textured_plate_temp_initial_layer": [ + "105" + ] +} diff --git a/resources/profiles/Flashforge/filament/Flashforge ABS Basic @FF Adventurer A5.json b/resources/profiles/Flashforge/filament/Flashforge ABS Basic @FF Adventurer A5.json new file mode 100644 index 0000000000..0ea70e0bf4 --- /dev/null +++ b/resources/profiles/Flashforge/filament/Flashforge ABS Basic @FF Adventurer A5.json @@ -0,0 +1,50 @@ +{ + "type": "filament", + "name": "Flashforge ABS Basic @FF Adventurer A5", + "inherits": "Generic ABS @Flashforge", + "from": "system", + "setting_id": "rDW4AwKc7SD7WIxN", + "filament_id": "OFibWuBd", + "filament_vendor": [ + "Flashforge" + ], + "instantiation": "true", + "cool_plate_temp": [ + "0" + ], + "cool_plate_temp_initial_layer": [ + "0" + ], + "eng_plate_temp": [ + "105" + ], + "eng_plate_temp_initial_layer": [ + "105" + ], + "filament_settings_id": [ + "Flashforge ABS Basic @FF Adventurer A5" + ], + "compatible_printers": [ + "Flashforge Adventurer A5 0.4 nozzle", + "Flashforge Adventurer A5 0.6 nozzle", + "Flashforge Adventurer A5 0.8 nozzle" + ], + "supertack_plate_temp": [ + "0" + ], + "supertack_plate_temp_initial_layer": [ + "0" + ], + "textured_cool_plate_temp": [ + "0" + ], + "textured_cool_plate_temp_initial_layer": [ + "0" + ], + "textured_plate_temp": [ + "105" + ], + "textured_plate_temp_initial_layer": [ + "105" + ] +} diff --git a/resources/profiles/Flashforge/filament/Flashforge ASA Basic @FF Adventurer A5 0.25 nozzle.json b/resources/profiles/Flashforge/filament/Flashforge ASA Basic @FF Adventurer A5 0.25 nozzle.json new file mode 100644 index 0000000000..7d65841413 --- /dev/null +++ b/resources/profiles/Flashforge/filament/Flashforge ASA Basic @FF Adventurer A5 0.25 nozzle.json @@ -0,0 +1,44 @@ +{ + "type": "filament", + "name": "Flashforge ASA Basic @FF Adventurer A5 0.25 nozzle", + "inherits": "Flashforge ASA Basic @FF AD5M 0.25 nozzle", + "from": "system", + "setting_id": "OIUW8rw2VhNpeVpF", + "instantiation": "true", + "cool_plate_temp": [ + "0" + ], + "cool_plate_temp_initial_layer": [ + "0" + ], + "eng_plate_temp": [ + "105" + ], + "eng_plate_temp_initial_layer": [ + "105" + ], + "filament_settings_id": [ + "Flashforge ASA Basic @FF Adventurer A5 0.25 nozzle" + ], + "compatible_printers": [ + "Flashforge Adventurer A5 0.25 nozzle" + ], + "supertack_plate_temp": [ + "0" + ], + "supertack_plate_temp_initial_layer": [ + "0" + ], + "textured_cool_plate_temp": [ + "0" + ], + "textured_cool_plate_temp_initial_layer": [ + "0" + ], + "textured_plate_temp": [ + "105" + ], + "textured_plate_temp_initial_layer": [ + "105" + ] +} diff --git a/resources/profiles/Flashforge/filament/Flashforge ASA Basic @FF Adventurer A5.json b/resources/profiles/Flashforge/filament/Flashforge ASA Basic @FF Adventurer A5.json new file mode 100644 index 0000000000..80943c015a --- /dev/null +++ b/resources/profiles/Flashforge/filament/Flashforge ASA Basic @FF Adventurer A5.json @@ -0,0 +1,50 @@ +{ + "type": "filament", + "name": "Flashforge ASA Basic @FF Adventurer A5", + "inherits": "Generic ASA @Flashforge", + "from": "system", + "setting_id": "FY9mcqOyuu1Gqq1m", + "filament_id": "OFFFg2Pf", + "filament_vendor": [ + "Flashforge" + ], + "instantiation": "true", + "cool_plate_temp": [ + "0" + ], + "cool_plate_temp_initial_layer": [ + "0" + ], + "eng_plate_temp": [ + "105" + ], + "eng_plate_temp_initial_layer": [ + "105" + ], + "filament_settings_id": [ + "Flashforge ASA Basic @FF Adventurer A5" + ], + "compatible_printers": [ + "Flashforge Adventurer A5 0.4 nozzle", + "Flashforge Adventurer A5 0.6 nozzle", + "Flashforge Adventurer A5 0.8 nozzle" + ], + "supertack_plate_temp": [ + "0" + ], + "supertack_plate_temp_initial_layer": [ + "0" + ], + "textured_cool_plate_temp": [ + "0" + ], + "textured_cool_plate_temp_initial_layer": [ + "0" + ], + "textured_plate_temp": [ + "105" + ], + "textured_plate_temp_initial_layer": [ + "105" + ] +} diff --git a/resources/profiles/Flashforge/filament/Flashforge HS PETG @FF Adventurer A5 0.25 nozzle.json b/resources/profiles/Flashforge/filament/Flashforge HS PETG @FF Adventurer A5 0.25 nozzle.json new file mode 100644 index 0000000000..609de4b870 --- /dev/null +++ b/resources/profiles/Flashforge/filament/Flashforge HS PETG @FF Adventurer A5 0.25 nozzle.json @@ -0,0 +1,44 @@ +{ + "type": "filament", + "name": "Flashforge HS PETG @FF Adventurer A5 0.25 nozzle", + "inherits": "Flashforge HS PETG @FF AD5M 0.25 nozzle", + "from": "system", + "setting_id": "UFal5gkMUJpoiOWP", + "instantiation": "true", + "cool_plate_temp": [ + "0" + ], + "cool_plate_temp_initial_layer": [ + "0" + ], + "eng_plate_temp": [ + "70" + ], + "eng_plate_temp_initial_layer": [ + "70" + ], + "filament_settings_id": [ + "Flashforge HS PETG @FF Adventurer A5 0.25 nozzle" + ], + "compatible_printers": [ + "Flashforge Adventurer A5 0.25 nozzle" + ], + "supertack_plate_temp": [ + "70" + ], + "supertack_plate_temp_initial_layer": [ + "70" + ], + "textured_cool_plate_temp": [ + "70" + ], + "textured_cool_plate_temp_initial_layer": [ + "70" + ], + "textured_plate_temp": [ + "70" + ], + "textured_plate_temp_initial_layer": [ + "70" + ] +} diff --git a/resources/profiles/Flashforge/filament/Flashforge HS PETG @FF Adventurer A5.json b/resources/profiles/Flashforge/filament/Flashforge HS PETG @FF Adventurer A5.json new file mode 100644 index 0000000000..5825f17141 --- /dev/null +++ b/resources/profiles/Flashforge/filament/Flashforge HS PETG @FF Adventurer A5.json @@ -0,0 +1,59 @@ +{ + "type": "filament", + "name": "Flashforge HS PETG @FF Adventurer A5", + "inherits": "Generic PETG @Flashforge", + "from": "system", + "setting_id": "ZpNEEHTtvhMJS8Kv", + "filament_id": "OFDxxTpW", + "filament_vendor": [ + "Flashforge" + ], + "instantiation": "true", + "close_fan_the_first_x_layers": [ + "2" + ], + "cool_plate_temp": [ + "0" + ], + "cool_plate_temp_initial_layer": [ + "0" + ], + "eng_plate_temp": [ + "70" + ], + "eng_plate_temp_initial_layer": [ + "70" + ], + "filament_flow_ratio": [ + "0.98" + ], + "filament_max_volumetric_speed": [ + "21" + ], + "filament_settings_id": [ + "Flashforge HS PETG @FF Adventurer A5" + ], + "compatible_printers": [ + "Flashforge Adventurer A5 0.4 nozzle", + "Flashforge Adventurer A5 0.6 nozzle", + "Flashforge Adventurer A5 0.8 nozzle" + ], + "supertack_plate_temp": [ + "70" + ], + "supertack_plate_temp_initial_layer": [ + "70" + ], + "textured_cool_plate_temp": [ + "70" + ], + "textured_cool_plate_temp_initial_layer": [ + "70" + ], + "textured_plate_temp": [ + "70" + ], + "textured_plate_temp_initial_layer": [ + "70" + ] +} diff --git a/resources/profiles/Flashforge/filament/Flashforge HS PLA @FF Adventurer A5 0.25 nozzle.json b/resources/profiles/Flashforge/filament/Flashforge HS PLA @FF Adventurer A5 0.25 nozzle.json new file mode 100644 index 0000000000..797c72be19 --- /dev/null +++ b/resources/profiles/Flashforge/filament/Flashforge HS PLA @FF Adventurer A5 0.25 nozzle.json @@ -0,0 +1,26 @@ +{ + "type": "filament", + "name": "Flashforge HS PLA @FF Adventurer A5 0.25 nozzle", + "inherits": "Flashforge HS PLA @FF AD5M 0.25 nozzle", + "from": "system", + "setting_id": "Ewx6vNp0sDLDczPc", + "instantiation": "true", + "cool_plate_temp": [ + "40" + ], + "cool_plate_temp_initial_layer": [ + "40" + ], + "filament_settings_id": [ + "Flashforge HS PLA @FF Adventurer A5 0.25 nozzle" + ], + "compatible_printers": [ + "Flashforge Adventurer A5 0.25 nozzle" + ], + "hot_plate_temp": [ + "60" + ], + "hot_plate_temp_initial_layer": [ + "60" + ] +} diff --git a/resources/profiles/Flashforge/filament/Flashforge HS PLA @FF Adventurer A5.json b/resources/profiles/Flashforge/filament/Flashforge HS PLA @FF Adventurer A5.json new file mode 100644 index 0000000000..9f34aa44af --- /dev/null +++ b/resources/profiles/Flashforge/filament/Flashforge HS PLA @FF Adventurer A5.json @@ -0,0 +1,47 @@ +{ + "type": "filament", + "name": "Flashforge HS PLA @FF Adventurer A5", + "inherits": "Generic PLA @Flashforge", + "from": "system", + "setting_id": "2L7FS5JeAyPb3y0s", + "filament_id": "OFIK2H3G", + "filament_vendor": [ + "Flashforge" + ], + "instantiation": "true", + "cool_plate_temp": [ + "45" + ], + "cool_plate_temp_initial_layer": [ + "45" + ], + "eng_plate_temp": [ + "55" + ], + "filament_max_volumetric_speed": [ + "22" + ], + "filament_settings_id": [ + "Flashforge HS PLA @FF Adventurer A5" + ], + "compatible_printers": [ + "Flashforge Adventurer A5 0.4 nozzle", + "Flashforge Adventurer A5 0.6 nozzle", + "Flashforge Adventurer A5 0.8 nozzle" + ], + "hot_plate_temp": [ + "55" + ], + "pressure_advance": [ + "0.0325" + ], + "textured_cool_plate_temp": [ + "45" + ], + "textured_cool_plate_temp_initial_layer": [ + "45" + ], + "textured_plate_temp": [ + "55" + ] +} diff --git a/resources/profiles/Flashforge/filament/Flashforge HS PLA+ @FF Adventurer A5 0.25 nozzle.json b/resources/profiles/Flashforge/filament/Flashforge HS PLA+ @FF Adventurer A5 0.25 nozzle.json new file mode 100644 index 0000000000..1d6ac25b9f --- /dev/null +++ b/resources/profiles/Flashforge/filament/Flashforge HS PLA+ @FF Adventurer A5 0.25 nozzle.json @@ -0,0 +1,36 @@ +{ + "type": "filament", + "name": "Flashforge HS PLA+ @FF Adventurer A5 0.25 nozzle", + "inherits": "Flashforge PLA @FF AD5M 0.25 Nozzle", + "from": "system", + "setting_id": "DeiDOP4VfKSyMtjw", + "filament_id": "OFXB8ZI7", + "instantiation": "true", + "cool_plate_temp": [ + "40" + ], + "cool_plate_temp_initial_layer": [ + "40" + ], + "eng_plate_temp_initial_layer": [ + "60" + ], + "filament_flow_ratio": [ + "0.95" + ], + "filament_settings_id": [ + "Flashforge HS PLA+ @FF Adventurer A5 0.25 nozzle" + ], + "compatible_printers": [ + "Flashforge Adventurer A5 0.25 nozzle" + ], + "hot_plate_temp": [ + "60" + ], + "hot_plate_temp_initial_layer": [ + "60" + ], + "textured_plate_temp_initial_layer": [ + "60" + ] +} diff --git a/resources/profiles/Flashforge/filament/Flashforge HS PLA+ @FF Adventurer A5.json b/resources/profiles/Flashforge/filament/Flashforge HS PLA+ @FF Adventurer A5.json new file mode 100644 index 0000000000..22c1c9870f --- /dev/null +++ b/resources/profiles/Flashforge/filament/Flashforge HS PLA+ @FF Adventurer A5.json @@ -0,0 +1,50 @@ +{ + "type": "filament", + "name": "Flashforge HS PLA+ @FF Adventurer A5", + "inherits": "Generic PLA @Flashforge", + "from": "system", + "setting_id": "V4jIUQzxoZkK50mn", + "filament_id": "OFXB8ZI7", + "filament_vendor": [ + "Flashforge" + ], + "instantiation": "true", + "cool_plate_temp": [ + "45" + ], + "cool_plate_temp_initial_layer": [ + "45" + ], + "eng_plate_temp": [ + "55" + ], + "filament_flow_ratio": [ + "0.94" + ], + "filament_max_volumetric_speed": [ + "22" + ], + "filament_settings_id": [ + "Flashforge HS PLA+ @FF Adventurer A5" + ], + "compatible_printers": [ + "Flashforge Adventurer A5 0.4 nozzle", + "Flashforge Adventurer A5 0.6 nozzle", + "Flashforge Adventurer A5 0.8 nozzle" + ], + "hot_plate_temp": [ + "55" + ], + "pressure_advance": [ + "0.0325" + ], + "textured_cool_plate_temp": [ + "45" + ], + "textured_cool_plate_temp_initial_layer": [ + "45" + ], + "textured_plate_temp": [ + "55" + ] +} diff --git a/resources/profiles/Flashforge/filament/Flashforge PETG Basic @FF Adventurer A5 0.25 nozzle.json b/resources/profiles/Flashforge/filament/Flashforge PETG Basic @FF Adventurer A5 0.25 nozzle.json new file mode 100644 index 0000000000..ec9f63af46 --- /dev/null +++ b/resources/profiles/Flashforge/filament/Flashforge PETG Basic @FF Adventurer A5 0.25 nozzle.json @@ -0,0 +1,44 @@ +{ + "type": "filament", + "name": "Flashforge PETG Basic @FF Adventurer A5 0.25 nozzle", + "inherits": "Flashforge PETG Basic @FF AD5M 0.25 nozzle", + "from": "system", + "setting_id": "0sotIYsGkpQpcq6Y", + "instantiation": "true", + "cool_plate_temp": [ + "0" + ], + "cool_plate_temp_initial_layer": [ + "0" + ], + "eng_plate_temp": [ + "70" + ], + "eng_plate_temp_initial_layer": [ + "70" + ], + "filament_settings_id": [ + "Flashforge PETG Basic @FF Adventurer A5 0.25 nozzle" + ], + "compatible_printers": [ + "Flashforge Adventurer A5 0.25 nozzle" + ], + "supertack_plate_temp": [ + "70" + ], + "supertack_plate_temp_initial_layer": [ + "70" + ], + "textured_cool_plate_temp": [ + "70" + ], + "textured_cool_plate_temp_initial_layer": [ + "70" + ], + "textured_plate_temp": [ + "70" + ], + "textured_plate_temp_initial_layer": [ + "70" + ] +} diff --git a/resources/profiles/Flashforge/filament/Flashforge PETG Pro @FF Adventurer A5 0.25 nozzle.json b/resources/profiles/Flashforge/filament/Flashforge PETG Pro @FF Adventurer A5 0.25 nozzle.json new file mode 100644 index 0000000000..7ebc60dc50 --- /dev/null +++ b/resources/profiles/Flashforge/filament/Flashforge PETG Pro @FF Adventurer A5 0.25 nozzle.json @@ -0,0 +1,44 @@ +{ + "type": "filament", + "name": "Flashforge PETG Pro @FF Adventurer A5 0.25 nozzle", + "inherits": "Flashforge PETG Pro @FF AD5M 0.25 nozzle", + "from": "system", + "setting_id": "SZmG7gbmfOCGc8Fa", + "instantiation": "true", + "cool_plate_temp": [ + "0" + ], + "cool_plate_temp_initial_layer": [ + "0" + ], + "eng_plate_temp": [ + "70" + ], + "eng_plate_temp_initial_layer": [ + "70" + ], + "filament_settings_id": [ + "Flashforge PETG Pro @FF Adventurer A5 0.25 nozzle" + ], + "compatible_printers": [ + "Flashforge Adventurer A5 0.25 nozzle" + ], + "supertack_plate_temp": [ + "70" + ], + "supertack_plate_temp_initial_layer": [ + "70" + ], + "textured_cool_plate_temp": [ + "70" + ], + "textured_cool_plate_temp_initial_layer": [ + "70" + ], + "textured_plate_temp": [ + "70" + ], + "textured_plate_temp_initial_layer": [ + "70" + ] +} diff --git a/resources/profiles/Flashforge/filament/Flashforge PETG Pro @FF Adventurer A5.json b/resources/profiles/Flashforge/filament/Flashforge PETG Pro @FF Adventurer A5.json new file mode 100644 index 0000000000..b1a6a9f7e5 --- /dev/null +++ b/resources/profiles/Flashforge/filament/Flashforge PETG Pro @FF Adventurer A5.json @@ -0,0 +1,92 @@ +{ + "type": "filament", + "name": "Flashforge PETG Pro @FF Adventurer A5", + "inherits": "Generic PETG @Flashforge", + "from": "system", + "setting_id": "rPy6e6kaIt2tI34j", + "filament_id": "OFXiArjA", + "filament_vendor": [ + "Flashforge" + ], + "instantiation": "true", + "additional_cooling_fan_speed": [ + "60" + ], + "close_fan_the_first_x_layers": [ + "2" + ], + "cool_plate_temp": [ + "0" + ], + "cool_plate_temp_initial_layer": [ + "0" + ], + "eng_plate_temp": [ + "75" + ], + "eng_plate_temp_initial_layer": [ + "75" + ], + "fan_max_speed": [ + "50" + ], + "fan_min_speed": [ + "10" + ], + "filament_flow_ratio": [ + "0.98" + ], + "filament_max_volumetric_speed": [ + "10" + ], + "filament_settings_id": [ + "Flashforge PETG Pro @FF Adventurer A5" + ], + "compatible_printers": [ + "Flashforge Adventurer A5 0.4 nozzle", + "Flashforge Adventurer A5 0.6 nozzle", + "Flashforge Adventurer A5 0.8 nozzle" + ], + "hot_plate_temp": [ + "75" + ], + "hot_plate_temp_initial_layer": [ + "75" + ], + "nozzle_temperature": [ + "265" + ], + "nozzle_temperature_range_high": [ + "270" + ], + "overhang_fan_speed": [ + "100" + ], + "slow_down_layer_time": [ + "12" + ], + "slow_down_min_speed": [ + "20" + ], + "supertack_plate_temp": [ + "75" + ], + "supertack_plate_temp_initial_layer": [ + "75" + ], + "support_material_interface_fan_speed": [ + "100" + ], + "textured_cool_plate_temp": [ + "75" + ], + "textured_cool_plate_temp_initial_layer": [ + "75" + ], + "textured_plate_temp": [ + "75" + ], + "textured_plate_temp_initial_layer": [ + "75" + ] +} diff --git a/resources/profiles/Flashforge/filament/Flashforge PETG Transparent @FF Adventurer A5 0.25 nozzle.json b/resources/profiles/Flashforge/filament/Flashforge PETG Transparent @FF Adventurer A5 0.25 nozzle.json new file mode 100644 index 0000000000..1c116250c6 --- /dev/null +++ b/resources/profiles/Flashforge/filament/Flashforge PETG Transparent @FF Adventurer A5 0.25 nozzle.json @@ -0,0 +1,44 @@ +{ + "type": "filament", + "name": "Flashforge PETG Transparent @FF Adventurer A5 0.25 nozzle", + "inherits": "Flashforge PETG Transparent @FF AD5M 0.25 nozzle", + "from": "system", + "setting_id": "PJ1sXWRB5uQa7TAJ", + "instantiation": "true", + "cool_plate_temp": [ + "0" + ], + "cool_plate_temp_initial_layer": [ + "0" + ], + "eng_plate_temp": [ + "70" + ], + "eng_plate_temp_initial_layer": [ + "70" + ], + "filament_settings_id": [ + "Flashforge PETG Transparent @FF Adventurer A5 0.25 nozzle" + ], + "compatible_printers": [ + "Flashforge Adventurer A5 0.25 nozzle" + ], + "supertack_plate_temp": [ + "70" + ], + "supertack_plate_temp_initial_layer": [ + "70" + ], + "textured_cool_plate_temp": [ + "70" + ], + "textured_cool_plate_temp_initial_layer": [ + "70" + ], + "textured_plate_temp": [ + "70" + ], + "textured_plate_temp_initial_layer": [ + "70" + ] +} diff --git a/resources/profiles/Flashforge/filament/Flashforge PETG Transparent @FF Adventurer A5.json b/resources/profiles/Flashforge/filament/Flashforge PETG Transparent @FF Adventurer A5.json new file mode 100644 index 0000000000..15ccd1d0ac --- /dev/null +++ b/resources/profiles/Flashforge/filament/Flashforge PETG Transparent @FF Adventurer A5.json @@ -0,0 +1,92 @@ +{ + "type": "filament", + "name": "Flashforge PETG Transparent @FF Adventurer A5", + "inherits": "Generic PETG @Flashforge", + "from": "system", + "setting_id": "axOWrjnN5lofH9qM", + "filament_id": "OFwjMiKL", + "filament_vendor": [ + "Flashforge" + ], + "instantiation": "true", + "additional_cooling_fan_speed": [ + "60" + ], + "close_fan_the_first_x_layers": [ + "2" + ], + "cool_plate_temp": [ + "0" + ], + "cool_plate_temp_initial_layer": [ + "0" + ], + "eng_plate_temp": [ + "75" + ], + "eng_plate_temp_initial_layer": [ + "75" + ], + "fan_max_speed": [ + "50" + ], + "fan_min_speed": [ + "10" + ], + "filament_flow_ratio": [ + "0.98" + ], + "filament_max_volumetric_speed": [ + "10" + ], + "filament_settings_id": [ + "Flashforge PETG Transparent @FF Adventurer A5" + ], + "compatible_printers": [ + "Flashforge Adventurer A5 0.4 nozzle", + "Flashforge Adventurer A5 0.6 nozzle", + "Flashforge Adventurer A5 0.8 nozzle" + ], + "hot_plate_temp": [ + "75" + ], + "hot_plate_temp_initial_layer": [ + "75" + ], + "nozzle_temperature": [ + "265" + ], + "nozzle_temperature_range_high": [ + "270" + ], + "overhang_fan_speed": [ + "100" + ], + "slow_down_layer_time": [ + "12" + ], + "slow_down_min_speed": [ + "20" + ], + "supertack_plate_temp": [ + "75" + ], + "supertack_plate_temp_initial_layer": [ + "75" + ], + "support_material_interface_fan_speed": [ + "100" + ], + "textured_cool_plate_temp": [ + "75" + ], + "textured_cool_plate_temp_initial_layer": [ + "75" + ], + "textured_plate_temp": [ + "75" + ], + "textured_plate_temp_initial_layer": [ + "75" + ] +} diff --git a/resources/profiles/Flashforge/filament/Flashforge PETG-CF @FF Adventurer A5.json b/resources/profiles/Flashforge/filament/Flashforge PETG-CF @FF Adventurer A5.json new file mode 100644 index 0000000000..c4001061f2 --- /dev/null +++ b/resources/profiles/Flashforge/filament/Flashforge PETG-CF @FF Adventurer A5.json @@ -0,0 +1,53 @@ +{ + "type": "filament", + "name": "Flashforge PETG-CF @FF Adventurer A5", + "inherits": "Generic PETG-CF10 @Flashforge", + "from": "system", + "setting_id": "aDSOS4PWssYHk8Fh", + "filament_id": "OFuFEtKX", + "filament_vendor": [ + "Flashforge" + ], + "instantiation": "true", + "cool_plate_temp": [ + "0" + ], + "cool_plate_temp_initial_layer": [ + "0" + ], + "eng_plate_temp": [ + "70" + ], + "eng_plate_temp_initial_layer": [ + "70" + ], + "filament_flow_ratio": [ + "0.98" + ], + "filament_settings_id": [ + "Flashforge PETG-CF @FF Adventurer A5" + ], + "compatible_printers": [ + "Flashforge Adventurer A5 0.4 nozzle", + "Flashforge Adventurer A5 0.6 nozzle", + "Flashforge Adventurer A5 0.8 nozzle" + ], + "supertack_plate_temp": [ + "70" + ], + "supertack_plate_temp_initial_layer": [ + "70" + ], + "textured_cool_plate_temp": [ + "70" + ], + "textured_cool_plate_temp_initial_layer": [ + "70" + ], + "textured_plate_temp": [ + "70" + ], + "textured_plate_temp_initial_layer": [ + "70" + ] +} diff --git a/resources/profiles/Flashforge/filament/Flashforge PLA Basic @FF Adventurer A5 0.25 nozzle.json b/resources/profiles/Flashforge/filament/Flashforge PLA Basic @FF Adventurer A5 0.25 nozzle.json new file mode 100644 index 0000000000..f94dbbd8c4 --- /dev/null +++ b/resources/profiles/Flashforge/filament/Flashforge PLA Basic @FF Adventurer A5 0.25 nozzle.json @@ -0,0 +1,32 @@ +{ + "type": "filament", + "name": "Flashforge PLA Basic @FF Adventurer A5 0.25 nozzle", + "inherits": "Flashforge PLA Basic @FF AD5M 0.25 nozzle", + "from": "system", + "setting_id": "e8JkrQPgHO1ekM7Q", + "instantiation": "true", + "cool_plate_temp": [ + "40" + ], + "cool_plate_temp_initial_layer": [ + "40" + ], + "eng_plate_temp_initial_layer": [ + "60" + ], + "filament_settings_id": [ + "Flashforge PLA Basic @FF Adventurer A5 0.25 nozzle" + ], + "compatible_printers": [ + "Flashforge Adventurer A5 0.25 nozzle" + ], + "hot_plate_temp": [ + "60" + ], + "hot_plate_temp_initial_layer": [ + "60" + ], + "textured_plate_temp_initial_layer": [ + "60" + ] +} diff --git a/resources/profiles/Flashforge/filament/Flashforge PLA Basic @FF Adventurer A5.json b/resources/profiles/Flashforge/filament/Flashforge PLA Basic @FF Adventurer A5.json new file mode 100644 index 0000000000..6fdc1bdb17 --- /dev/null +++ b/resources/profiles/Flashforge/filament/Flashforge PLA Basic @FF Adventurer A5.json @@ -0,0 +1,47 @@ +{ + "type": "filament", + "name": "Flashforge PLA Basic @FF Adventurer A5", + "inherits": "Generic PLA @Flashforge", + "from": "system", + "setting_id": "HCpI817HAWckXBtk", + "filament_id": "OFJ3F2jm", + "filament_vendor": [ + "Flashforge" + ], + "instantiation": "true", + "cool_plate_temp": [ + "45" + ], + "cool_plate_temp_initial_layer": [ + "45" + ], + "eng_plate_temp": [ + "55" + ], + "filament_max_volumetric_speed": [ + "22" + ], + "filament_settings_id": [ + "Flashforge PLA Basic @FF Adventurer A5" + ], + "compatible_printers": [ + "Flashforge Adventurer A5 0.4 nozzle", + "Flashforge Adventurer A5 0.6 nozzle", + "Flashforge Adventurer A5 0.8 nozzle" + ], + "hot_plate_temp": [ + "55" + ], + "pressure_advance": [ + "0.0325" + ], + "textured_cool_plate_temp": [ + "45" + ], + "textured_cool_plate_temp_initial_layer": [ + "45" + ], + "textured_plate_temp": [ + "55" + ] +} diff --git a/resources/profiles/Flashforge/filament/Flashforge PLA Color Change @FF Adventurer A5 0.25 nozzle.json b/resources/profiles/Flashforge/filament/Flashforge PLA Color Change @FF Adventurer A5 0.25 nozzle.json new file mode 100644 index 0000000000..7cd3bae5bd --- /dev/null +++ b/resources/profiles/Flashforge/filament/Flashforge PLA Color Change @FF Adventurer A5 0.25 nozzle.json @@ -0,0 +1,32 @@ +{ + "type": "filament", + "name": "Flashforge PLA Color Change @FF Adventurer A5 0.25 nozzle", + "inherits": "Flashforge PLA Color Change @FF AD5M 0.25 nozzle", + "from": "system", + "setting_id": "8ifsgreK3DQhMfeh", + "instantiation": "true", + "cool_plate_temp": [ + "40" + ], + "cool_plate_temp_initial_layer": [ + "40" + ], + "eng_plate_temp_initial_layer": [ + "60" + ], + "filament_settings_id": [ + "Flashforge PLA Color Change @FF Adventurer A5 0.25 nozzle" + ], + "compatible_printers": [ + "Flashforge Adventurer A5 0.25 nozzle" + ], + "hot_plate_temp": [ + "60" + ], + "hot_plate_temp_initial_layer": [ + "60" + ], + "textured_plate_temp_initial_layer": [ + "60" + ] +} diff --git a/resources/profiles/Flashforge/filament/Flashforge PLA Color Change @FF Adventurer A5.json b/resources/profiles/Flashforge/filament/Flashforge PLA Color Change @FF Adventurer A5.json new file mode 100644 index 0000000000..2eeb85526c --- /dev/null +++ b/resources/profiles/Flashforge/filament/Flashforge PLA Color Change @FF Adventurer A5.json @@ -0,0 +1,47 @@ +{ + "type": "filament", + "name": "Flashforge PLA Color Change @FF Adventurer A5", + "inherits": "Generic PLA @Flashforge", + "from": "system", + "setting_id": "o1Fl6t8nFCKZoj3Q", + "filament_id": "OFMkAW6r", + "filament_vendor": [ + "Flashforge" + ], + "instantiation": "true", + "cool_plate_temp": [ + "45" + ], + "cool_plate_temp_initial_layer": [ + "45" + ], + "eng_plate_temp": [ + "55" + ], + "filament_max_volumetric_speed": [ + "22" + ], + "filament_settings_id": [ + "Flashforge PLA Color Change @FF Adventurer A5" + ], + "compatible_printers": [ + "Flashforge Adventurer A5 0.4 nozzle", + "Flashforge Adventurer A5 0.6 nozzle", + "Flashforge Adventurer A5 0.8 nozzle" + ], + "hot_plate_temp": [ + "55" + ], + "pressure_advance": [ + "0.035" + ], + "textured_cool_plate_temp": [ + "45" + ], + "textured_cool_plate_temp_initial_layer": [ + "45" + ], + "textured_plate_temp": [ + "55" + ] +} diff --git a/resources/profiles/Flashforge/filament/Flashforge PLA Galaxy @FF Adventurer A5 0.25 nozzle.json b/resources/profiles/Flashforge/filament/Flashforge PLA Galaxy @FF Adventurer A5 0.25 nozzle.json new file mode 100644 index 0000000000..c75415adf9 --- /dev/null +++ b/resources/profiles/Flashforge/filament/Flashforge PLA Galaxy @FF Adventurer A5 0.25 nozzle.json @@ -0,0 +1,32 @@ +{ + "type": "filament", + "name": "Flashforge PLA Galaxy @FF Adventurer A5 0.25 nozzle", + "inherits": "Flashforge PLA Galaxy @FF AD5M 0.25 nozzle", + "from": "system", + "setting_id": "WViVLfSsNolVB55w", + "instantiation": "true", + "cool_plate_temp": [ + "40" + ], + "cool_plate_temp_initial_layer": [ + "40" + ], + "eng_plate_temp_initial_layer": [ + "60" + ], + "filament_settings_id": [ + "Flashforge PLA Galaxy @FF Adventurer A5 0.25 nozzle" + ], + "compatible_printers": [ + "Flashforge Adventurer A5 0.25 nozzle" + ], + "hot_plate_temp": [ + "60" + ], + "hot_plate_temp_initial_layer": [ + "60" + ], + "textured_plate_temp_initial_layer": [ + "60" + ] +} diff --git a/resources/profiles/Flashforge/filament/Flashforge PLA Galaxy @FF Adventurer A5.json b/resources/profiles/Flashforge/filament/Flashforge PLA Galaxy @FF Adventurer A5.json new file mode 100644 index 0000000000..a833b55331 --- /dev/null +++ b/resources/profiles/Flashforge/filament/Flashforge PLA Galaxy @FF Adventurer A5.json @@ -0,0 +1,47 @@ +{ + "type": "filament", + "name": "Flashforge PLA Galaxy @FF Adventurer A5", + "inherits": "Generic PLA @Flashforge", + "from": "system", + "setting_id": "4rpfTTgZrsVDwxI9", + "filament_id": "OFJJ0Ar3", + "filament_vendor": [ + "Flashforge" + ], + "instantiation": "true", + "cool_plate_temp": [ + "45" + ], + "cool_plate_temp_initial_layer": [ + "45" + ], + "eng_plate_temp": [ + "55" + ], + "filament_max_volumetric_speed": [ + "22" + ], + "filament_settings_id": [ + "Flashforge PLA Galaxy @FF Adventurer A5" + ], + "compatible_printers": [ + "Flashforge Adventurer A5 0.4 nozzle", + "Flashforge Adventurer A5 0.6 nozzle", + "Flashforge Adventurer A5 0.8 nozzle" + ], + "hot_plate_temp": [ + "55" + ], + "pressure_advance": [ + "0.0325" + ], + "textured_cool_plate_temp": [ + "45" + ], + "textured_cool_plate_temp_initial_layer": [ + "45" + ], + "textured_plate_temp": [ + "55" + ] +} diff --git a/resources/profiles/Flashforge/filament/Flashforge PLA LITE @FF Adventurer A5 0.25 nozzle.json b/resources/profiles/Flashforge/filament/Flashforge PLA LITE @FF Adventurer A5 0.25 nozzle.json new file mode 100644 index 0000000000..85f661e98f --- /dev/null +++ b/resources/profiles/Flashforge/filament/Flashforge PLA LITE @FF Adventurer A5 0.25 nozzle.json @@ -0,0 +1,36 @@ +{ + "type": "filament", + "name": "Flashforge PLA LITE @FF Adventurer A5 0.25 nozzle", + "inherits": "Flashforge PLA @FF AD5M 0.25 Nozzle", + "from": "system", + "setting_id": "FpqRF3Gw0ftvpvay", + "filament_id": "OFDDdgHM", + "instantiation": "true", + "cool_plate_temp": [ + "40" + ], + "cool_plate_temp_initial_layer": [ + "40" + ], + "eng_plate_temp_initial_layer": [ + "60" + ], + "filament_flow_ratio": [ + "1.04" + ], + "filament_settings_id": [ + "Flashforge PLA LITE @FF Adventurer A5 0.25 nozzle" + ], + "compatible_printers": [ + "Flashforge Adventurer A5 0.25 nozzle" + ], + "hot_plate_temp": [ + "60" + ], + "hot_plate_temp_initial_layer": [ + "60" + ], + "textured_plate_temp_initial_layer": [ + "60" + ] +} diff --git a/resources/profiles/Flashforge/filament/Flashforge PLA LITE @FF Adventurer A5.json b/resources/profiles/Flashforge/filament/Flashforge PLA LITE @FF Adventurer A5.json new file mode 100644 index 0000000000..36e0a64d69 --- /dev/null +++ b/resources/profiles/Flashforge/filament/Flashforge PLA LITE @FF Adventurer A5.json @@ -0,0 +1,50 @@ +{ + "type": "filament", + "name": "Flashforge PLA LITE @FF Adventurer A5", + "inherits": "Generic PLA @Flashforge", + "from": "system", + "setting_id": "2QZaQyg66IJPbsSc", + "filament_id": "OFDDdgHM", + "filament_vendor": [ + "Flashforge" + ], + "instantiation": "true", + "cool_plate_temp": [ + "45" + ], + "cool_plate_temp_initial_layer": [ + "45" + ], + "eng_plate_temp": [ + "55" + ], + "filament_flow_ratio": [ + "1.02" + ], + "filament_max_volumetric_speed": [ + "22" + ], + "filament_settings_id": [ + "Flashforge PLA LITE @FF Adventurer A5" + ], + "compatible_printers": [ + "Flashforge Adventurer A5 0.4 nozzle", + "Flashforge Adventurer A5 0.6 nozzle", + "Flashforge Adventurer A5 0.8 nozzle" + ], + "hot_plate_temp": [ + "55" + ], + "pressure_advance": [ + "0.0325" + ], + "textured_cool_plate_temp": [ + "45" + ], + "textured_cool_plate_temp_initial_layer": [ + "45" + ], + "textured_plate_temp": [ + "55" + ] +} diff --git a/resources/profiles/Flashforge/filament/Flashforge PLA Luminous @FF Adventurer A5 0.25 nozzle.json b/resources/profiles/Flashforge/filament/Flashforge PLA Luminous @FF Adventurer A5 0.25 nozzle.json new file mode 100644 index 0000000000..53a0749e1d --- /dev/null +++ b/resources/profiles/Flashforge/filament/Flashforge PLA Luminous @FF Adventurer A5 0.25 nozzle.json @@ -0,0 +1,32 @@ +{ + "type": "filament", + "name": "Flashforge PLA Luminous @FF Adventurer A5 0.25 nozzle", + "inherits": "Flashforge PLA Luminous @FF AD5M 0.25 nozzle", + "from": "system", + "setting_id": "e3Yir3COUY9MyFdE", + "instantiation": "true", + "cool_plate_temp": [ + "40" + ], + "cool_plate_temp_initial_layer": [ + "40" + ], + "eng_plate_temp_initial_layer": [ + "60" + ], + "filament_settings_id": [ + "Flashforge PLA Luminous @FF Adventurer A5 0.25 nozzle" + ], + "compatible_printers": [ + "Flashforge Adventurer A5 0.25 nozzle" + ], + "hot_plate_temp": [ + "60" + ], + "hot_plate_temp_initial_layer": [ + "60" + ], + "textured_plate_temp_initial_layer": [ + "60" + ] +} diff --git a/resources/profiles/Flashforge/filament/Flashforge PLA Luminous @FF Adventurer A5.json b/resources/profiles/Flashforge/filament/Flashforge PLA Luminous @FF Adventurer A5.json new file mode 100644 index 0000000000..0be02b85f5 --- /dev/null +++ b/resources/profiles/Flashforge/filament/Flashforge PLA Luminous @FF Adventurer A5.json @@ -0,0 +1,47 @@ +{ + "type": "filament", + "name": "Flashforge PLA Luminous @FF Adventurer A5", + "inherits": "Generic PLA @Flashforge", + "from": "system", + "setting_id": "GqNeJoH4M1IVAXrZ", + "filament_id": "OFdqkWtz", + "filament_vendor": [ + "Flashforge" + ], + "instantiation": "true", + "cool_plate_temp": [ + "45" + ], + "cool_plate_temp_initial_layer": [ + "45" + ], + "eng_plate_temp": [ + "55" + ], + "filament_max_volumetric_speed": [ + "22" + ], + "filament_settings_id": [ + "Flashforge PLA Luminous @FF Adventurer A5" + ], + "compatible_printers": [ + "Flashforge Adventurer A5 0.4 nozzle", + "Flashforge Adventurer A5 0.6 nozzle", + "Flashforge Adventurer A5 0.8 nozzle" + ], + "hot_plate_temp": [ + "55" + ], + "pressure_advance": [ + "0.0325" + ], + "textured_cool_plate_temp": [ + "45" + ], + "textured_cool_plate_temp_initial_layer": [ + "45" + ], + "textured_plate_temp": [ + "55" + ] +} diff --git a/resources/profiles/Flashforge/filament/Flashforge PLA Matte @FF Adventurer A5 0.25 nozzle.json b/resources/profiles/Flashforge/filament/Flashforge PLA Matte @FF Adventurer A5 0.25 nozzle.json new file mode 100644 index 0000000000..cc011b9336 --- /dev/null +++ b/resources/profiles/Flashforge/filament/Flashforge PLA Matte @FF Adventurer A5 0.25 nozzle.json @@ -0,0 +1,32 @@ +{ + "type": "filament", + "name": "Flashforge PLA Matte @FF Adventurer A5 0.25 nozzle", + "inherits": "Flashforge PLA Matte @FF AD5M 0.25 nozzle", + "from": "system", + "setting_id": "o2Ttw4qaxOTgEWtp", + "instantiation": "true", + "cool_plate_temp": [ + "40" + ], + "cool_plate_temp_initial_layer": [ + "40" + ], + "eng_plate_temp_initial_layer": [ + "60" + ], + "filament_settings_id": [ + "Flashforge PLA Matte @FF Adventurer A5 0.25 nozzle" + ], + "compatible_printers": [ + "Flashforge Adventurer A5 0.25 nozzle" + ], + "hot_plate_temp": [ + "60" + ], + "hot_plate_temp_initial_layer": [ + "60" + ], + "textured_plate_temp_initial_layer": [ + "60" + ] +} diff --git a/resources/profiles/Flashforge/filament/Flashforge PLA Matte @FF Adventurer A5.json b/resources/profiles/Flashforge/filament/Flashforge PLA Matte @FF Adventurer A5.json new file mode 100644 index 0000000000..33a2228f8d --- /dev/null +++ b/resources/profiles/Flashforge/filament/Flashforge PLA Matte @FF Adventurer A5.json @@ -0,0 +1,47 @@ +{ + "type": "filament", + "name": "Flashforge PLA Matte @FF Adventurer A5", + "inherits": "Generic PLA @Flashforge", + "from": "system", + "setting_id": "Jk7PRQkF2lFEtI8Q", + "filament_id": "OF6qAuyi", + "filament_vendor": [ + "Flashforge" + ], + "instantiation": "true", + "cool_plate_temp": [ + "45" + ], + "cool_plate_temp_initial_layer": [ + "45" + ], + "eng_plate_temp": [ + "55" + ], + "filament_max_volumetric_speed": [ + "22" + ], + "filament_settings_id": [ + "Flashforge PLA Matte @FF Adventurer A5" + ], + "compatible_printers": [ + "Flashforge Adventurer A5 0.4 nozzle", + "Flashforge Adventurer A5 0.6 nozzle", + "Flashforge Adventurer A5 0.8 nozzle" + ], + "hot_plate_temp": [ + "55" + ], + "pressure_advance": [ + "0.0325" + ], + "textured_cool_plate_temp": [ + "45" + ], + "textured_cool_plate_temp_initial_layer": [ + "45" + ], + "textured_plate_temp": [ + "55" + ] +} diff --git a/resources/profiles/Flashforge/filament/Flashforge PLA Metal @FF Adventurer A5 0.25 nozzle.json b/resources/profiles/Flashforge/filament/Flashforge PLA Metal @FF Adventurer A5 0.25 nozzle.json new file mode 100644 index 0000000000..92a8d1c8db --- /dev/null +++ b/resources/profiles/Flashforge/filament/Flashforge PLA Metal @FF Adventurer A5 0.25 nozzle.json @@ -0,0 +1,32 @@ +{ + "type": "filament", + "name": "Flashforge PLA Metal @FF Adventurer A5 0.25 nozzle", + "inherits": "Flashforge PLA Metal @FF AD5M 0.25 nozzle", + "from": "system", + "setting_id": "eg4osx9bpk61uXvT", + "instantiation": "true", + "cool_plate_temp": [ + "40" + ], + "cool_plate_temp_initial_layer": [ + "40" + ], + "eng_plate_temp_initial_layer": [ + "60" + ], + "filament_settings_id": [ + "Flashforge PLA Metal @FF Adventurer A5 0.25 nozzle" + ], + "compatible_printers": [ + "Flashforge Adventurer A5 0.25 nozzle" + ], + "hot_plate_temp": [ + "60" + ], + "hot_plate_temp_initial_layer": [ + "60" + ], + "textured_plate_temp_initial_layer": [ + "60" + ] +} diff --git a/resources/profiles/Flashforge/filament/Flashforge PLA Metal @FF Adventurer A5.json b/resources/profiles/Flashforge/filament/Flashforge PLA Metal @FF Adventurer A5.json new file mode 100644 index 0000000000..1ef06a756b --- /dev/null +++ b/resources/profiles/Flashforge/filament/Flashforge PLA Metal @FF Adventurer A5.json @@ -0,0 +1,47 @@ +{ + "type": "filament", + "name": "Flashforge PLA Metal @FF Adventurer A5", + "inherits": "Generic PLA @Flashforge", + "from": "system", + "setting_id": "Gs8hS5CpV3W62pjs", + "filament_id": "OFAebKg8", + "filament_vendor": [ + "Flashforge" + ], + "instantiation": "true", + "cool_plate_temp": [ + "45" + ], + "cool_plate_temp_initial_layer": [ + "45" + ], + "eng_plate_temp": [ + "55" + ], + "filament_max_volumetric_speed": [ + "22" + ], + "filament_settings_id": [ + "Flashforge PLA Metal @FF Adventurer A5" + ], + "compatible_printers": [ + "Flashforge Adventurer A5 0.4 nozzle", + "Flashforge Adventurer A5 0.6 nozzle", + "Flashforge Adventurer A5 0.8 nozzle" + ], + "hot_plate_temp": [ + "55" + ], + "pressure_advance": [ + "0.0325" + ], + "textured_cool_plate_temp": [ + "45" + ], + "textured_cool_plate_temp_initial_layer": [ + "45" + ], + "textured_plate_temp": [ + "55" + ] +} diff --git a/resources/profiles/Flashforge/filament/Flashforge PLA Pro @FF Adventurer A5 0.25 nozzle.json b/resources/profiles/Flashforge/filament/Flashforge PLA Pro @FF Adventurer A5 0.25 nozzle.json new file mode 100644 index 0000000000..15f7813b78 --- /dev/null +++ b/resources/profiles/Flashforge/filament/Flashforge PLA Pro @FF Adventurer A5 0.25 nozzle.json @@ -0,0 +1,32 @@ +{ + "type": "filament", + "name": "Flashforge PLA Pro @FF Adventurer A5 0.25 nozzle", + "inherits": "Flashforge PLA Pro @FF AD5M 0.25 nozzle", + "from": "system", + "setting_id": "sD9IWFJxvKTDfpXm", + "instantiation": "true", + "cool_plate_temp": [ + "40" + ], + "cool_plate_temp_initial_layer": [ + "40" + ], + "eng_plate_temp_initial_layer": [ + "60" + ], + "filament_settings_id": [ + "Flashforge PLA Pro @FF Adventurer A5 0.25 nozzle" + ], + "compatible_printers": [ + "Flashforge Adventurer A5 0.25 nozzle" + ], + "hot_plate_temp": [ + "60" + ], + "hot_plate_temp_initial_layer": [ + "60" + ], + "textured_plate_temp_initial_layer": [ + "60" + ] +} diff --git a/resources/profiles/Flashforge/filament/Flashforge PLA Pro @FF Adventurer A5.json b/resources/profiles/Flashforge/filament/Flashforge PLA Pro @FF Adventurer A5.json new file mode 100644 index 0000000000..416c8bf207 --- /dev/null +++ b/resources/profiles/Flashforge/filament/Flashforge PLA Pro @FF Adventurer A5.json @@ -0,0 +1,47 @@ +{ + "type": "filament", + "name": "Flashforge PLA Pro @FF Adventurer A5", + "inherits": "Generic PLA @Flashforge", + "from": "system", + "setting_id": "vTVCr1id0cTtMzuE", + "filament_id": "OFm4SivL", + "filament_vendor": [ + "Flashforge" + ], + "instantiation": "true", + "cool_plate_temp": [ + "45" + ], + "cool_plate_temp_initial_layer": [ + "45" + ], + "eng_plate_temp": [ + "55" + ], + "filament_max_volumetric_speed": [ + "22" + ], + "filament_settings_id": [ + "Flashforge PLA Pro @FF Adventurer A5" + ], + "compatible_printers": [ + "Flashforge Adventurer A5 0.4 nozzle", + "Flashforge Adventurer A5 0.6 nozzle", + "Flashforge Adventurer A5 0.8 nozzle" + ], + "hot_plate_temp": [ + "55" + ], + "pressure_advance": [ + "0.0325" + ], + "textured_cool_plate_temp": [ + "45" + ], + "textured_cool_plate_temp_initial_layer": [ + "45" + ], + "textured_plate_temp": [ + "55" + ] +} diff --git a/resources/profiles/Flashforge/filament/Flashforge PLA Silk @FF Adventurer A5 0.25 nozzle.json b/resources/profiles/Flashforge/filament/Flashforge PLA Silk @FF Adventurer A5 0.25 nozzle.json new file mode 100644 index 0000000000..0a63c055a3 --- /dev/null +++ b/resources/profiles/Flashforge/filament/Flashforge PLA Silk @FF Adventurer A5 0.25 nozzle.json @@ -0,0 +1,35 @@ +{ + "type": "filament", + "name": "Flashforge PLA Silk @FF Adventurer A5 0.25 nozzle", + "inherits": "Flashforge PLA Silk @FF AD5M 0.25 nozzle", + "from": "system", + "setting_id": "ipe3qzXePPZ9pMmY", + "instantiation": "true", + "cool_plate_temp": [ + "40" + ], + "cool_plate_temp_initial_layer": [ + "40" + ], + "eng_plate_temp_initial_layer": [ + "60" + ], + "filament_settings_id": [ + "Flashforge PLA Silk @FF Adventurer A5 0.25 nozzle" + ], + "compatible_printers": [ + "Flashforge Adventurer A5 0.25 nozzle" + ], + "hot_plate_temp": [ + "60" + ], + "hot_plate_temp_initial_layer": [ + "60" + ], + "nozzle_temperature": [ + "220" + ], + "textured_plate_temp_initial_layer": [ + "60" + ] +} diff --git a/resources/profiles/Flashforge/filament/Flashforge PLA Silk @FF Adventurer A5.json b/resources/profiles/Flashforge/filament/Flashforge PLA Silk @FF Adventurer A5.json new file mode 100644 index 0000000000..e157b16c6d --- /dev/null +++ b/resources/profiles/Flashforge/filament/Flashforge PLA Silk @FF Adventurer A5.json @@ -0,0 +1,47 @@ +{ + "type": "filament", + "name": "Flashforge PLA Silk @FF Adventurer A5", + "inherits": "Generic PLA-Silk @Flashforge", + "from": "system", + "setting_id": "XXmeUWaLyVCTDS6G", + "filament_id": "OFgjgN35", + "filament_vendor": [ + "Flashforge" + ], + "instantiation": "true", + "cool_plate_temp": [ + "45" + ], + "cool_plate_temp_initial_layer": [ + "45" + ], + "eng_plate_temp": [ + "55" + ], + "filament_flow_ratio": [ + "0.98" + ], + "filament_settings_id": [ + "Flashforge PLA Silk @FF Adventurer A5" + ], + "compatible_printers": [ + "Flashforge Adventurer A5 0.4 nozzle", + "Flashforge Adventurer A5 0.6 nozzle", + "Flashforge Adventurer A5 0.8 nozzle" + ], + "hot_plate_temp": [ + "55" + ], + "pressure_advance": [ + "0.035" + ], + "textured_cool_plate_temp": [ + "45" + ], + "textured_cool_plate_temp_initial_layer": [ + "45" + ], + "textured_plate_temp": [ + "55" + ] +} diff --git a/resources/profiles/Flashforge/filament/Flashforge PLA Sparkle @FF Adventurer A5 0.25 nozzle.json b/resources/profiles/Flashforge/filament/Flashforge PLA Sparkle @FF Adventurer A5 0.25 nozzle.json new file mode 100644 index 0000000000..ebf72e7fb1 --- /dev/null +++ b/resources/profiles/Flashforge/filament/Flashforge PLA Sparkle @FF Adventurer A5 0.25 nozzle.json @@ -0,0 +1,32 @@ +{ + "type": "filament", + "name": "Flashforge PLA Sparkle @FF Adventurer A5 0.25 nozzle", + "inherits": "Flashforge PLA Sparkle @FF AD5M 0.25 nozzle", + "from": "system", + "setting_id": "VV75FchmjnPjnDE8", + "instantiation": "true", + "cool_plate_temp": [ + "40" + ], + "cool_plate_temp_initial_layer": [ + "40" + ], + "eng_plate_temp_initial_layer": [ + "60" + ], + "filament_settings_id": [ + "Flashforge PLA Sparkle @FF Adventurer A5 0.25 nozzle" + ], + "compatible_printers": [ + "Flashforge Adventurer A5 0.25 nozzle" + ], + "hot_plate_temp": [ + "60" + ], + "hot_plate_temp_initial_layer": [ + "60" + ], + "textured_plate_temp_initial_layer": [ + "60" + ] +} diff --git a/resources/profiles/Flashforge/filament/Flashforge PLA Sparkle @FF Adventurer A5.json b/resources/profiles/Flashforge/filament/Flashforge PLA Sparkle @FF Adventurer A5.json new file mode 100644 index 0000000000..b7954c6677 --- /dev/null +++ b/resources/profiles/Flashforge/filament/Flashforge PLA Sparkle @FF Adventurer A5.json @@ -0,0 +1,47 @@ +{ + "type": "filament", + "name": "Flashforge PLA Sparkle @FF Adventurer A5", + "inherits": "Generic PLA @Flashforge", + "from": "system", + "setting_id": "dscnwSfbrGWiS4Um", + "filament_id": "OFV5c8hG", + "filament_vendor": [ + "Flashforge" + ], + "instantiation": "true", + "cool_plate_temp": [ + "45" + ], + "cool_plate_temp_initial_layer": [ + "45" + ], + "eng_plate_temp": [ + "55" + ], + "filament_max_volumetric_speed": [ + "22" + ], + "filament_settings_id": [ + "Flashforge PLA Sparkle @FF Adventurer A5" + ], + "compatible_printers": [ + "Flashforge Adventurer A5 0.4 nozzle", + "Flashforge Adventurer A5 0.6 nozzle", + "Flashforge Adventurer A5 0.8 nozzle" + ], + "hot_plate_temp": [ + "55" + ], + "pressure_advance": [ + "0.0325" + ], + "textured_cool_plate_temp": [ + "45" + ], + "textured_cool_plate_temp_initial_layer": [ + "45" + ], + "textured_plate_temp": [ + "55" + ] +} diff --git a/resources/profiles/Flashforge/filament/Flashforge PLA-CF @FF Adventurer A5.json b/resources/profiles/Flashforge/filament/Flashforge PLA-CF @FF Adventurer A5.json new file mode 100644 index 0000000000..542045cdeb --- /dev/null +++ b/resources/profiles/Flashforge/filament/Flashforge PLA-CF @FF Adventurer A5.json @@ -0,0 +1,56 @@ +{ + "type": "filament", + "name": "Flashforge PLA-CF @FF Adventurer A5", + "inherits": "Generic PLA-CF10 @Flashforge", + "from": "system", + "setting_id": "EpC2ItdGUxFV7x1y", + "filament_id": "OF9cAwMK", + "filament_vendor": [ + "Flashforge" + ], + "instantiation": "true", + "cool_plate_temp": [ + "45" + ], + "cool_plate_temp_initial_layer": [ + "45" + ], + "eng_plate_temp": [ + "55" + ], + "eng_plate_temp_initial_layer": [ + "55" + ], + "filament_flow_ratio": [ + "0.98" + ], + "filament_max_volumetric_speed": [ + "15" + ], + "filament_settings_id": [ + "Flashforge PLA-CF @FF Adventurer A5" + ], + "compatible_printers": [ + "Flashforge Adventurer A5 0.4 nozzle", + "Flashforge Adventurer A5 0.6 nozzle", + "Flashforge Adventurer A5 0.8 nozzle" + ], + "hot_plate_temp": [ + "55" + ], + "pressure_advance": [ + "0.0325" + ], + "textured_cool_plate_temp": [ + "45" + ], + "textured_cool_plate_temp_initial_layer": [ + "45" + ], + "textured_plate_temp": [ + "55" + ], + "textured_plate_temp_initial_layer": [ + "55" + ] +} diff --git a/resources/profiles/Flashforge/filament/Flashforge R PLA @FF Adventurer A5 0.25 nozzle.json b/resources/profiles/Flashforge/filament/Flashforge R PLA @FF Adventurer A5 0.25 nozzle.json new file mode 100644 index 0000000000..e898843db9 --- /dev/null +++ b/resources/profiles/Flashforge/filament/Flashforge R PLA @FF Adventurer A5 0.25 nozzle.json @@ -0,0 +1,33 @@ +{ + "type": "filament", + "name": "Flashforge R PLA @FF Adventurer A5 0.25 nozzle", + "inherits": "Flashforge PLA @FF AD5M 0.25 Nozzle", + "from": "system", + "setting_id": "G0qAKoO8Dyo0hO6G", + "filament_id": "OFT02Lz9", + "instantiation": "true", + "cool_plate_temp": [ + "40" + ], + "cool_plate_temp_initial_layer": [ + "40" + ], + "eng_plate_temp_initial_layer": [ + "60" + ], + "filament_settings_id": [ + "Flashforge R PLA @FF Adventurer A5 0.25 nozzle" + ], + "compatible_printers": [ + "Flashforge Adventurer A5 0.25 nozzle" + ], + "hot_plate_temp": [ + "60" + ], + "hot_plate_temp_initial_layer": [ + "60" + ], + "textured_plate_temp_initial_layer": [ + "60" + ] +} diff --git a/resources/profiles/Flashforge/filament/Flashforge R PLA @FF Adventurer A5.json b/resources/profiles/Flashforge/filament/Flashforge R PLA @FF Adventurer A5.json new file mode 100644 index 0000000000..e5511d5622 --- /dev/null +++ b/resources/profiles/Flashforge/filament/Flashforge R PLA @FF Adventurer A5.json @@ -0,0 +1,50 @@ +{ + "type": "filament", + "name": "Flashforge R PLA @FF Adventurer A5", + "inherits": "Generic PLA @Flashforge", + "from": "system", + "setting_id": "sN7eGcbuGZxGrbR5", + "filament_id": "OFT02Lz9", + "filament_vendor": [ + "Flashforge" + ], + "instantiation": "true", + "cool_plate_temp": [ + "45" + ], + "cool_plate_temp_initial_layer": [ + "45" + ], + "eng_plate_temp": [ + "55" + ], + "filament_max_volumetric_speed": [ + "22" + ], + "filament_settings_id": [ + "Flashforge R PLA @FF Adventurer A5" + ], + "compatible_printers": [ + "Flashforge Adventurer A5 0.4 nozzle", + "Flashforge Adventurer A5 0.6 nozzle", + "Flashforge Adventurer A5 0.8 nozzle" + ], + "hot_plate_temp": [ + "55" + ], + "pressure_advance": [ + "0.0325" + ], + "slow_down_layer_time": [ + "8" + ], + "textured_cool_plate_temp": [ + "45" + ], + "textured_cool_plate_temp_initial_layer": [ + "45" + ], + "textured_plate_temp": [ + "55" + ] +} diff --git a/resources/profiles/Flashforge/filament/Flashforge TPU 95A @FF Adventurer A5.json b/resources/profiles/Flashforge/filament/Flashforge TPU 95A @FF Adventurer A5.json new file mode 100644 index 0000000000..19b0981798 --- /dev/null +++ b/resources/profiles/Flashforge/filament/Flashforge TPU 95A @FF Adventurer A5.json @@ -0,0 +1,38 @@ +{ + "type": "filament", + "name": "Flashforge TPU 95A @FF Adventurer A5", + "inherits": "Generic TPU @Flashforge", + "from": "system", + "setting_id": "2MT9C2rvvQ3uU1lG", + "filament_id": "OFSqIcJC", + "filament_vendor": [ + "Flashforge" + ], + "instantiation": "true", + "cool_plate_temp": [ + "40" + ], + "cool_plate_temp_initial_layer": [ + "40" + ], + "eng_plate_temp": [ + "45" + ], + "eng_plate_temp_initial_layer": [ + "45" + ], + "filament_settings_id": [ + "Flashforge TPU 95A @FF Adventurer A5" + ], + "compatible_printers": [ + "Flashforge Adventurer A5 0.4 nozzle", + "Flashforge Adventurer A5 0.6 nozzle", + "Flashforge Adventurer A5 0.8 nozzle" + ], + "textured_plate_temp": [ + "45" + ], + "textured_plate_temp_initial_layer": [ + "45" + ] +} diff --git a/resources/profiles/Flashforge/filament/Generic PETG @FF Adventurer A5 0.25 nozzle.json b/resources/profiles/Flashforge/filament/Generic PETG @FF Adventurer A5 0.25 nozzle.json new file mode 100644 index 0000000000..764b31e9c4 --- /dev/null +++ b/resources/profiles/Flashforge/filament/Generic PETG @FF Adventurer A5 0.25 nozzle.json @@ -0,0 +1,17 @@ +{ + "type": "filament", + "name": "Generic PETG @FF Adventurer A5 0.25 nozzle", + "inherits": "Generic PETG @FF AD5M 0.25 Nozzle", + "from": "system", + "setting_id": "KSKX6BHNQgmOEShO", + "instantiation": "true", + "filament_max_volumetric_speed": [ + "1.2" + ], + "filament_settings_id": [ + "Generic PETG @FF Adventurer A5 0.25 nozzle" + ], + "compatible_printers": [ + "Flashforge Adventurer A5 0.25 nozzle" + ] +} diff --git a/resources/profiles/Flashforge/filament/Generic PLA @FF Adventurer A5 0.25 nozzle.json b/resources/profiles/Flashforge/filament/Generic PLA @FF Adventurer A5 0.25 nozzle.json new file mode 100644 index 0000000000..416e42006f --- /dev/null +++ b/resources/profiles/Flashforge/filament/Generic PLA @FF Adventurer A5 0.25 nozzle.json @@ -0,0 +1,35 @@ +{ + "type": "filament", + "name": "Generic PLA @FF Adventurer A5 0.25 nozzle", + "inherits": "Generic PLA @FF AD5M 0.25 Nozzle", + "from": "system", + "setting_id": "kHdLzX8Auwz9tFvw", + "instantiation": "true", + "cool_plate_temp": [ + "40" + ], + "cool_plate_temp_initial_layer": [ + "40" + ], + "eng_plate_temp_initial_layer": [ + "60" + ], + "filament_max_volumetric_speed": [ + "2.2" + ], + "filament_settings_id": [ + "Generic PLA @FF Adventurer A5 0.25 nozzle" + ], + "compatible_printers": [ + "Flashforge Adventurer A5 0.25 nozzle" + ], + "hot_plate_temp": [ + "60" + ], + "hot_plate_temp_initial_layer": [ + "60" + ], + "textured_plate_temp_initial_layer": [ + "60" + ] +} diff --git a/resources/profiles/Flashforge/filament/Kexcelled TPU 64D @FF Adventurer A5.json b/resources/profiles/Flashforge/filament/Kexcelled TPU 64D @FF Adventurer A5.json new file mode 100644 index 0000000000..285af63564 --- /dev/null +++ b/resources/profiles/Flashforge/filament/Kexcelled TPU 64D @FF Adventurer A5.json @@ -0,0 +1,38 @@ +{ + "type": "filament", + "name": "Kexcelled TPU 64D @FF Adventurer A5", + "inherits": "Generic TPU @Flashforge", + "from": "system", + "setting_id": "OB4I8nwZn8sCcCcF", + "filament_id": "OF20zavY", + "filament_vendor": [ + "Kexcelled" + ], + "instantiation": "true", + "cool_plate_temp": [ + "40" + ], + "cool_plate_temp_initial_layer": [ + "40" + ], + "eng_plate_temp": [ + "45" + ], + "eng_plate_temp_initial_layer": [ + "45" + ], + "filament_settings_id": [ + "Kexcelled TPU 64D @FF Adventurer A5" + ], + "compatible_printers": [ + "Flashforge Adventurer A5 0.4 nozzle", + "Flashforge Adventurer A5 0.6 nozzle", + "Flashforge Adventurer A5 0.8 nozzle" + ], + "textured_plate_temp": [ + "45" + ], + "textured_plate_temp_initial_layer": [ + "45" + ] +} diff --git a/resources/profiles/Flashforge/machine/Flashforge Adventurer A5 0.25 nozzle.json b/resources/profiles/Flashforge/machine/Flashforge Adventurer A5 0.25 nozzle.json new file mode 100644 index 0000000000..d9665ff0bb --- /dev/null +++ b/resources/profiles/Flashforge/machine/Flashforge Adventurer A5 0.25 nozzle.json @@ -0,0 +1,233 @@ +{ + "type": "machine", + "name": "Flashforge Adventurer A5 0.25 nozzle", + "inherits": "Flashforge Adventurer 5M Pro 0.25 Nozzle", + "from": "system", + "setting_id": "TZyRxvTiJNKNJWCD", + "instantiation": "true", + "adaptive_bed_mesh_margin": "0", + "auxiliary_fan": "1", + "bbl_use_printhost": "0", + "bed_custom_model": "", + "bed_custom_texture": "", + "bed_exclude_area": [ + "0x0" + ], + "bed_mesh_max": "99999,99999", + "bed_mesh_min": "-99999,-99999", + "bed_mesh_probe_distance": "50,50", + "before_layer_change_gcode": ";BEFORE_LAYER_CHANGE\n;[layer_z]", + "best_object_pos": "0.5,0.5", + "change_extrusion_role_gcode": "", + "change_filament_gcode": "", + "cooling_tube_length": "0", + "cooling_tube_retraction": "0", + "default_filament_profile": [ + "Generic PLA @Flashforge" + ], + "default_print_profile": "0.12mm Standard @FF Adventurer A5 0.25 nozzle", + "deretraction_speed": [ + "35" + ], + "disable_m73": "0", + "emit_machine_limits_to_gcode": "1", + "enable_filament_ramming": "0", + "enable_long_retraction_when_cut": "0", + "extra_loading_move": "0", + "extruder_clearance_height_to_lid": "150", + "extruder_clearance_height_to_rod": "27", + "extruder_clearance_radius": "76", + "extruder_colour": [ + "#FCE94F" + ], + "extruder_offset": [ + "0x0" + ], + "fan_kickstart": "0", + "fan_speedup_overhangs": "1", + "fan_speedup_time": "0", + "gcode_flavor": "klipper", + "head_wrap_detect_zone": [], + "high_current_on_filament_swap": "0", + "host_type": "octoprint", + "layer_change_gcode": ";AFTER_LAYER_CHANGE\n;[layer_z]", + "long_retractions_when_cut": [ + "0" + ], + "machine_end_gcode": "G1 E-3 F3600\nG0 X50 Y50 F30000\nM104 S0 ; turn off temperature", + "machine_load_filament_time": "0", + "machine_max_acceleration_e": [ + "5000", + "5000" + ], + "machine_max_acceleration_extruding": [ + "20000", + "20000" + ], + "machine_max_acceleration_retracting": [ + "5000", + "5000" + ], + "machine_max_acceleration_travel": [ + "20000", + "20000" + ], + "machine_max_acceleration_x": [ + "20000", + "20000" + ], + "machine_max_acceleration_y": [ + "20000", + "20000" + ], + "machine_max_acceleration_z": [ + "500", + "500" + ], + "machine_max_jerk_e": [ + "2.5", + "2.5" + ], + "machine_max_jerk_x": [ + "9", + "9" + ], + "machine_max_jerk_y": [ + "9", + "9" + ], + "machine_max_jerk_z": [ + "3", + "3" + ], + "machine_max_speed_e": [ + "30", + "30" + ], + "machine_max_speed_x": [ + "600", + "600" + ], + "machine_max_speed_y": [ + "600", + "600" + ], + "machine_max_speed_z": [ + "20", + "20" + ], + "machine_min_extruding_rate": [ + "0", + "0" + ], + "machine_min_travel_rate": [ + "0", + "0" + ], + "machine_pause_gcode": "PAUSE", + "machine_start_gcode": "M190 S[bed_temperature_initial_layer_single]\nM104 S[nozzle_temperature_initial_layer]\nG1 Z5 F6000\nG90 E0\nM83\nG1 E-1 F600\nG1 E8 F300\nG1 X85 Y110 Z0.2 F1200\nG1 X-110 E15 F2400\nG1 Y0 E4 F2400\nG1 X-109.6 F2400\nG1 Y110 E5 F2400\nG92 E0", + "machine_tool_change_time": "0", + "machine_unload_filament_time": "0", + "manual_filament_change": "0", + "max_layer_height": [ + "0.14" + ], + "min_layer_height": [ + "0.08" + ], + "nozzle_diameter": [ + "0.25" + ], + "nozzle_height": "2.5", + "nozzle_hrc": "0", + "nozzle_type": "stainless_steel", + "nozzle_volume": "0", + "parking_pos_retraction": "0", + "pellet_modded_printer": "0", + "preferred_orientation": "0", + "printable_area": [ + "-110x-110", + "110x-110", + "110x110", + "-110x110" + ], + "printable_height": "220", + "printer_model": "Flashforge Adventurer A5", + "printer_notes": "", + "printer_settings_id": "Flashforge Adventurer A5 0.25 nozzle", + "printer_structure": "undefine", + "printer_technology": "FFF", + "printer_variant": "0.25", + "printhost_authorization_type": "key", + "printhost_ssl_ignore_revoke": "0", + "printing_by_object_gcode": "", + "purge_in_prime_tower": "1", + "retract_before_wipe": [ + "100%" + ], + "retract_length_toolchange": [ + "2" + ], + "retract_lift_above": [ + "0" + ], + "retract_lift_below": [ + "0" + ], + "retract_lift_enforce": [ + "All Surfaces" + ], + "retract_on_top_layer": [ + "1" + ], + "retract_restart_extra": [ + "0" + ], + "retract_restart_extra_toolchange": [ + "0" + ], + "retract_when_changing_layer": [ + "1" + ], + "retraction_distances_when_cut": [ + "18" + ], + "retraction_length": [ + "1" + ], + "retraction_minimum_travel": [ + "1" + ], + "retraction_speed": [ + "35" + ], + "scan_first_layer": "0", + "single_extruder_multi_material": "0", + "support_air_filtration": "1", + "support_chamber_temp_control": "1", + "support_multi_bed_types": "1", + "template_custom_gcode": "", + "thumbnails": "140x110/PNG", + "thumbnails_format": "PNG", + "time_cost": "0", + "time_lapse_gcode": "", + "travel_slope": [ + "3" + ], + "upward_compatible_machine": [], + "use_firmware_retraction": "0", + "use_relative_e_distances": "1", + "wipe": [ + "1" + ], + "wipe_distance": [ + "2" + ], + "z_hop": [ + "0.3" + ], + "z_hop_types": [ + "Auto Lift" + ], + "z_offset": "0" +} diff --git a/resources/profiles/Flashforge/machine/Flashforge Adventurer A5 0.4 nozzle.json b/resources/profiles/Flashforge/machine/Flashforge Adventurer A5 0.4 nozzle.json new file mode 100644 index 0000000000..04de9fb9ec --- /dev/null +++ b/resources/profiles/Flashforge/machine/Flashforge Adventurer A5 0.4 nozzle.json @@ -0,0 +1,233 @@ +{ + "type": "machine", + "name": "Flashforge Adventurer A5 0.4 nozzle", + "inherits": "Flashforge Adventurer 5M Pro 0.4 Nozzle", + "from": "system", + "setting_id": "EOhWyVbRzFtAc33v", + "instantiation": "true", + "adaptive_bed_mesh_margin": "0", + "auxiliary_fan": "1", + "bbl_use_printhost": "0", + "bed_custom_model": "", + "bed_custom_texture": "", + "bed_exclude_area": [ + "0x0" + ], + "bed_mesh_max": "99999,99999", + "bed_mesh_min": "-99999,-99999", + "bed_mesh_probe_distance": "50,50", + "before_layer_change_gcode": ";BEFORE_LAYER_CHANGE\n;[layer_z]", + "best_object_pos": "0.5,0.5", + "change_extrusion_role_gcode": "", + "change_filament_gcode": "", + "cooling_tube_length": "0", + "cooling_tube_retraction": "0", + "default_filament_profile": [ + "Generic PLA @Flashforge" + ], + "default_print_profile": "0.20mm Standard @FF Adventurer A5 0.4 nozzle", + "deretraction_speed": [ + "35" + ], + "disable_m73": "0", + "emit_machine_limits_to_gcode": "1", + "enable_filament_ramming": "0", + "enable_long_retraction_when_cut": "0", + "extra_loading_move": "0", + "extruder_clearance_height_to_lid": "150", + "extruder_clearance_height_to_rod": "27", + "extruder_clearance_radius": "76", + "extruder_colour": [ + "#FCE94F" + ], + "extruder_offset": [ + "0x0" + ], + "fan_kickstart": "0", + "fan_speedup_overhangs": "1", + "fan_speedup_time": "0", + "gcode_flavor": "klipper", + "head_wrap_detect_zone": [], + "high_current_on_filament_swap": "0", + "host_type": "octoprint", + "layer_change_gcode": ";AFTER_LAYER_CHANGE\n;[layer_z]", + "long_retractions_when_cut": [ + "0" + ], + "machine_end_gcode": "G1 E-3 F3600\nG0 X50 Y50 F30000\nM104 S0 ; turn off temperature", + "machine_load_filament_time": "0", + "machine_max_acceleration_e": [ + "5000", + "5000" + ], + "machine_max_acceleration_extruding": [ + "20000", + "20000" + ], + "machine_max_acceleration_retracting": [ + "5000", + "5000" + ], + "machine_max_acceleration_travel": [ + "20000", + "20000" + ], + "machine_max_acceleration_x": [ + "20000", + "20000" + ], + "machine_max_acceleration_y": [ + "20000", + "20000" + ], + "machine_max_acceleration_z": [ + "500", + "500" + ], + "machine_max_jerk_e": [ + "2.5", + "2.5" + ], + "machine_max_jerk_x": [ + "9", + "9" + ], + "machine_max_jerk_y": [ + "9", + "9" + ], + "machine_max_jerk_z": [ + "3", + "3" + ], + "machine_max_speed_e": [ + "30", + "30" + ], + "machine_max_speed_x": [ + "600", + "600" + ], + "machine_max_speed_y": [ + "600", + "600" + ], + "machine_max_speed_z": [ + "20", + "20" + ], + "machine_min_extruding_rate": [ + "0", + "0" + ], + "machine_min_travel_rate": [ + "0", + "0" + ], + "machine_pause_gcode": "PAUSE", + "machine_start_gcode": "M190 S[bed_temperature_initial_layer_single]\nM104 S[nozzle_temperature_initial_layer]\nG90\nM83\nG1 Z5 F6000\nG1 E-0.2 F800\nG1 X110 Y-110 F6000\nG1 E2 F800\nG1 Y-110 X55 Z0.25 F4800\nG1 X-55 E8 F2400\nG1 Y-109.6 F2400\nG1 X55 E5 F2400\nG1 Y-110 X55 Z0.45 F4800\nG1 X-55 E8 F2400\nG1 Y-109.6 F2400\nG1 X55 E5 F2400\nG92 E0", + "machine_tool_change_time": "0", + "machine_unload_filament_time": "0", + "manual_filament_change": "0", + "max_layer_height": [ + "0.28" + ], + "min_layer_height": [ + "0.08" + ], + "nozzle_diameter": [ + "0.4" + ], + "nozzle_height": "2.5", + "nozzle_hrc": "0", + "nozzle_type": "hardened_steel", + "nozzle_volume": "0", + "parking_pos_retraction": "0", + "pellet_modded_printer": "0", + "preferred_orientation": "0", + "printable_area": [ + "-110x-110", + "110x-110", + "110x110", + "-110x110" + ], + "printable_height": "220", + "printer_model": "Flashforge Adventurer A5", + "printer_notes": "", + "printer_settings_id": "Flashforge Adventurer A5 0.4 nozzle", + "printer_structure": "undefine", + "printer_technology": "FFF", + "printer_variant": "0.4", + "printhost_authorization_type": "key", + "printhost_ssl_ignore_revoke": "0", + "printing_by_object_gcode": "", + "purge_in_prime_tower": "1", + "retract_before_wipe": [ + "100%" + ], + "retract_length_toolchange": [ + "2" + ], + "retract_lift_above": [ + "0" + ], + "retract_lift_below": [ + "0" + ], + "retract_lift_enforce": [ + "All Surfaces" + ], + "retract_on_top_layer": [ + "1" + ], + "retract_restart_extra": [ + "0" + ], + "retract_restart_extra_toolchange": [ + "0" + ], + "retract_when_changing_layer": [ + "1" + ], + "retraction_distances_when_cut": [ + "18" + ], + "retraction_length": [ + "0.8" + ], + "retraction_minimum_travel": [ + "1" + ], + "retraction_speed": [ + "35" + ], + "scan_first_layer": "0", + "single_extruder_multi_material": "0", + "support_air_filtration": "1", + "support_chamber_temp_control": "1", + "support_multi_bed_types": "1", + "template_custom_gcode": "", + "thumbnails": "140x110/PNG", + "thumbnails_format": "PNG", + "time_cost": "0", + "time_lapse_gcode": "", + "travel_slope": [ + "3" + ], + "upward_compatible_machine": [], + "use_firmware_retraction": "0", + "use_relative_e_distances": "1", + "wipe": [ + "1" + ], + "wipe_distance": [ + "2" + ], + "z_hop": [ + "0.4" + ], + "z_hop_types": [ + "Auto Lift" + ], + "z_offset": "0" +} diff --git a/resources/profiles/Flashforge/machine/Flashforge Adventurer A5 0.6 nozzle.json b/resources/profiles/Flashforge/machine/Flashforge Adventurer A5 0.6 nozzle.json new file mode 100644 index 0000000000..0ac8ffe783 --- /dev/null +++ b/resources/profiles/Flashforge/machine/Flashforge Adventurer A5 0.6 nozzle.json @@ -0,0 +1,233 @@ +{ + "type": "machine", + "name": "Flashforge Adventurer A5 0.6 nozzle", + "inherits": "Flashforge Adventurer 5M Pro 0.6 Nozzle", + "from": "system", + "setting_id": "gu3ZxlImr6zK3yb6", + "instantiation": "true", + "adaptive_bed_mesh_margin": "0", + "auxiliary_fan": "1", + "bbl_use_printhost": "0", + "bed_custom_model": "", + "bed_custom_texture": "", + "bed_exclude_area": [ + "0x0" + ], + "bed_mesh_max": "99999,99999", + "bed_mesh_min": "-99999,-99999", + "bed_mesh_probe_distance": "50,50", + "before_layer_change_gcode": ";BEFORE_LAYER_CHANGE\n;[layer_z]", + "best_object_pos": "0.5,0.5", + "change_extrusion_role_gcode": "", + "change_filament_gcode": "", + "cooling_tube_length": "0", + "cooling_tube_retraction": "0", + "default_filament_profile": [ + "Generic PLA @Flashforge" + ], + "default_print_profile": "0.30mm Standard @FF Adventurer A5 0.6 nozzle", + "deretraction_speed": [ + "35" + ], + "disable_m73": "0", + "emit_machine_limits_to_gcode": "1", + "enable_filament_ramming": "0", + "enable_long_retraction_when_cut": "0", + "extra_loading_move": "0", + "extruder_clearance_height_to_lid": "150", + "extruder_clearance_height_to_rod": "27", + "extruder_clearance_radius": "76", + "extruder_colour": [ + "#FCE94F" + ], + "extruder_offset": [ + "0x0" + ], + "fan_kickstart": "0", + "fan_speedup_overhangs": "1", + "fan_speedup_time": "0", + "gcode_flavor": "klipper", + "head_wrap_detect_zone": [], + "high_current_on_filament_swap": "0", + "host_type": "octoprint", + "layer_change_gcode": ";AFTER_LAYER_CHANGE\n;[layer_z]", + "long_retractions_when_cut": [ + "0" + ], + "machine_end_gcode": "G1 E-3 F3600\nG0 X50 Y50 F30000\nM104 S0 ; turn off temperature", + "machine_load_filament_time": "0", + "machine_max_acceleration_e": [ + "5000", + "5000" + ], + "machine_max_acceleration_extruding": [ + "20000", + "20000" + ], + "machine_max_acceleration_retracting": [ + "5000", + "5000" + ], + "machine_max_acceleration_travel": [ + "20000", + "20000" + ], + "machine_max_acceleration_x": [ + "20000", + "20000" + ], + "machine_max_acceleration_y": [ + "20000", + "20000" + ], + "machine_max_acceleration_z": [ + "500", + "500" + ], + "machine_max_jerk_e": [ + "2.5", + "2.5" + ], + "machine_max_jerk_x": [ + "9", + "9" + ], + "machine_max_jerk_y": [ + "9", + "9" + ], + "machine_max_jerk_z": [ + "3", + "3" + ], + "machine_max_speed_e": [ + "30", + "30" + ], + "machine_max_speed_x": [ + "600", + "600" + ], + "machine_max_speed_y": [ + "600", + "600" + ], + "machine_max_speed_z": [ + "20", + "20" + ], + "machine_min_extruding_rate": [ + "0", + "0" + ], + "machine_min_travel_rate": [ + "0", + "0" + ], + "machine_pause_gcode": "PAUSE", + "machine_start_gcode": "M190 S[bed_temperature_initial_layer_single]\nM104 S[nozzle_temperature_initial_layer]\nG90\nM83\nG1 Z5 F6000\nG1 E-0.2 F800\nG1 X110 Y-110 F6000\nG1 E2 F800\nG1 Y-110 X55 Z0.25 F4800\nG1 X-55 E8 F2400\nG1 Y-109.6 F2400\nG1 X55 E5 F2400\nG1 Y-110 X55 Z0.45 F4800\nG1 X-55 E8 F2400\nG1 Y-109.6 F2400\nG1 X55 E5 F2400\nG92 E0", + "machine_tool_change_time": "0", + "machine_unload_filament_time": "0", + "manual_filament_change": "0", + "max_layer_height": [ + "0.42" + ], + "min_layer_height": [ + "0.15" + ], + "nozzle_diameter": [ + "0.6" + ], + "nozzle_height": "2.5", + "nozzle_hrc": "0", + "nozzle_type": "hardened_steel", + "nozzle_volume": "0", + "parking_pos_retraction": "0", + "pellet_modded_printer": "0", + "preferred_orientation": "0", + "printable_area": [ + "-110x-110", + "110x-110", + "110x110", + "-110x110" + ], + "printable_height": "220", + "printer_model": "Flashforge Adventurer A5", + "printer_notes": "", + "printer_settings_id": "Flashforge Adventurer A5 0.6 nozzle", + "printer_structure": "undefine", + "printer_technology": "FFF", + "printer_variant": "0.6", + "printhost_authorization_type": "key", + "printhost_ssl_ignore_revoke": "0", + "printing_by_object_gcode": "", + "purge_in_prime_tower": "1", + "retract_before_wipe": [ + "100%" + ], + "retract_length_toolchange": [ + "2" + ], + "retract_lift_above": [ + "0" + ], + "retract_lift_below": [ + "0" + ], + "retract_lift_enforce": [ + "All Surfaces" + ], + "retract_on_top_layer": [ + "1" + ], + "retract_restart_extra": [ + "0" + ], + "retract_restart_extra_toolchange": [ + "0" + ], + "retract_when_changing_layer": [ + "1" + ], + "retraction_distances_when_cut": [ + "18" + ], + "retraction_length": [ + "1.2" + ], + "retraction_minimum_travel": [ + "1" + ], + "retraction_speed": [ + "35" + ], + "scan_first_layer": "0", + "single_extruder_multi_material": "0", + "support_air_filtration": "1", + "support_chamber_temp_control": "1", + "support_multi_bed_types": "1", + "template_custom_gcode": "", + "thumbnails": "140x110/PNG", + "thumbnails_format": "PNG", + "time_cost": "0", + "time_lapse_gcode": "", + "travel_slope": [ + "3" + ], + "upward_compatible_machine": [], + "use_firmware_retraction": "0", + "use_relative_e_distances": "1", + "wipe": [ + "1" + ], + "wipe_distance": [ + "2" + ], + "z_hop": [ + "0.4" + ], + "z_hop_types": [ + "Auto Lift" + ], + "z_offset": "0" +} diff --git a/resources/profiles/Flashforge/machine/Flashforge Adventurer A5 0.8 nozzle.json b/resources/profiles/Flashforge/machine/Flashforge Adventurer A5 0.8 nozzle.json new file mode 100644 index 0000000000..e982ec00a9 --- /dev/null +++ b/resources/profiles/Flashforge/machine/Flashforge Adventurer A5 0.8 nozzle.json @@ -0,0 +1,233 @@ +{ + "type": "machine", + "name": "Flashforge Adventurer A5 0.8 nozzle", + "inherits": "Flashforge Adventurer 5M Pro 0.8 Nozzle", + "from": "system", + "setting_id": "tKE8SP6KOhIupWbU", + "instantiation": "true", + "adaptive_bed_mesh_margin": "0", + "auxiliary_fan": "1", + "bbl_use_printhost": "0", + "bed_custom_model": "", + "bed_custom_texture": "", + "bed_exclude_area": [ + "0x0" + ], + "bed_mesh_max": "99999,99999", + "bed_mesh_min": "-99999,-99999", + "bed_mesh_probe_distance": "50,50", + "before_layer_change_gcode": ";BEFORE_LAYER_CHANGE\n;[layer_z]", + "best_object_pos": "0.5,0.5", + "change_extrusion_role_gcode": "", + "change_filament_gcode": "", + "cooling_tube_length": "0", + "cooling_tube_retraction": "0", + "default_filament_profile": [ + "Generic PLA @Flashforge" + ], + "default_print_profile": "0.40mm Standard @FF Adventurer A5 0.8 nozzle", + "deretraction_speed": [ + "35" + ], + "disable_m73": "0", + "emit_machine_limits_to_gcode": "1", + "enable_filament_ramming": "0", + "enable_long_retraction_when_cut": "0", + "extra_loading_move": "0", + "extruder_clearance_height_to_lid": "150", + "extruder_clearance_height_to_rod": "27", + "extruder_clearance_radius": "76", + "extruder_colour": [ + "#FCE94F" + ], + "extruder_offset": [ + "0x0" + ], + "fan_kickstart": "0", + "fan_speedup_overhangs": "1", + "fan_speedup_time": "0", + "gcode_flavor": "klipper", + "head_wrap_detect_zone": [], + "high_current_on_filament_swap": "0", + "host_type": "octoprint", + "layer_change_gcode": ";AFTER_LAYER_CHANGE\n;[layer_z]", + "long_retractions_when_cut": [ + "0" + ], + "machine_end_gcode": "G1 E-3 F3600\nG0 X50 Y50 F30000\nM104 S0 ; turn off temperature", + "machine_load_filament_time": "0", + "machine_max_acceleration_e": [ + "5000", + "5000" + ], + "machine_max_acceleration_extruding": [ + "20000", + "20000" + ], + "machine_max_acceleration_retracting": [ + "5000", + "5000" + ], + "machine_max_acceleration_travel": [ + "20000", + "20000" + ], + "machine_max_acceleration_x": [ + "20000", + "20000" + ], + "machine_max_acceleration_y": [ + "20000", + "20000" + ], + "machine_max_acceleration_z": [ + "500", + "500" + ], + "machine_max_jerk_e": [ + "2.5", + "2.5" + ], + "machine_max_jerk_x": [ + "9", + "9" + ], + "machine_max_jerk_y": [ + "9", + "9" + ], + "machine_max_jerk_z": [ + "3", + "3" + ], + "machine_max_speed_e": [ + "30", + "30" + ], + "machine_max_speed_x": [ + "600", + "600" + ], + "machine_max_speed_y": [ + "600", + "600" + ], + "machine_max_speed_z": [ + "20", + "20" + ], + "machine_min_extruding_rate": [ + "0", + "0" + ], + "machine_min_travel_rate": [ + "0", + "0" + ], + "machine_pause_gcode": "PAUSE", + "machine_start_gcode": "M190 S[bed_temperature_initial_layer_single]\nM104 S[nozzle_temperature_initial_layer]\nG1 Z5 F6000\nG1 E-1.5 F600\nG1 E12 F800\nG1 X85 Y110 Z0.3 F1200\nG1 X-110 E30 F2400\nG1 Y0 E8 F2400\nG1 X-109.6 F2400\nG1 Y110 E10 F2400\nG92 E0", + "machine_tool_change_time": "0", + "machine_unload_filament_time": "0", + "manual_filament_change": "0", + "max_layer_height": [ + "0.56" + ], + "min_layer_height": [ + "0.24" + ], + "nozzle_diameter": [ + "0.8" + ], + "nozzle_height": "2.5", + "nozzle_hrc": "0", + "nozzle_type": "hardened_steel", + "nozzle_volume": "0", + "parking_pos_retraction": "0", + "pellet_modded_printer": "0", + "preferred_orientation": "0", + "printable_area": [ + "-110x-110", + "110x-110", + "110x110", + "-110x110" + ], + "printable_height": "220", + "printer_model": "Flashforge Adventurer A5", + "printer_notes": "", + "printer_settings_id": "Flashforge Adventurer A5 0.8 nozzle", + "printer_structure": "undefine", + "printer_technology": "FFF", + "printer_variant": "0.8", + "printhost_authorization_type": "key", + "printhost_ssl_ignore_revoke": "0", + "printing_by_object_gcode": "", + "purge_in_prime_tower": "1", + "retract_before_wipe": [ + "100%" + ], + "retract_length_toolchange": [ + "2" + ], + "retract_lift_above": [ + "0" + ], + "retract_lift_below": [ + "0" + ], + "retract_lift_enforce": [ + "All Surfaces" + ], + "retract_on_top_layer": [ + "1" + ], + "retract_restart_extra": [ + "0" + ], + "retract_restart_extra_toolchange": [ + "0" + ], + "retract_when_changing_layer": [ + "1" + ], + "retraction_distances_when_cut": [ + "18" + ], + "retraction_length": [ + "1.5" + ], + "retraction_minimum_travel": [ + "1" + ], + "retraction_speed": [ + "35" + ], + "scan_first_layer": "0", + "single_extruder_multi_material": "0", + "support_air_filtration": "1", + "support_chamber_temp_control": "1", + "support_multi_bed_types": "1", + "template_custom_gcode": "", + "thumbnails": "140x110/PNG", + "thumbnails_format": "PNG", + "time_cost": "0", + "time_lapse_gcode": "", + "travel_slope": [ + "3" + ], + "upward_compatible_machine": [], + "use_firmware_retraction": "0", + "use_relative_e_distances": "1", + "wipe": [ + "1" + ], + "wipe_distance": [ + "2" + ], + "z_hop": [ + "0" + ], + "z_hop_types": [ + "Auto Lift" + ], + "z_offset": "0" +} diff --git a/resources/profiles/Flashforge/machine/Flashforge Adventurer A5.json b/resources/profiles/Flashforge/machine/Flashforge Adventurer A5.json new file mode 100644 index 0000000000..8b7c579ca4 --- /dev/null +++ b/resources/profiles/Flashforge/machine/Flashforge Adventurer A5.json @@ -0,0 +1,12 @@ +{ + "type": "machine_model", + "name": "Flashforge Adventurer A5", + "model_id": "Flashforge-Adventurer-A5", + "nozzle_diameter": "0.25;0.4;0.6;0.8", + "machine_tech": "FFF", + "family": "Flashforge", + "bed_model": "flashforge_adventurer5m_series_buildplate_model.STL", + "bed_texture": "flashforge_adventurer5m_buildplate_texture.svg", + "hotend_model": "flashforge_adventurer_5m_series_hotend.STL", + "default_materials": "Generic ABS @Flashforge;Generic PETG @Flashforge;Generic PLA @Flashforge;Flashforge PLA Basic @FF Adventurer A5;Generic PLA @FF Adventurer A5 0.25 nozzle" +} diff --git a/resources/profiles/Flashforge/process/0.06mm Standard @FF Adventurer A5 0.25 nozzle.json b/resources/profiles/Flashforge/process/0.06mm Standard @FF Adventurer A5 0.25 nozzle.json new file mode 100644 index 0000000000..62a2cbd3d1 --- /dev/null +++ b/resources/profiles/Flashforge/process/0.06mm Standard @FF Adventurer A5 0.25 nozzle.json @@ -0,0 +1,23 @@ +{ + "type": "process", + "name": "0.06mm Standard @FF Adventurer A5 0.25 nozzle", + "inherits": "0.06mm Standard @Flashforge AD5M Pro 0.25 Nozzle", + "from": "system", + "setting_id": "426xS3MFF3smfdDE", + "instantiation": "true", + "elefant_foot_compensation": "0.15", + "enable_arc_fitting": "1", + "filename_format": "{input_filename_base}_{filament_type[initial_tool]}_{print_time}.gcode", + "compatible_printers": [ + "Flashforge Adventurer A5 0.25 nozzle" + ], + "infill_wall_overlap": "15%", + "only_one_wall_top": "1", + "print_settings_id": "0.06mm Standard @FF Adventurer A5 0.25 nozzle", + "seam_slope_conditional": "1", + "seam_slope_inner_walls": "1", + "slowdown_for_curled_perimeters": "0", + "small_perimeter_speed": "25", + "sparse_infill_pattern": "grid", + "wipe_speed": "200" +} diff --git a/resources/profiles/Flashforge/process/0.08mm Standard @FF Adventurer A5 0.25 nozzle.json b/resources/profiles/Flashforge/process/0.08mm Standard @FF Adventurer A5 0.25 nozzle.json new file mode 100644 index 0000000000..21c8dd069b --- /dev/null +++ b/resources/profiles/Flashforge/process/0.08mm Standard @FF Adventurer A5 0.25 nozzle.json @@ -0,0 +1,23 @@ +{ + "type": "process", + "name": "0.08mm Standard @FF Adventurer A5 0.25 nozzle", + "inherits": "0.08mm Standard @Flashforge AD5M Pro 0.25 Nozzle", + "from": "system", + "setting_id": "2N8NG8IpxxCPXZlq", + "instantiation": "true", + "elefant_foot_compensation": "0.15", + "enable_arc_fitting": "1", + "filename_format": "{input_filename_base}_{filament_type[initial_tool]}_{print_time}.gcode", + "compatible_printers": [ + "Flashforge Adventurer A5 0.25 nozzle" + ], + "infill_wall_overlap": "15%", + "only_one_wall_top": "1", + "print_settings_id": "0.08mm Standard @FF Adventurer A5 0.25 nozzle", + "seam_slope_conditional": "1", + "seam_slope_inner_walls": "1", + "slowdown_for_curled_perimeters": "0", + "small_perimeter_speed": "25", + "sparse_infill_pattern": "grid", + "wipe_speed": "200" +} diff --git a/resources/profiles/Flashforge/process/0.10mm Standard @FF Adventurer A5 0.25 nozzle.json b/resources/profiles/Flashforge/process/0.10mm Standard @FF Adventurer A5 0.25 nozzle.json new file mode 100644 index 0000000000..a53d6c235f --- /dev/null +++ b/resources/profiles/Flashforge/process/0.10mm Standard @FF Adventurer A5 0.25 nozzle.json @@ -0,0 +1,23 @@ +{ + "type": "process", + "name": "0.10mm Standard @FF Adventurer A5 0.25 nozzle", + "inherits": "0.10mm Standard @Flashforge AD5M Pro 0.25 Nozzle", + "from": "system", + "setting_id": "H74U0yaiNgyQpdbc", + "instantiation": "true", + "elefant_foot_compensation": "0.15", + "enable_arc_fitting": "1", + "filename_format": "{input_filename_base}_{filament_type[initial_tool]}_{print_time}.gcode", + "compatible_printers": [ + "Flashforge Adventurer A5 0.25 nozzle" + ], + "infill_wall_overlap": "15%", + "only_one_wall_top": "1", + "print_settings_id": "0.10mm Standard @FF Adventurer A5 0.25 nozzle", + "seam_slope_conditional": "1", + "seam_slope_inner_walls": "1", + "slowdown_for_curled_perimeters": "0", + "small_perimeter_speed": "25", + "sparse_infill_pattern": "grid", + "wipe_speed": "200" +} diff --git a/resources/profiles/Flashforge/process/0.12mm Fine @FF Adventurer A5 0.4 nozzle.json b/resources/profiles/Flashforge/process/0.12mm Fine @FF Adventurer A5 0.4 nozzle.json new file mode 100644 index 0000000000..58b5bc5c5d --- /dev/null +++ b/resources/profiles/Flashforge/process/0.12mm Fine @FF Adventurer A5 0.4 nozzle.json @@ -0,0 +1,24 @@ +{ + "type": "process", + "name": "0.12mm Fine @FF Adventurer A5 0.4 nozzle", + "inherits": "0.12mm Fine @Flashforge AD5M Pro 0.4 Nozzle", + "from": "system", + "setting_id": "G5AhxHk95GfXw6ec", + "instantiation": "true", + "bridge_flow": "1", + "enable_arc_fitting": "1", + "filename_format": "{input_filename_base}_{filament_type[initial_tool]}_{print_time}.gcode", + "compatible_printers": [ + "Flashforge Adventurer A5 0.4 nozzle" + ], + "infill_wall_overlap": "15%", + "initial_layer_print_height": "0.2", + "only_one_wall_top": "1", + "print_settings_id": "0.12mm Fine @FF Adventurer A5 0.4 nozzle", + "seam_slope_conditional": "1", + "seam_slope_inner_walls": "1", + "slowdown_for_curled_perimeters": "0", + "small_perimeter_speed": "25", + "sparse_infill_pattern": "grid", + "support_line_width": "0.42" +} diff --git a/resources/profiles/Flashforge/process/0.12mm Standard @FF Adventurer A5 0.25 nozzle.json b/resources/profiles/Flashforge/process/0.12mm Standard @FF Adventurer A5 0.25 nozzle.json new file mode 100644 index 0000000000..ddd5449889 --- /dev/null +++ b/resources/profiles/Flashforge/process/0.12mm Standard @FF Adventurer A5 0.25 nozzle.json @@ -0,0 +1,17 @@ +{ + "type": "process", + "name": "0.12mm Standard @FF Adventurer A5 0.25 nozzle", + "inherits": "0.12mm Standard @Flashforge AD5M Pro 0.25 Nozzle", + "from": "system", + "setting_id": "x28lWqpQxkirzYXm", + "instantiation": "true", + "enable_arc_fitting": "1", + "compatible_printers": [ + "Flashforge Adventurer A5 0.25 nozzle" + ], + "infill_wall_overlap": "15%", + "only_one_wall_top": "1", + "slowdown_for_curled_perimeters": "0", + "print_settings_id": "0.12mm Standard @FF Adventurer A5 0.25 nozzle", + "sparse_infill_pattern": "grid" +} diff --git a/resources/profiles/Flashforge/process/0.14mm Standard @FF Adventurer A5 0.25 nozzle.json b/resources/profiles/Flashforge/process/0.14mm Standard @FF Adventurer A5 0.25 nozzle.json new file mode 100644 index 0000000000..09cf76fb60 --- /dev/null +++ b/resources/profiles/Flashforge/process/0.14mm Standard @FF Adventurer A5 0.25 nozzle.json @@ -0,0 +1,23 @@ +{ + "type": "process", + "name": "0.14mm Standard @FF Adventurer A5 0.25 nozzle", + "inherits": "0.14mm Standard @Flashforge AD5M Pro 0.25 Nozzle", + "from": "system", + "setting_id": "Xx4fcIZ3esI4IXbl", + "instantiation": "true", + "elefant_foot_compensation": "0.15", + "enable_arc_fitting": "1", + "filename_format": "{input_filename_base}_{filament_type[initial_tool]}_{print_time}.gcode", + "compatible_printers": [ + "Flashforge Adventurer A5 0.25 nozzle" + ], + "infill_wall_overlap": "15%", + "only_one_wall_top": "1", + "print_settings_id": "0.14mm Standard @FF Adventurer A5 0.25 nozzle", + "seam_slope_conditional": "1", + "seam_slope_inner_walls": "1", + "slowdown_for_curled_perimeters": "0", + "small_perimeter_speed": "25", + "sparse_infill_pattern": "grid", + "wipe_speed": "200" +} diff --git a/resources/profiles/Flashforge/process/0.18mm Fine @FF Adventurer A5 0.6 nozzle.json b/resources/profiles/Flashforge/process/0.18mm Fine @FF Adventurer A5 0.6 nozzle.json new file mode 100644 index 0000000000..6213e93574 --- /dev/null +++ b/resources/profiles/Flashforge/process/0.18mm Fine @FF Adventurer A5 0.6 nozzle.json @@ -0,0 +1,24 @@ +{ + "type": "process", + "name": "0.18mm Fine @FF Adventurer A5 0.6 nozzle", + "inherits": "0.18mm Fine @Flashforge AD5M Pro 0.6 Nozzle", + "from": "system", + "setting_id": "USICCgjHQ4aHkqMM", + "instantiation": "true", + "enable_arc_fitting": "1", + "enable_support": "1", + "filename_format": "{input_filename_base}_{filament_type[initial_tool]}_{print_time}.gcode", + "compatible_printers": [ + "Flashforge Adventurer A5 0.6 nozzle" + ], + "infill_wall_overlap": "15%", + "initial_layer_print_height": "0.25", + "only_one_wall_top": "1", + "print_settings_id": "0.18mm Fine @FF Adventurer A5 0.6 nozzle", + "seam_slope_conditional": "1", + "seam_slope_inner_walls": "1", + "slowdown_for_curled_perimeters": "0", + "small_perimeter_speed": "25", + "support_bottom_z_distance": "0.2", + "support_top_z_distance": "0.2" +} diff --git a/resources/profiles/Flashforge/process/0.20mm Standard @FF Adventurer A5 0.4 nozzle.json b/resources/profiles/Flashforge/process/0.20mm Standard @FF Adventurer A5 0.4 nozzle.json new file mode 100644 index 0000000000..4f1e8cba7c --- /dev/null +++ b/resources/profiles/Flashforge/process/0.20mm Standard @FF Adventurer A5 0.4 nozzle.json @@ -0,0 +1,21 @@ +{ + "type": "process", + "name": "0.20mm Standard @FF Adventurer A5 0.4 nozzle", + "inherits": "0.20mm Standard @Flashforge AD5M Pro 0.4 Nozzle", + "from": "system", + "setting_id": "ZrWC7sW8I5eH0nI0", + "instantiation": "true", + "enable_arc_fitting": "1", + "compatible_printers": [ + "Flashforge Adventurer A5 0.4 nozzle" + ], + "infill_wall_overlap": "15%", + "only_one_wall_top": "1", + "print_settings_id": "0.20mm Standard @FF Adventurer A5 0.4 nozzle", + "seam_slope_conditional": "1", + "seam_slope_inner_walls": "1", + "slowdown_for_curled_perimeters": "0", + "small_perimeter_speed": "25", + "support_bottom_z_distance": "0.2", + "support_top_z_distance": "0.2" +} diff --git a/resources/profiles/Flashforge/process/0.24mm Draft @FF Adventurer A5 0.4 nozzle.json b/resources/profiles/Flashforge/process/0.24mm Draft @FF Adventurer A5 0.4 nozzle.json new file mode 100644 index 0000000000..7cbac2a836 --- /dev/null +++ b/resources/profiles/Flashforge/process/0.24mm Draft @FF Adventurer A5 0.4 nozzle.json @@ -0,0 +1,23 @@ +{ + "type": "process", + "name": "0.24mm Draft @FF Adventurer A5 0.4 nozzle", + "inherits": "0.24mm Draft @Flashforge AD5M Pro 0.4 Nozzle", + "from": "system", + "setting_id": "nniAHPVQxmVlEZqp", + "instantiation": "true", + "enable_arc_fitting": "1", + "filename_format": "{input_filename_base}_{filament_type[initial_tool]}_{print_time}.gcode", + "compatible_printers": [ + "Flashforge Adventurer A5 0.4 nozzle" + ], + "infill_wall_overlap": "15%", + "initial_layer_print_height": "0.25", + "only_one_wall_top": "1", + "print_settings_id": "0.24mm Draft @FF Adventurer A5 0.4 nozzle", + "seam_slope_conditional": "1", + "seam_slope_inner_walls": "1", + "slowdown_for_curled_perimeters": "0", + "small_perimeter_speed": "25", + "support_bottom_z_distance": "0.2", + "support_top_z_distance": "0.2" +} diff --git a/resources/profiles/Flashforge/process/0.24mm Fine @FF Adventurer A5 0.8 nozzle.json b/resources/profiles/Flashforge/process/0.24mm Fine @FF Adventurer A5 0.8 nozzle.json new file mode 100644 index 0000000000..8ff452ef10 --- /dev/null +++ b/resources/profiles/Flashforge/process/0.24mm Fine @FF Adventurer A5 0.8 nozzle.json @@ -0,0 +1,19 @@ +{ + "type": "process", + "name": "0.24mm Fine @FF Adventurer A5 0.8 nozzle", + "inherits": "0.24mm Fine @Flashforge AD5M Pro 0.8 Nozzle", + "from": "system", + "setting_id": "INfUgOlQBMZLYrfu", + "instantiation": "true", + "bridge_flow": "1", + "enable_arc_fitting": "1", + "compatible_printers": [ + "Flashforge Adventurer A5 0.8 nozzle" + ], + "infill_wall_overlap": "15%", + "initial_layer_print_height": "0.3", + "only_one_wall_top": "1", + "print_settings_id": "0.24mm Fine @FF Adventurer A5 0.8 nozzle", + "slowdown_for_curled_perimeters": "0", + "sparse_infill_pattern": "grid" +} diff --git a/resources/profiles/Flashforge/process/0.30mm Standard @FF Adventurer A5 0.6 nozzle.json b/resources/profiles/Flashforge/process/0.30mm Standard @FF Adventurer A5 0.6 nozzle.json new file mode 100644 index 0000000000..d8376dad80 --- /dev/null +++ b/resources/profiles/Flashforge/process/0.30mm Standard @FF Adventurer A5 0.6 nozzle.json @@ -0,0 +1,22 @@ +{ + "type": "process", + "name": "0.30mm Standard @FF Adventurer A5 0.6 nozzle", + "inherits": "0.30mm Standard @Flashforge AD5M Pro 0.6 Nozzle", + "from": "system", + "setting_id": "zNxUHo9HvYPlL2KP", + "instantiation": "true", + "enable_arc_fitting": "1", + "compatible_printers": [ + "Flashforge Adventurer A5 0.6 nozzle" + ], + "infill_wall_overlap": "15%", + "only_one_wall_top": "1", + "print_settings_id": "0.30mm Standard @FF Adventurer A5 0.6 nozzle", + "seam_slope_conditional": "1", + "seam_slope_inner_walls": "1", + "slowdown_for_curled_perimeters": "0", + "small_perimeter_speed": "25", + "sparse_infill_pattern": "grid", + "support_bottom_z_distance": "0.2", + "support_top_z_distance": "0.2" +} diff --git a/resources/profiles/Flashforge/process/0.40mm Standard @FF Adventurer A5 0.8 nozzle.json b/resources/profiles/Flashforge/process/0.40mm Standard @FF Adventurer A5 0.8 nozzle.json new file mode 100644 index 0000000000..4a0300bccc --- /dev/null +++ b/resources/profiles/Flashforge/process/0.40mm Standard @FF Adventurer A5 0.8 nozzle.json @@ -0,0 +1,18 @@ +{ + "type": "process", + "name": "0.40mm Standard @FF Adventurer A5 0.8 nozzle", + "inherits": "0.40mm Standard @Flashforge AD5M Pro 0.8 Nozzle", + "from": "system", + "setting_id": "Davfy2YyV2b7ofhd", + "instantiation": "true", + "enable_arc_fitting": "1", + "compatible_printers": [ + "Flashforge Adventurer A5 0.8 nozzle" + ], + "infill_wall_overlap": "15%", + "print_settings_id": "0.40mm Standard @FF Adventurer A5 0.8 nozzle", + "slowdown_for_curled_perimeters": "0", + "sparse_infill_pattern": "grid", + "support_bottom_z_distance": "0.25", + "support_top_z_distance": "0.25" +} diff --git a/resources/profiles/Flashforge/process/0.42mm Draft @FF Adventurer A5 0.6 nozzle.json b/resources/profiles/Flashforge/process/0.42mm Draft @FF Adventurer A5 0.6 nozzle.json new file mode 100644 index 0000000000..de9c64ea11 --- /dev/null +++ b/resources/profiles/Flashforge/process/0.42mm Draft @FF Adventurer A5 0.6 nozzle.json @@ -0,0 +1,23 @@ +{ + "type": "process", + "name": "0.42mm Draft @FF Adventurer A5 0.6 nozzle", + "inherits": "0.42mm Draft @Flashforge AD5M Pro 0.6 Nozzle", + "from": "system", + "setting_id": "k35K2zIeyVhqNVC1", + "instantiation": "true", + "bridge_flow": "1", + "enable_arc_fitting": "1", + "filename_format": "{input_filename_base}_{filament_type[initial_tool]}_{print_time}.gcode", + "compatible_printers": [ + "Flashforge Adventurer A5 0.6 nozzle" + ], + "infill_wall_overlap": "15%", + "initial_layer_print_height": "0.3", + "only_one_wall_top": "1", + "print_settings_id": "0.42mm Draft @FF Adventurer A5 0.6 nozzle", + "seam_slope_conditional": "1", + "seam_slope_inner_walls": "1", + "slowdown_for_curled_perimeters": "0", + "small_perimeter_speed": "25", + "sparse_infill_pattern": "grid" +} diff --git a/resources/profiles/Flashforge/process/0.56mm Draft @FF Adventurer A5 0.8 nozzle.json b/resources/profiles/Flashforge/process/0.56mm Draft @FF Adventurer A5 0.8 nozzle.json new file mode 100644 index 0000000000..b95c9c1895 --- /dev/null +++ b/resources/profiles/Flashforge/process/0.56mm Draft @FF Adventurer A5 0.8 nozzle.json @@ -0,0 +1,16 @@ +{ + "type": "process", + "name": "0.56mm Draft @FF Adventurer A5 0.8 nozzle", + "inherits": "0.56mm Draft @Flashforge AD5M Pro 0.8 Nozzle", + "from": "system", + "setting_id": "AMe67pwFNPpsDJ9B", + "instantiation": "true", + "enable_arc_fitting": "1", + "compatible_printers": [ + "Flashforge Adventurer A5 0.8 nozzle" + ], + "infill_wall_overlap": "25%", + "print_settings_id": "0.56mm Draft @FF Adventurer A5 0.8 nozzle", + "slowdown_for_curled_perimeters": "0", + "sparse_infill_pattern": "grid" +} From b6bb1b92c941c1f7f0eeb5f980fd949e3a9f2430 Mon Sep 17 00:00:00 2001 From: Tim Schneider Date: Mon, 21 Sep 2026 18:14:33 +0200 Subject: [PATCH 16/48] Add Meltingplot vendor profiles (CHX 350 + MBL series) (#14756) * Add Meltingplot vendor profiles (CHX 350 + MBL series) Adds the Meltingplot vendor bundle with 5 printer models: - CHX 350 (880x422x943, RepRapFirmware/Duet) - MBL 133/136/308/480 (RepRapFirmware/Duet) Each model ships 0.4/0.6/0.8/1.0/1.2 nozzle variants. Layer height presets span 40-60% of the nozzle diameter and deliberately avoid heights that divide the Z screw lead evenly (CHX: 1204 ball screw, 4 mm lead; MBL: TR4x2 trapezoidal screw, 8 mm lead) so periodic screw error does not repeat as banding. All printers use 2.85 mm filament, so the bundle carries its own filament library (PLA, StoneFil, ABS, TitanX, ASA, PETG, PA6 CF HT, STYX 12, PP 9-2, PET-CF15, Extrudr PLA NX2 Matt, Igus iglidur J260) with the 2.85 mm diameter pinned once in the vendor-local fdm_filament_common base. Machine limits mirror the printers' firmware configuration; machine limit emission is disabled so the values only feed the time estimator. * Add per-nozzle volumetric flow limits and nozzle size in filename Cap filament volumetric speed per nozzle (0.4: 14, 0.6: 20, 0.8: 26, 1.0: 30, 1.2: 40 mm3/s). Filaments whose limit exceeds a nozzle's capability get a nozzle-scoped child profile that only lowers filament_max_volumetric_speed; filament_id is inherited so all nozzle variants remain the same material. Also include layer height and nozzle diameter in the g-code filename. * Set CHX 350 machine time cost to 5 EUR/h * Inherit Meltingplot filaments from OrcaFilamentLibrary generics Per the profile creation guide, vendor filament profiles now inherit from Generic * @System instead of vendor-local fdm_filament_* copies. Each profile carries only Meltingplot-specific deviations plus the 2.85 mm filament diameter; the seven local fdm_filament_* base files are removed. Deliberate pins where the library default would change tuned behavior: - PLA/ABS/TitanX keep filament_max_volumetric_speed 20 (0.6 nozzle cap) - ABS/PET-CF15 keep close_fan_the_first_x_layers 1 - STYX 12 sets required_nozzle_HRC 0 (unfilled PA12, density 1.02) * Remove Meltingplot StoneFil filament profile * Meltingplot ABS: use library fan settings * Meltingplot TitanX/ABS: use library fan and nozzle temperature settings * Remove STYX 12, PP 9-2 and Igus iglidur J260 filament profiles * Meltingplot ASA: use library fan_max_speed * Derive per-nozzle volumetric speed caps from physical limit formula Caps now follow V = 34*d * m / S: the 34*d limit line calibrated on Micro Swiss Volcano plated copper at 2.85 mm, material factor m from the OrcaFilamentLibrary generic ratios (PLA/ABS/ASA 1.0, PETG 10/12, PETG-CF 11.5/12, PA-CF 8/12, PLA Matte 11/12), safety factor S = 1.25 covering batch/moisture/wear/diameter tolerances. Each material base now serves the 1.2 nozzle at its maximum cap; children @0.4-@1.0 lower the cap per nozzle. Machine variant default_filament_profile entries point at the matching preset. * Scale slow_down_layer_time per nozzle from bead cross-section Minimum layer time follows the derived cooling rule: heat per layer scales with bead cross-section (layer height x line width), so the 0.8-nozzle-tuned values are scaled by q(d)/q(0.8) using each nozzle's standard preset geometry. Bases carry the 1.2 value, children @0.4-@1.0 their nozzle-specific value. * Meltingplot: lift Z above the print before the end macro Add a G90 / G1 Z{min(max_layer_z + 5, printable_height)} F600 move at the start of machine_end_gcode, before M98 print_end shuts the printer down and parks it. Besides clearing the part, the explicit Z coordinate lets the Duet file-info parser pick up the object height. * Meltingplot: cap default layer height at 40% of outer wall width A 45 deg slope shifts each bead outward by exactly one layer height. With the Slic3r bead model (rectangle (w-h) x h plus half-circles of diameter h) the flat contact band to the layer below is w - 2h, so the maximum self-supporting angle is atan((w-h)/h). Support cannot compensate: the stair tread at 45 deg is only h wide, far below one support line width, so no support line ever fits underneath a single step. All ten machine variants defaulted to h/w = 0.455..0.524, i.e. at or past the h/w = 0.5 point where the flat contact vanishes. The 0.8 nozzle default (0.44 mm at w = 0.84) reached atan(0.4/0.44) = 42.3 deg and failed on 45 deg slopes even with support. Default presets now satisfy h <= 0.40 * outer_wall_line_width, which leaves one third of the bead's flat underside in contact at 45 deg and puts the geometric limit at 56.3 deg. To keep the defaults on sensible ladder rungs, outer wall width is widened where it was the binding constraint: chx_small 110 -> 115%, chx_large 105 -> 110%, mbl_04 105 -> 115%. Ladders are unchanged; the thicker rungs stay available for parts without steep overhangs. * Meltingplot PLA: raise slow_down_layer_time by calibration factor 1.5 Print feedback on CHX 350 with a 0.8 nozzle at 0.44 mm layer height showed curling at the retraction points with the derived value of 25 s. There is no cooling headroom left to trade: fdm_filament_pla pins fan_min_speed = fan_max_speed = 100, and additional_cooling_fan_speed is inert because no Meltingplot machine enables auxiliary_fan. Minimum layer time is the only remaining lever; 35 s prints cleanly at that geometry. The cross-section rule only fixes the ratios between nozzle sizes, so this is a calibration of the PLA anchor itself: both PLA ladders are scaled by 1.5 (Extrudr 9/20/38/56/83 s, Meltingplot PLA 8/17/30/45/66 s for 0.4/0.6/0.8/1.0/1.2). The Extrudr base fan_cooling_layer_time goes 60 -> 100 so the 1.2-nozzle value stays below it. Other materials are left unchanged - only the PLA anchor has a real counter-example so far. * Meltingplot: drop layer heights that cannot print 45 degree walls A preset whose layer height exceeds ~45% of the outer wall line width has less than ~6 degrees of reserve on a 45 degree wall (max self-supporting angle atan((w-h)/h)), and support cannot compensate because the 45 degree stair tread is only h wide - far below one support line. Those presets are not usable in practice, so shipping them only invites failed prints. Removes the 22 rungs above h/w = 0.45 and prunes them from the vendor index. What remains per nozzle (default first): CHX 350 0.4: 0.18 | 0.6: 0.24 0.28 | 0.8: 0.32 0.36 1.0: 0.44 0.48 | 1.2: 0.48 0.56 MBL 0.4: 0.18 | 0.6: 0.24 0.28 | 0.8: 0.36 0.34 1.0: 0.44 0.48 | 1.2: 0.48 0.56 The 0.4 nozzle keeps a single rung: 0.20 mm would qualify (h/w = 0.435) but divides both screw leads evenly (4/0.20, 8/0.20) and stays excluded by the Z-artifact rule, and 0.22 is already at 0.478. Also corrects the MBL 0.8 default to 0.36 mm, which at w = 0.92 sits at h/w = 0.391 and therefore still satisfies the stricter 40% default rule. * Meltingplot: require 5 degrees of reserve on 45 degree walls Replaces the two separate thresholds (h <= 0.40 * outer wall width for defaults, 0.45 for ladder rungs) with a single requirement stated on the design constraint itself: every shipped preset must reach a_max = atan((w - h) / h) >= 50 deg i.e. 5 degrees of reserve on a 45 degree wall, equivalent to h <= 0.456 * outer_wall_line_width. The default is simply the thickest rung that passes. The 11 degrees the 40% rule produced were more margin than the failure mode warrants, and cost throughput for no return. For calibration: across 940 machine defaults from 60 vendor bundles in this repo, the median reserve is +1.8 deg, 71% ship less than 5 deg, and 8% cannot geometrically produce a 45 deg wall at all. Adds the rungs the relaxed threshold makes available - 0.30 (0.6 nozzle, both series) and 0.38 (0.8 nozzle, both series) - and restores the 0.30 mm MBL preset removed in 5b4862b3 with its original setting_id. 0.20 mm on the 0.4 nozzle and 0.50 mm on the 1.0 nozzle would also qualify but stay excluded because they divide both screw leads evenly. Defaults are now (0.4/0.6/0.8/1.0/1.2) 0.18/0.30/0.38/0.48/0.56 for both series, at 50.2 to 57.3 deg. The 1.2 nozzle deliberately keeps 0.56 rather than the 0.60 the rule would allow: solidification time scales with h^2 and bead weight with h*w, so the largest nozzle is the one that should not sit on the minimum. * Meltingplot: disable precise wall by default Precise wall was inheriting OrcaSlicer's global default of true. Disable it bundle-wide in the vendor process root so it applies to CHX 350 and all MBL models. Note it was already ignored on the CHX small-nozzle branch, which uses the inner-outer-inner wall sequence. * Meltingplot CHX: raise max extruding acceleration to 6000 The 4000 limit silently clamped the profiles' 6000 values for default and inner wall acceleration, since GCodeWriter caps print acceleration against machine_max_acceleration_extruding regardless of emit_machine_limits_to_gcode. Raising it to 6000 matches the X/Y limits so the configured values are emitted as-is. The firmware's own M201 still governs what is actually driven. * Meltingplot PA6 CF HT: raise part cooling floor to 40% Sharp 90 degree corners were washing out layer by layer while straight walls and overhangs printed cleanly. Overhangs are fine because overhang_fan_speed forces 100% regardless of layer time; everything else fell back to fan_min_speed, since at the layer times seen in practice neither branch of the layer-time fan interpolation applies. Raise fan_min_speed to 40% and set reduce_fan_stop_start_freq so that floor is actually applied instead of dropping to zero. Also lower the auxiliary fan to 40% and raise the overhang cooling threshold to 95%, matching the values validated on the print. * Meltingplot: re-mint filament ids with orca_id_tool Upstream now requires every filament_id to be a minted "OF" id derived from the (filament_vendor, filament_type, name) triple and recorded in scripts/filament_id_snapshot.json. The hand-made ids this bundle shipped with (MPFPLA0, EXTNX2M, ...) were rejected by orca_extra_profile_check. Regenerate them with "orca_id_tool.py --generate --vendor Meltingplot" and record the result with --update-snapshot. No setting_id changed, and the ids were never released, so no existing project file refers to them. * Meltingplot: normalize bundle for updated profile checks Drop obsolete keys (silent_mode, adaptive_layer_height, tree_support_with_infill) and rebuild the vendor index in canonical order, as orca_profile_tool.py normalize / update-index write them. * Meltingplot: list per-nozzle filaments in default_materials The unsuffixed filament presets only cover the 1.2 mm variants, so the 0.4-1.0 mm printer presets had no compatible entry in their model's default_materials. The validator's check_printer_default_materials rejects that, and load_installed_filaments would auto-install no filament for those variants on first run. Name the @0.4/0.6/0.8/1.0 nozzle presets alongside the base ones for PLA, PETG, ABS and ASA. --------- Co-authored-by: yw4z --- resources/profiles/Meltingplot.json | 434 ++++++++++++++++++ .../Meltingplot/Meltingplot CHX 350_cover.png | Bin 0 -> 147766 bytes .../Meltingplot/Meltingplot MBL 133_cover.png | Bin 0 -> 42858 bytes .../Meltingplot/Meltingplot MBL 136_cover.png | Bin 0 -> 32398 bytes .../Meltingplot/Meltingplot MBL 308_cover.png | Bin 0 -> 36673 bytes .../Meltingplot/Meltingplot MBL 480_cover.png | Bin 0 -> 36570 bytes .../profiles/Meltingplot/chx350-printbed.stl | Bin 0 -> 183284 bytes .../profiles/Meltingplot/chx350-texture.svg | 5 + .../Extrudr PLA NX2 Matt @0.4 nozzle.json | 21 + .../Extrudr PLA NX2 Matt @0.6 nozzle.json | 21 + .../Extrudr PLA NX2 Matt @0.8 nozzle.json | 21 + .../Extrudr PLA NX2 Matt @1.0 nozzle.json | 21 + .../filament/Extrudr PLA NX2 Matt.json | 79 ++++ .../filament/Meltingplot ABS @0.4 nozzle.json | 21 + .../filament/Meltingplot ABS @0.6 nozzle.json | 21 + .../filament/Meltingplot ABS @0.8 nozzle.json | 21 + .../filament/Meltingplot ABS @1.0 nozzle.json | 21 + .../Meltingplot/filament/Meltingplot ABS.json | 70 +++ .../filament/Meltingplot ASA @0.4 nozzle.json | 21 + .../filament/Meltingplot ASA @0.6 nozzle.json | 21 + .../filament/Meltingplot ASA @0.8 nozzle.json | 21 + .../filament/Meltingplot ASA @1.0 nozzle.json | 21 + .../Meltingplot/filament/Meltingplot ASA.json | 70 +++ .../Meltingplot PA6 CF HT @0.4 nozzle.json | 21 + .../Meltingplot PA6 CF HT @0.6 nozzle.json | 21 + .../Meltingplot PA6 CF HT @0.8 nozzle.json | 21 + .../Meltingplot PA6 CF HT @1.0 nozzle.json | 21 + .../filament/Meltingplot PA6 CF HT.json | 94 ++++ .../Meltingplot PET-CF15 @0.4 nozzle.json | 21 + .../Meltingplot PET-CF15 @0.6 nozzle.json | 21 + .../Meltingplot PET-CF15 @0.8 nozzle.json | 21 + .../Meltingplot PET-CF15 @1.0 nozzle.json | 21 + .../filament/Meltingplot PET-CF15.json | 91 ++++ .../Meltingplot PETG @0.4 nozzle.json | 21 + .../Meltingplot PETG @0.6 nozzle.json | 21 + .../Meltingplot PETG @0.8 nozzle.json | 21 + .../Meltingplot PETG @1.0 nozzle.json | 21 + .../filament/Meltingplot PETG.json | 70 +++ .../filament/Meltingplot PLA @0.4 nozzle.json | 21 + .../filament/Meltingplot PLA @0.6 nozzle.json | 21 + .../filament/Meltingplot PLA @0.8 nozzle.json | 21 + .../filament/Meltingplot PLA @1.0 nozzle.json | 21 + .../Meltingplot/filament/Meltingplot PLA.json | 67 +++ .../Meltingplot TitanX @0.4 nozzle.json | 21 + .../Meltingplot TitanX @0.6 nozzle.json | 21 + .../Meltingplot TitanX @0.8 nozzle.json | 21 + .../Meltingplot TitanX @1.0 nozzle.json | 21 + .../filament/Meltingplot TitanX.json | 61 +++ .../Meltingplot CHX 350 0.4 nozzle.json | 30 ++ .../Meltingplot CHX 350 0.6 nozzle.json | 30 ++ .../Meltingplot CHX 350 0.8 nozzle.json | 32 ++ .../Meltingplot CHX 350 1.0 nozzle.json | 33 ++ .../Meltingplot CHX 350 1.2 nozzle.json | 33 ++ .../machine/Meltingplot CHX 350.json | 12 + .../Meltingplot MBL 133 0.4 nozzle.json | 30 ++ .../Meltingplot MBL 133 0.6 nozzle.json | 30 ++ .../Meltingplot MBL 133 0.8 nozzle.json | 30 ++ .../Meltingplot MBL 133 1.0 nozzle.json | 30 ++ .../Meltingplot MBL 133 1.2 nozzle.json | 30 ++ .../machine/Meltingplot MBL 133.json | 12 + .../Meltingplot MBL 136 0.4 nozzle.json | 30 ++ .../Meltingplot MBL 136 0.6 nozzle.json | 30 ++ .../Meltingplot MBL 136 0.8 nozzle.json | 30 ++ .../Meltingplot MBL 136 1.0 nozzle.json | 30 ++ .../Meltingplot MBL 136 1.2 nozzle.json | 30 ++ .../machine/Meltingplot MBL 136.json | 12 + .../Meltingplot MBL 308 0.4 nozzle.json | 30 ++ .../Meltingplot MBL 308 0.6 nozzle.json | 30 ++ .../Meltingplot MBL 308 0.8 nozzle.json | 30 ++ .../Meltingplot MBL 308 1.0 nozzle.json | 30 ++ .../Meltingplot MBL 308 1.2 nozzle.json | 30 ++ .../machine/Meltingplot MBL 308.json | 12 + .../Meltingplot MBL 480 0.4 nozzle.json | 30 ++ .../Meltingplot MBL 480 0.6 nozzle.json | 30 ++ .../Meltingplot MBL 480 0.8 nozzle.json | 30 ++ .../Meltingplot MBL 480 1.0 nozzle.json | 30 ++ .../Meltingplot MBL 480 1.2 nozzle.json | 30 ++ .../machine/Meltingplot MBL 480.json | 12 + .../machine/fdm_machine_common.json | 68 +++ .../machine/fdm_machine_meltingplot_chx.json | 71 +++ .../machine/fdm_machine_meltingplot_mbl.json | 69 +++ .../profiles/Meltingplot/mbl-133-texture.svg | 158 +++++++ .../profiles/Meltingplot/mbl-136-texture.svg | 158 +++++++ .../profiles/Meltingplot/mbl-308-texture.svg | 158 +++++++ .../profiles/Meltingplot/mbl-480-texture.svg | 158 +++++++ .../profiles/Meltingplot/mbl133-printbed.stl | Bin 0 -> 222284 bytes .../profiles/Meltingplot/mbl136-printbed.stl | Bin 0 -> 160484 bytes .../profiles/Meltingplot/mbl308-printbed.stl | Bin 0 -> 160484 bytes .../profiles/Meltingplot/mbl480-printbed.stl | Bin 0 -> 160484 bytes ... Fine 0.4 nozzle @Meltingplot CHX 350.json | 12 + ...18mm Fine 0.4 nozzle @Meltingplot MBL.json | 15 + ... Fine 0.6 nozzle @Meltingplot CHX 350.json | 12 + ...24mm Fine 0.6 nozzle @Meltingplot MBL.json | 15 + ...timal 0.6 nozzle @Meltingplot CHX 350.json | 12 + ...m Optimal 0.6 nozzle @Meltingplot MBL.json | 15 + ...ndard 0.6 nozzle @Meltingplot CHX 350.json | 12 + ... Standard 0.6 nozzle @Meltingplot MBL.json | 15 + ... Fine 0.8 nozzle @Meltingplot CHX 350.json | 12 + ...34mm Fine 0.8 nozzle @Meltingplot MBL.json | 15 + ...timal 0.8 nozzle @Meltingplot CHX 350.json | 12 + ...m Optimal 0.8 nozzle @Meltingplot MBL.json | 15 + ...ndard 0.8 nozzle @Meltingplot CHX 350.json | 12 + ... Standard 0.8 nozzle @Meltingplot MBL.json | 15 + ... Fine 1.0 nozzle @Meltingplot CHX 350.json | 12 + ...44mm Fine 1.0 nozzle @Meltingplot MBL.json | 15 + ... Fine 1.2 nozzle @Meltingplot CHX 350.json | 12 + ...48mm Fine 1.2 nozzle @Meltingplot MBL.json | 15 + ...timal 1.0 nozzle @Meltingplot CHX 350.json | 12 + ...m Optimal 1.0 nozzle @Meltingplot MBL.json | 15 + ...timal 1.2 nozzle @Meltingplot CHX 350.json | 12 + ...m Optimal 1.2 nozzle @Meltingplot MBL.json | 15 + .../process/fdm_process_common.json | 107 +++++ .../fdm_process_meltingplot_chx_common.json | 39 ++ ..._process_meltingplot_chx_large_nozzle.json | 26 ++ ..._process_meltingplot_chx_small_nozzle.json | 24 + ...fdm_process_meltingplot_mbl_04_nozzle.json | 14 + ...fdm_process_meltingplot_mbl_06_nozzle.json | 14 + ...fdm_process_meltingplot_mbl_08_nozzle.json | 14 + ...fdm_process_meltingplot_mbl_10_nozzle.json | 15 + ...fdm_process_meltingplot_mbl_12_nozzle.json | 15 + .../fdm_process_meltingplot_mbl_common.json | 60 +++ 121 files changed, 3996 insertions(+) create mode 100644 resources/profiles/Meltingplot.json create mode 100644 resources/profiles/Meltingplot/Meltingplot CHX 350_cover.png create mode 100644 resources/profiles/Meltingplot/Meltingplot MBL 133_cover.png create mode 100644 resources/profiles/Meltingplot/Meltingplot MBL 136_cover.png create mode 100644 resources/profiles/Meltingplot/Meltingplot MBL 308_cover.png create mode 100644 resources/profiles/Meltingplot/Meltingplot MBL 480_cover.png create mode 100644 resources/profiles/Meltingplot/chx350-printbed.stl create mode 100644 resources/profiles/Meltingplot/chx350-texture.svg create mode 100644 resources/profiles/Meltingplot/filament/Extrudr PLA NX2 Matt @0.4 nozzle.json create mode 100644 resources/profiles/Meltingplot/filament/Extrudr PLA NX2 Matt @0.6 nozzle.json create mode 100644 resources/profiles/Meltingplot/filament/Extrudr PLA NX2 Matt @0.8 nozzle.json create mode 100644 resources/profiles/Meltingplot/filament/Extrudr PLA NX2 Matt @1.0 nozzle.json create mode 100644 resources/profiles/Meltingplot/filament/Extrudr PLA NX2 Matt.json create mode 100644 resources/profiles/Meltingplot/filament/Meltingplot ABS @0.4 nozzle.json create mode 100644 resources/profiles/Meltingplot/filament/Meltingplot ABS @0.6 nozzle.json create mode 100644 resources/profiles/Meltingplot/filament/Meltingplot ABS @0.8 nozzle.json create mode 100644 resources/profiles/Meltingplot/filament/Meltingplot ABS @1.0 nozzle.json create mode 100644 resources/profiles/Meltingplot/filament/Meltingplot ABS.json create mode 100644 resources/profiles/Meltingplot/filament/Meltingplot ASA @0.4 nozzle.json create mode 100644 resources/profiles/Meltingplot/filament/Meltingplot ASA @0.6 nozzle.json create mode 100644 resources/profiles/Meltingplot/filament/Meltingplot ASA @0.8 nozzle.json create mode 100644 resources/profiles/Meltingplot/filament/Meltingplot ASA @1.0 nozzle.json create mode 100644 resources/profiles/Meltingplot/filament/Meltingplot ASA.json create mode 100644 resources/profiles/Meltingplot/filament/Meltingplot PA6 CF HT @0.4 nozzle.json create mode 100644 resources/profiles/Meltingplot/filament/Meltingplot PA6 CF HT @0.6 nozzle.json create mode 100644 resources/profiles/Meltingplot/filament/Meltingplot PA6 CF HT @0.8 nozzle.json create mode 100644 resources/profiles/Meltingplot/filament/Meltingplot PA6 CF HT @1.0 nozzle.json create mode 100644 resources/profiles/Meltingplot/filament/Meltingplot PA6 CF HT.json create mode 100644 resources/profiles/Meltingplot/filament/Meltingplot PET-CF15 @0.4 nozzle.json create mode 100644 resources/profiles/Meltingplot/filament/Meltingplot PET-CF15 @0.6 nozzle.json create mode 100644 resources/profiles/Meltingplot/filament/Meltingplot PET-CF15 @0.8 nozzle.json create mode 100644 resources/profiles/Meltingplot/filament/Meltingplot PET-CF15 @1.0 nozzle.json create mode 100644 resources/profiles/Meltingplot/filament/Meltingplot PET-CF15.json create mode 100644 resources/profiles/Meltingplot/filament/Meltingplot PETG @0.4 nozzle.json create mode 100644 resources/profiles/Meltingplot/filament/Meltingplot PETG @0.6 nozzle.json create mode 100644 resources/profiles/Meltingplot/filament/Meltingplot PETG @0.8 nozzle.json create mode 100644 resources/profiles/Meltingplot/filament/Meltingplot PETG @1.0 nozzle.json create mode 100644 resources/profiles/Meltingplot/filament/Meltingplot PETG.json create mode 100644 resources/profiles/Meltingplot/filament/Meltingplot PLA @0.4 nozzle.json create mode 100644 resources/profiles/Meltingplot/filament/Meltingplot PLA @0.6 nozzle.json create mode 100644 resources/profiles/Meltingplot/filament/Meltingplot PLA @0.8 nozzle.json create mode 100644 resources/profiles/Meltingplot/filament/Meltingplot PLA @1.0 nozzle.json create mode 100644 resources/profiles/Meltingplot/filament/Meltingplot PLA.json create mode 100644 resources/profiles/Meltingplot/filament/Meltingplot TitanX @0.4 nozzle.json create mode 100644 resources/profiles/Meltingplot/filament/Meltingplot TitanX @0.6 nozzle.json create mode 100644 resources/profiles/Meltingplot/filament/Meltingplot TitanX @0.8 nozzle.json create mode 100644 resources/profiles/Meltingplot/filament/Meltingplot TitanX @1.0 nozzle.json create mode 100644 resources/profiles/Meltingplot/filament/Meltingplot TitanX.json create mode 100644 resources/profiles/Meltingplot/machine/Meltingplot CHX 350 0.4 nozzle.json create mode 100644 resources/profiles/Meltingplot/machine/Meltingplot CHX 350 0.6 nozzle.json create mode 100644 resources/profiles/Meltingplot/machine/Meltingplot CHX 350 0.8 nozzle.json create mode 100644 resources/profiles/Meltingplot/machine/Meltingplot CHX 350 1.0 nozzle.json create mode 100644 resources/profiles/Meltingplot/machine/Meltingplot CHX 350 1.2 nozzle.json create mode 100644 resources/profiles/Meltingplot/machine/Meltingplot CHX 350.json create mode 100644 resources/profiles/Meltingplot/machine/Meltingplot MBL 133 0.4 nozzle.json create mode 100644 resources/profiles/Meltingplot/machine/Meltingplot MBL 133 0.6 nozzle.json create mode 100644 resources/profiles/Meltingplot/machine/Meltingplot MBL 133 0.8 nozzle.json create mode 100644 resources/profiles/Meltingplot/machine/Meltingplot MBL 133 1.0 nozzle.json create mode 100644 resources/profiles/Meltingplot/machine/Meltingplot MBL 133 1.2 nozzle.json create mode 100644 resources/profiles/Meltingplot/machine/Meltingplot MBL 133.json create mode 100644 resources/profiles/Meltingplot/machine/Meltingplot MBL 136 0.4 nozzle.json create mode 100644 resources/profiles/Meltingplot/machine/Meltingplot MBL 136 0.6 nozzle.json create mode 100644 resources/profiles/Meltingplot/machine/Meltingplot MBL 136 0.8 nozzle.json create mode 100644 resources/profiles/Meltingplot/machine/Meltingplot MBL 136 1.0 nozzle.json create mode 100644 resources/profiles/Meltingplot/machine/Meltingplot MBL 136 1.2 nozzle.json create mode 100644 resources/profiles/Meltingplot/machine/Meltingplot MBL 136.json create mode 100644 resources/profiles/Meltingplot/machine/Meltingplot MBL 308 0.4 nozzle.json create mode 100644 resources/profiles/Meltingplot/machine/Meltingplot MBL 308 0.6 nozzle.json create mode 100644 resources/profiles/Meltingplot/machine/Meltingplot MBL 308 0.8 nozzle.json create mode 100644 resources/profiles/Meltingplot/machine/Meltingplot MBL 308 1.0 nozzle.json create mode 100644 resources/profiles/Meltingplot/machine/Meltingplot MBL 308 1.2 nozzle.json create mode 100644 resources/profiles/Meltingplot/machine/Meltingplot MBL 308.json create mode 100644 resources/profiles/Meltingplot/machine/Meltingplot MBL 480 0.4 nozzle.json create mode 100644 resources/profiles/Meltingplot/machine/Meltingplot MBL 480 0.6 nozzle.json create mode 100644 resources/profiles/Meltingplot/machine/Meltingplot MBL 480 0.8 nozzle.json create mode 100644 resources/profiles/Meltingplot/machine/Meltingplot MBL 480 1.0 nozzle.json create mode 100644 resources/profiles/Meltingplot/machine/Meltingplot MBL 480 1.2 nozzle.json create mode 100644 resources/profiles/Meltingplot/machine/Meltingplot MBL 480.json create mode 100644 resources/profiles/Meltingplot/machine/fdm_machine_common.json create mode 100644 resources/profiles/Meltingplot/machine/fdm_machine_meltingplot_chx.json create mode 100644 resources/profiles/Meltingplot/machine/fdm_machine_meltingplot_mbl.json create mode 100644 resources/profiles/Meltingplot/mbl-133-texture.svg create mode 100644 resources/profiles/Meltingplot/mbl-136-texture.svg create mode 100644 resources/profiles/Meltingplot/mbl-308-texture.svg create mode 100644 resources/profiles/Meltingplot/mbl-480-texture.svg create mode 100644 resources/profiles/Meltingplot/mbl133-printbed.stl create mode 100644 resources/profiles/Meltingplot/mbl136-printbed.stl create mode 100644 resources/profiles/Meltingplot/mbl308-printbed.stl create mode 100644 resources/profiles/Meltingplot/mbl480-printbed.stl create mode 100644 resources/profiles/Meltingplot/process/0.18mm Fine 0.4 nozzle @Meltingplot CHX 350.json create mode 100644 resources/profiles/Meltingplot/process/0.18mm Fine 0.4 nozzle @Meltingplot MBL.json create mode 100644 resources/profiles/Meltingplot/process/0.24mm Fine 0.6 nozzle @Meltingplot CHX 350.json create mode 100644 resources/profiles/Meltingplot/process/0.24mm Fine 0.6 nozzle @Meltingplot MBL.json create mode 100644 resources/profiles/Meltingplot/process/0.28mm Optimal 0.6 nozzle @Meltingplot CHX 350.json create mode 100644 resources/profiles/Meltingplot/process/0.28mm Optimal 0.6 nozzle @Meltingplot MBL.json create mode 100644 resources/profiles/Meltingplot/process/0.30mm Standard 0.6 nozzle @Meltingplot CHX 350.json create mode 100644 resources/profiles/Meltingplot/process/0.30mm Standard 0.6 nozzle @Meltingplot MBL.json create mode 100644 resources/profiles/Meltingplot/process/0.32mm Fine 0.8 nozzle @Meltingplot CHX 350.json create mode 100644 resources/profiles/Meltingplot/process/0.34mm Fine 0.8 nozzle @Meltingplot MBL.json create mode 100644 resources/profiles/Meltingplot/process/0.36mm Optimal 0.8 nozzle @Meltingplot CHX 350.json create mode 100644 resources/profiles/Meltingplot/process/0.36mm Optimal 0.8 nozzle @Meltingplot MBL.json create mode 100644 resources/profiles/Meltingplot/process/0.38mm Standard 0.8 nozzle @Meltingplot CHX 350.json create mode 100644 resources/profiles/Meltingplot/process/0.38mm Standard 0.8 nozzle @Meltingplot MBL.json create mode 100644 resources/profiles/Meltingplot/process/0.44mm Fine 1.0 nozzle @Meltingplot CHX 350.json create mode 100644 resources/profiles/Meltingplot/process/0.44mm Fine 1.0 nozzle @Meltingplot MBL.json create mode 100644 resources/profiles/Meltingplot/process/0.48mm Fine 1.2 nozzle @Meltingplot CHX 350.json create mode 100644 resources/profiles/Meltingplot/process/0.48mm Fine 1.2 nozzle @Meltingplot MBL.json create mode 100644 resources/profiles/Meltingplot/process/0.48mm Optimal 1.0 nozzle @Meltingplot CHX 350.json create mode 100644 resources/profiles/Meltingplot/process/0.48mm Optimal 1.0 nozzle @Meltingplot MBL.json create mode 100644 resources/profiles/Meltingplot/process/0.56mm Optimal 1.2 nozzle @Meltingplot CHX 350.json create mode 100644 resources/profiles/Meltingplot/process/0.56mm Optimal 1.2 nozzle @Meltingplot MBL.json create mode 100644 resources/profiles/Meltingplot/process/fdm_process_common.json create mode 100644 resources/profiles/Meltingplot/process/fdm_process_meltingplot_chx_common.json create mode 100644 resources/profiles/Meltingplot/process/fdm_process_meltingplot_chx_large_nozzle.json create mode 100644 resources/profiles/Meltingplot/process/fdm_process_meltingplot_chx_small_nozzle.json create mode 100644 resources/profiles/Meltingplot/process/fdm_process_meltingplot_mbl_04_nozzle.json create mode 100644 resources/profiles/Meltingplot/process/fdm_process_meltingplot_mbl_06_nozzle.json create mode 100644 resources/profiles/Meltingplot/process/fdm_process_meltingplot_mbl_08_nozzle.json create mode 100644 resources/profiles/Meltingplot/process/fdm_process_meltingplot_mbl_10_nozzle.json create mode 100644 resources/profiles/Meltingplot/process/fdm_process_meltingplot_mbl_12_nozzle.json create mode 100644 resources/profiles/Meltingplot/process/fdm_process_meltingplot_mbl_common.json diff --git a/resources/profiles/Meltingplot.json b/resources/profiles/Meltingplot.json new file mode 100644 index 0000000000..654d955380 --- /dev/null +++ b/resources/profiles/Meltingplot.json @@ -0,0 +1,434 @@ +{ + "name": "Meltingplot", + "version": "02.04.00.00", + "force_update": "0", + "description": "Meltingplot configurations", + "machine_model_list": [ + { + "name": "Meltingplot CHX 350", + "sub_path": "machine/Meltingplot CHX 350.json" + }, + { + "name": "Meltingplot MBL 133", + "sub_path": "machine/Meltingplot MBL 133.json" + }, + { + "name": "Meltingplot MBL 136", + "sub_path": "machine/Meltingplot MBL 136.json" + }, + { + "name": "Meltingplot MBL 308", + "sub_path": "machine/Meltingplot MBL 308.json" + }, + { + "name": "Meltingplot MBL 480", + "sub_path": "machine/Meltingplot MBL 480.json" + } + ], + "process_list": [ + { + "name": "fdm_process_common", + "sub_path": "process/fdm_process_common.json" + }, + { + "name": "fdm_process_meltingplot_chx_common", + "sub_path": "process/fdm_process_meltingplot_chx_common.json" + }, + { + "name": "fdm_process_meltingplot_mbl_common", + "sub_path": "process/fdm_process_meltingplot_mbl_common.json" + }, + { + "name": "fdm_process_meltingplot_chx_large_nozzle", + "sub_path": "process/fdm_process_meltingplot_chx_large_nozzle.json" + }, + { + "name": "fdm_process_meltingplot_chx_small_nozzle", + "sub_path": "process/fdm_process_meltingplot_chx_small_nozzle.json" + }, + { + "name": "fdm_process_meltingplot_mbl_04_nozzle", + "sub_path": "process/fdm_process_meltingplot_mbl_04_nozzle.json" + }, + { + "name": "fdm_process_meltingplot_mbl_06_nozzle", + "sub_path": "process/fdm_process_meltingplot_mbl_06_nozzle.json" + }, + { + "name": "fdm_process_meltingplot_mbl_08_nozzle", + "sub_path": "process/fdm_process_meltingplot_mbl_08_nozzle.json" + }, + { + "name": "fdm_process_meltingplot_mbl_10_nozzle", + "sub_path": "process/fdm_process_meltingplot_mbl_10_nozzle.json" + }, + { + "name": "fdm_process_meltingplot_mbl_12_nozzle", + "sub_path": "process/fdm_process_meltingplot_mbl_12_nozzle.json" + }, + { + "name": "0.32mm Fine 0.8 nozzle @Meltingplot CHX 350", + "sub_path": "process/0.32mm Fine 0.8 nozzle @Meltingplot CHX 350.json" + }, + { + "name": "0.36mm Optimal 0.8 nozzle @Meltingplot CHX 350", + "sub_path": "process/0.36mm Optimal 0.8 nozzle @Meltingplot CHX 350.json" + }, + { + "name": "0.38mm Standard 0.8 nozzle @Meltingplot CHX 350", + "sub_path": "process/0.38mm Standard 0.8 nozzle @Meltingplot CHX 350.json" + }, + { + "name": "0.44mm Fine 1.0 nozzle @Meltingplot CHX 350", + "sub_path": "process/0.44mm Fine 1.0 nozzle @Meltingplot CHX 350.json" + }, + { + "name": "0.48mm Fine 1.2 nozzle @Meltingplot CHX 350", + "sub_path": "process/0.48mm Fine 1.2 nozzle @Meltingplot CHX 350.json" + }, + { + "name": "0.48mm Optimal 1.0 nozzle @Meltingplot CHX 350", + "sub_path": "process/0.48mm Optimal 1.0 nozzle @Meltingplot CHX 350.json" + }, + { + "name": "0.56mm Optimal 1.2 nozzle @Meltingplot CHX 350", + "sub_path": "process/0.56mm Optimal 1.2 nozzle @Meltingplot CHX 350.json" + }, + { + "name": "0.18mm Fine 0.4 nozzle @Meltingplot CHX 350", + "sub_path": "process/0.18mm Fine 0.4 nozzle @Meltingplot CHX 350.json" + }, + { + "name": "0.24mm Fine 0.6 nozzle @Meltingplot CHX 350", + "sub_path": "process/0.24mm Fine 0.6 nozzle @Meltingplot CHX 350.json" + }, + { + "name": "0.28mm Optimal 0.6 nozzle @Meltingplot CHX 350", + "sub_path": "process/0.28mm Optimal 0.6 nozzle @Meltingplot CHX 350.json" + }, + { + "name": "0.30mm Standard 0.6 nozzle @Meltingplot CHX 350", + "sub_path": "process/0.30mm Standard 0.6 nozzle @Meltingplot CHX 350.json" + }, + { + "name": "0.18mm Fine 0.4 nozzle @Meltingplot MBL", + "sub_path": "process/0.18mm Fine 0.4 nozzle @Meltingplot MBL.json" + }, + { + "name": "0.24mm Fine 0.6 nozzle @Meltingplot MBL", + "sub_path": "process/0.24mm Fine 0.6 nozzle @Meltingplot MBL.json" + }, + { + "name": "0.28mm Optimal 0.6 nozzle @Meltingplot MBL", + "sub_path": "process/0.28mm Optimal 0.6 nozzle @Meltingplot MBL.json" + }, + { + "name": "0.30mm Standard 0.6 nozzle @Meltingplot MBL", + "sub_path": "process/0.30mm Standard 0.6 nozzle @Meltingplot MBL.json" + }, + { + "name": "0.34mm Fine 0.8 nozzle @Meltingplot MBL", + "sub_path": "process/0.34mm Fine 0.8 nozzle @Meltingplot MBL.json" + }, + { + "name": "0.36mm Optimal 0.8 nozzle @Meltingplot MBL", + "sub_path": "process/0.36mm Optimal 0.8 nozzle @Meltingplot MBL.json" + }, + { + "name": "0.38mm Standard 0.8 nozzle @Meltingplot MBL", + "sub_path": "process/0.38mm Standard 0.8 nozzle @Meltingplot MBL.json" + }, + { + "name": "0.44mm Fine 1.0 nozzle @Meltingplot MBL", + "sub_path": "process/0.44mm Fine 1.0 nozzle @Meltingplot MBL.json" + }, + { + "name": "0.48mm Optimal 1.0 nozzle @Meltingplot MBL", + "sub_path": "process/0.48mm Optimal 1.0 nozzle @Meltingplot MBL.json" + }, + { + "name": "0.48mm Fine 1.2 nozzle @Meltingplot MBL", + "sub_path": "process/0.48mm Fine 1.2 nozzle @Meltingplot MBL.json" + }, + { + "name": "0.56mm Optimal 1.2 nozzle @Meltingplot MBL", + "sub_path": "process/0.56mm Optimal 1.2 nozzle @Meltingplot MBL.json" + } + ], + "filament_list": [ + { + "name": "Extrudr PLA NX2 Matt", + "sub_path": "filament/Extrudr PLA NX2 Matt.json" + }, + { + "name": "Meltingplot ABS", + "sub_path": "filament/Meltingplot ABS.json" + }, + { + "name": "Meltingplot ASA", + "sub_path": "filament/Meltingplot ASA.json" + }, + { + "name": "Meltingplot PA6 CF HT", + "sub_path": "filament/Meltingplot PA6 CF HT.json" + }, + { + "name": "Meltingplot PET-CF15", + "sub_path": "filament/Meltingplot PET-CF15.json" + }, + { + "name": "Meltingplot PETG", + "sub_path": "filament/Meltingplot PETG.json" + }, + { + "name": "Meltingplot PLA", + "sub_path": "filament/Meltingplot PLA.json" + }, + { + "name": "Meltingplot TitanX", + "sub_path": "filament/Meltingplot TitanX.json" + }, + { + "name": "Extrudr PLA NX2 Matt @0.4 nozzle", + "sub_path": "filament/Extrudr PLA NX2 Matt @0.4 nozzle.json" + }, + { + "name": "Extrudr PLA NX2 Matt @0.6 nozzle", + "sub_path": "filament/Extrudr PLA NX2 Matt @0.6 nozzle.json" + }, + { + "name": "Extrudr PLA NX2 Matt @0.8 nozzle", + "sub_path": "filament/Extrudr PLA NX2 Matt @0.8 nozzle.json" + }, + { + "name": "Extrudr PLA NX2 Matt @1.0 nozzle", + "sub_path": "filament/Extrudr PLA NX2 Matt @1.0 nozzle.json" + }, + { + "name": "Meltingplot ABS @0.4 nozzle", + "sub_path": "filament/Meltingplot ABS @0.4 nozzle.json" + }, + { + "name": "Meltingplot ABS @0.6 nozzle", + "sub_path": "filament/Meltingplot ABS @0.6 nozzle.json" + }, + { + "name": "Meltingplot ABS @0.8 nozzle", + "sub_path": "filament/Meltingplot ABS @0.8 nozzle.json" + }, + { + "name": "Meltingplot ABS @1.0 nozzle", + "sub_path": "filament/Meltingplot ABS @1.0 nozzle.json" + }, + { + "name": "Meltingplot ASA @0.4 nozzle", + "sub_path": "filament/Meltingplot ASA @0.4 nozzle.json" + }, + { + "name": "Meltingplot ASA @0.6 nozzle", + "sub_path": "filament/Meltingplot ASA @0.6 nozzle.json" + }, + { + "name": "Meltingplot ASA @0.8 nozzle", + "sub_path": "filament/Meltingplot ASA @0.8 nozzle.json" + }, + { + "name": "Meltingplot ASA @1.0 nozzle", + "sub_path": "filament/Meltingplot ASA @1.0 nozzle.json" + }, + { + "name": "Meltingplot PA6 CF HT @0.4 nozzle", + "sub_path": "filament/Meltingplot PA6 CF HT @0.4 nozzle.json" + }, + { + "name": "Meltingplot PA6 CF HT @0.6 nozzle", + "sub_path": "filament/Meltingplot PA6 CF HT @0.6 nozzle.json" + }, + { + "name": "Meltingplot PA6 CF HT @0.8 nozzle", + "sub_path": "filament/Meltingplot PA6 CF HT @0.8 nozzle.json" + }, + { + "name": "Meltingplot PA6 CF HT @1.0 nozzle", + "sub_path": "filament/Meltingplot PA6 CF HT @1.0 nozzle.json" + }, + { + "name": "Meltingplot PET-CF15 @0.4 nozzle", + "sub_path": "filament/Meltingplot PET-CF15 @0.4 nozzle.json" + }, + { + "name": "Meltingplot PET-CF15 @0.6 nozzle", + "sub_path": "filament/Meltingplot PET-CF15 @0.6 nozzle.json" + }, + { + "name": "Meltingplot PET-CF15 @0.8 nozzle", + "sub_path": "filament/Meltingplot PET-CF15 @0.8 nozzle.json" + }, + { + "name": "Meltingplot PET-CF15 @1.0 nozzle", + "sub_path": "filament/Meltingplot PET-CF15 @1.0 nozzle.json" + }, + { + "name": "Meltingplot PETG @0.4 nozzle", + "sub_path": "filament/Meltingplot PETG @0.4 nozzle.json" + }, + { + "name": "Meltingplot PETG @0.6 nozzle", + "sub_path": "filament/Meltingplot PETG @0.6 nozzle.json" + }, + { + "name": "Meltingplot PETG @0.8 nozzle", + "sub_path": "filament/Meltingplot PETG @0.8 nozzle.json" + }, + { + "name": "Meltingplot PETG @1.0 nozzle", + "sub_path": "filament/Meltingplot PETG @1.0 nozzle.json" + }, + { + "name": "Meltingplot PLA @0.4 nozzle", + "sub_path": "filament/Meltingplot PLA @0.4 nozzle.json" + }, + { + "name": "Meltingplot PLA @0.6 nozzle", + "sub_path": "filament/Meltingplot PLA @0.6 nozzle.json" + }, + { + "name": "Meltingplot PLA @0.8 nozzle", + "sub_path": "filament/Meltingplot PLA @0.8 nozzle.json" + }, + { + "name": "Meltingplot PLA @1.0 nozzle", + "sub_path": "filament/Meltingplot PLA @1.0 nozzle.json" + }, + { + "name": "Meltingplot TitanX @0.4 nozzle", + "sub_path": "filament/Meltingplot TitanX @0.4 nozzle.json" + }, + { + "name": "Meltingplot TitanX @0.6 nozzle", + "sub_path": "filament/Meltingplot TitanX @0.6 nozzle.json" + }, + { + "name": "Meltingplot TitanX @0.8 nozzle", + "sub_path": "filament/Meltingplot TitanX @0.8 nozzle.json" + }, + { + "name": "Meltingplot TitanX @1.0 nozzle", + "sub_path": "filament/Meltingplot TitanX @1.0 nozzle.json" + } + ], + "machine_list": [ + { + "name": "fdm_machine_common", + "sub_path": "machine/fdm_machine_common.json" + }, + { + "name": "fdm_machine_meltingplot_chx", + "sub_path": "machine/fdm_machine_meltingplot_chx.json" + }, + { + "name": "fdm_machine_meltingplot_mbl", + "sub_path": "machine/fdm_machine_meltingplot_mbl.json" + }, + { + "name": "Meltingplot CHX 350 0.4 nozzle", + "sub_path": "machine/Meltingplot CHX 350 0.4 nozzle.json" + }, + { + "name": "Meltingplot CHX 350 0.6 nozzle", + "sub_path": "machine/Meltingplot CHX 350 0.6 nozzle.json" + }, + { + "name": "Meltingplot CHX 350 0.8 nozzle", + "sub_path": "machine/Meltingplot CHX 350 0.8 nozzle.json" + }, + { + "name": "Meltingplot CHX 350 1.0 nozzle", + "sub_path": "machine/Meltingplot CHX 350 1.0 nozzle.json" + }, + { + "name": "Meltingplot CHX 350 1.2 nozzle", + "sub_path": "machine/Meltingplot CHX 350 1.2 nozzle.json" + }, + { + "name": "Meltingplot MBL 133 0.4 nozzle", + "sub_path": "machine/Meltingplot MBL 133 0.4 nozzle.json" + }, + { + "name": "Meltingplot MBL 133 0.6 nozzle", + "sub_path": "machine/Meltingplot MBL 133 0.6 nozzle.json" + }, + { + "name": "Meltingplot MBL 133 0.8 nozzle", + "sub_path": "machine/Meltingplot MBL 133 0.8 nozzle.json" + }, + { + "name": "Meltingplot MBL 133 1.0 nozzle", + "sub_path": "machine/Meltingplot MBL 133 1.0 nozzle.json" + }, + { + "name": "Meltingplot MBL 133 1.2 nozzle", + "sub_path": "machine/Meltingplot MBL 133 1.2 nozzle.json" + }, + { + "name": "Meltingplot MBL 136 0.4 nozzle", + "sub_path": "machine/Meltingplot MBL 136 0.4 nozzle.json" + }, + { + "name": "Meltingplot MBL 136 0.6 nozzle", + "sub_path": "machine/Meltingplot MBL 136 0.6 nozzle.json" + }, + { + "name": "Meltingplot MBL 136 0.8 nozzle", + "sub_path": "machine/Meltingplot MBL 136 0.8 nozzle.json" + }, + { + "name": "Meltingplot MBL 136 1.0 nozzle", + "sub_path": "machine/Meltingplot MBL 136 1.0 nozzle.json" + }, + { + "name": "Meltingplot MBL 136 1.2 nozzle", + "sub_path": "machine/Meltingplot MBL 136 1.2 nozzle.json" + }, + { + "name": "Meltingplot MBL 308 0.4 nozzle", + "sub_path": "machine/Meltingplot MBL 308 0.4 nozzle.json" + }, + { + "name": "Meltingplot MBL 308 0.6 nozzle", + "sub_path": "machine/Meltingplot MBL 308 0.6 nozzle.json" + }, + { + "name": "Meltingplot MBL 308 0.8 nozzle", + "sub_path": "machine/Meltingplot MBL 308 0.8 nozzle.json" + }, + { + "name": "Meltingplot MBL 308 1.0 nozzle", + "sub_path": "machine/Meltingplot MBL 308 1.0 nozzle.json" + }, + { + "name": "Meltingplot MBL 308 1.2 nozzle", + "sub_path": "machine/Meltingplot MBL 308 1.2 nozzle.json" + }, + { + "name": "Meltingplot MBL 480 0.4 nozzle", + "sub_path": "machine/Meltingplot MBL 480 0.4 nozzle.json" + }, + { + "name": "Meltingplot MBL 480 0.6 nozzle", + "sub_path": "machine/Meltingplot MBL 480 0.6 nozzle.json" + }, + { + "name": "Meltingplot MBL 480 0.8 nozzle", + "sub_path": "machine/Meltingplot MBL 480 0.8 nozzle.json" + }, + { + "name": "Meltingplot MBL 480 1.0 nozzle", + "sub_path": "machine/Meltingplot MBL 480 1.0 nozzle.json" + }, + { + "name": "Meltingplot MBL 480 1.2 nozzle", + "sub_path": "machine/Meltingplot MBL 480 1.2 nozzle.json" + } + ] +} diff --git a/resources/profiles/Meltingplot/Meltingplot CHX 350_cover.png b/resources/profiles/Meltingplot/Meltingplot CHX 350_cover.png new file mode 100644 index 0000000000000000000000000000000000000000..2f625aedc4d78a5f2888a506ff483caae0e5e041 GIT binary patch literal 147766 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%0DBt*F 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