diff --git a/CHANGELOG.md b/CHANGELOG.md
index 1801cdf..2e873e3 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,8 +1,10 @@
# Changelog
-## 07/01/2021 - v2.2.0
+## 10/01/2021 - v2.2.0
-* (Add) FDG file format for Voxelab Printers
+* (Add) FDG file format for Voxelab Printers (ezrec/uv3dp#129)
+* (Add) PrusaSlicer printer: Voxelab Ceres 8.9
+* (Change) Print time display to hours and minutes: 00h00m
## 07/01/2021 - v2.1.3
diff --git a/ImportPrusaSlicerData.bat b/ImportPrusaSlicerData.bat
index 98764e2..1efb9a9 100644
--- a/ImportPrusaSlicerData.bat
+++ b/ImportPrusaSlicerData.bat
@@ -56,11 +56,12 @@ SET files[46]=Wanhao CGR Mono.ini
SET files[47]=Creality LD-002R.ini
SET files[48]=Creality LD-002H.ini
SET files[49]=Creality LD-006.ini
-SET files[50]=Voxelab Polaris.ini
-SET files[51]=Voxelab Proxima.ini
-SET files[52]=Longer Orange 10.ini
-SET files[53]=Longer Orange 30.ini
-SET files[54]=Longer Orange4K.ini
+SET files[50]=Voxelab Polaris 5.5.ini
+SET files[51]=Voxelab Proxima 6.ini
+SET files[52]=Voxelab Ceres 8.9.ini
+SET files[53]=Longer Orange 10.ini
+SET files[54]=Longer Orange 30.ini
+SET files[55]=Longer Orange4K.ini
echo PrusaSlicer Printers Instalation
echo This will replace printers, all changes will be discarded
diff --git a/PrusaSlicer/printer/Voxelab Ceres 8.9.ini b/PrusaSlicer/printer/Voxelab Ceres 8.9.ini
new file mode 100644
index 0000000..20e560d
--- /dev/null
+++ b/PrusaSlicer/printer/Voxelab Ceres 8.9.ini
@@ -0,0 +1,37 @@
+# generated by PrusaSlicer 2.2.0+win64 on 2021-01-09 at 22:10:08 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 = 2400
+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_VOXELAB\nPRINTER_MODEL_CERES_8.9\n\nSTART_CUSTOM_VALUES\nLayerOffTime_0\nBottomLightOffDelay_0\nBottomLiftHeight_8\nLiftHeight_8\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\nFORMAT_FDG\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/PrusaSlicer/printer/Voxelab Polaris.ini b/PrusaSlicer/printer/Voxelab Polaris 5.5.ini
similarity index 69%
rename from PrusaSlicer/printer/Voxelab Polaris.ini
rename to PrusaSlicer/printer/Voxelab Polaris 5.5.ini
index 760a68a..7015849 100644
--- a/PrusaSlicer/printer/Voxelab Polaris.ini
+++ b/PrusaSlicer/printer/Voxelab Polaris 5.5.ini
@@ -1,4 +1,4 @@
-# generated by PrusaSlicer 2.2.0+win64 on 2020-10-01 at 01:27:58 UTC
+# generated by PrusaSlicer 2.2.0+win64 on 2021-01-09 at 22:08:12 UTC
absolute_correction = 0
area_fill = 50
bed_custom_model =
@@ -25,7 +25,7 @@ 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\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_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_5.5\n\nSTART_CUSTOM_VALUES\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\nFORMAT_FDG\nEND_CUSTOM_VALUES
printer_settings_id =
printer_technology = SLA
printer_variant = default
diff --git a/PrusaSlicer/printer/Voxelab Proxima.ini b/PrusaSlicer/printer/Voxelab Proxima 6.ini
similarity index 69%
rename from PrusaSlicer/printer/Voxelab Proxima.ini
rename to PrusaSlicer/printer/Voxelab Proxima 6.ini
index f661138..1c6e5d9 100644
--- a/PrusaSlicer/printer/Voxelab Proxima.ini
+++ b/PrusaSlicer/printer/Voxelab Proxima 6.ini
@@ -1,4 +1,4 @@
-# generated by PrusaSlicer 2.2.0+win64 on 2020-10-01 at 03:18:23 UTC
+# generated by PrusaSlicer 2.2.0+win64 on 2021-01-09 at 22:08:28 UTC
absolute_correction = 0
area_fill = 50
bed_custom_model =
@@ -25,7 +25,7 @@ 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_PROXIMA\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_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_PROXIMA_6\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\nFORMAT_FDG\nEND_CUSTOM_VALUES
printer_settings_id =
printer_technology = SLA
printer_variant = default
diff --git a/README.md b/README.md
index f5ab852..20a0d78 100644
--- a/README.md
+++ b/README.md
@@ -59,12 +59,13 @@ But also, i need victims for test subject. Proceed at your own risk!
* CBDDLP (Chitubox)
* CBT (Chitubox)
* PHZ (Chitubox)
+* FDG (Voxelab)
* PWS (Photon Workshop)
* PW0 (Photon Workshop)
-* PWX (Photon Workshop) [Not confirmed]
-* PWMO (Photon Workshop) [Not confirmed]
-* PWMS (Photon Workshop) [Not confirmed]
-* PWMX (Photon Workshop) [Not confirmed]
+* PWX (Photon Workshop)
+* PWMO (Photon Workshop)
+* PWMS (Photon Workshop)
+* PWMX (Photon Workshop)
* ZCodex (Z-Suite)
* CWS (NovaMaker)
* LGS (Longer Orange 10)
@@ -120,8 +121,9 @@ But also, i need victims for test subject. Proceed at your own risk!
* Creality LD-002R
* Creality LD-002H
* Creality LD-006
-* Voxelab Polaris
-* Voxelab Proxima
+* Voxelab Polaris 5.5
+* Voxelab Proxima 6
+* Voxelab Ceres 8.9
* Longer Orange 10
* Longer Orange 30
* Longer Orange4K
diff --git a/UVtools.Core/FileFormats/FDGFile.cs b/UVtools.Core/FileFormats/FDGFile.cs
index 71b9a4f..40ad1cd 100644
--- a/UVtools.Core/FileFormats/FDGFile.cs
+++ b/UVtools.Core/FileFormats/FDGFile.cs
@@ -661,7 +661,7 @@ namespace UVtools.Core.FileFormats
public override FileFormatType FileType => FileFormatType.Binary;
public override FileExtension[] FileExtensions { get; } = {
- new("fdg", "Chitubox FDG"),
+ new("fdg", "Voxelab FDG"),
};
public override Type[] ConvertToFormats { get; } =
@@ -985,9 +985,7 @@ namespace UVtools.Core.FileFormats
{
HeaderSettings.PreviewLargeOffsetAddress = currentOffset;
}
-
-
-
+
Preview preview = new Preview
{
ResolutionX = (uint) image.Width,
diff --git a/UVtools.Core/FileFormats/FileFormat.cs b/UVtools.Core/FileFormats/FileFormat.cs
index 36c02af..f0951ef 100644
--- a/UVtools.Core/FileFormats/FileFormat.cs
+++ b/UVtools.Core/FileFormats/FileFormat.cs
@@ -489,6 +489,7 @@ namespace UVtools.Core.FileFormats
RaisePropertyChanged(nameof(PrintTimeOrComputed));
RaisePropertyChanged(nameof(PrintTimeComputed));
RaisePropertyChanged(nameof(PrintTimeHours));
+ RaisePropertyChanged(nameof(PrintTimeString));
}
}
@@ -536,6 +537,8 @@ namespace UVtools.Core.FileFormats
public float PrintTimeHours => (float) Math.Round(PrintTimeOrComputed / 3600, 2);
+ public string PrintTimeString => TimeSpan.FromSeconds(PrintTimeOrComputed).ToString("hh\\hmm\\m");
+
public virtual float UsedMaterial { get; set; }
public virtual float MaterialCost { get; set; }
diff --git a/UVtools.Core/FileFormats/IFileFormat.cs b/UVtools.Core/FileFormats/IFileFormat.cs
index e690512..6b46b4f 100644
--- a/UVtools.Core/FileFormats/IFileFormat.cs
+++ b/UVtools.Core/FileFormats/IFileFormat.cs
@@ -253,6 +253,11 @@ namespace UVtools.Core.FileFormats
///
float PrintTimeHours { get; }
+ ///
+ /// Gets the estimate print time in hours and minutes formatted
+ ///
+ string PrintTimeString { get; }
+
///
/// Gets the estimate used material in ml
///
diff --git a/UVtools.Core/FileFormats/PhotonSFile.cs b/UVtools.Core/FileFormats/PhotonSFile.cs
index f4a671a..e77b200 100644
--- a/UVtools.Core/FileFormats/PhotonSFile.cs
+++ b/UVtools.Core/FileFormats/PhotonSFile.cs
@@ -24,7 +24,7 @@ namespace UVtools.Core.FileFormats
{
public class PhotonSFile : FileFormat
{
- public const byte RLEEncodingLimit = 128; // 128;
+ public const byte RLEEncodingLimit = 0x7f - 2; // 128;
#region Sub Classes
@@ -101,13 +101,52 @@ namespace UVtools.Core.FileFormats
public unsafe byte[] Encode(Mat mat)
{
List rawData = new List();
- List chunk = new List();
var spanMat = mat.GetBytePointer();
var imageLength = mat.GetLength();
-
+ int rep = 0;
+ byte color = 0;
+
+ void AddRep()
+ {
+ if (rep <= 0) return;
+ rep--;
+ byte rle =
+ (byte) (((rep & 1) > 0 ? 128 : 0) |
+ ((rep & 2) > 0 ? 64 : 0) |
+ ((rep & 4) > 0 ? 32 : 0) |
+ ((rep & 8) > 0 ? 16 : 0) |
+ ((rep & 16) > 0 ? 8 : 0) |
+ ((rep & 32) > 0 ? 4 : 0) |
+ ((rep & 64) > 0 ? 2 : 0) | color);
+
+ rawData.Add(rle);
+ }
+
+ for (int i = 0; i < imageLength; i++)
+ {
+ color = color <= 127 ? 0 : 255; // Sanitize no AA
+ if (spanMat[i] != color)
+ {
+ AddRep();
+ color = spanMat[i];
+ rep = 1;
+ }
+ else
+ {
+ rep++;
+ if (rep == RLEEncodingLimit)
+ {
+ AddRep();
+ rep = 0;
+ }
+ }
+ }
+
+ AddRep();
+
EncodedRle = rawData.ToArray();
- DataSize = (uint)(EncodedRle.Length * 8 + 32);
+ DataSize = (uint)(EncodedRle.Length * 8 + 4);
return EncodedRle;
}
@@ -400,6 +439,7 @@ namespace UVtools.Core.FileFormats
{
outputFile.WriteSerialize(HeaderSettings);
outputFile.WriteBytes(PreviewEncode(Thumbnails[0]));
+ LayerSettings.LayerCount = LayerCount;
outputFile.WriteSerialize(LayerSettings);
LayerData[] layerData = new LayerData[LayerCount];
diff --git a/UVtools.Core/FileFormats/SL1File.cs b/UVtools.Core/FileFormats/SL1File.cs
index d44b408..e8e2230 100644
--- a/UVtools.Core/FileFormats/SL1File.cs
+++ b/UVtools.Core/FileFormats/SL1File.cs
@@ -298,6 +298,7 @@ namespace UVtools.Core.FileFormats
typeof(ChituboxZipFile),
typeof(PHZFile),
typeof(FDGFile),
+ typeof(PhotonSFile),
typeof(PhotonWorkshopFile),
typeof(ZCodexFile),
typeof(CWSFile),
@@ -1013,6 +1014,32 @@ namespace UVtools.Core.FileFormats
return true;
}
+ if (to == typeof(PhotonSFile))
+ {
+ PhotonSFile defaultFormat = (PhotonSFile)FindByType(typeof(PhotonSFile));
+ PhotonSFile file = new PhotonSFile
+ {
+ LayerManager = LayerManager,
+ HeaderSettings =
+ {
+ BottomExposureSeconds = MaterialSettings.InitialExposureTime,
+ BottomLayerCount = PrintSettings.FadedLayers,
+ ExposureSeconds = MaterialSettings.ExposureTime,
+ LayerHeight = PrintSettings.LayerHeight,
+ LayerOffSeconds = LookupCustomValue(Keyword_LayerOffTime, DefaultLightOffDelay),
+ LiftHeight = LookupCustomValue(Keyword_LiftHeight, DefaultLiftHeight),
+ LiftSpeed = LookupCustomValue(Keyword_LiftSpeed, DefaultLiftSpeed),
+ RetractSpeed = LookupCustomValue(Keyword_RetractSpeed, DefaultRetractSpeed),
+ Volume = OutputConfigSettings.UsedMaterial,
+ }
+ };
+
+ file.SetThumbnails(Thumbnails);
+ file.Encode(fileFullPath, progress);
+
+ return true;
+ }
+
if (to == typeof(ZCodexFile))
{
ZCodexFile defaultFormat = (ZCodexFile)FindByType(typeof(ZCodexFile));
diff --git a/UVtools.Core/UVtools.Core.csproj b/UVtools.Core/UVtools.Core.csproj
index 4986428..cd0664b 100644
--- a/UVtools.Core/UVtools.Core.csproj
+++ b/UVtools.Core/UVtools.Core.csproj
@@ -10,7 +10,7 @@
https://github.com/sn4k3/UVtools
https://github.com/sn4k3/UVtools
MSLA/DLP, file analysis, calibration, repair, conversion and manipulation
- 2.1.3
+ 2.2.0
Copyright © 2020 PTRTECH
UVtools.png
AnyCPU;x64
diff --git a/UVtools.InstallerMM/UVtools.InstallerMM.wxs b/UVtools.InstallerMM/UVtools.InstallerMM.wxs
index 4c32268..4bf4191 100644
--- a/UVtools.InstallerMM/UVtools.InstallerMM.wxs
+++ b/UVtools.InstallerMM/UVtools.InstallerMM.wxs
@@ -975,11 +975,14 @@
-
-
+
+
-
-
+
+
+
+
+
diff --git a/UVtools.WPF/MainWindow.axaml b/UVtools.WPF/MainWindow.axaml
index 1036ce3..ddbb019 100644
--- a/UVtools.WPF/MainWindow.axaml
+++ b/UVtools.WPF/MainWindow.axaml
@@ -279,7 +279,7 @@
+ Text="{Binding SlicerFile.PrintTimeString, StringFormat=Print time: \{0\}}"/>
diff --git a/UVtools.WPF/UVtools.WPF.csproj b/UVtools.WPF/UVtools.WPF.csproj
index 5d5ad09..59ed6ce 100644
--- a/UVtools.WPF/UVtools.WPF.csproj
+++ b/UVtools.WPF/UVtools.WPF.csproj
@@ -12,7 +12,7 @@
LICENSE
https://github.com/sn4k3/UVtools
Git
- 2.1.3
+ 2.2.0