diff --git a/UVtools.Core/FileFormats/ChituboxFile.cs b/UVtools.Core/FileFormats/ChituboxFile.cs
index b190edd..002a830 100644
--- a/UVtools.Core/FileFormats/ChituboxFile.cs
+++ b/UVtools.Core/FileFormats/ChituboxFile.cs
@@ -306,7 +306,7 @@ namespace UVtools.Core.FileFormats
[FieldOrder(12)] public uint SoftwareVersion { get; set; } = 0x01060300;
[FieldOrder(13)] public uint Unknown1 { get; set; }
[FieldOrder(14)] public uint Padding8 { get; set; }
- [FieldOrder(15)] public uint Padding9 { get; set; }
+ [FieldOrder(15)] public uint TransitionLayerCount { get; set; } // CTB not all printers
[FieldOrder(16)] public uint Padding10 { get; set; }
[FieldOrder(17)] public uint Padding11 { get; set; }
[FieldOrder(18)] public uint Padding12 { get; set; }
@@ -321,7 +321,7 @@ namespace UVtools.Core.FileFormats
public override string ToString()
{
- return $"{nameof(Padding1)}: {Padding1}, {nameof(Padding2)}: {Padding2}, {nameof(Padding3)}: {Padding3}, {nameof(Padding4)}: {Padding4}, {nameof(Padding5)}: {Padding5}, {nameof(Padding6)}: {Padding6}, {nameof(Padding7)}: {Padding7}, {nameof(MachineNameAddress)}: {MachineNameAddress}, {nameof(MachineNameSize)}: {MachineNameSize}, {nameof(EncryptionMode)}: {EncryptionMode}, {nameof(MysteriousId)}: {MysteriousId}, {nameof(AntiAliasLevel)}: {AntiAliasLevel}, {nameof(SoftwareVersion)}: {SoftwareVersion}, {nameof(Unknown1)}: {Unknown1}, {nameof(Padding8)}: {Padding8}, {nameof(Padding9)}: {Padding9}, {nameof(Padding10)}: {Padding10}, {nameof(Padding11)}: {Padding11}, {nameof(Padding12)}: {Padding12}, {nameof(MachineName)}: {MachineName}";
+ return $"{nameof(Padding1)}: {Padding1}, {nameof(Padding2)}: {Padding2}, {nameof(Padding3)}: {Padding3}, {nameof(Padding4)}: {Padding4}, {nameof(Padding5)}: {Padding5}, {nameof(Padding6)}: {Padding6}, {nameof(Padding7)}: {Padding7}, {nameof(MachineNameAddress)}: {MachineNameAddress}, {nameof(MachineNameSize)}: {MachineNameSize}, {nameof(EncryptionMode)}: {EncryptionMode}, {nameof(MysteriousId)}: {MysteriousId}, {nameof(AntiAliasLevel)}: {AntiAliasLevel}, {nameof(SoftwareVersion)}: {SoftwareVersion}, {nameof(Unknown1)}: {Unknown1}, {nameof(Padding8)}: {Padding8}, {nameof(TransitionLayerCount)}: {TransitionLayerCount}, {nameof(Padding10)}: {Padding10}, {nameof(Padding11)}: {Padding11}, {nameof(Padding12)}: {Padding12}, {nameof(MachineName)}: {MachineName}";
}
}
diff --git a/UVtools.Core/PixelEditor/PixelDrainHole.cs b/UVtools.Core/PixelEditor/PixelDrainHole.cs
index 1f03edb..4dd82f9 100644
--- a/UVtools.Core/PixelEditor/PixelDrainHole.cs
+++ b/UVtools.Core/PixelEditor/PixelDrainHole.cs
@@ -11,9 +11,14 @@ namespace UVtools.Core.PixelEditor
{
public class PixelDrainHole : PixelOperation
{
+ private byte _diameter = 50;
public override PixelOperationType OperationType => PixelOperationType.DrainHole;
- public byte Diameter { get; }
+ public byte Diameter
+ {
+ get => _diameter;
+ set => RaiseAndSetIfChanged(ref _diameter, value);
+ }
public PixelDrainHole(){}
diff --git a/UVtools.Core/PixelEditor/PixelSupport.cs b/UVtools.Core/PixelEditor/PixelSupport.cs
index 66ce20f..31374e5 100644
--- a/UVtools.Core/PixelEditor/PixelSupport.cs
+++ b/UVtools.Core/PixelEditor/PixelSupport.cs
@@ -11,13 +11,28 @@ namespace UVtools.Core.PixelEditor
{
public class PixelSupport : PixelOperation
{
+ private byte _tipDiameter = 19;
+ private byte _pillarDiameter = 32;
+ private byte _baseDiameter = 60;
public override PixelOperationType OperationType => PixelOperationType.Supports;
- public byte TipDiameter { get; set; }
+ public byte TipDiameter
+ {
+ get => _tipDiameter;
+ set => RaiseAndSetIfChanged(ref _tipDiameter, value);
+ }
- public byte PillarDiameter { get; set; }
+ public byte PillarDiameter
+ {
+ get => _pillarDiameter;
+ set => RaiseAndSetIfChanged(ref _pillarDiameter, value);
+ }
- public byte BaseDiameter { get; set; }
+ public byte BaseDiameter
+ {
+ get => _baseDiameter;
+ set => RaiseAndSetIfChanged(ref _baseDiameter, value);
+ }
public PixelSupport(){}
diff --git a/UVtools.Core/PixelEditor/PixelText.cs b/UVtools.Core/PixelEditor/PixelText.cs
index 7f84b7c..5d0f286 100644
--- a/UVtools.Core/PixelEditor/PixelText.cs
+++ b/UVtools.Core/PixelEditor/PixelText.cs
@@ -14,14 +14,44 @@ namespace UVtools.Core.PixelEditor
{
public class PixelText : PixelOperation
{
+ private FontFace _font;
+ private double _fontScale = 1;
+ private ushort _thickness = 1;
+ private string _text;
+ private bool _mirror;
public override PixelOperationType OperationType => PixelOperationType.Text;
- public FontFace Font { get; set; }
+ public static FontFace[] FontFaces => (FontFace[]) Enum.GetValues(typeof(FontFace));
- public double FontScale { get; set; }
- public ushort Thickness { get; set; }
- public string Text { get; set; }
- public bool Mirror { get; set; }
+ public FontFace Font
+ {
+ get => _font;
+ set => RaiseAndSetIfChanged(ref _font, value);
+ }
+
+ public double FontScale
+ {
+ get => _fontScale;
+ set => RaiseAndSetIfChanged(ref _fontScale, value);
+ }
+
+ public ushort Thickness
+ {
+ get => _thickness;
+ set => RaiseAndSetIfChanged(ref _thickness, value);
+ }
+
+ public string Text
+ {
+ get => _text;
+ set => RaiseAndSetIfChanged(ref _text, value);
+ }
+
+ public bool Mirror
+ {
+ get => _mirror;
+ set => RaiseAndSetIfChanged(ref _mirror, value);
+ }
public bool IsAdd { get; }
diff --git a/UVtools.WPF/App.axaml.cs b/UVtools.WPF/App.axaml.cs
index 0e99fdb..8e9c32b 100644
--- a/UVtools.WPF/App.axaml.cs
+++ b/UVtools.WPF/App.axaml.cs
@@ -161,7 +161,7 @@ namespace UVtools.WPF
}
public static Bitmap GetBitmapFromAsset(string url) => new Bitmap(GetAsset(url));
-
+
#endregion
}
}
diff --git a/UVtools.WPF/Assets/PrusaSlicer/printer/AnyCubic Photon S.ini b/UVtools.WPF/Assets/PrusaSlicer/printer/AnyCubic Photon S.ini
deleted file mode 100644
index 3b3babe..0000000
--- a/UVtools.WPF/Assets/PrusaSlicer/printer/AnyCubic Photon S.ini
+++ /dev/null
@@ -1,37 +0,0 @@
-# generated by PrusaSlicer 2.2.0+win64 on 2020-06-29 at 20:22:18 UTC
-absolute_correction = 0
-area_fill = 50
-bed_custom_model =
-bed_custom_texture =
-bed_shape = 0x0,121x0,121x68,0x68
-default_sla_material_profile = Prusa Orange Tough 0.05
-default_sla_print_profile = 0.05 Normal
-display_height = 68
-display_mirror_x = 0
-display_mirror_y = 1
-display_orientation = portrait
-display_pixels_x = 2560
-display_pixels_y = 1440
-display_width = 121
-elefant_foot_compensation = 0.2
-elefant_foot_min_width = 0.2
-fast_tilt_time = 5
-gamma_correction = 1
-inherits = Original Prusa SL1
-max_exposure_time = 120
-max_initial_exposure_time = 300
-max_print_height = 165
-min_exposure_time = 1
-min_initial_exposure_time = 1
-print_host =
-printer_model = SL1
-printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_SL1\nPRINTER_VENDOR_ANYCUBIC\nPRINTER_MODEL_PHOTON_S\n\nSTART_CUSTOM_VALUES\nFLIP_XY\nLayerOffTime_1\nLiftHeight_6\nLiftingSpeed_60\nRetractSpeed_150\nAntiAliasing_4 ; Use 0 or 1 for disable AntiAliasing with "printer gamma correction" set to 0, otherwise use multiples of 2 and "gamma correction" set to 1 for enable\nEND_CUSTOM_VALUES
-printer_settings_id =
-printer_technology = SLA
-printer_variant = default
-printer_vendor =
-printhost_apikey =
-printhost_cafile =
-relative_correction = 1,1
-slow_tilt_time = 8
-thumbnails = 400x400,800x480
diff --git a/UVtools.WPF/Assets/PrusaSlicer/printer/AnyCubic Photon Zero.ini b/UVtools.WPF/Assets/PrusaSlicer/printer/AnyCubic Photon Zero.ini
deleted file mode 100644
index 59ff711..0000000
--- a/UVtools.WPF/Assets/PrusaSlicer/printer/AnyCubic Photon Zero.ini
+++ /dev/null
@@ -1,37 +0,0 @@
-# generated by PrusaSlicer 2.2.0+win64 on 2020-06-29 at 20:22:23 UTC
-absolute_correction = 0
-area_fill = 50
-bed_custom_model =
-bed_custom_texture =
-bed_shape = 0x0,98.6x0,98.6x55.4,0x55.4
-default_sla_material_profile = Prusa Orange Tough 0.05
-default_sla_print_profile = 0.05 Normal
-display_height = 55.4
-display_mirror_x = 0
-display_mirror_y = 1
-display_orientation = portrait
-display_pixels_x = 854
-display_pixels_y = 480
-display_width = 98.6
-elefant_foot_compensation = 0.2
-elefant_foot_min_width = 0.2
-fast_tilt_time = 5
-gamma_correction = 1
-inherits = Original Prusa SL1
-max_exposure_time = 120
-max_initial_exposure_time = 300
-max_print_height = 150
-min_exposure_time = 1
-min_initial_exposure_time = 1
-print_host =
-printer_model = SL1
-printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_SL1\nPRINTER_VENDOR_ANYCUBIC\nPRINTER_MODEL_PHOTON_ZERO\n\nSTART_CUSTOM_VALUES\nFLIP_XY\nLayerOffTime_1\nLiftHeight_6\nLiftingSpeed_60\nRetractSpeed_150\nAntiAliasing_4 ; Use 0 or 1 for disable AntiAliasing with "printer gamma correction" set to 0, otherwise use multiples of 2 and "gamma correction" set to 1 for enable\nEND_CUSTOM_VALUES
-printer_settings_id =
-printer_technology = SLA
-printer_variant = default
-printer_vendor =
-printhost_apikey =
-printhost_cafile =
-relative_correction = 1,1
-slow_tilt_time = 8
-thumbnails = 400x400,800x480
diff --git a/UVtools.WPF/Assets/PrusaSlicer/printer/AnyCubic Photon.ini b/UVtools.WPF/Assets/PrusaSlicer/printer/AnyCubic Photon.ini
deleted file mode 100644
index b438e38..0000000
--- a/UVtools.WPF/Assets/PrusaSlicer/printer/AnyCubic Photon.ini
+++ /dev/null
@@ -1,37 +0,0 @@
-# generated by PrusaSlicer 2.2.0+win64 on 2020-06-29 at 20:22:12 UTC
-absolute_correction = 0
-area_fill = 50
-bed_custom_model =
-bed_custom_texture =
-bed_shape = 0x0,120.96x0,120.96x68.04,0x68.04
-default_sla_material_profile = Prusa Orange Tough 0.05
-default_sla_print_profile = 0.05 Normal
-display_height = 68.04
-display_mirror_x = 0
-display_mirror_y = 1
-display_orientation = portrait
-display_pixels_x = 2560
-display_pixels_y = 1440
-display_width = 120.96
-elefant_foot_compensation = 0.2
-elefant_foot_min_width = 0.2
-fast_tilt_time = 5
-gamma_correction = 1
-inherits = Original Prusa SL1
-max_exposure_time = 120
-max_initial_exposure_time = 300
-max_print_height = 155
-min_exposure_time = 1
-min_initial_exposure_time = 1
-print_host =
-printer_model = SL1
-printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_SL1\nPRINTER_VENDOR_ANYCUBIC\nPRINTER_MODEL_PHOTON\n\nSTART_CUSTOM_VALUES\nFLIP_XY\nLayerOffTime_0\nBottomLightOffDelay_2\nBottomLiftHeight_5\nLiftHeight_5\nBottomLiftSpeed_65\nLiftSpeed_65\nRetractSpeed_150\nBottomLightPWM_255\nLightPWM_255\nAntiAliasing_4 ; Use 0 or 1 for disable AntiAliasing with "printer gamma correction" set to 0, otherwise use multiples of 2 and "gamma correction" set to 1 for enable\nEND_CUSTOM_VALUES
-printer_settings_id =
-printer_technology = SLA
-printer_variant = default
-printer_vendor =
-printhost_apikey =
-printhost_cafile =
-relative_correction = 1,1
-slow_tilt_time = 8
-thumbnails = 400x400,800x480
diff --git a/UVtools.WPF/Assets/PrusaSlicer/printer/Creality LD-002H.ini b/UVtools.WPF/Assets/PrusaSlicer/printer/Creality LD-002H.ini
deleted file mode 100644
index 22c0ffd..0000000
--- a/UVtools.WPF/Assets/PrusaSlicer/printer/Creality LD-002H.ini
+++ /dev/null
@@ -1,37 +0,0 @@
-# generated by PrusaSlicer 2.2.0+win64 on 2020-07-13 at 23:26:09 UTC
-absolute_correction = 0
-area_fill = 50
-bed_custom_model =
-bed_custom_texture =
-bed_shape = 0x0,130.56x0,130.56x82.62,0x82.62
-default_sla_material_profile = Prusa Orange Tough 0.05
-default_sla_print_profile = 0.05 Normal
-display_height = 82.62
-display_mirror_x = 0
-display_mirror_y = 1
-display_orientation = portrait
-display_pixels_x = 2560
-display_pixels_y = 1620
-display_width = 130.56
-elefant_foot_compensation = 0.2
-elefant_foot_min_width = 0.2
-fast_tilt_time = 5
-gamma_correction = 1
-inherits = Original Prusa SL1
-max_exposure_time = 120
-max_initial_exposure_time = 300
-max_print_height = 160
-min_exposure_time = 1
-min_initial_exposure_time = 1
-print_host =
-printer_model = SL1
-printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_SL1\nPRINTER_VENDOR_CREALITY\nPRINTER_MODEL_LD-002H\n\nSTART_CUSTOM_VALUES\nFLIP_XY\nLayerOffTime_0\nBottomLightOffDelay_2\nBottomLiftHeight_5\nLiftHeight_7\nBottomLiftSpeed_50\nLiftSpeed_50\nRetractSpeed_150\nBottomLightPWM_255\nLightPWM_255\nAntiAliasing_4 ; Use 0 or 1 for disable AntiAliasing with "printer gamma correction" set to 0, otherwise use multiples of 2 and "gamma correction" set to 1 for enable\nEND_CUSTOM_VALUES
-printer_settings_id =
-printer_technology = SLA
-printer_variant = default
-printer_vendor =
-printhost_apikey =
-printhost_cafile =
-relative_correction = 1,1
-slow_tilt_time = 8
-thumbnails = 400x400,800x480
diff --git a/UVtools.WPF/Assets/PrusaSlicer/printer/Creality LD-002R.ini b/UVtools.WPF/Assets/PrusaSlicer/printer/Creality LD-002R.ini
deleted file mode 100644
index 5a9fce4..0000000
--- a/UVtools.WPF/Assets/PrusaSlicer/printer/Creality LD-002R.ini
+++ /dev/null
@@ -1,37 +0,0 @@
-# generated by PrusaSlicer 2.2.0+win64 on 2020-06-29 at 20:22:31 UTC
-absolute_correction = 0
-area_fill = 50
-bed_custom_model =
-bed_custom_texture =
-bed_shape = 0x0,120.96x0,120.96x68.04,0x68.04
-default_sla_material_profile = Prusa Orange Tough 0.05
-default_sla_print_profile = 0.05 Normal
-display_height = 68.04
-display_mirror_x = 0
-display_mirror_y = 1
-display_orientation = portrait
-display_pixels_x = 2560
-display_pixels_y = 1440
-display_width = 120.96
-elefant_foot_compensation = 0.2
-elefant_foot_min_width = 0.2
-fast_tilt_time = 5
-gamma_correction = 1
-inherits = Original Prusa SL1
-max_exposure_time = 120
-max_initial_exposure_time = 300
-max_print_height = 160
-min_exposure_time = 1
-min_initial_exposure_time = 1
-print_host =
-printer_model = SL1
-printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_SL1\nPRINTER_VENDOR_CREALITY\nPRINTER_MODEL_LD-002R\n\nSTART_CUSTOM_VALUES\nFLIP_XY\nLayerOffTime_0\nBottomLightOffDelay_2\nBottomLiftHeight_5\nLiftHeight_5\nBottomLiftSpeed_65\nLiftSpeed_65\nRetractSpeed_150\nBottomLightPWM_255\nLightPWM_255\nAntiAliasing_4 ; Use 0 or 1 for disable AntiAliasing with "printer gamma correction" set to 0, otherwise use multiples of 2 and "gamma correction" set to 1 for enable\nEND_CUSTOM_VALUES
-printer_settings_id =
-printer_technology = SLA
-printer_variant = default
-printer_vendor =
-printhost_apikey =
-printhost_cafile =
-relative_correction = 1,1
-slow_tilt_time = 8
-thumbnails = 400x400,800x480
diff --git a/UVtools.WPF/Assets/PrusaSlicer/printer/EPAX X1.ini b/UVtools.WPF/Assets/PrusaSlicer/printer/EPAX X1.ini
deleted file mode 100644
index 3407149..0000000
--- a/UVtools.WPF/Assets/PrusaSlicer/printer/EPAX X1.ini
+++ /dev/null
@@ -1,37 +0,0 @@
-# generated by PrusaSlicer 2.2.0+win64 on 2020-06-29 at 20:22:36 UTC
-absolute_correction = 0
-area_fill = 50
-bed_custom_model =
-bed_custom_texture =
-bed_shape = 0x0,120.96x0,120.96x68.04,0x68.04
-default_sla_material_profile = Prusa Orange Tough 0.05
-default_sla_print_profile = 0.05 Normal
-display_height = 68.04
-display_mirror_x = 0
-display_mirror_y = 1
-display_orientation = portrait
-display_pixels_x = 2560
-display_pixels_y = 1440
-display_width = 120.96
-elefant_foot_compensation = 0.2
-elefant_foot_min_width = 0.2
-fast_tilt_time = 5
-gamma_correction = 1
-inherits = Original Prusa SL1
-max_exposure_time = 120
-max_initial_exposure_time = 300
-max_print_height = 155
-min_exposure_time = 1
-min_initial_exposure_time = 1
-print_host =
-printer_model = SL1
-printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_SL1\nPRINTER_VENDOR_EPAX\nPRINTER_MODEL_X1\n\nSTART_CUSTOM_VALUES\nFLIP_XY\nLayerOffTime_0\nBottomLightOffDelay_2\nBottomLiftHeight_5\nLiftHeight_5\nBottomLiftSpeed_40\nLiftSpeed_60\nRetractSpeed_150\nBottomLightPWM_255\nLightPWM_255\nAntiAliasing_4 ; Use 0 or 1 for disable AntiAliasing with "printer gamma correction" set to 0, otherwise use multiples of 2 and "gamma correction" set to 1 for enable\nEND_CUSTOM_VALUES
-printer_settings_id =
-printer_technology = SLA
-printer_variant = default
-printer_vendor =
-printhost_apikey =
-printhost_cafile =
-relative_correction = 1,1
-slow_tilt_time = 8
-thumbnails = 400x400,800x480
diff --git a/UVtools.WPF/Assets/PrusaSlicer/printer/EPAX X10 4K Mono.ini b/UVtools.WPF/Assets/PrusaSlicer/printer/EPAX X10 4K Mono.ini
deleted file mode 100644
index c36afa4..0000000
--- a/UVtools.WPF/Assets/PrusaSlicer/printer/EPAX X10 4K Mono.ini
+++ /dev/null
@@ -1,37 +0,0 @@
-# generated by PrusaSlicer 2.2.0+win64 on 2020-06-30 at 23:52:31 UTC
-absolute_correction = 0
-area_fill = 50
-bed_custom_model =
-bed_custom_texture =
-bed_shape = 0x0,192x0,192x120,0x120
-default_sla_material_profile = Prusa Orange Tough 0.05
-default_sla_print_profile = 0.05 Normal
-display_height = 120
-display_mirror_x = 1
-display_mirror_y = 0
-display_orientation = landscape
-display_pixels_x = 3840
-display_pixels_y = 2160
-display_width = 192
-elefant_foot_compensation = 0.2
-elefant_foot_min_width = 0.2
-fast_tilt_time = 5
-gamma_correction = 1
-inherits = Original Prusa SL1
-max_exposure_time = 120
-max_initial_exposure_time = 300
-max_print_height = 250
-min_exposure_time = 1
-min_initial_exposure_time = 1
-print_host =
-printer_model = SL1
-printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_SL1\nPRINTER_VENDOR_EPAX\nPRINTER_MODEL_X10-4KMONO\n\nSTART_CUSTOM_VALUES\nLayerOffTime_0\nBottomLightOffDelay_10\nBottomLiftHeight_15\nLiftHeight_12\nBottomLiftSpeed_40\nLiftSpeed_40\nRetractSpeed_150\nBottomLightPWM_255\nLightPWM_255\nAntiAliasing_4 ; Use 0 or 1 for disable AntiAliasing with "printer gamma correction" set to 0, otherwise use multiples of 2 and "gamma correction" set to 1 for enable\nEND_CUSTOM_VALUES
-printer_settings_id =
-printer_technology = SLA
-printer_variant = default
-printer_vendor =
-printhost_apikey =
-printhost_cafile =
-relative_correction = 1,1
-slow_tilt_time = 8
-thumbnails = 400x400,800x480
diff --git a/UVtools.WPF/Assets/PrusaSlicer/printer/EPAX X10.ini b/UVtools.WPF/Assets/PrusaSlicer/printer/EPAX X10.ini
deleted file mode 100644
index 14e3cb3..0000000
--- a/UVtools.WPF/Assets/PrusaSlicer/printer/EPAX X10.ini
+++ /dev/null
@@ -1,37 +0,0 @@
-# generated by PrusaSlicer 2.2.0+win64 on 2020-06-29 at 20:22:43 UTC
-absolute_correction = 0
-area_fill = 50
-bed_custom_model =
-bed_custom_texture =
-bed_shape = 0x0,216.57x0,216.57x135.36,0x135.36
-default_sla_material_profile = Prusa Orange Tough 0.05
-default_sla_print_profile = 0.05 Normal
-display_height = 135.36
-display_mirror_x = 0
-display_mirror_y = 1
-display_orientation = portrait
-display_pixels_x = 2560
-display_pixels_y = 1600
-display_width = 216.57
-elefant_foot_compensation = 0.2
-elefant_foot_min_width = 0.2
-fast_tilt_time = 5
-gamma_correction = 1
-inherits = Original Prusa SL1
-max_exposure_time = 120
-max_initial_exposure_time = 300
-max_print_height = 250
-min_exposure_time = 1
-min_initial_exposure_time = 1
-print_host =
-printer_model = SL1
-printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_SL1\nPRINTER_VENDOR_EPAX\nPRINTER_MODEL_X10\n\nSTART_CUSTOM_VALUES\nFLIP_XY\nLayerOffTime_0\nBottomLightOffDelay_12\nBottomLiftHeight_7\nLiftHeight_7\nBottomLiftSpeed_40\nLiftSpeed_60\nRetractSpeed_150\nBottomLightPWM_255\nLightPWM_255\nAntiAliasing_4 ; Use 0 or 1 for disable AntiAliasing with "printer gamma correction" set to 0, otherwise use multiples of 2 and "gamma correction" set to 1 for enable\nEND_CUSTOM_VALUES
-printer_settings_id =
-printer_technology = SLA
-printer_variant = default
-printer_vendor =
-printhost_apikey =
-printhost_cafile =
-relative_correction = 1,1
-slow_tilt_time = 8
-thumbnails = 400x400,800x480
diff --git a/UVtools.WPF/Assets/PrusaSlicer/printer/EPAX X133 4K Mono.ini b/UVtools.WPF/Assets/PrusaSlicer/printer/EPAX X133 4K Mono.ini
deleted file mode 100644
index 0345529..0000000
--- a/UVtools.WPF/Assets/PrusaSlicer/printer/EPAX X133 4K Mono.ini
+++ /dev/null
@@ -1,37 +0,0 @@
-# generated by PrusaSlicer 2.2.0+win64 on 2020-06-12 at 00:39:25 UTC
-absolute_correction = 0
-area_fill = 50
-bed_custom_model =
-bed_custom_texture =
-bed_shape = 0x0,216.576x0,216.576x135.36,0x135.36
-default_sla_material_profile = Prusa Orange Tough 0.05
-default_sla_print_profile = 0.05 Normal
-display_height = 135.36
-display_mirror_x = 1
-display_mirror_y = 0
-display_orientation = landscape
-display_pixels_x = 3840
-display_pixels_y = 2160
-display_width = 216.576
-elefant_foot_compensation = 0.2
-elefant_foot_min_width = 0.2
-fast_tilt_time = 5
-gamma_correction = 1
-inherits = Original Prusa SL1
-max_exposure_time = 120
-max_initial_exposure_time = 300
-max_print_height = 400
-min_exposure_time = 1
-min_initial_exposure_time = 1
-print_host =
-printer_model = SL1
-printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_SL1\nPRINTER_VENDOR_EPAX\nPRINTER_MODEL_X133-4KMONO\n\nSTART_CUSTOM_VALUES\nLayerOffTime_0\nBottomLightOffDelay_10\nBottomLiftHeight_15\nLiftHeight_12\nBottomLiftSpeed_40\nLiftSpeed_40\nRetractSpeed_150\nBottomLightPWM_255\nLightPWM_255\nAntiAliasing_4 ; Use 0 or 1 for disable AntiAliasing with "printer gamma correction" set to 0, otherwise use multiples of 2 and "gamma correction" set to 1 for enable\nEND_CUSTOM_VALUES
-printer_settings_id =
-printer_technology = SLA
-printer_variant = default
-printer_vendor =
-printhost_apikey =
-printhost_cafile =
-relative_correction = 1,1
-slow_tilt_time = 8
-thumbnails = 400x400,800x480
diff --git a/UVtools.WPF/Assets/PrusaSlicer/printer/EPAX X156 4K Color.ini b/UVtools.WPF/Assets/PrusaSlicer/printer/EPAX X156 4K Color.ini
deleted file mode 100644
index 93b5521..0000000
--- a/UVtools.WPF/Assets/PrusaSlicer/printer/EPAX X156 4K Color.ini
+++ /dev/null
@@ -1,37 +0,0 @@
-# generated by PrusaSlicer 2.2.0+win64 on 2020-06-12 at 00:39:31 UTC
-absolute_correction = 0
-area_fill = 50
-bed_custom_model =
-bed_custom_texture =
-bed_shape = 0x0,345.6x0,345.6x194.4,0x194.4
-default_sla_material_profile = Prusa Orange Tough 0.05
-default_sla_print_profile = 0.05 Normal
-display_height = 194.4
-display_mirror_x = 1
-display_mirror_y = 0
-display_orientation = landscape
-display_pixels_x = 3840
-display_pixels_y = 2160
-display_width = 345.6
-elefant_foot_compensation = 0.2
-elefant_foot_min_width = 0.2
-fast_tilt_time = 5
-gamma_correction = 1
-inherits = Original Prusa SL1
-max_exposure_time = 120
-max_initial_exposure_time = 300
-max_print_height = 400
-min_exposure_time = 1
-min_initial_exposure_time = 1
-print_host =
-printer_model = SL1
-printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_SL1\nPRINTER_VENDOR_EPAX\nPRINTER_MODEL_X156-4KCOLOR\n\nSTART_CUSTOM_VALUES\nLayerOffTime_0\nBottomLightOffDelay_0\nBottomLiftHeight_15\nLiftHeight_12\nBottomLiftSpeed_40\nLiftSpeed_40\nRetractSpeed_150\nBottomLightPWM_255\nLightPWM_255\nAntiAliasing_4 ; Use 0 or 1 for disable AntiAliasing with "printer gamma correction" set to 0, otherwise use multiples of 2 and "gamma correction" set to 1 for enable\nEND_CUSTOM_VALUES
-printer_settings_id =
-printer_technology = SLA
-printer_variant = default
-printer_vendor =
-printhost_apikey =
-printhost_cafile =
-relative_correction = 1,1
-slow_tilt_time = 8
-thumbnails = 400x400,800x480
diff --git a/UVtools.WPF/Assets/PrusaSlicer/printer/Elegoo Mars 2 Pro.ini b/UVtools.WPF/Assets/PrusaSlicer/printer/Elegoo Mars 2 Pro.ini
deleted file mode 100644
index d493fdf..0000000
--- a/UVtools.WPF/Assets/PrusaSlicer/printer/Elegoo Mars 2 Pro.ini
+++ /dev/null
@@ -1,37 +0,0 @@
-# generated by PrusaSlicer 2.2.0+win64 on 2020-07-13 at 23:29:07 UTC
-absolute_correction = 0
-area_fill = 50
-bed_custom_model =
-bed_custom_texture =
-bed_shape = 0x0,130.56x0,130.56x82.62,0x82.62
-default_sla_material_profile = Prusa Orange Tough 0.05
-default_sla_print_profile = 0.05 Normal
-display_height = 82.62
-display_mirror_x = 0
-display_mirror_y = 1
-display_orientation = portrait
-display_pixels_x = 2560
-display_pixels_y = 1620
-display_width = 130.56
-elefant_foot_compensation = 0.2
-elefant_foot_min_width = 0.2
-fast_tilt_time = 5
-gamma_correction = 1
-inherits = Original Prusa SL1
-max_exposure_time = 120
-max_initial_exposure_time = 300
-max_print_height = 160
-min_exposure_time = 1
-min_initial_exposure_time = 1
-print_host =
-printer_model = SL1
-printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_SL1\nPRINTER_VENDOR_ELEGOO\nPRINTER_MODEL_MARS2_PRO\n\nSTART_CUSTOM_VALUES\nFLIP_XY\nLayerOffTime_0\nBottomLightOffDelay_0\nBottomLiftHeight_5\nLiftHeight_5\nBottomLiftSpeed_90\nLiftSpeed_100\nRetractSpeed_150\nBottomLightPWM_255\nLightPWM_255\nAntiAliasing_4 ; Use 0 or 1 for disable AntiAliasing with "printer gamma correction" set to 0, otherwise use multiples of 2 and "gamma correction" set to 1 for enable\nEND_CUSTOM_VALUES
-printer_settings_id =
-printer_technology = SLA
-printer_variant = default
-printer_vendor =
-printhost_apikey =
-printhost_cafile =
-relative_correction = 1,1
-slow_tilt_time = 8
-thumbnails = 400x400,800x480
diff --git a/UVtools.WPF/Assets/PrusaSlicer/printer/Elegoo Mars Saturn.ini b/UVtools.WPF/Assets/PrusaSlicer/printer/Elegoo Mars Saturn.ini
deleted file mode 100644
index 3bc0f71..0000000
--- a/UVtools.WPF/Assets/PrusaSlicer/printer/Elegoo Mars Saturn.ini
+++ /dev/null
@@ -1,37 +0,0 @@
-# generated by PrusaSlicer 2.2.0+win64 on 2020-06-29 at 20:32:02 UTC
-absolute_correction = 0
-area_fill = 50
-bed_custom_model =
-bed_custom_texture =
-bed_shape = 0x0,192x0,192x120,0x120
-default_sla_material_profile = Prusa Orange Tough 0.05
-default_sla_print_profile = 0.05 Normal
-display_height = 120
-display_mirror_x = 0
-display_mirror_y = 1
-display_orientation = landscape
-display_pixels_x = 2560
-display_pixels_y = 1600
-display_width = 192
-elefant_foot_compensation = 0.2
-elefant_foot_min_width = 0.2
-fast_tilt_time = 5
-gamma_correction = 1
-inherits = Original Prusa SL1
-max_exposure_time = 120
-max_initial_exposure_time = 300
-max_print_height = 200
-min_exposure_time = 1
-min_initial_exposure_time = 1
-print_host =
-printer_model = SL1
-printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_SL1\nPRINTER_VENDOR_ELEGOO\nPRINTER_MODEL_SATURN\n\nSTART_CUSTOM_VALUES\nLayerOffTime_0\nBottomLightOffDelay_0\nBottomLiftHeight_5\nLiftHeight_7\nBottomLiftSpeed_70\nLiftSpeed_70\nRetractSpeed_70\nBottomLightPWM_255\nLightPWM_255\nAntiAliasing_4 ; Use 0 or 1 for disable AntiAliasing with "printer gamma correction" set to 0, otherwise use multiples of 2 and "gamma correction" set to 1 for enable\nEND_CUSTOM_VALUES
-printer_settings_id =
-printer_technology = SLA
-printer_variant = default
-printer_vendor =
-printhost_apikey =
-printhost_cafile =
-relative_correction = 1,1
-slow_tilt_time = 8
-thumbnails = 400x400,800x480
diff --git a/UVtools.WPF/Assets/PrusaSlicer/printer/Elegoo Mars.ini b/UVtools.WPF/Assets/PrusaSlicer/printer/Elegoo Mars.ini
deleted file mode 100644
index 5ab1c72..0000000
--- a/UVtools.WPF/Assets/PrusaSlicer/printer/Elegoo Mars.ini
+++ /dev/null
@@ -1,37 +0,0 @@
-# generated by PrusaSlicer 2.2.0+win64 on 2020-06-29 at 20:31:58 UTC
-absolute_correction = 0
-area_fill = 50
-bed_custom_model =
-bed_custom_texture =
-bed_shape = 0x0,120.96x0,120.96x68.04,0x68.04
-default_sla_material_profile = Prusa Orange Tough 0.05
-default_sla_print_profile = 0.05 Normal
-display_height = 68.04
-display_mirror_x = 0
-display_mirror_y = 1
-display_orientation = portrait
-display_pixels_x = 2560
-display_pixels_y = 1440
-display_width = 120.96
-elefant_foot_compensation = 0.2
-elefant_foot_min_width = 0.2
-fast_tilt_time = 5
-gamma_correction = 1
-inherits = Original Prusa SL1
-max_exposure_time = 120
-max_initial_exposure_time = 300
-max_print_height = 150
-min_exposure_time = 1
-min_initial_exposure_time = 1
-print_host =
-printer_model = SL1
-printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_SL1\nPRINTER_VENDOR_ELEGOO\nPRINTER_MODEL_MARS\n\nSTART_CUSTOM_VALUES\nFLIP_XY\nLayerOffTime_0\nBottomLightOffDelay_0\nBottomLiftHeight_5\nLiftHeight_5\nBottomLiftSpeed_90\nLiftSpeed_100\nRetractSpeed_150\nBottomLightPWM_255\nLightPWM_255\nAntiAliasing_4 ; Use 0 or 1 for disable AntiAliasing with "printer gamma correction" set to 0, otherwise use multiples of 2 and "gamma correction" set to 1 for enable\nEND_CUSTOM_VALUES
-printer_settings_id =
-printer_technology = SLA
-printer_variant = default
-printer_vendor =
-printhost_apikey =
-printhost_cafile =
-relative_correction = 1,1
-slow_tilt_time = 8
-thumbnails = 400x400,800x480
diff --git a/UVtools.WPF/Assets/PrusaSlicer/printer/Kelant S400.ini b/UVtools.WPF/Assets/PrusaSlicer/printer/Kelant S400.ini
deleted file mode 100644
index 53b25a5..0000000
--- a/UVtools.WPF/Assets/PrusaSlicer/printer/Kelant S400.ini
+++ /dev/null
@@ -1,37 +0,0 @@
-# generated by PrusaSlicer 2.2.0+win64 on 2020-09-05 at 19:03:56 UTC
-absolute_correction = 0
-area_fill = 50
-bed_custom_model =
-bed_custom_texture =
-bed_shape = 0x0,192x0,192x120,0x120
-default_sla_material_profile = Prusa Orange Tough 0.05
-default_sla_print_profile = 0.05 Normal
-display_height = 120
-display_mirror_x = 0
-display_mirror_y = 1
-display_orientation = landscape
-display_pixels_x = 2560
-display_pixels_y = 1600
-display_width = 192
-elefant_foot_compensation = 0.2
-elefant_foot_min_width = 0.2
-fast_tilt_time = 5
-gamma_correction = 1
-inherits = Original Prusa SL1
-max_exposure_time = 120
-max_initial_exposure_time = 300
-max_print_height = 200
-min_exposure_time = 1
-min_initial_exposure_time = 1
-print_host =
-printer_model = SL1
-printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_SL1\nPRINTER_VENDOR_KELANT\nPRINTER_MODEL_S400\n\nSTART_CUSTOM_VALUES\nLayerOffTime_0\nBottomLightOffDelay_0\nBottomLiftHeight_15\nLiftHeight_15\nBottomLiftSpeed_30\nLiftSpeed_30\nRetractSpeed_300\nBottomLightPWM_255\nLightPWM_255\nAntiAliasing_4 ; Use 0 or 1 for disable AntiAliasing with "printer gamma correction" set to 0, otherwise use multiples of 2 and "gamma correction" set to 1 for enable\nEND_CUSTOM_VALUES
-printer_settings_id =
-printer_technology = SLA
-printer_variant = default
-printer_vendor =
-printhost_apikey =
-printhost_cafile =
-relative_correction = 1,1
-slow_tilt_time = 8
-thumbnails = 400x400,800x480
diff --git a/UVtools.WPF/Assets/PrusaSlicer/printer/Longer Orange 10.ini b/UVtools.WPF/Assets/PrusaSlicer/printer/Longer Orange 10.ini
deleted file mode 100644
index 7838689..0000000
--- a/UVtools.WPF/Assets/PrusaSlicer/printer/Longer Orange 10.ini
+++ /dev/null
@@ -1,37 +0,0 @@
-# generated by PrusaSlicer 2.2.0+win64 on 2020-09-10 at 15:48:09 UTC
-absolute_correction = 0
-area_fill = 50
-bed_custom_model =
-bed_custom_texture =
-bed_shape = 0x0,98.64x0,98.64x55.44,0x55.44
-default_sla_material_profile = Prusa Orange Tough 0.05
-default_sla_print_profile = 0.05 Normal
-display_height = 55.44
-display_mirror_x = 0
-display_mirror_y = 1
-display_orientation = portrait
-display_pixels_x = 854
-display_pixels_y = 480
-display_width = 98.64
-elefant_foot_compensation = 0.2
-elefant_foot_min_width = 0.2
-fast_tilt_time = 5
-gamma_correction = 1
-inherits = Original Prusa SL1
-max_exposure_time = 120
-max_initial_exposure_time = 300
-max_print_height = 140
-min_exposure_time = 1
-min_initial_exposure_time = 1
-print_host =
-printer_model = SL1
-printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_SL1\nPRINTER_VENDOR_LONGER\nPRINTER_MODEL_ORANGE10\n\nSTART_CUSTOM_VALUES\nFLIP_XY\nLayerOffTime_1\nBottomLightOffDelay_1\nBottomLiftHeight_4\nLiftHeight_2\nBottomLiftSpeed_90\nLiftSpeed_150\nAntiAliasing_4 ; Use 0 or 1 for disable AntiAliasing with "printer gamma correction" set to 0, otherwise use multiples of 2 and "gamma correction" set to 1 for enable\nEND_CUSTOM_VALUES
-printer_settings_id =
-printer_technology = SLA
-printer_variant = default
-printer_vendor =
-printhost_apikey =
-printhost_cafile =
-relative_correction = 1,1
-slow_tilt_time = 8
-thumbnails = 400x400,800x480
diff --git a/UVtools.WPF/Assets/PrusaSlicer/printer/Longer Orange 30.ini b/UVtools.WPF/Assets/PrusaSlicer/printer/Longer Orange 30.ini
deleted file mode 100644
index 22dd691..0000000
--- a/UVtools.WPF/Assets/PrusaSlicer/printer/Longer Orange 30.ini
+++ /dev/null
@@ -1,37 +0,0 @@
-# generated by PrusaSlicer 2.2.0+win64 on 2020-09-10 at 15:36:45 UTC
-absolute_correction = 0
-area_fill = 50
-bed_custom_model =
-bed_custom_texture =
-bed_shape = 0x0,120.96x0,120.96x68.04,0x68.04
-default_sla_material_profile = Prusa Orange Tough 0.05
-default_sla_print_profile = 0.05 Normal
-display_height = 68.04
-display_mirror_x = 0
-display_mirror_y = 1
-display_orientation = portrait
-display_pixels_x = 2560
-display_pixels_y = 1440
-display_width = 120.96
-elefant_foot_compensation = 0.2
-elefant_foot_min_width = 0.2
-fast_tilt_time = 5
-gamma_correction = 1
-inherits = Original Prusa SL1
-max_exposure_time = 120
-max_initial_exposure_time = 300
-max_print_height = 170
-min_exposure_time = 1
-min_initial_exposure_time = 1
-print_host =
-printer_model = SL1
-printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_SL1\nPRINTER_VENDOR_LONGER\nPRINTER_MODEL_ORANGE30\n\nSTART_CUSTOM_VALUES\nFLIP_XY\nLayerOffTime_1\nBottomLightOffDelay_1\nBottomLiftHeight_4\nLiftHeight_2\nBottomLiftSpeed_90\nLiftSpeed_150\nAntiAliasing_4 ; Use 0 or 1 for disable AntiAliasing with "printer gamma correction" set to 0, otherwise use multiples of 2 and "gamma correction" set to 1 for enable\nEND_CUSTOM_VALUES
-printer_settings_id =
-printer_technology = SLA
-printer_variant = default
-printer_vendor =
-printhost_apikey =
-printhost_cafile =
-relative_correction = 1,1
-slow_tilt_time = 8
-thumbnails = 400x400,800x480
diff --git a/UVtools.WPF/Assets/PrusaSlicer/printer/Nova3D Bene4 Mono.ini b/UVtools.WPF/Assets/PrusaSlicer/printer/Nova3D Bene4 Mono.ini
deleted file mode 100644
index 583d56d..0000000
--- a/UVtools.WPF/Assets/PrusaSlicer/printer/Nova3D Bene4 Mono.ini
+++ /dev/null
@@ -1,37 +0,0 @@
-# generated by PrusaSlicer 2.2.0+win64 on 2020-09-04 at 20:31:20 UTC
-absolute_correction = 0
-area_fill = 50
-bed_custom_model =
-bed_custom_texture =
-bed_shape = 0x0,116x0,116x65.02,0x65.02
-default_sla_material_profile = Prusa Orange Tough 0.05
-default_sla_print_profile = 0.05 Normal
-display_height = 65.02
-display_mirror_x = 0
-display_mirror_y = 0
-display_orientation = portrait
-display_pixels_x = 2549
-display_pixels_y = 1566
-display_width = 116
-elefant_foot_compensation = 0.2
-elefant_foot_min_width = 0.2
-fast_tilt_time = 5
-gamma_correction = 1
-inherits = Original Prusa SL1
-max_exposure_time = 120
-max_initial_exposure_time = 300
-max_print_height = 130
-min_exposure_time = 1
-min_initial_exposure_time = 1
-print_host =
-printer_model = SL1
-printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_SL1\nPRINTER_VENDOR_NOVA3D\nPRINTER_MODEL_BENE4_MONO\n\nSTART_CUSTOM_VALUES\nFLIP_XY\nXppm_19.608\nYppm_19.608\nWaitBeforeExpoMs_3000\nLiftHeight_4\nLiftSpeed_120\nRetractSpeed_120\nLiftWhenFinished_80\nBlankingLayerTime_0\nAntiAliasing_4 ; Use 0 or 1 for disable AntiAliasing with "printer gamma correction" set to 0, otherwise use multiples of 2 and "gamma correction" set to 1 for enable\nNOVAMAKER_GRAY2RGB_ENCODE ; Required for Bene4 Mono as output images are in RGB\nEND_CUSTOM_VALUES
-printer_settings_id =
-printer_technology = SLA
-printer_variant = default
-printer_vendor =
-printhost_apikey =
-printhost_cafile =
-relative_correction = 1,1
-slow_tilt_time = 8
-thumbnails = 400x400,800x480
diff --git a/UVtools.WPF/Assets/PrusaSlicer/printer/Nova3D Elfin.ini b/UVtools.WPF/Assets/PrusaSlicer/printer/Nova3D Elfin.ini
deleted file mode 100644
index b9375de..0000000
--- a/UVtools.WPF/Assets/PrusaSlicer/printer/Nova3D Elfin.ini
+++ /dev/null
@@ -1,37 +0,0 @@
-# generated by PrusaSlicer 2.2.0+win64 on 2020-09-04 at 22:08:49 UTC
-absolute_correction = 0
-area_fill = 50
-bed_custom_model =
-bed_custom_texture =
-bed_shape = 0x0,131x0,131x73,0x73
-default_sla_material_profile = Prusa Orange Tough 0.05
-default_sla_print_profile = 0.05 Normal
-display_height = 73
-display_mirror_x = 0
-display_mirror_y = 0
-display_orientation = portrait
-display_pixels_x = 2531
-display_pixels_y = 1410
-display_width = 131
-elefant_foot_compensation = 0.2
-elefant_foot_min_width = 0.2
-fast_tilt_time = 5
-gamma_correction = 1
-inherits = Original Prusa SL1
-max_exposure_time = 120
-max_initial_exposure_time = 300
-max_print_height = 150
-min_exposure_time = 1
-min_initial_exposure_time = 1
-print_host =
-printer_model = SL1
-printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_SL1\nPRINTER_VENDOR_NOVA3D\nPRINTER_MODEL_ELFIN\n\nSTART_CUSTOM_VALUES\nFLIP_XY\nXppm_19.324\nYppm_19.324\nWaitBeforeExpoMs_2000\nLiftHeight_4\nLiftSpeed_120\nRetractSpeed_120\nLiftWhenFinished_80\nBlankingLayerTime_0\nAntiAliasing_4 ; Use 0 or 1 for disable AntiAliasing with "printer gamma correction" set to 0, otherwise use multiples of 2 and "gamma correction" set to 1 for enable\nEND_CUSTOM_VALUES
-printer_settings_id =
-printer_technology = SLA
-printer_variant = default
-printer_vendor =
-printhost_apikey =
-printhost_cafile =
-relative_correction = 1,1
-slow_tilt_time = 8
-thumbnails = 400x400,800x480
diff --git a/UVtools.WPF/Assets/PrusaSlicer/printer/Peopoly Phenom L.ini b/UVtools.WPF/Assets/PrusaSlicer/printer/Peopoly Phenom L.ini
deleted file mode 100644
index 50a835f..0000000
--- a/UVtools.WPF/Assets/PrusaSlicer/printer/Peopoly Phenom L.ini
+++ /dev/null
@@ -1,37 +0,0 @@
-# generated by PrusaSlicer 2.2.0+win64 on 2020-06-29 at 20:32:29 UTC
-absolute_correction = 0
-area_fill = 50
-bed_custom_model =
-bed_custom_texture =
-bed_shape = 0x0,345.6x0,345.6x194.4,0x194.4
-default_sla_material_profile = Prusa Orange Tough 0.05
-default_sla_print_profile = 0.05 Normal
-display_height = 194.4
-display_mirror_x = 0
-display_mirror_y = 1
-display_orientation = landscape
-display_pixels_x = 3840
-display_pixels_y = 2160
-display_width = 345.6
-elefant_foot_compensation = 0.2
-elefant_foot_min_width = 0.2
-fast_tilt_time = 5
-gamma_correction = 1
-inherits = Original Prusa SL1
-max_exposure_time = 120
-max_initial_exposure_time = 300
-max_print_height = 400
-min_exposure_time = 1
-min_initial_exposure_time = 1
-print_host =
-printer_model = SL1
-printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_SL1\nPRINTER_VENDOR_PEOPOLY\nPRINTER_MODEL_PHENOM_L\n\nSTART_CUSTOM_VALUES\nLayerOffTime_0\nBottomLightOffDelay_0\nBottomLiftHeight_15\nLiftHeight_9\nBottomLiftSpeed_32\nLiftSpeed_45\nRetractSpeed_150\nBottomLightPWM_255\nLightPWM_255\nAntiAliasing_4 ; Use 0 or 1 for disable AntiAliasing with "printer gamma correction" set to 0, otherwise use multiples of 2 and "gamma correction" set to 1 for enable\nEND_CUSTOM_VALUES
-printer_settings_id =
-printer_technology = SLA
-printer_variant = default
-printer_vendor =
-printhost_apikey =
-printhost_cafile =
-relative_correction = 1,1
-slow_tilt_time = 8
-thumbnails = 400x400,800x480
diff --git a/UVtools.WPF/Assets/PrusaSlicer/printer/Peopoly Phenom Noir.ini b/UVtools.WPF/Assets/PrusaSlicer/printer/Peopoly Phenom Noir.ini
deleted file mode 100644
index 23933e3..0000000
--- a/UVtools.WPF/Assets/PrusaSlicer/printer/Peopoly Phenom Noir.ini
+++ /dev/null
@@ -1,37 +0,0 @@
-# generated by PrusaSlicer 2.2.0+win64 on 2020-06-29 at 20:32:33 UTC
-absolute_correction = 0
-area_fill = 50
-bed_custom_model =
-bed_custom_texture =
-bed_shape = 0x0,293.76x0,293.76x165.24,0x165.24
-default_sla_material_profile = Prusa Orange Tough 0.05
-default_sla_print_profile = 0.05 Normal
-display_height = 165.24
-display_mirror_x = 0
-display_mirror_y = 1
-display_orientation = landscape
-display_pixels_x = 3840
-display_pixels_y = 2160
-display_width = 293.76
-elefant_foot_compensation = 0.2
-elefant_foot_min_width = 0.2
-fast_tilt_time = 5
-gamma_correction = 1
-inherits = Original Prusa SL1
-max_exposure_time = 120
-max_initial_exposure_time = 300
-max_print_height = 400
-min_exposure_time = 1
-min_initial_exposure_time = 1
-print_host =
-printer_model = SL1
-printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_SL1\nPRINTER_VENDOR_PEOPOLY\nPRINTER_MODEL_PHENOM_NOIR\n\nSTART_CUSTOM_VALUES\nLayerOffTime_0\nBottomLightOffDelay_0\nBottomLiftHeight_8\nLiftHeight_8\nBottomLiftSpeed_36\nLiftSpeed_45\nRetractSpeed_150\nBottomLightPWM_255\nLightPWM_255\nAntiAliasing_4 ; Use 0 or 1 for disable AntiAliasing with "printer gamma correction" set to 0, otherwise use multiples of 2 and "gamma correction" set to 1 for enable\nEND_CUSTOM_VALUES
-printer_settings_id =
-printer_technology = SLA
-printer_variant = default
-printer_vendor =
-printhost_apikey =
-printhost_cafile =
-relative_correction = 1,1
-slow_tilt_time = 8
-thumbnails = 400x400,800x480
diff --git a/UVtools.WPF/Assets/PrusaSlicer/printer/Peopoly Phenom.ini b/UVtools.WPF/Assets/PrusaSlicer/printer/Peopoly Phenom.ini
deleted file mode 100644
index b6d72b0..0000000
--- a/UVtools.WPF/Assets/PrusaSlicer/printer/Peopoly Phenom.ini
+++ /dev/null
@@ -1,37 +0,0 @@
-# generated by PrusaSlicer 2.2.0+win64 on 2020-06-29 at 20:32:25 UTC
-absolute_correction = 0
-area_fill = 50
-bed_custom_model =
-bed_custom_texture =
-bed_shape = 0x0,276.48x0,276.48x155.52,0x155.52
-default_sla_material_profile = Prusa Orange Tough 0.05
-default_sla_print_profile = 0.05 Normal
-display_height = 155.52
-display_mirror_x = 0
-display_mirror_y = 1
-display_orientation = landscape
-display_pixels_x = 3840
-display_pixels_y = 2160
-display_width = 276.48
-elefant_foot_compensation = 0.2
-elefant_foot_min_width = 0.2
-fast_tilt_time = 5
-gamma_correction = 1
-inherits = Original Prusa SL1
-max_exposure_time = 120
-max_initial_exposure_time = 300
-max_print_height = 400
-min_exposure_time = 1
-min_initial_exposure_time = 1
-print_host =
-printer_model = SL1
-printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_SL1\nPRINTER_VENDOR_PEOPOLY\nPRINTER_MODEL_PHENOM\n\nSTART_CUSTOM_VALUES\nLayerOffTime_0\nBottomLightOffDelay_0\nBottomLiftHeight_15\nLiftHeight_12\nBottomLiftSpeed_36\nLiftSpeed_48\nRetractSpeed_150\nBottomLightPWM_255\nLightPWM_255\nAntiAliasing_4 ; Use 0 or 1 for disable AntiAliasing with "printer gamma correction" set to 0, otherwise use multiples of 2 and "gamma correction" set to 1 for enable\nEND_CUSTOM_VALUES
-printer_settings_id =
-printer_technology = SLA
-printer_variant = default
-printer_vendor =
-printhost_apikey =
-printhost_cafile =
-relative_correction = 1,1
-slow_tilt_time = 8
-thumbnails = 400x400,800x480
diff --git a/UVtools.WPF/Assets/PrusaSlicer/printer/Phrozen Shuffle 4K.ini b/UVtools.WPF/Assets/PrusaSlicer/printer/Phrozen Shuffle 4K.ini
deleted file mode 100644
index 3c24780..0000000
--- a/UVtools.WPF/Assets/PrusaSlicer/printer/Phrozen Shuffle 4K.ini
+++ /dev/null
@@ -1,37 +0,0 @@
-# generated by PrusaSlicer 2.2.0+win64 on 2020-06-12 at 00:41:28 UTC
-absolute_correction = 0
-area_fill = 50
-bed_custom_model =
-bed_custom_texture =
-bed_shape = 0x0,120.96x0,120.96x68.04,0x68.04
-default_sla_material_profile = Prusa Orange Tough 0.05
-default_sla_print_profile = 0.05 Normal
-display_height = 68.04
-display_mirror_x = 0
-display_mirror_y = 0
-display_orientation = portrait
-display_pixels_x = 3840
-display_pixels_y = 2160
-display_width = 120.96
-elefant_foot_compensation = 0.2
-elefant_foot_min_width = 0.2
-fast_tilt_time = 5
-gamma_correction = 1
-inherits = Original Prusa SL1
-max_exposure_time = 120
-max_initial_exposure_time = 300
-max_print_height = 170
-min_exposure_time = 1
-min_initial_exposure_time = 1
-print_host =
-printer_model = SL1
-printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_SL1\nPRINTER_VENDOR_PHROZEN\nPRINTER_MODEL_SHUFFLE_4K\n\nSTART_CUSTOM_VALUES\nFLIP_XY\nLayerOffTime_10\nBottomLightOffDelay_10\nBottomLiftHeight_6\nLiftHeight_5\nBottomLiftSpeed_100\nLiftSpeed_100\nRetractSpeed_150\nBottomLightPWM_255\nLightPWM_255\nAntiAliasing_4 ; Use 0 or 1 for disable AntiAliasing with "printer gamma correction" set to 0, otherwise use multiples of 2 and "gamma correction" set to 1 for enable\nEND_CUSTOM_VALUES
-printer_settings_id =
-printer_technology = SLA
-printer_variant = default
-printer_vendor =
-printhost_apikey =
-printhost_cafile =
-relative_correction = 1,1
-slow_tilt_time = 8
-thumbnails = 400x400,800x480
diff --git a/UVtools.WPF/Assets/PrusaSlicer/printer/Phrozen Shuffle Lite.ini b/UVtools.WPF/Assets/PrusaSlicer/printer/Phrozen Shuffle Lite.ini
deleted file mode 100644
index c9ee486..0000000
--- a/UVtools.WPF/Assets/PrusaSlicer/printer/Phrozen Shuffle Lite.ini
+++ /dev/null
@@ -1,37 +0,0 @@
-# generated by PrusaSlicer 2.2.0+win64 on 2020-06-12 at 00:41:32 UTC
-absolute_correction = 0
-area_fill = 50
-bed_custom_model =
-bed_custom_texture =
-bed_shape = 0x0,120.32x0,120.32x67.68,0x67.68
-default_sla_material_profile = Prusa Orange Tough 0.05
-default_sla_print_profile = 0.05 Normal
-display_height = 67.68
-display_mirror_x = 0
-display_mirror_y = 0
-display_orientation = portrait
-display_pixels_x = 2560
-display_pixels_y = 1440
-display_width = 120.32
-elefant_foot_compensation = 0.2
-elefant_foot_min_width = 0.2
-fast_tilt_time = 5
-gamma_correction = 1
-inherits = Original Prusa SL1
-max_exposure_time = 120
-max_initial_exposure_time = 300
-max_print_height = 170
-min_exposure_time = 1
-min_initial_exposure_time = 1
-print_host =
-printer_model = SL1
-printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_SL1\nPRINTER_VENDOR_PHROZEN\nPRINTER_MODEL_SHUFFLE_LITE\n\nSTART_CUSTOM_VALUES\nFLIP_XY\nLayerOffTime_7\nBottomLightOffDelay_7\nBottomLiftHeight_6\nLiftHeight_5\nBottomLiftSpeed_100\nLiftSpeed_100\nRetractSpeed_200\nBottomLightPWM_255\nLightPWM_255\nAntiAliasing_4 ; Use 0 or 1 for disable AntiAliasing with "printer gamma correction" set to 0, otherwise use multiples of 2 and "gamma correction" set to 1 for enable\nEND_CUSTOM_VALUES
-printer_settings_id =
-printer_technology = SLA
-printer_variant = default
-printer_vendor =
-printhost_apikey =
-printhost_cafile =
-relative_correction = 1,1
-slow_tilt_time = 8
-thumbnails = 400x400,800x480
diff --git a/UVtools.WPF/Assets/PrusaSlicer/printer/Phrozen Shuffle XL.ini b/UVtools.WPF/Assets/PrusaSlicer/printer/Phrozen Shuffle XL.ini
deleted file mode 100644
index 8f2ea49..0000000
--- a/UVtools.WPF/Assets/PrusaSlicer/printer/Phrozen Shuffle XL.ini
+++ /dev/null
@@ -1,37 +0,0 @@
-# generated by PrusaSlicer 2.2.0+win64 on 2020-06-12 at 00:41:36 UTC
-absolute_correction = 0
-area_fill = 50
-bed_custom_model =
-bed_custom_texture =
-bed_shape = 0x0,192x0,192x120,0x120
-default_sla_material_profile = Prusa Orange Tough 0.05
-default_sla_print_profile = 0.05 Normal
-display_height = 120
-display_mirror_x = 0
-display_mirror_y = 0
-display_orientation = landscape
-display_pixels_x = 2560
-display_pixels_y = 1600
-display_width = 192
-elefant_foot_compensation = 0.2
-elefant_foot_min_width = 0.2
-fast_tilt_time = 5
-gamma_correction = 1
-inherits = Original Prusa SL1
-max_exposure_time = 120
-max_initial_exposure_time = 300
-max_print_height = 200
-min_exposure_time = 1
-min_initial_exposure_time = 1
-print_host =
-printer_model = SL1
-printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_SL1\nPRINTER_VENDOR_PHROZEN\nPRINTER_MODEL_SHUFFLE_4K\n\nSTART_CUSTOM_VALUES\nLayerOffTime_10\nBottomLightOffDelay_10\nBottomLiftHeight_6\nLiftHeight_5\nBottomLiftSpeed_100\nLiftSpeed_100\nRetractSpeed_150\nBottomLightPWM_255\nLightPWM_255\nAntiAliasing_4 ; Use 0 or 1 for disable AntiAliasing with "printer gamma correction" set to 0, otherwise use multiples of 2 and "gamma correction" set to 1 for enable\nEND_CUSTOM_VALUES
-printer_settings_id =
-printer_technology = SLA
-printer_variant = default
-printer_vendor =
-printhost_apikey =
-printhost_cafile =
-relative_correction = 1,1
-slow_tilt_time = 8
-thumbnails = 400x400,800x480
diff --git a/UVtools.WPF/Assets/PrusaSlicer/printer/Phrozen Shuffle.ini b/UVtools.WPF/Assets/PrusaSlicer/printer/Phrozen Shuffle.ini
deleted file mode 100644
index 41b8055..0000000
--- a/UVtools.WPF/Assets/PrusaSlicer/printer/Phrozen Shuffle.ini
+++ /dev/null
@@ -1,37 +0,0 @@
-# generated by PrusaSlicer 2.2.0+win64 on 2020-06-12 at 00:41:24 UTC
-absolute_correction = 0
-area_fill = 50
-bed_custom_model =
-bed_custom_texture =
-bed_shape = 0x0,120.32x0,120.32x67.68,0x67.68
-default_sla_material_profile = Prusa Orange Tough 0.05
-default_sla_print_profile = 0.05 Normal
-display_height = 67.68
-display_mirror_x = 0
-display_mirror_y = 0
-display_orientation = portrait
-display_pixels_x = 2560
-display_pixels_y = 1440
-display_width = 120.32
-elefant_foot_compensation = 0.2
-elefant_foot_min_width = 0.2
-fast_tilt_time = 5
-gamma_correction = 1
-inherits = Original Prusa SL1
-max_exposure_time = 120
-max_initial_exposure_time = 300
-max_print_height = 200
-min_exposure_time = 1
-min_initial_exposure_time = 1
-print_host =
-printer_model = SL1
-printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_SL1\nPRINTER_VENDOR_PHROZEN\nPRINTER_MODEL_SHUFFLE\n\nSTART_CUSTOM_VALUES\nFLIP_XY\nLayerOffTime_7\nBottomLightOffDelay_7\nBottomLiftHeight_6\nLiftHeight_5\nBottomLiftSpeed_100\nLiftSpeed_100\nRetractSpeed_200\nBottomLightPWM_255\nLightPWM_255\nAntiAliasing_4 ; Use 0 or 1 for disable AntiAliasing with "printer gamma correction" set to 0, otherwise use multiples of 2 and "gamma correction" set to 1 for enable\nEND_CUSTOM_VALUES
-printer_settings_id =
-printer_technology = SLA
-printer_variant = default
-printer_vendor =
-printhost_apikey =
-printhost_cafile =
-relative_correction = 1,1
-slow_tilt_time = 8
-thumbnails = 400x400,800x480
diff --git a/UVtools.WPF/Assets/PrusaSlicer/printer/Phrozen Sonic Mini 4K.ini b/UVtools.WPF/Assets/PrusaSlicer/printer/Phrozen Sonic Mini 4K.ini
deleted file mode 100644
index f2cd3c4..0000000
--- a/UVtools.WPF/Assets/PrusaSlicer/printer/Phrozen Sonic Mini 4K.ini
+++ /dev/null
@@ -1,37 +0,0 @@
-# generated by PrusaSlicer 2.2.0+win64 on 2020-09-23 at 19:41:00 UTC
-absolute_correction = 0
-area_fill = 50
-bed_custom_model =
-bed_custom_texture =
-bed_shape = 0x0,134.4x0,134.4x75.6,0x75.6
-default_sla_material_profile = Prusa Orange Tough 0.05
-default_sla_print_profile = 0.05 Normal
-display_height = 75.6
-display_mirror_x = 0
-display_mirror_y = 1
-display_orientation = landscape
-display_pixels_x = 3840
-display_pixels_y = 2160
-display_width = 134.4
-elefant_foot_compensation = 0.2
-elefant_foot_min_width = 0.2
-fast_tilt_time = 5
-gamma_correction = 1
-inherits = Original Prusa SL1
-max_exposure_time = 120
-max_initial_exposure_time = 300
-max_print_height = 130
-min_exposure_time = 1
-min_initial_exposure_time = 1
-print_host =
-printer_model = SL1
-printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_SL1\nPRINTER_VENDOR_PHROZEN\nPRINTER_MODEL_SONIC_MINI_4K\n\nSTART_CUSTOM_VALUES\nLayerOffTime_10\nBottomLightOffDelay_10\nBottomLiftHeight_6\nLiftHeight_5\nBottomLiftSpeed_100\nLiftSpeed_100\nRetractSpeed_150\nBottomLightPWM_255\nLightPWM_255\nAntiAliasing_4 ; Use 0 or 1 for disable AntiAliasing with "printer gamma correction" set to 0, otherwise use multiples of 2 and "gamma correction" set to 1 for enable\nEND_CUSTOM_VALUES
-printer_settings_id =
-printer_technology = SLA
-printer_variant = default
-printer_vendor =
-printhost_apikey =
-printhost_cafile =
-relative_correction = 1,1
-slow_tilt_time = 8
-thumbnails = 400x400,800x480
diff --git a/UVtools.WPF/Assets/PrusaSlicer/printer/Phrozen Sonic Mini.ini b/UVtools.WPF/Assets/PrusaSlicer/printer/Phrozen Sonic Mini.ini
deleted file mode 100644
index 3cd5088..0000000
--- a/UVtools.WPF/Assets/PrusaSlicer/printer/Phrozen Sonic Mini.ini
+++ /dev/null
@@ -1,37 +0,0 @@
-# generated by PrusaSlicer 2.2.0+win64 on 2020-06-20 at 15:15:00 UTC
-absolute_correction = 0
-area_fill = 50
-bed_custom_model =
-bed_custom_texture =
-bed_shape = 0x0,120.96x0,120.96x68.04,0x68.04
-default_sla_material_profile = Prusa Orange Tough 0.05
-default_sla_print_profile = 0.05 Normal
-display_height = 68.04
-display_mirror_x = 0
-display_mirror_y = 0
-display_orientation = portrait
-display_pixels_x = 1920
-display_pixels_y = 1080
-display_width = 120.96
-elefant_foot_compensation = 0.2
-elefant_foot_min_width = 0.2
-fast_tilt_time = 5
-gamma_correction = 1
-inherits = Original Prusa SL1
-max_exposure_time = 120
-max_initial_exposure_time = 300
-max_print_height = 130
-min_exposure_time = 1
-min_initial_exposure_time = 1
-print_host =
-printer_model = SL1
-printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_SL1\nPRINTER_VENDOR_PHROZEN\nPRINTER_MODEL_SONIC_MINI\n\nSTART_CUSTOM_VALUES\nFLIP_XY\nLayerOffTime_7\nBottomLightOffDelay_7\nBottomLiftHeight_6\nLiftHeight_5\nBottomLiftSpeed_100\nLiftSpeed_100\nRetractSpeed_200\nBottomLightPWM_255\nLightPWM_255\nAntiAliasing_4 ; Use 0 or 1 for disable AntiAliasing with "printer gamma correction" set to 0, otherwise use multiples of 2 and "gamma correction" set to 1 for enable\nEND_CUSTOM_VALUES
-printer_settings_id =
-printer_technology = SLA
-printer_variant = default
-printer_vendor =
-printhost_apikey =
-printhost_cafile =
-relative_correction = 1,1
-slow_tilt_time = 8
-thumbnails = 400x400,800x480
diff --git a/UVtools.WPF/Assets/PrusaSlicer/printer/Phrozen Sonic.ini b/UVtools.WPF/Assets/PrusaSlicer/printer/Phrozen Sonic.ini
deleted file mode 100644
index b4e44da..0000000
--- a/UVtools.WPF/Assets/PrusaSlicer/printer/Phrozen Sonic.ini
+++ /dev/null
@@ -1,37 +0,0 @@
-# generated by PrusaSlicer 2.2.0+win64 on 2020-06-12 at 00:41:40 UTC
-absolute_correction = 0
-area_fill = 50
-bed_custom_model =
-bed_custom_texture =
-bed_shape = 0x0,120.96x0,120.96x68.04,0x68.04
-default_sla_material_profile = Prusa Orange Tough 0.05
-default_sla_print_profile = 0.05 Normal
-display_height = 68.04
-display_mirror_x = 0
-display_mirror_y = 0
-display_orientation = portrait
-display_pixels_x = 1920
-display_pixels_y = 1080
-display_width = 120.96
-elefant_foot_compensation = 0.2
-elefant_foot_min_width = 0.2
-fast_tilt_time = 5
-gamma_correction = 1
-inherits = Original Prusa SL1
-max_exposure_time = 120
-max_initial_exposure_time = 300
-max_print_height = 170
-min_exposure_time = 1
-min_initial_exposure_time = 1
-print_host =
-printer_model = SL1
-printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_SL1\nPRINTER_VENDOR_PHROZEN\nPRINTER_MODEL_SONIC\n\nSTART_CUSTOM_VALUES\nFLIP_XY\nLayerOffTime_6\nBottomLightOffDelay_6\nBottomLiftHeight_6\nLiftHeight_5\nBottomLiftSpeed_100\nLiftSpeed_100\nRetractSpeed_200\nBottomLightPWM_255\nLightPWM_255\nAntiAliasing_4 ; Use 0 or 1 for disable AntiAliasing with "printer gamma correction" set to 0, otherwise use multiples of 2 and "gamma correction" set to 1 for enable\nEND_CUSTOM_VALUES
-printer_settings_id =
-printer_technology = SLA
-printer_variant = default
-printer_vendor =
-printhost_apikey =
-printhost_cafile =
-relative_correction = 1,1
-slow_tilt_time = 8
-thumbnails = 400x400,800x480
diff --git a/UVtools.WPF/Assets/PrusaSlicer/printer/Phrozen Transform.ini b/UVtools.WPF/Assets/PrusaSlicer/printer/Phrozen Transform.ini
deleted file mode 100644
index 1360d3f..0000000
--- a/UVtools.WPF/Assets/PrusaSlicer/printer/Phrozen Transform.ini
+++ /dev/null
@@ -1,37 +0,0 @@
-# generated by PrusaSlicer 2.2.0+win64 on 2020-06-12 at 00:41:58 UTC
-absolute_correction = 0
-area_fill = 50
-bed_custom_model =
-bed_custom_texture =
-bed_shape = 0x0,291.84x0,291.84x164.16,0x164.16
-default_sla_material_profile = Prusa Orange Tough 0.05
-default_sla_print_profile = 0.05 Normal
-display_height = 164.16
-display_mirror_x = 0
-display_mirror_y = 0
-display_orientation = landscape
-display_pixels_x = 3840
-display_pixels_y = 2160
-display_width = 291.84
-elefant_foot_compensation = 0.2
-elefant_foot_min_width = 0.2
-fast_tilt_time = 5
-gamma_correction = 1
-inherits = Original Prusa SL1
-max_exposure_time = 120
-max_initial_exposure_time = 300
-max_print_height = 400
-min_exposure_time = 1
-min_initial_exposure_time = 1
-print_host =
-printer_model = SL1
-printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_SL1\nPRINTER_VENDOR_PHROZEN\nPRINTER_MODEL_TRANSFORM\n\nSTART_CUSTOM_VALUES\nLayerOffTime_10\nBottomLightOffDelay_10\nBottomLiftHeight_10\nLiftHeight_8\nBottomLiftSpeed_65\nLiftSpeed_65\nRetractSpeed_150\nBottomLightPWM_255\nLightPWM_255\nAntiAliasing_4 ; Use 0 or 1 for disable AntiAliasing with "printer gamma correction" set to 0, otherwise use multiples of 2 and "gamma correction" set to 1 for enable\nEND_CUSTOM_VALUES
-printer_settings_id =
-printer_technology = SLA
-printer_variant = default
-printer_vendor =
-printhost_apikey =
-printhost_cafile =
-relative_correction = 1,1
-slow_tilt_time = 8
-thumbnails = 400x400,800x480
diff --git a/UVtools.WPF/Assets/PrusaSlicer/printer/QIDI Shadow5.5.ini b/UVtools.WPF/Assets/PrusaSlicer/printer/QIDI Shadow5.5.ini
deleted file mode 100644
index bc68866..0000000
--- a/UVtools.WPF/Assets/PrusaSlicer/printer/QIDI Shadow5.5.ini
+++ /dev/null
@@ -1,37 +0,0 @@
-# generated by PrusaSlicer 2.2.0+win64 on 2020-06-29 at 20:32:51 UTC
-absolute_correction = 0
-area_fill = 50
-bed_custom_model =
-bed_custom_texture =
-bed_shape = 0x0,120.96x0,120.96x68.04,0x68.04
-default_sla_material_profile = Prusa Orange Tough 0.05
-default_sla_print_profile = 0.05 Normal
-display_height = 68.04
-display_mirror_x = 0
-display_mirror_y = 1
-display_orientation = portrait
-display_pixels_x = 2560
-display_pixels_y = 1440
-display_width = 120.96
-elefant_foot_compensation = 0.2
-elefant_foot_min_width = 0.2
-fast_tilt_time = 5
-gamma_correction = 1
-inherits = Original Prusa SL1
-max_exposure_time = 120
-max_initial_exposure_time = 300
-max_print_height = 150
-min_exposure_time = 1
-min_initial_exposure_time = 1
-print_host =
-printer_model = SL1
-printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_SL1\nPRINTER_VENDOR_QIDI\nPRINTER_MODEL_SHADOW5.5\n\nSTART_CUSTOM_VALUES\nFLIP_XY\nLayerOffTime_0\nBottomLightOffDelay_0\nBottomLiftHeight_80\nLiftHeight_5\nBottomLiftSpeed_65\nLiftSpeed_65\nRetractSpeed_65\nBottomLightPWM_255\nLightPWM_255\nAntiAliasing_4 ; Use 0 or 1 for disable AntiAliasing with "printer gamma correction" set to 0, otherwise use multiples of 2 and "gamma correction" set to 1 for enable\nEND_CUSTOM_VALUES
-printer_settings_id =
-printer_technology = SLA
-printer_variant = default
-printer_vendor =
-printhost_apikey =
-printhost_cafile =
-relative_correction = 1,1
-slow_tilt_time = 8
-thumbnails = 400x400,800x480
diff --git a/UVtools.WPF/Assets/PrusaSlicer/printer/QIDI Shadow6.0 Pro.ini b/UVtools.WPF/Assets/PrusaSlicer/printer/QIDI Shadow6.0 Pro.ini
deleted file mode 100644
index 23dee47..0000000
--- a/UVtools.WPF/Assets/PrusaSlicer/printer/QIDI Shadow6.0 Pro.ini
+++ /dev/null
@@ -1,37 +0,0 @@
-# generated by PrusaSlicer 2.2.0+win64 on 2020-06-29 at 20:32:56 UTC
-absolute_correction = 0
-area_fill = 50
-bed_custom_model =
-bed_custom_texture =
-bed_shape = 0x0,132.48x0,132.48x74.52,0x74.52
-default_sla_material_profile = Prusa Orange Tough 0.05
-default_sla_print_profile = 0.05 Normal
-display_height = 74.52
-display_mirror_x = 0
-display_mirror_y = 1
-display_orientation = portrait
-display_pixels_x = 2560
-display_pixels_y = 1440
-display_width = 132.48
-elefant_foot_compensation = 0.2
-elefant_foot_min_width = 0.2
-fast_tilt_time = 5
-gamma_correction = 1
-inherits = Original Prusa SL1
-max_exposure_time = 120
-max_initial_exposure_time = 300
-max_print_height = 150
-min_exposure_time = 1
-min_initial_exposure_time = 1
-print_host =
-printer_model = SL1
-printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_SL1\nPRINTER_VENDOR_QIDI\nPRINTER_MODEL_SHADOW6.0PRO\n\nSTART_CUSTOM_VALUES\nFLIP_XY\nLayerOffTime_0\nBottomLightOffDelay_0\nBottomLiftHeight_80\nLiftHeight_5\nBottomLiftSpeed_100\nLiftSpeed_65\nRetractSpeed_65\nBottomLightPWM_255\nLightPWM_255\nAntiAliasing_4 ; Use 0 or 1 for disable AntiAliasing with "printer gamma correction" set to 0, otherwise use multiples of 2 and "gamma correction" set to 1 for enable\nEND_CUSTOM_VALUES
-printer_settings_id =
-printer_technology = SLA
-printer_variant = default
-printer_vendor =
-printhost_apikey =
-printhost_cafile =
-relative_correction = 1,1
-slow_tilt_time = 8
-thumbnails = 400x400,800x480
diff --git a/UVtools.WPF/Assets/PrusaSlicer/printer/Voxelab Polaris.ini b/UVtools.WPF/Assets/PrusaSlicer/printer/Voxelab Polaris.ini
deleted file mode 100644
index b65418b..0000000
--- a/UVtools.WPF/Assets/PrusaSlicer/printer/Voxelab Polaris.ini
+++ /dev/null
@@ -1,37 +0,0 @@
-# generated by PrusaSlicer 2.2.0+win64 on 2020-07-13 at 23:30:41 UTC
-absolute_correction = 0
-area_fill = 50
-bed_custom_model =
-bed_custom_texture =
-bed_shape = 0x0,120.96x0,120.96x68.04,0x68.04
-default_sla_material_profile = Prusa Orange Tough 0.05
-default_sla_print_profile = 0.05 Normal
-display_height = 68.04
-display_mirror_x = 0
-display_mirror_y = 1
-display_orientation = portrait
-display_pixels_x = 2560
-display_pixels_y = 1440
-display_width = 120.96
-elefant_foot_compensation = 0.2
-elefant_foot_min_width = 0.2
-fast_tilt_time = 5
-gamma_correction = 1
-inherits = Original Prusa SL1
-max_exposure_time = 120
-max_initial_exposure_time = 300
-max_print_height = 155
-min_exposure_time = 1
-min_initial_exposure_time = 1
-print_host =
-printer_model = SL1
-printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_SL1\nPRINTER_VENDOR_VOXELAB\nPRINTER_MODEL_POLARIS\n\nSTART_CUSTOM_VALUES\nFLIP_XY\nLayerOffTime_0\nBottomLightOffDelay_0\nBottomLiftHeight_5\nLiftHeight_5\nBottomLiftSpeed_65\nLiftSpeed_65\nRetractSpeed_150\nBottomLightPWM_255\nLightPWM_255\nAntiAliasing_4 ; Use 0 or 1 for disable AntiAliasing with "printer gamma correction" set to 0, otherwise use multiples of 2 and "gamma correction" set to 1 for enable\nEND_CUSTOM_VALUES
-printer_settings_id =
-printer_technology = SLA
-printer_variant = default
-printer_vendor =
-printhost_apikey =
-printhost_cafile =
-relative_correction = 1,1
-slow_tilt_time = 8
-thumbnails = 400x400,800x480
diff --git a/UVtools.WPF/Assets/PrusaSlicer/printer/Wanhao D7.ini b/UVtools.WPF/Assets/PrusaSlicer/printer/Wanhao D7.ini
deleted file mode 100644
index a4088d5..0000000
--- a/UVtools.WPF/Assets/PrusaSlicer/printer/Wanhao D7.ini
+++ /dev/null
@@ -1,37 +0,0 @@
-# generated by PrusaSlicer 2.2.0+win64 on 2020-06-29 at 20:33:00 UTC
-absolute_correction = 0
-area_fill = 50
-bed_custom_model =
-bed_custom_texture =
-bed_shape = 0x0,120.96x0,120.96x68.5,0x68.5
-default_sla_material_profile = Prusa Orange Tough 0.05
-default_sla_print_profile = 0.05 Normal
-display_height = 68.5
-display_mirror_x = 0
-display_mirror_y = 1
-display_orientation = landscape
-display_pixels_x = 2560
-display_pixels_y = 1440
-display_width = 120.96
-elefant_foot_compensation = 0.2
-elefant_foot_min_width = 0.2
-fast_tilt_time = 5
-gamma_correction = 1
-inherits = Original Prusa SL1
-max_exposure_time = 120
-max_initial_exposure_time = 300
-max_print_height = 180
-min_exposure_time = 1
-min_initial_exposure_time = 1
-print_host =
-printer_model = SL1
-printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_SL1\nPRINTER_VENDOR_WANHAO\nPRINTER_MODEL_D7\n\nSTART_CUSTOM_VALUES\nLayerOffTime_0\nBottomLightOffDelay_0\nBottomLiftHeight_5\nLiftHeight_5\nBottomLiftSpeed_60\nLiftSpeed_60\nRetractSpeed_150\nBottomLightPWM_255\nLightPWM_255\nAntiAliasing_4 ; Use 0 or 1 for disable AntiAliasing with "printer gamma correction" set to 0, otherwise use multiples of 2 and "gamma correction" set to 1 for enable\nEND_CUSTOM_VALUES
-printer_settings_id =
-printer_technology = SLA
-printer_variant = default
-printer_vendor =
-printhost_apikey =
-printhost_cafile =
-relative_correction = 1,1
-slow_tilt_time = 8
-thumbnails = 400x400,800x480
diff --git a/UVtools.WPF/Assets/PrusaSlicer/printer/Wanhao D8.ini b/UVtools.WPF/Assets/PrusaSlicer/printer/Wanhao D8.ini
deleted file mode 100644
index 9d74056..0000000
--- a/UVtools.WPF/Assets/PrusaSlicer/printer/Wanhao D8.ini
+++ /dev/null
@@ -1,37 +0,0 @@
-# generated by PrusaSlicer 2.2.0+win64 on 2020-06-29 at 20:33:04 UTC
-absolute_correction = 0
-area_fill = 50
-bed_custom_model =
-bed_custom_texture =
-bed_shape = 0x0,192x0,192x120,0x120
-default_sla_material_profile = Prusa Orange Tough 0.05
-default_sla_print_profile = 0.05 Normal
-display_height = 120
-display_mirror_x = 0
-display_mirror_y = 1
-display_orientation = landscape
-display_pixels_x = 2560
-display_pixels_y = 1600
-display_width = 192
-elefant_foot_compensation = 0.2
-elefant_foot_min_width = 0.2
-fast_tilt_time = 5
-gamma_correction = 1
-inherits = Original Prusa SL1
-max_exposure_time = 120
-max_initial_exposure_time = 300
-max_print_height = 180
-min_exposure_time = 1
-min_initial_exposure_time = 1
-print_host =
-printer_model = SL1
-printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_SL1\nPRINTER_VENDOR_WANHAO\nPRINTER_MODEL_D8\n\nSTART_CUSTOM_VALUES\nLayerOffTime_0\nBottomLightOffDelay_0\nBottomLiftHeight_5\nLiftHeight_5\nBottomLiftSpeed_60\nLiftSpeed_60\nRetractSpeed_150\nBottomLightPWM_255\nLightPWM_255\nAntiAliasing_4 ; Use 0 or 1 for disable AntiAliasing with "printer gamma correction" set to 0, otherwise use multiples of 2 and "gamma correction" set to 1 for enable\nEND_CUSTOM_VALUES
-printer_settings_id =
-printer_technology = SLA
-printer_variant = default
-printer_vendor =
-printhost_apikey =
-printhost_cafile =
-relative_correction = 1,1
-slow_tilt_time = 8
-thumbnails = 400x400,800x480
diff --git a/UVtools.WPF/Assets/PrusaSlicer/printer/Zortrax Inkspire.ini b/UVtools.WPF/Assets/PrusaSlicer/printer/Zortrax Inkspire.ini
deleted file mode 100644
index a999a68..0000000
--- a/UVtools.WPF/Assets/PrusaSlicer/printer/Zortrax Inkspire.ini
+++ /dev/null
@@ -1,37 +0,0 @@
-# generated by PrusaSlicer 2.2.0+win64 on 2020-06-20 at 15:23:41 UTC
-absolute_correction = 0
-area_fill = 50
-bed_custom_model =
-bed_custom_texture =
-bed_shape = 0x0,132.88x0,132.88x74.67,0x74.67
-default_sla_material_profile = Prusa Orange Tough 0.05
-default_sla_print_profile = 0.05 Normal
-display_height = 74.67
-display_mirror_x = 1
-display_mirror_y = 0
-display_orientation = portrait
-display_pixels_x = 2560
-display_pixels_y = 1440
-display_width = 132.88
-elefant_foot_compensation = 0.2
-elefant_foot_min_width = 0.2
-fast_tilt_time = 5
-gamma_correction = 1
-inherits = Original Prusa SL1
-max_exposure_time = 120
-max_initial_exposure_time = 300
-max_print_height = 175
-min_exposure_time = 1
-min_initial_exposure_time = 1
-print_host =
-printer_model = SL1
-printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_SL1\nPRINTER_VENDOR_EPAX\nPRINTER_MODEL_X1\n\nSTART_CUSTOM_VALUES\nLayerOffTime_5\nLiftHeight_5\nLiftSpeed_100\nRetractSpeed_100\nAntiAliasing_4 ; Use 0 or 1 for disable AntiAliasing with "printer gamma correction" set to 0, otherwise use multiples of 2 and "gamma correction" set to 1 for enable\nEND_CUSTOM_VALUES
-printer_settings_id =
-printer_technology = SLA
-printer_variant = default
-printer_vendor =
-printhost_apikey =
-printhost_cafile =
-relative_correction = 1,1
-slow_tilt_time = 8
-thumbnails = 400x400,800x480
diff --git a/UVtools.WPF/Assets/PrusaSlicer/sla_print/Universal 0.025 UltraDetail - Heavy Supports.ini b/UVtools.WPF/Assets/PrusaSlicer/sla_print/Universal 0.025 UltraDetail - Heavy Supports.ini
deleted file mode 100644
index b50c910..0000000
--- a/UVtools.WPF/Assets/PrusaSlicer/sla_print/Universal 0.025 UltraDetail - Heavy Supports.ini
+++ /dev/null
@@ -1,44 +0,0 @@
-# generated by PrusaSlicer 2.2.0+win64 on 2020-06-11 at 02:37:18 UTC
-compatible_printers =
-compatible_printers_condition =
-default_sla_print_profile =
-faded_layers = 10
-hollowing_closing_distance = 2
-hollowing_enable = 0
-hollowing_min_thickness = 3
-hollowing_quality = 0.5
-inherits = 0.025 UltraDetail
-layer_height = 0.025
-output_filename_format = {input_filename_base}_{material_type}{layer_height}mm_{printer_model}_{print_time}.sl1
-pad_around_object = 0
-pad_around_object_everywhere = 0
-pad_brim_size = 1.6
-pad_enable = 1
-pad_max_merge_distance = 50
-pad_object_connector_penetration = 0.3
-pad_object_connector_stride = 10
-pad_object_connector_width = 0.5
-pad_object_gap = 1
-pad_wall_height = 0
-pad_wall_slope = 90
-pad_wall_thickness = 1
-sla_print_settings_id =
-slice_closing_radius = 0.005
-support_base_diameter = 3
-support_base_height = 1
-support_base_safety_distance = 1
-support_buildplate_only = 0
-support_critical_angle = 45
-support_head_front_diameter = 1
-support_head_penetration = 0.6
-support_head_width = 2
-support_max_bridge_length = 10
-support_max_bridges_on_pillar = 3
-support_max_pillar_link_distance = 10
-support_object_elevation = 5
-support_pillar_connection_mode = zigzag
-support_pillar_diameter = 1.5
-support_pillar_widening_factor = 0
-support_points_density_relative = 100
-support_points_minimal_distance = 1
-supports_enable = 1
diff --git a/UVtools.WPF/Assets/PrusaSlicer/sla_print/Universal 0.025 UltraDetail - Medium Supports.ini b/UVtools.WPF/Assets/PrusaSlicer/sla_print/Universal 0.025 UltraDetail - Medium Supports.ini
deleted file mode 100644
index ed59379..0000000
--- a/UVtools.WPF/Assets/PrusaSlicer/sla_print/Universal 0.025 UltraDetail - Medium Supports.ini
+++ /dev/null
@@ -1,44 +0,0 @@
-# generated by PrusaSlicer 2.2.0+win64 on 2020-06-11 at 02:36:13 UTC
-compatible_printers =
-compatible_printers_condition =
-default_sla_print_profile =
-faded_layers = 10
-hollowing_closing_distance = 2
-hollowing_enable = 0
-hollowing_min_thickness = 3
-hollowing_quality = 0.5
-inherits = 0.025 UltraDetail
-layer_height = 0.025
-output_filename_format = {input_filename_base}_{material_type}{layer_height}mm_{printer_model}_{print_time}.sl1
-pad_around_object = 0
-pad_around_object_everywhere = 0
-pad_brim_size = 1.6
-pad_enable = 1
-pad_max_merge_distance = 50
-pad_object_connector_penetration = 0.3
-pad_object_connector_stride = 10
-pad_object_connector_width = 0.5
-pad_object_gap = 1
-pad_wall_height = 0
-pad_wall_slope = 90
-pad_wall_thickness = 1
-sla_print_settings_id =
-slice_closing_radius = 0.005
-support_base_diameter = 3
-support_base_height = 1
-support_base_safety_distance = 1
-support_buildplate_only = 0
-support_critical_angle = 45
-support_head_front_diameter = 0.8
-support_head_penetration = 0.4
-support_head_width = 2
-support_max_bridge_length = 10
-support_max_bridges_on_pillar = 3
-support_max_pillar_link_distance = 10
-support_object_elevation = 5
-support_pillar_connection_mode = zigzag
-support_pillar_diameter = 1.2
-support_pillar_widening_factor = 0
-support_points_density_relative = 100
-support_points_minimal_distance = 1
-supports_enable = 1
diff --git a/UVtools.WPF/Assets/PrusaSlicer/sla_print/Universal 0.035 Detail - Heavy Supports.ini b/UVtools.WPF/Assets/PrusaSlicer/sla_print/Universal 0.035 Detail - Heavy Supports.ini
deleted file mode 100644
index a46b970..0000000
--- a/UVtools.WPF/Assets/PrusaSlicer/sla_print/Universal 0.035 Detail - Heavy Supports.ini
+++ /dev/null
@@ -1,44 +0,0 @@
-# generated by PrusaSlicer 2.2.0+win64 on 2020-06-11 at 02:34:54 UTC
-compatible_printers =
-compatible_printers_condition =
-default_sla_print_profile =
-faded_layers = 10
-hollowing_closing_distance = 2
-hollowing_enable = 0
-hollowing_min_thickness = 3
-hollowing_quality = 0.5
-inherits = 0.035 Detail
-layer_height = 0.035
-output_filename_format = {input_filename_base}_{material_type}{layer_height}mm_{printer_model}_{print_time}.sl1
-pad_around_object = 0
-pad_around_object_everywhere = 0
-pad_brim_size = 1.6
-pad_enable = 1
-pad_max_merge_distance = 50
-pad_object_connector_penetration = 0.3
-pad_object_connector_stride = 10
-pad_object_connector_width = 0.5
-pad_object_gap = 1
-pad_wall_height = 0
-pad_wall_slope = 90
-pad_wall_thickness = 1
-sla_print_settings_id =
-slice_closing_radius = 0.005
-support_base_diameter = 3
-support_base_height = 1
-support_base_safety_distance = 1
-support_buildplate_only = 0
-support_critical_angle = 45
-support_head_front_diameter = 1
-support_head_penetration = 0.6
-support_head_width = 3
-support_max_bridge_length = 10
-support_max_bridges_on_pillar = 3
-support_max_pillar_link_distance = 10
-support_object_elevation = 5
-support_pillar_connection_mode = zigzag
-support_pillar_diameter = 1.5
-support_pillar_widening_factor = 0
-support_points_density_relative = 100
-support_points_minimal_distance = 1
-supports_enable = 1
diff --git a/UVtools.WPF/Assets/PrusaSlicer/sla_print/Universal 0.035 Detail - Medium Supports.ini b/UVtools.WPF/Assets/PrusaSlicer/sla_print/Universal 0.035 Detail - Medium Supports.ini
deleted file mode 100644
index fa0c748..0000000
--- a/UVtools.WPF/Assets/PrusaSlicer/sla_print/Universal 0.035 Detail - Medium Supports.ini
+++ /dev/null
@@ -1,44 +0,0 @@
-# generated by PrusaSlicer 2.2.0+win64 on 2020-06-11 at 02:34:31 UTC
-compatible_printers =
-compatible_printers_condition =
-default_sla_print_profile =
-faded_layers = 10
-hollowing_closing_distance = 2
-hollowing_enable = 0
-hollowing_min_thickness = 3
-hollowing_quality = 0.5
-inherits = 0.035 Detail
-layer_height = 0.035
-output_filename_format = {input_filename_base}_{material_type}{layer_height}mm_{printer_model}_{print_time}.sl1
-pad_around_object = 0
-pad_around_object_everywhere = 0
-pad_brim_size = 1.6
-pad_enable = 1
-pad_max_merge_distance = 50
-pad_object_connector_penetration = 0.3
-pad_object_connector_stride = 10
-pad_object_connector_width = 0.5
-pad_object_gap = 1
-pad_wall_height = 0
-pad_wall_slope = 90
-pad_wall_thickness = 1
-sla_print_settings_id =
-slice_closing_radius = 0.005
-support_base_diameter = 3
-support_base_height = 1
-support_base_safety_distance = 1
-support_buildplate_only = 0
-support_critical_angle = 45
-support_head_front_diameter = 0.8
-support_head_penetration = 0.4
-support_head_width = 3
-support_max_bridge_length = 10
-support_max_bridges_on_pillar = 3
-support_max_pillar_link_distance = 10
-support_object_elevation = 5
-support_pillar_connection_mode = zigzag
-support_pillar_diameter = 1.2
-support_pillar_widening_factor = 0
-support_points_density_relative = 100
-support_points_minimal_distance = 1
-supports_enable = 1
diff --git a/UVtools.WPF/Assets/PrusaSlicer/sla_print/Universal 0.05 Normal - Heavy Supports.ini b/UVtools.WPF/Assets/PrusaSlicer/sla_print/Universal 0.05 Normal - Heavy Supports.ini
deleted file mode 100644
index 10e334d..0000000
--- a/UVtools.WPF/Assets/PrusaSlicer/sla_print/Universal 0.05 Normal - Heavy Supports.ini
+++ /dev/null
@@ -1,44 +0,0 @@
-# generated by PrusaSlicer 2.2.0+win64 on 2020-06-11 at 02:24:57 UTC
-compatible_printers =
-compatible_printers_condition =
-default_sla_print_profile =
-faded_layers = 10
-hollowing_closing_distance = 2
-hollowing_enable = 0
-hollowing_min_thickness = 3
-hollowing_quality = 0.5
-inherits = 0.05 Normal
-layer_height = 0.05
-output_filename_format = {input_filename_base}_{material_type}{layer_height}mm_{printer_model}_{print_time}.sl1
-pad_around_object = 0
-pad_around_object_everywhere = 0
-pad_brim_size = 1.6
-pad_enable = 1
-pad_max_merge_distance = 50
-pad_object_connector_penetration = 0.3
-pad_object_connector_stride = 10
-pad_object_connector_width = 0.5
-pad_object_gap = 1
-pad_wall_height = 0
-pad_wall_slope = 90
-pad_wall_thickness = 1
-sla_print_settings_id =
-slice_closing_radius = 0.005
-support_base_diameter = 3
-support_base_height = 1
-support_base_safety_distance = 1
-support_buildplate_only = 0
-support_critical_angle = 45
-support_head_front_diameter = 1
-support_head_penetration = 0.6
-support_head_width = 3
-support_max_bridge_length = 10
-support_max_bridges_on_pillar = 3
-support_max_pillar_link_distance = 10
-support_object_elevation = 5
-support_pillar_connection_mode = zigzag
-support_pillar_diameter = 1.5
-support_pillar_widening_factor = 0
-support_points_density_relative = 100
-support_points_minimal_distance = 1
-supports_enable = 1
diff --git a/UVtools.WPF/Assets/PrusaSlicer/sla_print/Universal 0.05 Normal - Medium Supports.ini b/UVtools.WPF/Assets/PrusaSlicer/sla_print/Universal 0.05 Normal - Medium Supports.ini
deleted file mode 100644
index 79511c7..0000000
--- a/UVtools.WPF/Assets/PrusaSlicer/sla_print/Universal 0.05 Normal - Medium Supports.ini
+++ /dev/null
@@ -1,44 +0,0 @@
-# generated by PrusaSlicer 2.2.0+win64 on 2020-06-11 at 02:23:55 UTC
-compatible_printers =
-compatible_printers_condition =
-default_sla_print_profile =
-faded_layers = 10
-hollowing_closing_distance = 2
-hollowing_enable = 0
-hollowing_min_thickness = 3
-hollowing_quality = 0.5
-inherits = 0.05 Normal
-layer_height = 0.05
-output_filename_format = {input_filename_base}_{material_type}{layer_height}mm_{printer_model}_{print_time}.sl1
-pad_around_object = 0
-pad_around_object_everywhere = 0
-pad_brim_size = 1.6
-pad_enable = 1
-pad_max_merge_distance = 50
-pad_object_connector_penetration = 0.3
-pad_object_connector_stride = 10
-pad_object_connector_width = 0.5
-pad_object_gap = 1
-pad_wall_height = 0
-pad_wall_slope = 90
-pad_wall_thickness = 1
-sla_print_settings_id =
-slice_closing_radius = 0.005
-support_base_diameter = 3
-support_base_height = 1
-support_base_safety_distance = 1
-support_buildplate_only = 0
-support_critical_angle = 45
-support_head_front_diameter = 0.8
-support_head_penetration = 0.4
-support_head_width = 3
-support_max_bridge_length = 10
-support_max_bridges_on_pillar = 3
-support_max_pillar_link_distance = 10
-support_object_elevation = 5
-support_pillar_connection_mode = zigzag
-support_pillar_diameter = 1.2
-support_pillar_widening_factor = 0
-support_points_density_relative = 100
-support_points_minimal_distance = 1
-supports_enable = 1
diff --git a/UVtools.WPF/Assets/PrusaSlicer/sla_print/Universal 0.1 Fast - Heavy Supports.ini b/UVtools.WPF/Assets/PrusaSlicer/sla_print/Universal 0.1 Fast - Heavy Supports.ini
deleted file mode 100644
index 825330a..0000000
--- a/UVtools.WPF/Assets/PrusaSlicer/sla_print/Universal 0.1 Fast - Heavy Supports.ini
+++ /dev/null
@@ -1,44 +0,0 @@
-# generated by PrusaSlicer 2.2.0+win64 on 2020-06-11 at 02:30:54 UTC
-compatible_printers =
-compatible_printers_condition =
-default_sla_print_profile =
-faded_layers = 10
-hollowing_closing_distance = 2
-hollowing_enable = 0
-hollowing_min_thickness = 3
-hollowing_quality = 0.5
-inherits = 0.1 Fast
-layer_height = 0.1
-output_filename_format = {input_filename_base}_{material_type}{layer_height}mm_{printer_model}_{print_time}.sl1
-pad_around_object = 0
-pad_around_object_everywhere = 0
-pad_brim_size = 1.6
-pad_enable = 1
-pad_max_merge_distance = 50
-pad_object_connector_penetration = 0.3
-pad_object_connector_stride = 10
-pad_object_connector_width = 0.5
-pad_object_gap = 1
-pad_wall_height = 0
-pad_wall_slope = 90
-pad_wall_thickness = 1
-sla_print_settings_id =
-slice_closing_radius = 0.005
-support_base_diameter = 3
-support_base_height = 1
-support_base_safety_distance = 1
-support_buildplate_only = 0
-support_critical_angle = 45
-support_head_front_diameter = 1
-support_head_penetration = 0.7
-support_head_width = 3
-support_max_bridge_length = 10
-support_max_bridges_on_pillar = 3
-support_max_pillar_link_distance = 10
-support_object_elevation = 5
-support_pillar_connection_mode = zigzag
-support_pillar_diameter = 1.5
-support_pillar_widening_factor = 0
-support_points_density_relative = 100
-support_points_minimal_distance = 1
-supports_enable = 1
diff --git a/UVtools.WPF/Assets/PrusaSlicer/sla_print/Universal 0.1 Fast - Medium Supports.ini b/UVtools.WPF/Assets/PrusaSlicer/sla_print/Universal 0.1 Fast - Medium Supports.ini
deleted file mode 100644
index c43832c..0000000
--- a/UVtools.WPF/Assets/PrusaSlicer/sla_print/Universal 0.1 Fast - Medium Supports.ini
+++ /dev/null
@@ -1,44 +0,0 @@
-# generated by PrusaSlicer 2.2.0+win64 on 2020-09-05 at 15:51:14 UTC
-compatible_printers =
-compatible_printers_condition =
-default_sla_print_profile =
-faded_layers = 10
-hollowing_closing_distance = 2
-hollowing_enable = 0
-hollowing_min_thickness = 3
-hollowing_quality = 0.5
-inherits = 0.1 Fast
-layer_height = 0.1
-output_filename_format = {input_filename_base}_{material_type}{layer_height}mm_{printer_model}_{print_time}.sl1
-pad_around_object = 0
-pad_around_object_everywhere = 0
-pad_brim_size = 1.6
-pad_enable = 1
-pad_max_merge_distance = 50
-pad_object_connector_penetration = 0.3
-pad_object_connector_stride = 10
-pad_object_connector_width = 0.5
-pad_object_gap = 1
-pad_wall_height = 0
-pad_wall_slope = 90
-pad_wall_thickness = 1
-sla_print_settings_id =
-slice_closing_radius = 0.005
-support_base_diameter = 3
-support_base_height = 1
-support_base_safety_distance = 1
-support_buildplate_only = 0
-support_critical_angle = 45
-support_head_front_diameter = 0.9
-support_head_penetration = 0.5
-support_head_width = 3
-support_max_bridge_length = 10
-support_max_bridges_on_pillar = 3
-support_max_pillar_link_distance = 10
-support_object_elevation = 5
-support_pillar_connection_mode = zigzag
-support_pillar_diameter = 1.3
-support_pillar_widening_factor = 0
-support_points_density_relative = 100
-support_points_minimal_distance = 1
-supports_enable = 1
diff --git a/UVtools.WPF/Controls/DummyControl.axaml b/UVtools.WPF/Controls/DummyControl.axaml
index 9e91fca..743118c 100644
--- a/UVtools.WPF/Controls/DummyControl.axaml
+++ b/UVtools.WPF/Controls/DummyControl.axaml
@@ -4,5 +4,59 @@
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d" d:DesignWidth="500" d:DesignHeight="450"
x:Class="UVtools.WPF.Controls.DummyControl">
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/UVtools.WPF/Extensions/BitmapExtension.cs b/UVtools.WPF/Extensions/BitmapExtension.cs
index c050bb8..d067661 100644
--- a/UVtools.WPF/Extensions/BitmapExtension.cs
+++ b/UVtools.WPF/Extensions/BitmapExtension.cs
@@ -24,7 +24,7 @@ namespace UVtools.WPF.Extensions
public static class BitmapExtension
{
public static int GetStep(this WriteableBitmap bitmap)
- => (int)(bitmap.Size.Width * 4);
+ => (int)bitmap.Size.Width;
///
/// Gets the total length of this
@@ -32,10 +32,13 @@ namespace UVtools.WPF.Extensions
///
/// The total length of this
public static int GetLength(this WriteableBitmap bitmap)
- => (int) (bitmap.Size.Width * 4 * bitmap.Size.Height);
+ => (int) (bitmap.Size.Width * bitmap.Size.Height);
public static int GetPixelPos(this WriteableBitmap bitmap, int x, int y)
- => (int)(bitmap.Size.Width * 4 * y + x);
+ => (int)(bitmap.Size.Width * y + x);
+
+ public static int GetPixelPos(this WriteableBitmap bitmap, System.Drawing.Point location) =>
+ bitmap.GetPixelPos(location.X, location.Y);
///
/// Gets a single pixel span to manipulate or read pixels
@@ -43,33 +46,33 @@ namespace UVtools.WPF.Extensions
/// Pixel type
/// Input
/// A containing all pixels in data memory
- public static unsafe Span GetPixelSpan(this WriteableBitmap bitmap)
+ public static unsafe Span GetPixelSpan(this WriteableBitmap bitmap)
{
using var l = bitmap.Lock();
- return new Span(l.Address.ToPointer(), bitmap.GetLength());
+ return new Span(l.Address.ToPointer(), bitmap.GetLength());
}
- public static unsafe Span GetPixelSpan(this WriteableBitmap bitmap, int length, int offset = 0)
+ public static unsafe Span GetPixelSpan(this WriteableBitmap bitmap, int length, int offset = 0)
{
using var l = bitmap.Lock();
- return new Span(IntPtr.Add(l.Address, offset).ToPointer(), length);
+ return new Span(IntPtr.Add(l.Address, offset).ToPointer(), length);
}
- public static Span GetSinglePixelSpan(this WriteableBitmap bitmap, int x, int y, int length = 3)
+ public static Span GetSinglePixelSpan(this WriteableBitmap bitmap, int x, int y, int length = 1)
{
using var l = bitmap.Lock();
return bitmap.GetPixelSpan(length, bitmap.GetPixelPos(x, y));
}
- public static Span GetSinglePixelPosSpan(this WriteableBitmap bitmap, int pos, int length = 3)
+ public static Span GetSinglePixelPosSpan(this WriteableBitmap bitmap, int pos, int length = 3)
=> bitmap.GetPixelSpan(length, pos);
- public static unsafe Span GetPixelRowSpan(this WriteableBitmap bitmap, int y, int length = 0, int offset = 0)
+ public static unsafe Span GetPixelRowSpan(this WriteableBitmap bitmap, int y, int length = 0, int offset = 0)
{
using var l = bitmap.Lock();
- return new Span(IntPtr.Add(l.Address, (int) (bitmap.Size.Width * 4 * y + offset)).ToPointer(), (int) (length == 0 ? bitmap.Size.Width * 4 : length));
+ return new Span(IntPtr.Add(l.Address, (int) (bitmap.Size.Width * y + offset)).ToPointer(), (int) (length == 0 ? bitmap.Size.Width : length));
}
public static SKBitmap ToSkBitmap(this Mat mat)
diff --git a/UVtools.WPF/MainWindow.Information.cs b/UVtools.WPF/MainWindow.Information.cs
index e58eca4..0b39aaf 100644
--- a/UVtools.WPF/MainWindow.Information.cs
+++ b/UVtools.WPF/MainWindow.Information.cs
@@ -9,16 +9,19 @@ using System;
using System.Collections.ObjectModel;
using System.Drawing;
using System.IO;
+using System.Linq;
using System.Text;
using Avalonia;
using Avalonia.Controls;
+using Avalonia.Input;
using Emgu.CV.CvEnum;
using MessageBox.Avalonia.Enums;
+using UVtools.Core;
using UVtools.Core.PixelEditor;
-using UVtools.WPF.Controls;
using UVtools.WPF.Extensions;
using UVtools.WPF.Structures;
using Bitmap = Avalonia.Media.Imaging.Bitmap;
+using Helpers = UVtools.WPF.Controls.Helpers;
using Point = System.Drawing.Point;
namespace UVtools.WPF
@@ -26,10 +29,36 @@ namespace UVtools.WPF
public partial class MainWindow
{
public ObservableCollection SlicerProperties { get; } = new ObservableCollection();
+ public DataGrid PropertiesGrid;
private uint _visibleThumbnailIndex;
private Bitmap _visibleThumbnailImage;
+ public void InitInformation()
+ {
+ PropertiesGrid = this.Find("PropertiesGrid");
+ PropertiesGrid.KeyUp += PropertiesGridOnKeyUp;
+ }
+
+ private void PropertiesGridOnKeyUp(object? sender, KeyEventArgs e)
+ {
+ switch (e.Key)
+ {
+ case Key.Escape:
+ PropertiesGrid.SelectedItems.Clear();
+ break;
+ case Key.Multiply:
+ var selectedItems = PropertiesGrid.SelectedItems.OfType().ToList();
+ PropertiesGrid.SelectedItems.Clear();
+ foreach (SlicerProperty item in SlicerProperties)
+ {
+ if (!selectedItems.Contains(item))
+ PropertiesGrid.SelectedItems.Add(item);
+ }
+ break;
+ }
+ }
+
#region Thumbnails
public uint VisibleThumbnailIndex
{
diff --git a/UVtools.WPF/MainWindow.Issues.cs b/UVtools.WPF/MainWindow.Issues.cs
index 78827eb..1f96b03 100644
--- a/UVtools.WPF/MainWindow.Issues.cs
+++ b/UVtools.WPF/MainWindow.Issues.cs
@@ -51,6 +51,14 @@ namespace UVtools.WPF
#endregion
#region Methods
+
+ public void InitIssues()
+ {
+ IssuesGrid = this.FindControl("IssuesGrid");
+ IssuesGrid.CellPointerPressed += IssuesGridOnCellPointerPressed;
+ IssuesGrid.KeyUp += IssuesGridOnKeyUp;
+ }
+
public void IssueGoPrevious()
{
if (!IssueCanGoPrevious) return;
@@ -287,7 +295,7 @@ namespace UVtools.WPF
public string IssueSelectedIndexStr => (_issueSelectedIndex + 1).ToString().PadLeft(Issues.Count.ToString().Length, '0');
- private void IssuesGridOnSelectionChanged(PointerPressedEventArgs pointer = null)
+ private void IssuesGridOnSelectionChanged()
{
if (IssuesGrid.SelectedItems.Count != 1) return;
if (!(IssuesGrid.SelectedItem is LayerIssue issue)) return;
@@ -295,14 +303,14 @@ namespace UVtools.WPF
if (issue.Type == LayerIssue.IssueType.TouchingBound || issue.Type == LayerIssue.IssueType.EmptyLayer ||
(issue.X == -1 && issue.Y == -1))
{
- ZoomToFit(pointer);
+ ZoomToFit();
}
else if (issue.X >= 0 && issue.Y >= 0)
{
- if (Settings.LayerPreview.ZoomIssues ^ (!ReferenceEquals(pointer, null) && (pointer.KeyModifiers & KeyModifiers.Alt) != 0))
+ if (Settings.LayerPreview.ZoomIssues ^ (_globalModifiers & KeyModifiers.Alt) != 0)
{
- ZoomToIssue(issue, pointer);
+ ZoomToIssue(issue);
}
else
{
@@ -313,7 +321,7 @@ namespace UVtools.WPF
if (!LayerImageBox.GetSourceImageRegion().Contains(GetTransposedIssueBounds(issue).ToAvalonia()))
{
- CenterAtIssue(issue, pointer);
+ CenterAtIssue(issue);
}
}
}
@@ -331,13 +339,13 @@ namespace UVtools.WPF
var pointer = e.PointerPressedEventArgs.GetCurrentPoint(IssuesGrid);
if (pointer.Properties.IsLeftButtonPressed)
{
- ZoomToIssue(issue, e.PointerPressedEventArgs);
+ ZoomToIssue(issue);
return;
}
if (pointer.Properties.IsRightButtonPressed)
{
- ZoomToFit(e.PointerPressedEventArgs);
+ ZoomToFit();
return;
}
@@ -345,6 +353,30 @@ namespace UVtools.WPF
}
+ private void IssuesGridOnKeyUp(object? sender, KeyEventArgs e)
+ {
+ switch (e.Key)
+ {
+ case Key.Escape:
+ IssuesGrid.SelectedItems.Clear();
+ break;
+ case Key.Multiply:
+ var selectedItems = IssuesGrid.SelectedItems.OfType().ToList();
+ IssuesGrid.SelectedItems.Clear();
+ foreach (LayerIssue item in Issues)
+ {
+ if (!selectedItems.Contains(item))
+ IssuesGrid.SelectedItems.Add(item);
+ }
+
+
+ break;
+ case Key.Delete:
+ OnClickIssueRemove();
+ break;
+ }
+ }
+
public async void OnClickRepairIssues()
{
await ShowRunOperation(typeof(OperationRepairLayers));
diff --git a/UVtools.WPF/MainWindow.LayerPreview.cs b/UVtools.WPF/MainWindow.LayerPreview.cs
index 659b3ba..a156690 100644
--- a/UVtools.WPF/MainWindow.LayerPreview.cs
+++ b/UVtools.WPF/MainWindow.LayerPreview.cs
@@ -11,12 +11,14 @@ using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using System.IO;
+using System.Linq;
using System.Threading.Tasks;
using System.Timers;
using Avalonia;
using Avalonia.Controls;
using Avalonia.Input;
using Avalonia.Platform;
+using Avalonia.Threading;
using Emgu.CV;
using Emgu.CV.CvEnum;
using Emgu.CV.Structure;
@@ -58,6 +60,77 @@ namespace UVtools.WPF
public LayerCache LayerCache = new LayerCache();
private Point _lastPixelMouseLocation = Point.Empty;
+ public void InitLayerPreview()
+ {
+ LayerImageBox = this.FindControl("LayerImage");
+ LayerSlider = this.FindControl("Layer.Navigation.Slider");
+ LayerNavigationTooltipPanel = this.FindControl("Layer.Navigation.Tooltip.Panel");
+ LayerNavigationTooltipBorder = this.FindControl("Layer.Navigation.Tooltip.Border");
+
+ _showLayerImageDifference = Settings.LayerPreview.ShowLayerDifference;
+ _showLayerOutlinePrintVolumeBoundary = Settings.LayerPreview.VolumeBoundsOutline;
+ _showLayerOutlineLayerBoundary = Settings.LayerPreview.LayerBoundsOutline;
+ _showLayerOutlineHollowAreas = Settings.LayerPreview.HollowOutline;
+
+ LayerImageBox.PropertyChanged += (sender, e) =>
+ {
+ if (e.PropertyName == nameof(LayerImageBox.Zoom))
+ {
+ RaisePropertyChanged(nameof(LayerZoomStr));
+ AddLogVerbose($"Zoomed from {LayerImageBox.OldZoom} to {LayerImageBox.Zoom}");
+
+ if (ShowLayerImageCrosshairs &&
+ Issues.Count > 0 &&
+ (LayerImageBox.OldZoom < 50 &&
+ LayerImageBox.Zoom >= 50 // Trigger refresh as crosshair thickness increases at lower zoom levels
+ || LayerImageBox.OldZoom > 100 && LayerImageBox.Zoom <= 100
+ || LayerImageBox.OldZoom >= 50 && LayerImageBox.OldZoom <= 100 && (LayerImageBox.Zoom < 50 || LayerImageBox.Zoom > 100)
+ || LayerImageBox.OldZoom <= AppSettings.CrosshairFadeLevel &&
+ LayerImageBox.Zoom > AppSettings.CrosshairFadeLevel // Trigger refresh as zoom level manually crosses fade threshold
+ || LayerImageBox.OldZoom > AppSettings.CrosshairFadeLevel && LayerImageBox.Zoom <= AppSettings.CrosshairFadeLevel)
+
+ )
+ {
+ if (Settings.LayerPreview.CrosshairShowOnlyOnSelectedIssues)
+ {
+ if (IssuesGrid.SelectedItems.Count == 0 || !IssuesGrid.SelectedItems.Cast().Any(
+ issue => // Find a valid candidate to update layer preview, otherwise quit
+ issue.LayerIndex == ActualLayer && issue.Type != LayerIssue.IssueType.EmptyLayer &&
+ issue.Type != LayerIssue.IssueType.TouchingBound)) return;
+ }
+ else
+ {
+ if (!Issues.Any(
+ issue => // Find a valid candidate to update layer preview, otherwise quit
+ issue.LayerIndex == ActualLayer && issue.Type != LayerIssue.IssueType.EmptyLayer &&
+ issue.Type != LayerIssue.IssueType.TouchingBound)) return;
+ }
+
+ // A timer is used here rather than invoking ShowLayer directly to eliminate sublte visual flashing
+ // that will occur on the transition when the crosshair fades or unfades if ShowLayer is called directly.
+ ShowLayer();
+ }
+
+ return;
+ }
+
+ if (e.PropertyName == nameof(LayerImageBox.SelectionRegion))
+ {
+ RaisePropertyChanged(nameof(LayerROIStr));
+ }
+
+ };
+
+ LayerImageBox.PointerMoved += LayerImageBoxOnPointerMoved;
+ LayerImageBox.KeyUp += LayerImageBox_KeyUp;
+ LayerImageBox.PointerReleased += LayerImageBox_PointerReleased;
+
+ _layerNavigationTooltipTimer.Elapsed += (sender, args) =>
+ {
+ Dispatcher.UIThread.InvokeAsync(() => RaisePropertyChanged(nameof(LayerNavigationTooltipMargin)));
+ };
+ }
+
public bool ShowLayerImageRotated
{
get => _showLayerImageRotated;
@@ -310,6 +383,11 @@ namespace UVtools.WPF
ActualLayer = SliderMaximumValue;
}
+ public void RefreshLayerImage()
+ {
+ LayerImageBox.Image = LayerCache.ImageBgr.ToBitmap();
+ }
+
///
/// Shows a layer number
///
@@ -821,12 +899,12 @@ namespace UVtools.WPF
/// Zoom the layer preview to the passed issue, or if appropriate for issue type,
/// Zoom to fit the plate or print bounds.
///
- private void ZoomToIssue(LayerIssue issue, PointerPressedEventArgs pointer = null)
+ private void ZoomToIssue(LayerIssue issue)
{
if (issue.Type == LayerIssue.IssueType.TouchingBound || issue.Type == LayerIssue.IssueType.EmptyLayer ||
(issue.X == -1 && issue.Y == -1))
{
- ZoomToFit(pointer);
+ ZoomToFit();
return;
}
@@ -854,12 +932,12 @@ namespace UVtools.WPF
/// Center the layer preview on the passed issue, or if appropriate for issue type,
/// Zoom to fit the plate or print bounds.
///
- private void CenterAtIssue(LayerIssue issue, PointerPressedEventArgs pointer)
+ private void CenterAtIssue(LayerIssue issue)
{
if (issue.Type == LayerIssue.IssueType.TouchingBound || issue.Type == LayerIssue.IssueType.EmptyLayer ||
(issue.X == -1 && issue.Y == -1))
{
- ZoomToFit(pointer);
+ ZoomToFit();
}
if (issue.X >= 0 && issue.Y >= 0)
@@ -878,14 +956,14 @@ namespace UVtools.WPF
LayerImageBox.ZoomToRegion(SlicerFile.LayerManager.BoundingRectangle);
}
- private void ZoomToFit(PointerPressedEventArgs pointer = null)
+ private void ZoomToFit()
{
if (!IsFileLoaded) return;
// If ALT key is pressed when ZoomToFit is performed, the configured option for
// zoom to plate vs. zoom to print bounds will be inverted.
- if (Settings.LayerPreview.ZoomToFitPrintVolumeBounds ^ (!ReferenceEquals(pointer, null) && (pointer.KeyModifiers & KeyModifiers.Alt) != 0))
+ if (Settings.LayerPreview.ZoomToFitPrintVolumeBounds ^ (_globalModifiers & KeyModifiers.Alt) != 0)
{
if (!_showLayerImageRotated)
{
@@ -959,8 +1037,10 @@ namespace UVtools.WPF
//location = pbLayer.PointToImage(e.Location);
_lastPixelMouseLocation = Point.Empty;
+ var imagePosition = LayerImageBox.PointToImage(pointer.Position).ToDotNet();
+
// Left or Alt-Right Adds pixel, Right or Alt-Left removes pixel
- DrawPixel(e.InitialPressMouseButton == MouseButton.Left ^ (e.KeyModifiers & KeyModifiers.Alt) != 0, pointer.Position.ToDotNet(), e.KeyModifiers);
+ DrawPixel(e.InitialPressMouseButton == MouseButton.Left ^ (e.KeyModifiers & KeyModifiers.Alt) != 0, imagePosition, e.KeyModifiers);
}
private void LayerImageBox_KeyUp(object? sender, KeyEventArgs e)
@@ -971,72 +1051,8 @@ namespace UVtools.WPF
e.Handled = true;
return;
}
- if (e.Key == Key.LeftShift ||
- e.Key == Key.RightShift ||
- (e.KeyModifiers & KeyModifiers.Shift) == 0 ||
- (e.KeyModifiers & KeyModifiers.Control) == 0)
- {
- LayerImageBox.Cursor = StaticControls.ArrowCursor;
- LayerImageBox.AutoPan = true;
- LayerImageBox.SelectionMode = AdvancedImageBox.SelectionModes.None;
- //lbLayerImageTooltipOverlay.Visible = false;
- e.Handled = true;
- }
}
- private void LayerImageBox_KeyDown(object? sender, KeyEventArgs e)
- {
- if (e.Handled
- || !IsFileLoaded
- || LayerImageBox.IsPanning
- || LayerImageBox.Cursor == StaticControls.CrossCursor
- || LayerImageBox.Cursor == StaticControls.HandCursor
- || LayerImageBox.SelectionMode == AdvancedImageBox.SelectionModes.Rectangle
- ) return;
-
- // Pixel Edit is active, Shift is down, and the cursor is over the image region.
- if (e.KeyModifiers == KeyModifiers.Shift)
- {
- if (IsPixelEditorActive)
- {
- LayerImageBox.AutoPan = false;
- LayerImageBox.Cursor = StaticControls.CrossCursor;
- /*lbLayerImageTooltipOverlay.Text = "Pixel editing is on:\n" +
- "» Click over a pixel to draw\n" +
- "» Hold CTRL to clear pixels";
-
- UpdatePixelEditorCursor();*/
- }
- else
- {
- LayerImageBox.Cursor = StaticControls.CrossCursor;
- LayerImageBox.SelectionMode = AdvancedImageBox.SelectionModes.Rectangle;
- /*lbLayerImageTooltipOverlay.Text = "ROI selection mode:\n" +
- "» Left-click drag to select a fixed region\n" +
- "» Left-click + ALT drag to select specific objects\n" +
- "» Right click on a specific object to select it\n" +
- "Press Esc to clear the ROI";*/
- }
-
- //lbLayerImageTooltipOverlay.Visible = Settings.Default.LayerTooltipOverlay;
- e.Handled = true;
- return;
- }
-
- if (e.KeyModifiers == KeyModifiers.Control)
- {
- LayerImageBox.Cursor = StaticControls.HandCursor;
- LayerImageBox.AutoPan = false;
- /*lbLayerImageTooltipOverlay.Text = "Issue selection mode:\n" +
- "» Click over an issue to select it";
-
- lbLayerImageTooltipOverlay.Visible = Settings.Default.LayerTooltipOverlay;*/
- e.Handled = true;
- return;
- }
- }
-
-
private void LayerImageBoxOnPointerMoved(object? sender, PointerEventArgs e)
{
var pointer = e.GetCurrentPoint(LayerImageBox);
diff --git a/UVtools.WPF/MainWindow.PixelEditor.cs b/UVtools.WPF/MainWindow.PixelEditor.cs
index 82fa17c..fb90a8f 100644
--- a/UVtools.WPF/MainWindow.PixelEditor.cs
+++ b/UVtools.WPF/MainWindow.PixelEditor.cs
@@ -8,14 +8,20 @@
using System;
using System.Collections.ObjectModel;
+using System.Diagnostics;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using Avalonia.Controls;
using Avalonia.Input;
+using Avalonia.Media;
+using Avalonia.Media.Imaging;
using DynamicData;
+using Emgu.CV;
using Emgu.CV.CvEnum;
+using Emgu.CV.Structure;
using MessageBox.Avalonia.Enums;
+using UVtools.Core.Extensions;
using UVtools.Core.PixelEditor;
using UVtools.WPF.Extensions;
@@ -39,17 +45,54 @@ namespace UVtools.WPF
set => RaiseAndSetIfChanged(ref _selectedPixelOperationTabIndex, value);
}
+ public void InitPixelEditor()
+ {
+ DrawingsGrid = this.FindControl("DrawingsGrid");
+ DrawingsGrid.KeyUp += DrawingsGridOnKeyUp;
+ DrawingsGrid.SelectionChanged += (sender, args) =>
+ {
+ ShowLayer();
+ };
+ }
+
+ private void DrawingsGridOnKeyUp(object? sender, KeyEventArgs e)
+ {
+ switch (e.Key)
+ {
+ case Key.Escape:
+ DrawingsGrid.SelectedItems.Clear();
+ break;
+ case Key.Multiply:
+ var selectedItems = DrawingsGrid.SelectedItems.OfType().ToList();
+ DrawingsGrid.SelectedItems.Clear();
+ foreach (PixelOperation item in Drawings)
+ {
+ if (!selectedItems.Contains(item))
+ DrawingsGrid.SelectedItems.Add(item);
+ }
+
+
+ break;
+ case Key.Delete:
+ OnClickDrawingRemove();
+ break;
+ }
+ }
+
public void OnClickDrawingRemove()
{
if (DrawingsGrid.SelectedItems.Count == 0) return;
Drawings.RemoveMany(DrawingsGrid.SelectedItems.Cast());
+ ShowLayer();
}
public async void OnClickDrawingClear()
{
- if(await this.MessageBoxQuestion($"Are you sure you want to clear {Drawings.Count} operations?",
+ if (Drawings.Count == 0) return;
+ if (await this.MessageBoxQuestion($"Are you sure you want to clear {Drawings.Count} operations?",
"Clear pixel editor operations?") != ButtonResult.Yes) return;
Drawings.Clear();
+ ShowLayer();
}
void DrawPixel(bool isAdd, Point location, KeyModifiers keyModifiers)
@@ -77,160 +120,160 @@ namespace UVtools.WPF
return;
}
- PixelOperation operation = null;
- //Bitmap bmp = pbLayer.Image as Bitmap;
+ WriteableBitmap bitmap = (WriteableBitmap)LayerImageBox.Image;
+ //var context = CreateRenderTarget().CreateDrawingContext(bitmap);
+
+ //Bitmap bmp = pbLayer.Image as Bitmap;
if (SelectedPixelOperationTabIndex == (byte)PixelOperation.PixelOperationType.Drawing)
{
uint minLayer = Math.Max(0, _actualLayer - DrawingPixelDrawing.LayersBelow);
- uint maxLayer = Math.Min(SlicerFile.LayerCount - 1,
- _actualLayer + DrawingPixelDrawing.LayersAbove);
+ uint maxLayer = Math.Min(SlicerFile.LayerCount - 1, _actualLayer + DrawingPixelDrawing.LayersAbove);
for (uint layerIndex = minLayer; layerIndex <= maxLayer; layerIndex++)
{
- operation = new PixelDrawing(layerIndex, realLocation, DrawingPixelDrawing.LineType,
+ var operationDrawing = new PixelDrawing(layerIndex, realLocation, DrawingPixelDrawing.LineType,
DrawingPixelDrawing.BrushShape, DrawingPixelDrawing.BrushSize, DrawingPixelDrawing.Thickness, isAdd);
//if (PixelHistory.Contains(operation)) continue;
- Drawings.Add(operation);
+ Drawings.Add(operationDrawing);
- if (layerIndex == ActualLayer)
+ if (layerIndex == _actualLayer)
{
- /*using (var gfx = Graphics.FromImage(bmp))
+ var color = isAdd
+ ? Settings.PixelEditor.AddPixelColor
+ : Settings.PixelEditor.RemovePixelColor;
+
+ if (operationDrawing.BrushSize == 1)
{
- int shiftPos = brushSize / 2;
- gfx.SmoothingMode = SmoothingMode.HighSpeed;
-
- var color = isAdd
- ? (flvPixelHistory.SelectedObjects.Contains(operation)
- ? Settings.Default.PixelEditorAddPixelHLColor
- : Settings.Default.PixelEditorAddPixelColor)
- : (flvPixelHistory.SelectedObjects.Contains(operation)
- ? Settings.Default.PixelEditorRemovePixelHLColor
- : Settings.Default.PixelEditorRemovePixelColor);
- if (lineType == LineType.AntiAlias && brushSize > 1)
+ unsafe
{
- gfx.SmoothingMode = SmoothingMode.AntiAlias;
+ using (var bl = bitmap.Lock())
+ {
+ var data = (uint*)bl.Address.ToPointer();
+ data[bitmap.GetPixelPos(location)] =
+ color.ToUint32();
+ }
}
+
+ LayerImageBox.InvalidateArrange();
+ // LayerCache.ImageBgr.SetByte(operationDrawing.Location.X, operationDrawing.Location.Y,
+ // new[] { color.B, color.G, color.R });
+ continue;
+ }
- switch (shapeType)
- {
- case PixelDrawing.BrushShapeType.Rectangle:
- if (thickness > 0)
- gfx.DrawRectangle(new Pen(color, thickness), Math.Max(0, location.X - shiftPos),
- Math.Max(0, location.Y - shiftPos),
- (int)nmPixelEditorDrawingBrushSize.Value,
- (int)nmPixelEditorDrawingBrushSize.Value);
- else
- gfx.FillRectangle(new SolidBrush(color), Math.Max(0, location.X - shiftPos),
- Math.Max(0, location.Y - shiftPos),
- (int)nmPixelEditorDrawingBrushSize.Value,
- (int)nmPixelEditorDrawingBrushSize.Value);
- break;
- case PixelDrawing.BrushShapeType.Circle:
- if (thickness > 0)
- gfx.DrawEllipse(new Pen(color, thickness), Math.Max(0, location.X - shiftPos),
- Math.Max(0, location.Y - shiftPos),
- (int)nmPixelEditorDrawingBrushSize.Value,
- (int)nmPixelEditorDrawingBrushSize.Value);
- else
- gfx.FillEllipse(new SolidBrush(color), Math.Max(0, location.X - shiftPos),
- Math.Max(0, location.Y - shiftPos),
- (int)nmPixelEditorDrawingBrushSize.Value,
- (int)nmPixelEditorDrawingBrushSize.Value);
- break;
- default:
- throw new ArgumentOutOfRangeException();
- }
- }*/
+ switch (operationDrawing.BrushShape)
+ {
+ case PixelDrawing.BrushShapeType.Rectangle:
+ CvInvoke.Rectangle(LayerCache.ImageBgr, GetTransposedRectangle(operationDrawing.Rectangle),
+ new MCvScalar(color.B, color.G, color.R), operationDrawing.Thickness,
+ operationDrawing.LineType);
+ break;
+ case PixelDrawing.BrushShapeType.Circle:
+ CvInvoke.Circle(LayerCache.ImageBgr, location, operationDrawing.BrushSize / 2,
+ new MCvScalar(color.B, color.G, color.R), operationDrawing.Thickness,
+ operationDrawing.LineType);
+ break;
+ default:
+ throw new ArgumentOutOfRangeException();
+ }
+
+ RefreshLayerImage();
}
}
}
- /*else if (tabControlPixelEditor.SelectedIndex == (byte)PixelOperation.PixelOperationType.Text)
+ else if (SelectedPixelOperationTabIndex == (byte)PixelOperation.PixelOperationType.Text)
{
- if (string.IsNullOrEmpty(tbPixelEditorTextText.Text) || nmPixelEditorTextFontScale.Value < 0.2m) return;
+ if (string.IsNullOrEmpty(DrawingPixelText.Text) || DrawingPixelText.FontScale < 0.2) return;
- LineType lineType = (LineType)cbPixelEditorTextLineType.SelectedItem;
- FontFace fontFace = (FontFace)cbPixelEditorTextFontFace.SelectedItem;
-
- uint minLayer = (uint)Math.Max(0, ActualLayer - nmPixelEditorTextLayersBelow.Value);
- uint maxLayer = (uint)Math.Min(SlicerFile.LayerCount - 1,
- ActualLayer + nmPixelEditorTextLayersAbove.Value);
+ uint minLayer = Math.Max(0, ActualLayer - DrawingPixelText.LayersBelow);
+ uint maxLayer = Math.Min(SlicerFile.LayerCount - 1,
+ ActualLayer + DrawingPixelText.LayersAbove);
for (uint layerIndex = minLayer; layerIndex <= maxLayer; layerIndex++)
{
- operation = new PixelText(layerIndex, realLocation, lineType,
- fontFace, (double)nmPixelEditorTextFontScale.Value, (ushort)nmPixelEditorTextThickness.Value,
- tbPixelEditorTextText.Text, cbPixelEditorTextMirror.Checked, isAdd);
+ var operationText = new PixelText(layerIndex, realLocation, DrawingPixelText.LineType,
+ DrawingPixelText.Font, DrawingPixelText.FontScale, DrawingPixelText.Thickness,
+ DrawingPixelText.Text, DrawingPixelText.Mirror, isAdd);
- if (PixelHistory.Contains(operation)) continue;
- PixelHistory.Add(operation);
+ //if (PixelHistory.Contains(operation)) continue;
+ //PixelHistory.Add(operation);
+ Drawings.Add(operationText);
+
+ /*var color = isAdd
+ ? Settings.PixelEditor.AddPixelColor : Settings.PixelEditor.RemovePixelColor;
+
+ if (layerIndex == _actualLayer)
+ {
+ CvInvoke.PutText(LayerCache.ImageBgr, operationText.Text, location,
+ operationText.Font, operationText.FontScale, new MCvScalar(color.B, color.G, color.R),
+ operationText.Thickness, operationText.LineType, operationText.Mirror);
+ RefreshLayerImage();
+ }*/
}
ShowLayer();
return;
}
- else if (tabControlPixelEditor.SelectedIndex == (byte)PixelOperation.PixelOperationType.Eraser)
+ else if (SelectedPixelOperationTabIndex == (byte)PixelOperation.PixelOperationType.Eraser)
{
- if (ActualLayerImage.GetByte(realLocation) < 10) return;
- uint minLayer = (uint)Math.Max(0, ActualLayer - nmPixelEditorEraserLayersBelow.Value);
- uint maxLayer = (uint)Math.Min(SlicerFile.LayerCount - 1,
- ActualLayer + nmPixelEditorEraserLayersAbove.Value);
+ if (LayerCache.Image.GetByte(realLocation) < 10) return;
+ uint minLayer = Math.Max(0, ActualLayer - DrawingPixelEraser.LayersBelow);
+ uint maxLayer = Math.Min(SlicerFile.LayerCount - 1,
+ ActualLayer + DrawingPixelEraser.LayersAbove);
for (uint layerIndex = minLayer; layerIndex <= maxLayer; layerIndex++)
{
- operation = new PixelEraser(layerIndex, realLocation);
+ var operationEraser = new PixelEraser(layerIndex, realLocation);
- if (PixelHistory.Contains(operation)) continue;
- PixelHistory.Add(operation);
+ //if (PixelHistory.Contains(operation)) continue;
+ Drawings.Add(operationEraser);
+
+ /*if (layerIndex == _actualLayer)
+ {
+ for (int i = 0; i < LayerCache.LayerContours.Size; i++)
+ {
+ if (CvInvoke.PointPolygonTest(LayerCache.LayerContours[i], operationEraser.Location, false) >= 0)
+ {
+ CvInvoke.DrawContours(LayerCache.ImageBgr, LayerCache.LayerContours, i,
+ new MCvScalar(Settings.PixelEditor.RemovePixelColor.B, Settings.PixelEditor.RemovePixelColor.G, Settings.PixelEditor.RemovePixelColor.R), -1);
+ RefreshLayerImage();
+ break;
+ }
+ }
+ }*/
}
ShowLayer();
return;
}
- else if (tabControlPixelEditor.SelectedIndex == (byte)PixelOperation.PixelOperationType.Supports)
+ else if (SelectedPixelOperationTabIndex == (byte)PixelOperation.PixelOperationType.Supports)
{
if (ActualLayer == 0) return;
- operation = new PixelSupport(ActualLayer, realLocation,
- (byte)nmPixelEditorSupportsTipDiameter.Value, (byte)nmPixelEditorSupportsPillarDiameter.Value,
- (byte)nmPixelEditorSupportsBaseDiameter.Value);
+ var operationSupport = new PixelSupport(ActualLayer, realLocation,
+ DrawingPixelSupport.TipDiameter, DrawingPixelSupport.PillarDiameter,
+ DrawingPixelSupport.BaseDiameter);
- if (PixelHistory.Contains(operation)) return;
- PixelHistory.Add(operation);
+ //if (PixelHistory.Contains(operation)) return;
+ Drawings.Add(operationSupport);
- SolidBrush brush = new SolidBrush(flvPixelHistory.SelectedObjects.Contains(operation)
- ? Settings.Default.PixelEditorSupportHLColor
- : Settings.Default.PixelEditorSupportColor);
- using (var gfx = Graphics.FromImage(bmp))
- {
- int shiftPos = (int)nmPixelEditorSupportsTipDiameter.Value / 2;
- gfx.SmoothingMode = SmoothingMode.HighSpeed;
- gfx.FillEllipse(brush, Math.Max(0, location.X - shiftPos), Math.Max(0, location.Y - shiftPos),
- (int)nmPixelEditorSupportsTipDiameter.Value, (int)nmPixelEditorSupportsTipDiameter.Value);
- }
+ CvInvoke.Circle(LayerCache.ImageBgr, location, operationSupport.TipDiameter / 2,
+ new MCvScalar(Settings.PixelEditor.SupportsColor.B, Settings.PixelEditor.SupportsColor.G, Settings.PixelEditor.SupportsColor.R), -1);
+ RefreshLayerImage();
}
- else if (tabControlPixelEditor.SelectedIndex == (byte)PixelOperation.PixelOperationType.DrainHole)
+ else if (SelectedPixelOperationTabIndex == (byte)PixelOperation.PixelOperationType.DrainHole)
{
if (ActualLayer == 0) return;
- operation = new PixelDrainHole(ActualLayer, realLocation, (byte)nmPixelEditorDrainHoleDiameter.Value);
+ var operationDrainHole = new PixelDrainHole(ActualLayer, realLocation, DrawingPixelDrainHole.Diameter);
- if (PixelHistory.Contains(operation)) return;
- PixelHistory.Add(operation);
+ //if (PixelHistory.Contains(operation)) return;
+ Drawings.Add(operationDrainHole);
- SolidBrush brush = new SolidBrush(flvPixelHistory.SelectedObjects.Contains(operation)
- ? Settings.Default.PixelEditorDrainHoleHLColor
- : Settings.Default.PixelEditorDrainHoleColor);
- using (var gfx = Graphics.FromImage(bmp))
- {
- int shiftPos = (int)nmPixelEditorDrainHoleDiameter.Value / 2;
- gfx.SmoothingMode = SmoothingMode.HighSpeed;
- gfx.FillEllipse(brush, Math.Max(0, location.X - shiftPos), Math.Max(0, location.Y - shiftPos),
- (int)nmPixelEditorDrainHoleDiameter.Value, (int)nmPixelEditorDrainHoleDiameter.Value);
- }
+ CvInvoke.Circle(LayerCache.ImageBgr, operationDrainHole.Location, operationDrainHole.Diameter / 2,
+ new MCvScalar(Settings.PixelEditor.DrainHoleColor.B, Settings.PixelEditor.DrainHoleColor.G, Settings.PixelEditor.DrainHoleColor.R), -1);
+ RefreshLayerImage();
}
else
{
throw new NotImplementedException("Missing pixel operation");
}
-
- */
}
}
}
diff --git a/UVtools.WPF/MainWindow.axaml b/UVtools.WPF/MainWindow.axaml
index b84cb02..713deb4 100644
--- a/UVtools.WPF/MainWindow.axaml
+++ b/UVtools.WPF/MainWindow.axaml
@@ -705,6 +705,7 @@
Grid.Column="2"
Grid.ColumnSpan="3"
Minimum="1"
+ Maximum="255"
Value="{Binding DrawingPixelDrawing.BrushSize}"/>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -797,6 +918,53 @@
Text="Eraser" />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -812,6 +980,69 @@
Text="Supports" />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -827,14 +1058,79 @@
Text="Drain holes" />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
+
-
-
-
+
+
-
-
-
-
+
+
+
+
+
+
+
-
-
-
-
@@ -1197,6 +1492,15 @@
+
+
+
+
+
+
diff --git a/UVtools.WPF/MainWindow.axaml.cs b/UVtools.WPF/MainWindow.axaml.cs
index e530c4b..0021f65 100644
--- a/UVtools.WPF/MainWindow.axaml.cs
+++ b/UVtools.WPF/MainWindow.axaml.cs
@@ -16,6 +16,7 @@ using Avalonia.Controls;
using Avalonia.Input;
using Avalonia.Interactivity;
using Avalonia.Markup.Xaml;
+using Avalonia.Media;
using Avalonia.Threading;
using Emgu.CV;
using Emgu.CV.CvEnum;
@@ -222,7 +223,10 @@ namespace UVtools.WPF
private bool _canSave;
private MenuItem[] _menuFileConvertItems;
private int _tabSelectedIndex;
-
+
+ private PointerEventArgs _globalPointerEventArgs;
+ private KeyModifiers _globalModifiers;
+
#endregion
#region GUI Models
@@ -255,9 +259,6 @@ namespace UVtools.WPF
ProgressWindow.Dispose();
});
}*/
-
-
-
}
}
@@ -315,19 +316,13 @@ namespace UVtools.WPF
//this.AttachDevTools();
#endif
App.ThemeSelector?.EnableThemes(this);
- LayerImageBox = this.FindControl("LayerImage");
- LayerSlider = this.FindControl("Layer.Navigation.Slider");
- LayerNavigationTooltipPanel = this.FindControl("Layer.Navigation.Tooltip.Panel");
- LayerNavigationTooltipBorder = this.FindControl("Layer.Navigation.Tooltip.Border");
- IssuesGrid = this.FindControl("IssuesGrid");
- DrawingsGrid = this.FindControl("DrawingsGrid");
+ InitInformation();
+ InitIssues();
+ InitPixelEditor();
+ InitLayerPreview();
+
//IssuesGrid.SelectionChanged += IssuesGridOnSelectionChanged;
- IssuesGrid.CellPointerPressed += IssuesGridOnCellPointerPressed;
-
- _showLayerImageDifference = Settings.LayerPreview.ShowLayerDifference;
- _showLayerOutlinePrintVolumeBoundary = Settings.LayerPreview.VolumeBoundsOutline;
- _showLayerOutlineLayerBoundary = Settings.LayerPreview.LayerBoundsOutline;
- _showLayerOutlineHollowAreas = Settings.LayerPreview.HollowOutline;
+
foreach (var menuItem in new[] { MenuTools, LayerActionsMenu })
{
@@ -340,60 +335,6 @@ namespace UVtools.WPF
}
- LayerImageBox.PropertyChanged += (sender, e) =>
- {
- if (e.PropertyName == nameof(LayerImageBox.Zoom))
- {
- RaisePropertyChanged(nameof(LayerZoomStr));
- AddLogVerbose($"Zoomed from {LayerImageBox.OldZoom} to {LayerImageBox.Zoom}");
-
- if (ShowLayerImageCrosshairs &&
- Issues.Count > 0 &&
- (LayerImageBox.OldZoom < 50 &&
- LayerImageBox.Zoom >= 50 // Trigger refresh as crosshair thickness increases at lower zoom levels
- || LayerImageBox.OldZoom > 100 && LayerImageBox.Zoom <= 100
- || LayerImageBox.OldZoom >= 50 && LayerImageBox.OldZoom <= 100 && (LayerImageBox.Zoom < 50 || LayerImageBox.Zoom > 100)
- || LayerImageBox.OldZoom <= AppSettings.CrosshairFadeLevel &&
- LayerImageBox.Zoom > AppSettings.CrosshairFadeLevel // Trigger refresh as zoom level manually crosses fade threshold
- || LayerImageBox.OldZoom > AppSettings.CrosshairFadeLevel && LayerImageBox.Zoom <= AppSettings.CrosshairFadeLevel)
-
- )
- {
- if (Settings.LayerPreview.CrosshairShowOnlyOnSelectedIssues)
- {
- if (IssuesGrid.SelectedItems.Count == 0 || !IssuesGrid.SelectedItems.Cast().Any(
- issue => // Find a valid candidate to update layer preview, otherwise quit
- issue.LayerIndex == ActualLayer && issue.Type != LayerIssue.IssueType.EmptyLayer &&
- issue.Type != LayerIssue.IssueType.TouchingBound)) return;
- }
- else
- {
- if (!Issues.Any(
- issue => // Find a valid candidate to update layer preview, otherwise quit
- issue.LayerIndex == ActualLayer && issue.Type != LayerIssue.IssueType.EmptyLayer &&
- issue.Type != LayerIssue.IssueType.TouchingBound)) return;
- }
-
- // A timer is used here rather than invoking ShowLayer directly to eliminate sublte visual flashing
- // that will occur on the transition when the crosshair fades or unfades if ShowLayer is called directly.
- ShowLayer();
- }
-
- return;
- }
-
- if (e.PropertyName == nameof(LayerImageBox.SelectionRegion))
- {
- RaisePropertyChanged(nameof(LayerROIStr));
- }
-
- };
-
- LayerImageBox.PointerMoved += LayerImageBoxOnPointerMoved;
- LayerImageBox.KeyDown += LayerImageBox_KeyDown;
- LayerImageBox.KeyUp += LayerImageBox_KeyUp;
- LayerImageBox.PointerReleased += LayerImageBox_PointerReleased;
-
/*LayerSlider.PropertyChanged += (sender, args) =>
{
Debug.WriteLine(args.Property.Name);
@@ -404,17 +345,8 @@ namespace UVtools.WPF
}
};*/
//PropertyChanged += OnPropertyChanged;
- DataContext = this;
- AddHandler(DragDrop.DropEvent, (sender, e) =>
- {
- ProcessFiles(e.Data.GetFileNames().ToArray());
- });
-
- _layerNavigationTooltipTimer.Elapsed += (sender, args) =>
- {
- Dispatcher.UIThread.InvokeAsync(() => RaisePropertyChanged(nameof(LayerNavigationTooltipMargin)));
- };
+
UpdateTitle();
@@ -424,6 +356,13 @@ namespace UVtools.WPF
WindowState = WindowState.Maximized;
}
+ DataContext = this;
+
+ AddHandler(DragDrop.DropEvent, (sender, e) =>
+ {
+ ProcessFiles(e.Data.GetFileNames().ToArray());
+ });
+
AddLog($"{About.Software} start");
ProcessFiles(Program.Args);
}
@@ -447,9 +386,86 @@ namespace UVtools.WPF
#region Overrides
+
+ protected override void OnPointerMoved(PointerEventArgs e)
+ {
+ base.OnPointerMoved(e);
+ _globalPointerEventArgs = e;
+ _globalModifiers = e.KeyModifiers;
+ }
+
+ protected override void OnKeyDown(KeyEventArgs e)
+ {
+ base.OnKeyDown(e);
+ _globalModifiers = e.KeyModifiers;
+ if (e.Handled
+ || !IsFileLoaded
+ || LayerImageBox.IsPanning
+ || LayerImageBox.Cursor == StaticControls.CrossCursor
+ || LayerImageBox.Cursor == StaticControls.HandCursor
+ || LayerImageBox.SelectionMode == AdvancedImageBox.SelectionModes.Rectangle
+ ) return;
+
+ var imageBoxMousePosition = _globalPointerEventArgs.GetPosition(LayerImageBox);
+ if (imageBoxMousePosition.X < 0 || imageBoxMousePosition.Y < 0) return;
+
+ // Pixel Edit is active, Shift is down, and the cursor is over the image region.
+ if (e.KeyModifiers == KeyModifiers.Shift)
+ {
+ if (IsPixelEditorActive)
+ {
+ LayerImageBox.AutoPan = false;
+ LayerImageBox.Cursor = StaticControls.CrossCursor;
+ /*lbLayerImageTooltipOverlay.Text = "Pixel editing is on:\n" +
+ "» Click over a pixel to draw\n" +
+ "» Hold CTRL to clear pixels";
+
+ UpdatePixelEditorCursor();*/
+ }
+ else
+ {
+ LayerImageBox.Cursor = StaticControls.CrossCursor;
+ LayerImageBox.SelectionMode = AdvancedImageBox.SelectionModes.Rectangle;
+ /*lbLayerImageTooltipOverlay.Text = "ROI selection mode:\n" +
+ "» Left-click drag to select a fixed region\n" +
+ "» Left-click + ALT drag to select specific objects\n" +
+ "» Right click on a specific object to select it\n" +
+ "Press Esc to clear the ROI";*/
+ }
+
+ //lbLayerImageTooltipOverlay.Visible = Settings.Default.LayerTooltipOverlay;
+ e.Handled = true;
+ return;
+ }
+
+ if (e.KeyModifiers == KeyModifiers.Control)
+ {
+ LayerImageBox.Cursor = StaticControls.HandCursor;
+ LayerImageBox.AutoPan = false;
+ /*lbLayerImageTooltipOverlay.Text = "Issue selection mode:\n" +
+ "» Click over an issue to select it";
+
+ lbLayerImageTooltipOverlay.Visible = Settings.Default.LayerTooltipOverlay;*/
+ e.Handled = true;
+ return;
+ }
+ }
+
protected override void OnKeyUp(KeyEventArgs e)
{
base.OnKeyUp(e);
+ _globalModifiers = e.KeyModifiers;
+ if (e.Key == Key.LeftShift ||
+ e.Key == Key.RightShift ||
+ (e.KeyModifiers & KeyModifiers.Shift) == 0 ||
+ (e.KeyModifiers & KeyModifiers.Control) == 0)
+ {
+ LayerImageBox.Cursor = StaticControls.ArrowCursor;
+ LayerImageBox.AutoPan = true;
+ LayerImageBox.SelectionMode = AdvancedImageBox.SelectionModes.None;
+ //lbLayerImageTooltipOverlay.Visible = false;
+ e.Handled = true;
+ }
}
#endregion
@@ -500,6 +516,7 @@ namespace UVtools.WPF
{
AllowMultiple = true,
Filters = Helpers.ToAvaloniaFileFilter(FileFormat.AllFileFiltersAvalonia),
+ Directory = Settings.General.DefaultDirectoryOpenFile
};
var files = await dialog.ShowAsync(this);
ProcessFiles(files, newWindow);
diff --git a/UVtools.WPF/Structures/Color.cs b/UVtools.WPF/Structures/Color.cs
index 6b372a6..f347d2e 100644
--- a/UVtools.WPF/Structures/Color.cs
+++ b/UVtools.WPF/Structures/Color.cs
@@ -79,5 +79,51 @@ namespace UVtools.WPF.Structures
Math.Min(Math.Max(min, B * factor), max));
return Color.FromArgb(A, r, g, b);
}
+
+ ///
+ /// Returns the integer representation of the color.
+ ///
+ ///
+ /// The integer representation of the color.
+ ///
+ public uint ToUint32()
+ {
+ return ((uint)A << 24) | ((uint)R << 16) | ((uint)G << 8) | (uint)B;
+ }
+
+ ///
+ /// Check if two colors are equal.
+ ///
+ public bool Equals(Color other)
+ {
+ return A == other.A && R == other.R && G == other.G && B == other.B;
+ }
+
+ public override bool Equals(object obj)
+ {
+ return obj is Color other && Equals(other);
+ }
+
+ public override int GetHashCode()
+ {
+ unchecked
+ {
+ int hashCode = A.GetHashCode();
+ hashCode = (hashCode * 397) ^ R.GetHashCode();
+ hashCode = (hashCode * 397) ^ G.GetHashCode();
+ hashCode = (hashCode * 397) ^ B.GetHashCode();
+ return hashCode;
+ }
+ }
+
+ public static bool operator ==(Color left, Color right)
+ {
+ return left.Equals(right);
+ }
+
+ public static bool operator !=(Color left, Color right)
+ {
+ return !left.Equals(right);
+ }
}
}
diff --git a/UVtools.WPF/UVtools.WPF.csproj b/UVtools.WPF/UVtools.WPF.csproj
index d4a12b0..5b1de0f 100644
--- a/UVtools.WPF/UVtools.WPF.csproj
+++ b/UVtools.WPF/UVtools.WPF.csproj
@@ -24,10 +24,10 @@
1701;1702;
-
+
-
-
+
+
@@ -49,135 +49,6 @@
PreserveNewest
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
PreserveNewest
@@ -242,4 +113,7 @@
%(Filename)
+
+
+