Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/sn4k3/UVtools.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTiago Conceição <Tiago_caza@hotmail.com>2020-06-16 07:19:32 +0300
committerTiago Conceição <Tiago_caza@hotmail.com>2020-06-16 07:19:32 +0300
commit87d2062495a7c4047e7e01b6f15d6d49a412ec7e (patch)
treead37778bee4d7ade22a98235bf8e7855a85be592
parentb3c9781a8b5676c47136cf277dcee11b317ba3ad (diff)
v5.1v0.5.1
-rw-r--r--CHANGELOG.md27
-rw-r--r--ImportPrusaSlicerData.bat4
-rw-r--r--PrusaSL1Reader/PrusaSL1Reader.csproj26
-rw-r--r--PrusaSL1Viewer/Images/Screenshots/PrusaSL1Viewer_GUI.pngbin392203 -> 0 bytes
-rw-r--r--PrusaSlicer/printer/AnyCubic Photon.ini4
-rw-r--r--PrusaSlicer/printer/Creality LD-002R.ini37
-rw-r--r--PrusaSlicer/printer/Kelant S400.ini37
-rw-r--r--PrusaSlicer/printer/Wanhao D7.ini37
-rw-r--r--PrusaSlicer/printer/Wanhao D8.ini37
-rw-r--r--README.md35
-rw-r--r--UVtools.GUI/App.config (renamed from PrusaSL1Viewer/App.config)0
-rw-r--r--UVtools.GUI/Controls/SplitButton.cs (renamed from PrusaSL1Viewer/Controls/SplitButton.cs)2
-rw-r--r--UVtools.GUI/EmguExtensions.cs (renamed from PrusaSL1Viewer/EmguExtensions.cs)4
-rw-r--r--UVtools.GUI/Forms/FrmAbout.Designer.cs (renamed from PrusaSL1Viewer/Forms/FrmAbout.Designer.cs)4
-rw-r--r--UVtools.GUI/Forms/FrmAbout.cs (renamed from PrusaSL1Viewer/Forms/FrmAbout.cs)4
-rw-r--r--UVtools.GUI/Forms/FrmAbout.resx (renamed from PrusaSL1Viewer/Forms/FrmAbout.resx)0
-rw-r--r--UVtools.GUI/Forms/FrmInputBox.Designer.cs (renamed from PrusaSL1Viewer/Forms/FrmInputBox.Designer.cs)6
-rw-r--r--UVtools.GUI/Forms/FrmInputBox.cs (renamed from PrusaSL1Viewer/Forms/FrmInputBox.cs)4
-rw-r--r--UVtools.GUI/Forms/FrmInputBox.resx (renamed from PrusaSL1Viewer/Forms/FrmInputBox.resx)0
-rw-r--r--UVtools.GUI/Forms/FrmLoading.Designer.cs (renamed from PrusaSL1Viewer/Forms/FrmLoading.Designer.cs)2
-rw-r--r--UVtools.GUI/Forms/FrmLoading.cs (renamed from PrusaSL1Viewer/Forms/FrmLoading.cs)2
-rw-r--r--UVtools.GUI/Forms/FrmLoading.resx (renamed from PrusaSL1Viewer/Forms/FrmLoading.resx)0
-rw-r--r--UVtools.GUI/Forms/FrmMutation.Designer.cs (renamed from PrusaSL1Viewer/Forms/FrmMutation.Designer.cs)136
-rw-r--r--UVtools.GUI/Forms/FrmMutation.cs (renamed from PrusaSL1Viewer/Forms/FrmMutation.cs)5
-rw-r--r--UVtools.GUI/Forms/FrmMutation.resx (renamed from PrusaSL1Viewer/Forms/FrmMutation.resx)0
-rw-r--r--UVtools.GUI/Forms/FrmMutationResize.Designer.cs (renamed from PrusaSL1Viewer/Forms/FrmMutationResize.Designer.cs)23
-rw-r--r--UVtools.GUI/Forms/FrmMutationResize.cs (renamed from PrusaSL1Viewer/Forms/FrmMutationResize.cs)12
-rw-r--r--UVtools.GUI/Forms/FrmMutationResize.resx (renamed from PrusaSL1Viewer/Forms/FrmMutationResize.resx)0
-rw-r--r--UVtools.GUI/Forms/FrmRepairLayers.Designer.cs (renamed from PrusaSL1Viewer/Forms/FrmRepairLayers.Designer.cs)10
-rw-r--r--UVtools.GUI/Forms/FrmRepairLayers.cs (renamed from PrusaSL1Viewer/Forms/FrmRepairLayers.cs)2
-rw-r--r--UVtools.GUI/Forms/FrmRepairLayers.resx (renamed from PrusaSL1Viewer/Forms/FrmRepairLayers.resx)0
-rw-r--r--UVtools.GUI/FrmMain.Designer.cs (renamed from PrusaSL1Viewer/FrmMain.Designer.cs)81
-rw-r--r--UVtools.GUI/FrmMain.cs (renamed from PrusaSL1Viewer/FrmMain.cs)245
-rw-r--r--UVtools.GUI/FrmMain.resx (renamed from PrusaSL1Viewer/FrmMain.resx)143
-rw-r--r--UVtools.GUI/ImageSharpExtensions.cs (renamed from PrusaSL1Viewer/ImageSharpExtensions.cs)4
-rw-r--r--UVtools.GUI/Images/Back-16x16.png (renamed from PrusaSL1Viewer/Images/Back-16x16.png)bin138 -> 138 bytes
-rw-r--r--UVtools.GUI/Images/Button-Info-16x16.png (renamed from PrusaSL1Viewer/Images/Button-Info-16x16.png)bin666 -> 666 bytes
-rw-r--r--UVtools.GUI/Images/CNCMachine-16x16.png (renamed from PrusaSL1Viewer/Images/CNCMachine-16x16.png)bin261 -> 261 bytes
-rw-r--r--UVtools.GUI/Images/Cancel-24x24.png (renamed from PrusaSL1Viewer/Images/Cancel-24x24.png)bin513 -> 513 bytes
-rw-r--r--UVtools.GUI/Images/Cancel-32x32.png (renamed from PrusaSL1Viewer/Images/Cancel-32x32.png)bin588 -> 588 bytes
-rw-r--r--UVtools.GUI/Images/Convert-16x16.png (renamed from PrusaSL1Viewer/Images/Convert-16x16.png)bin629 -> 629 bytes
-rw-r--r--UVtools.GUI/Images/DataList-16x16.png (renamed from PrusaSL1Viewer/Images/DataList-16x16.png)bin179 -> 179 bytes
-rw-r--r--UVtools.GUI/Images/Donate-16x16.png (renamed from PrusaSL1Viewer/Images/Donate-16x16.png)bin527 -> 527 bytes
-rw-r--r--UVtools.GUI/Images/Error-128x128.png (renamed from PrusaSL1Viewer/Images/Error-128x128.png)bin889 -> 889 bytes
-rw-r--r--UVtools.GUI/Images/Exit-16x16.png (renamed from PrusaSL1Viewer/Images/Exit-16x16.png)bin174 -> 174 bytes
-rw-r--r--UVtools.GUI/Images/Extract-object-16x16.png (renamed from PrusaSL1Viewer/Images/Extract-object-16x16.png)bin490 -> 490 bytes
-rw-r--r--UVtools.GUI/Images/File-Close-16x16.png (renamed from PrusaSL1Viewer/Images/File-Close-16x16.png)bin247 -> 247 bytes
-rw-r--r--UVtools.GUI/Images/File-Refresh-16x16.png (renamed from PrusaSL1Viewer/Images/File-Refresh-16x16.png)bin196 -> 196 bytes
-rw-r--r--UVtools.GUI/Images/GCode-16x16.png (renamed from PrusaSL1Viewer/Images/GCode-16x16.png)bin151 -> 151 bytes
-rw-r--r--UVtools.GUI/Images/Geometry-16x16.png (renamed from PrusaSL1Viewer/Images/Geometry-16x16.png)bin259 -> 259 bytes
-rw-r--r--UVtools.GUI/Images/Global-Network-icon-16x16.png (renamed from PrusaSL1Viewer/Images/Global-Network-icon-16x16.png)bin876 -> 876 bytes
-rw-r--r--UVtools.GUI/Images/Next-16x16.png (renamed from PrusaSL1Viewer/Images/Next-16x16.png)bin140 -> 140 bytes
-rw-r--r--UVtools.GUI/Images/Ok-24x24.png (renamed from PrusaSL1Viewer/Images/Ok-24x24.png)bin350 -> 350 bytes
-rw-r--r--UVtools.GUI/Images/Open-16x16.png (renamed from PrusaSL1Viewer/Images/Open-16x16.png)bin248 -> 248 bytes
-rw-r--r--UVtools.GUI/Images/PhotoInfo-16x16.png (renamed from PrusaSL1Viewer/Images/PhotoInfo-16x16.png)bin196 -> 196 bytes
-rw-r--r--UVtools.GUI/Images/Rotate-16x16.png (renamed from PrusaSL1Viewer/Images/Rotate-16x16.png)bin259 -> 259 bytes
-rw-r--r--UVtools.GUI/Images/Save-16x16.png (renamed from PrusaSL1Viewer/Images/Save-16x16.png)bin247 -> 247 bytes
-rw-r--r--UVtools.GUI/Images/SaveAs-16x16.png (renamed from PrusaSL1Viewer/Images/SaveAs-16x16.png)bin244 -> 244 bytes
-rw-r--r--UVtools.GUI/Images/Screenshots/SL1ToCbddlp.png (renamed from PrusaSL1Viewer/Images/Screenshots/SL1ToCbddlp.png)bin117156 -> 117156 bytes
-rw-r--r--UVtools.GUI/Images/Screenshots/UVtools_GUI.pngbin0 -> 392436 bytes
-rw-r--r--UVtools.GUI/Images/Screenshots/UVtools_GUI_Islands.png (renamed from PrusaSL1Viewer/Images/Screenshots/PrusaSL1Viewer_GUI_Islands.png)bin120520 -> 120520 bytes
-rw-r--r--UVtools.GUI/Images/Wrench-16x16.png (renamed from PrusaSL1Viewer/Images/Wrench-16x16.png)bin237 -> 237 bytes
-rw-r--r--UVtools.GUI/Images/arrow-down-16x16.png (renamed from PrusaSL1Viewer/Images/arrow-down-16x16.png)bin190 -> 190 bytes
-rw-r--r--UVtools.GUI/Images/arrow-down-double-16x16.png (renamed from PrusaSL1Viewer/Images/arrow-down-double-16x16.png)bin179 -> 179 bytes
-rw-r--r--UVtools.GUI/Images/arrow-down.ico (renamed from PrusaSL1Viewer/Images/arrow-down.ico)bin163498 -> 163498 bytes
-rw-r--r--UVtools.GUI/Images/arrow-end-16x16.png (renamed from PrusaSL1Viewer/Images/arrow-end-16x16.png)bin154 -> 154 bytes
-rw-r--r--UVtools.GUI/Images/arrow-top-16x16.png (renamed from PrusaSL1Viewer/Images/arrow-top-16x16.png)bin206 -> 206 bytes
-rw-r--r--UVtools.GUI/Images/arrow-up-16x16.png (renamed from PrusaSL1Viewer/Images/arrow-up-16x16.png)bin193 -> 193 bytes
-rw-r--r--UVtools.GUI/Images/arrow-up.ico (renamed from PrusaSL1Viewer/Images/arrow-up.ico)bin163464 -> 163464 bytes
-rw-r--r--UVtools.GUI/Images/delete-16x16.png (renamed from PrusaSL1Viewer/Images/delete-16x16.png)bin139 -> 139 bytes
-rw-r--r--UVtools.GUI/Images/eye-16x16.png (renamed from PrusaSL1Viewer/Images/eye-16x16.png)bin402 -> 402 bytes
-rw-r--r--UVtools.GUI/Images/eye-24x24.png (renamed from PrusaSL1Viewer/Images/eye-24x24.png)bin402 -> 402 bytes
-rw-r--r--UVtools.GUI/Images/filter-filled-16x16.png (renamed from PrusaSL1Viewer/Images/filter-filled-16x16.png)bin172 -> 172 bytes
-rw-r--r--UVtools.GUI/Images/gui/mutation_blackhat.png (renamed from PrusaSL1Viewer/Images/gui/mutation_blackhat.png)bin2165 -> 2165 bytes
-rw-r--r--UVtools.GUI/Images/gui/mutation_closing.png (renamed from PrusaSL1Viewer/Images/gui/mutation_closing.png)bin1427 -> 1427 bytes
-rw-r--r--UVtools.GUI/Images/gui/mutation_dilation.png (renamed from PrusaSL1Viewer/Images/gui/mutation_dilation.png)bin1083 -> 1083 bytes
-rw-r--r--UVtools.GUI/Images/gui/mutation_erosion.png (renamed from PrusaSL1Viewer/Images/gui/mutation_erosion.png)bin1055 -> 1055 bytes
-rw-r--r--UVtools.GUI/Images/gui/mutation_gradient.png (renamed from PrusaSL1Viewer/Images/gui/mutation_gradient.png)bin1280 -> 1280 bytes
-rw-r--r--UVtools.GUI/Images/gui/mutation_opening.png (renamed from PrusaSL1Viewer/Images/gui/mutation_opening.png)bin1265 -> 1265 bytes
-rw-r--r--UVtools.GUI/Images/gui/mutation_solidify.pngbin0 -> 1283 bytes
-rw-r--r--UVtools.GUI/Images/gui/mutation_tophat.png (renamed from PrusaSL1Viewer/Images/gui/mutation_tophat.png)bin948 -> 948 bytes
-rw-r--r--UVtools.GUI/Images/island-16x16.png (renamed from PrusaSL1Viewer/Images/island-16x16.png)bin647 -> 647 bytes
-rw-r--r--UVtools.GUI/Images/layers-16x16.png (renamed from PrusaSL1Viewer/Images/layers-16x16.png)bin358 -> 358 bytes
-rw-r--r--UVtools.GUI/Images/pixel-16x16.png (renamed from PrusaSL1Viewer/Images/pixel-16x16.png)bin454 -> 454 bytes
-rw-r--r--UVtools.GUI/Images/plus.ico (renamed from PrusaSL1Viewer/Images/plus.ico)bin162918 -> 162918 bytes
-rw-r--r--UVtools.GUI/Images/pointer-16x16.png (renamed from PrusaSL1Viewer/Images/pointer-16x16.png)bin516 -> 516 bytes
-rw-r--r--UVtools.GUI/Images/refresh-16x16.png (renamed from PrusaSL1Viewer/Images/refresh-16x16.png)bin308 -> 308 bytes
-rw-r--r--UVtools.GUI/Images/search-16x16.png (renamed from PrusaSL1Viewer/Images/search-16x16.png)bin344 -> 344 bytes
-rw-r--r--UVtools.GUI/Images/warning-16x16.png (renamed from PrusaSL1Viewer/Images/warning-16x16.png)bin699 -> 699 bytes
-rw-r--r--UVtools.GUI/Libraries/ApplicationManagement.dll (renamed from PrusaSL1Viewer/Libraries/ApplicationManagement.dll)bin28672 -> 28672 bytes
-rw-r--r--UVtools.GUI/Mutation.cs (renamed from PrusaSL1Viewer/Mutation.cs)6
-rw-r--r--UVtools.GUI/Program.cs (renamed from PrusaSL1Viewer/Program.cs)6
-rw-r--r--UVtools.GUI/Properties/AssemblyInfo.cs (renamed from PrusaSL1Viewer/Properties/AssemblyInfo.cs)10
-rw-r--r--UVtools.GUI/Properties/Resources.Designer.cs (renamed from PrusaSL1Viewer/Properties/Resources.Designer.cs)34
-rw-r--r--UVtools.GUI/Properties/Resources.resx (renamed from PrusaSL1Viewer/Properties/Resources.resx)39
-rw-r--r--UVtools.GUI/Properties/Settings.Designer.cs (renamed from PrusaSL1Viewer/Properties/Settings.Designer.cs)4
-rw-r--r--UVtools.GUI/Properties/Settings.settings (renamed from PrusaSL1Viewer/Properties/Settings.settings)0
-rw-r--r--UVtools.GUI/UVtools.GUI.csproj (renamed from PrusaSL1Viewer/PrusaSL1Viewer.csproj)18
-rw-r--r--UVtools.GUI/UVtools.fw.png (renamed from PrusaSL1Viewer/PrusaSL1Viewer.fw.png)bin107478 -> 107478 bytes
-rw-r--r--UVtools.GUI/UVtools.ico (renamed from PrusaSL1Viewer/PrusaSL1Viewer.ico)bin124548 -> 124548 bytes
-rw-r--r--UVtools.GUI/UVtools.png (renamed from PrusaSL1Viewer/PrusaSL1Viewer.png)bin30366 -> 30366 bytes
-rw-r--r--UVtools.GUI/packages.config (renamed from PrusaSL1Viewer/packages.config)0
-rw-r--r--UVtools.Parser/About.cs (renamed from PrusaSL1Reader/About.cs)6
-rw-r--r--UVtools.Parser/CWSFile.cs (renamed from PrusaSL1Reader/CWSFile.cs)17
-rw-r--r--UVtools.Parser/ChituboxFile.cs (renamed from PrusaSL1Reader/ChituboxFile.cs)7
-rw-r--r--UVtools.Parser/ChituboxZipFile.cs435
-rw-r--r--UVtools.Parser/Extensions/FileStreamExtensions.cs (renamed from PrusaSL1Reader/Extensions/FileStreamExtensions.cs)2
-rw-r--r--UVtools.Parser/Extensions/StreamExtensions.cs (renamed from PrusaSL1Reader/Extensions/StreamExtensions.cs)2
-rw-r--r--UVtools.Parser/Extensions/StringExtensions.cs (renamed from PrusaSL1Reader/Extensions/StringExtensions.cs)2
-rw-r--r--UVtools.Parser/Extensions/ZipArchiveExtensions.cs (renamed from PrusaSL1Reader/Extensions/ZipArchiveExtensions.cs)2
-rw-r--r--UVtools.Parser/FileExtension.cs (renamed from PrusaSL1Reader/FileExtension.cs)2
-rw-r--r--UVtools.Parser/FileFormat.cs (renamed from PrusaSL1Reader/FileFormat.cs)53
-rw-r--r--UVtools.Parser/Helpers.cs (renamed from PrusaSL1Reader/Helpers.cs)4
-rw-r--r--UVtools.Parser/IFileFormat.cs (renamed from PrusaSL1Reader/IFileFormat.cs)12
-rw-r--r--UVtools.Parser/ImageFile.cs (renamed from PrusaSL1Reader/ImageFile.cs)2
-rw-r--r--UVtools.Parser/LayerManager.cs (renamed from PrusaSL1Reader/LayerManager.cs)4
-rw-r--r--UVtools.Parser/PHZFile.cs (renamed from PrusaSL1Reader/PHZFile.cs)5
-rw-r--r--UVtools.Parser/PWSFile.cs (renamed from PrusaSL1Reader/PWSFile.cs)4
-rw-r--r--UVtools.Parser/SL1File.cs (renamed from PrusaSL1Reader/SL1File.cs)72
-rw-r--r--UVtools.Parser/Statistics.cs (renamed from PrusaSL1Reader/Statistics.cs)2
-rw-r--r--UVtools.Parser/UVtools.Parser.csproj33
-rw-r--r--UVtools.Parser/ZCodexFile.cs (renamed from PrusaSL1Reader/ZCodexFile.cs)4
-rw-r--r--UVtools.sln (renamed from PrusaSL1Viewer.sln)4
123 files changed, 1352 insertions, 372 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 17899d3..7a27ca6 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,26 @@
# Changelog
+## 16/06/2020 - v0.5.1
+
+* (Add) Zip file format compatible with chitubox zip
+* (Add) PrusaSlicer Printer "Kelant S400"
+* (Add) PrusaSlicer Printer "Wanhao D7"
+* (Add) PrusaSlicer Printer "Wanhao D8"
+* (Add) PrusaSlicer Printer "Creality LD-002R"
+* (Add) Shortcut "CTRL+C" under Issues listview to copy all selected item text to clipboard
+* (Add) Shortcut "ESC" under Properties listview to deselect all items
+* (Add) Shortcut "CTRL+A" under Properties listview to select all items
+* (Add) Shortcut "*" under Properties listview to invert selection
+* (Add) Shortcut "CTRL+C" under Properties listview to copy all selected item text to clipboard
+* (Add) Resize function can now fade towards 100% (Chamfers)
+* (Add) Solidify mutator, solidifies the selected layers, closes all inner holes
+* (Change) Renamed the project: UVtools
+* (Change) On title bar show loaded filename first and program version after
+* (Improvement) Increased Pixel column width on Issues tab listview
+* (Fix) Resize function can't make use of decimal numbers
+* (Fix) CWS gcode was setting M106 SO instead of M106 S0
+* (Fix) CWS disable motors before raise Z after finish print
+
## 13/06/2020 - v0.5
* (Add) PWS and PW0 file formats (Thanks to Jason McMullan)
@@ -42,9 +63,9 @@
## 05/06/2020 - v0.4.2.2 - Beta
-* (Add) Shortcut "ESC" under Islands list view to deselect all items
-* (Add) Shortcut "CTRL+A" under Islands list view to select all items
-* (Add) Shortcut "*" under Islands list view to invert selection
+* (Add) Shortcut "ESC" under Islands listview to deselect all items
+* (Add) Shortcut "CTRL+A" under Islands listview to select all items
+* (Add) Shortcut "*" under Islands listview to invert selection
* (Add) Shortcut "CTRL+F" to go to a layer number
* (Change) Layer image is now a RGB image for better manipulation and draws
* (Change) Layer difference now shows previous and next layers (only pixels not present on current layer) were previous are pink and next are cyan, if a pixel are present in both layers a red pixel will be painted.
diff --git a/ImportPrusaSlicerData.bat b/ImportPrusaSlicerData.bat
index 36faff7..7954794 100644
--- a/ImportPrusaSlicerData.bat
+++ b/ImportPrusaSlicerData.bat
@@ -29,6 +29,10 @@ SET files[19]=Phrozen Shuffle 4K.ini
SET files[20]=Phrozen Sonic.ini
SET files[21]=Phrozen Sonic Mini.ini
SET files[22]=Phrozen Transform.ini
+SET files[23]=Kelant S400.ini
+SET files[24]=Wanhao D7.ini
+SET files[25]=Wanhao D8.ini
+SET files[26]=Creality LD-002R.ini
echo PrusaSlicer Printers Instalation
echo This will replace printers, all changes will be discarded
diff --git a/PrusaSL1Reader/PrusaSL1Reader.csproj b/PrusaSL1Reader/PrusaSL1Reader.csproj
deleted file mode 100644
index 6529d68..0000000
--- a/PrusaSL1Reader/PrusaSL1Reader.csproj
+++ /dev/null
@@ -1,26 +0,0 @@
-<Project Sdk="Microsoft.NET.Sdk">
-
- <PropertyGroup>
- <TargetFramework>netstandard2.0</TargetFramework>
- <Authors>Tiago Conceição</Authors>
- <Company>PTRTECH</Company>
- <PackageProjectUrl>https://github.com/sn4k3/PrusaSL1Viewer</PackageProjectUrl>
- <PackageIcon></PackageIcon>
- <RepositoryUrl>https://github.com/sn4k3/PrusaSL1Viewer</RepositoryUrl>
- <AssemblyVersion>0.5.0.0</AssemblyVersion>
- <FileVersion>0.5.0.0</FileVersion>
- <Version>0.5</Version>
- <Description>Open, view, edit, extract and convert DLP/SLA files generated from Slicers</Description>
- </PropertyGroup>
-
- <ItemGroup>
- <None Include="..\LICENSE" Link="LICENSE" />
- </ItemGroup>
-
- <ItemGroup>
- <PackageReference Include="BinarySerializer" Version="8.5.1" />
- <PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
- <PackageReference Include="SixLabors.ImageSharp" Version="1.0.0-rc0002" />
- </ItemGroup>
-
-</Project>
diff --git a/PrusaSL1Viewer/Images/Screenshots/PrusaSL1Viewer_GUI.png b/PrusaSL1Viewer/Images/Screenshots/PrusaSL1Viewer_GUI.png
deleted file mode 100644
index d417773..0000000
--- a/PrusaSL1Viewer/Images/Screenshots/PrusaSL1Viewer_GUI.png
+++ /dev/null
Binary files differ
diff --git a/PrusaSlicer/printer/AnyCubic Photon.ini b/PrusaSlicer/printer/AnyCubic Photon.ini
index 4a0fd0c..7086ad1 100644
--- a/PrusaSlicer/printer/AnyCubic Photon.ini
+++ b/PrusaSlicer/printer/AnyCubic Photon.ini
@@ -1,4 +1,4 @@
-# generated by PrusaSlicer 2.2.0+win64 on 2020-06-12 at 00:45:10 UTC
+# generated by PrusaSlicer 2.2.0+win64 on 2020-06-16 at 03:20:05 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_ANYCUBIC\nPRINTER_MODEL_PHOTON\n\nSTART_CUSTOM_VALUES\nFLIP_XY\nLayerOffTime_0\nBottomLiftHeight_5\nBottomLiftSpeed_40\nLiftHeight_5\nLiftSpeed_60\nRetractSpeed_150\nBottomLightOffDelay_2\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_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
diff --git a/PrusaSlicer/printer/Creality LD-002R.ini b/PrusaSlicer/printer/Creality LD-002R.ini
new file mode 100644
index 0000000..6d5b392
--- /dev/null
+++ b/PrusaSlicer/printer/Creality LD-002R.ini
@@ -0,0 +1,37 @@
+# generated by PrusaSlicer 2.2.0+win64 on 2020-06-16 at 03:20:32 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 = 1
+display_mirror_y = 0
+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/PrusaSlicer/printer/Kelant S400.ini b/PrusaSlicer/printer/Kelant S400.ini
new file mode 100644
index 0000000..a0a3e36
--- /dev/null
+++ b/PrusaSlicer/printer/Kelant S400.ini
@@ -0,0 +1,37 @@
+# generated by PrusaSlicer 2.2.0+win64 on 2020-06-16 at 02:46:17 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 = portrait
+display_pixels_x = 2560
+display_pixels_y = 1440
+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\nFLIP_XY\nLayerOffTime_0\nBottomLightOffDelay_0\nBottomLiftHeight_5\nLiftHeight_5\nBottomLiftSpeed_100\nLiftSpeed_100\nRetractSpeed_100\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/PrusaSlicer/printer/Wanhao D7.ini b/PrusaSlicer/printer/Wanhao D7.ini
new file mode 100644
index 0000000..624f7d6
--- /dev/null
+++ b/PrusaSlicer/printer/Wanhao D7.ini
@@ -0,0 +1,37 @@
+# generated by PrusaSlicer 2.2.0+win64 on 2020-06-16 at 03:14:33 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 = 1
+display_mirror_y = 0
+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/PrusaSlicer/printer/Wanhao D8.ini b/PrusaSlicer/printer/Wanhao D8.ini
new file mode 100644
index 0000000..5eb9538
--- /dev/null
+++ b/PrusaSlicer/printer/Wanhao D8.ini
@@ -0,0 +1,37 @@
+# generated by PrusaSlicer 2.2.0+win64 on 2020-06-16 at 03:15:34 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 = 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/README.md b/README.md
index 27a2cf9..b47aa21 100644
--- a/README.md
+++ b/README.md
@@ -1,14 +1,14 @@
# Prusa SL1 Viewer
-Open, view, edit, extract, convert, mutate and island checker for DLP files generated from Slicers.
+MSLA/DLP, file analysis, repair, conversion and manipulation
-This simple tool can give you insight of supports and find some failures. Did you forget what resin or orther settings you used on a project? This can also save you, check every setting that were used with or simply change them!
+This simple tool can give you insight of supports and find some failures. Did you forget what resin or other settings you used on a project? This can also save you, check every setting that were used with or simply change them!
-* Facebook group: https://www.facebook.com/groups/prusasl1viewer
+* Facebook group: https://www.facebook.com/groups/uvtools
-![GUI Screenshot](https://raw.githubusercontent.com/sn4k3/PrusaSL1Viewer/master/PrusaSL1Viewer/Images/Screenshots/PrusaSL1Viewer_GUI.png)
-![GUI Screenshot Islands](https://raw.githubusercontent.com/sn4k3/PrusaSL1Viewer/master/PrusaSL1Viewer/Images/Screenshots/PrusaSL1Viewer_GUI_Islands.png)
-![Convertion Screenshot](https://raw.githubusercontent.com/sn4k3/PrusaSL1Viewer/master/PrusaSL1Viewer/Images/Screenshots/SL1ToCbddlp.png)
+![GUI Screenshot](https://raw.githubusercontent.com/sn4k3/UVtools/master/UVtools.GUI/Images/Screenshots/UVtools_GUI.png)
+![GUI Screenshot Islands](https://raw.githubusercontent.com/sn4k3/UVtools/master/UVtools.GUI/Images/Screenshots/UVtools_GUI_Islands.png)
+![Convertion Screenshot](https://raw.githubusercontent.com/sn4k3/UVtools/master/UVtools.GUI/Images/Screenshots/SL1ToCbddlp.png)
## Why this project?
I don't own a Prusa SL1 or any other resin printer, for now I’m only a FDM user with
@@ -39,20 +39,21 @@ But also, i need victims for test subject. Proceed at your own risk!
* View all used settings
* Edit print properties and save file
* Mutate and filter layers
-* Check islands and repair/remove them
+* Check islands and repair/remove them as other issues
* Export file to a folder
-* Convert SL1 format to another format
+* Convert format to another format
* Portable (No installation needed)
## Known Formats
* SL1 (PrusaSlicer)
+* Zip (Chitubox)
* Photon (Chitubox)
* CBDDLP (Chitubox)
* CBT (Chitubox)
+* PHZ (Chitubox)
* PWS (Photon Workshop)
* PW0 (Photon Workshop)
-* PHZ (Chitubox)
* ZCodex (Z-Suite)
* CWS (NovaMaker)
@@ -81,6 +82,10 @@ But also, i need victims for test subject. Proceed at your own risk!
* Phrozen Sonic
* Phrozen Sonic Mini
* Phrozen Transform
+* Kelant S400
+* Wanhao D7
+* Wanhao D8
+* Creality LD-002R
## Available profiles for PrusaSlicer
@@ -99,7 +104,7 @@ But also, i need victims for test subject. Proceed at your own risk!
1. Start and configure PrusaSlicer (Wizard)
* Choose SL1 printer
1. Close PrusaSlicer
-1. Open PrusaSL1Viewer if not already
+1. Open UVtools if not already
* Under Menu click -> About -> Install profiles into PrusaSlicer
1. Open PrusaSlicer and check if profiles are there
1. To clean up interface remove printers that you will not use (OPTIONAL)
@@ -131,12 +136,12 @@ After some tests without failure you can increase your confidence and ignore thi
## How to use
-There are multiple ways to open your SL1 file:
+There are multiple ways to open your file:
-1. Open PrusaSL1Viewer.exe and load your file (CTRL + O) (File -> Open)
-2. Open PrusaSL1Viewer.exe and drag and drop your file inside window
-3. Drag and drop sl1 file into PrusaSL1Viewer.exe
-4. Set PrusaSL1Viewer.exe the default program to open .sl1 files
+1. Open UVtools.exe and load your file (CTRL + O) (File -> Open)
+2. Open UVtools.exe and drag and drop your file inside window
+3. Drag and drop file into UVtools.exe
+4. Set UVtools.exe the default program to open your files
## Library -> Developers
diff --git a/PrusaSL1Viewer/App.config b/UVtools.GUI/App.config
index d896ff5..d896ff5 100644
--- a/PrusaSL1Viewer/App.config
+++ b/UVtools.GUI/App.config
diff --git a/PrusaSL1Viewer/Controls/SplitButton.cs b/UVtools.GUI/Controls/SplitButton.cs
index 57140e4..736ce38 100644
--- a/PrusaSL1Viewer/Controls/SplitButton.cs
+++ b/UVtools.GUI/Controls/SplitButton.cs
@@ -11,7 +11,7 @@ using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
-namespace PrusaSL1Viewer.Controls
+namespace UVtools.GUI.Controls
{
public class SplitButton : Button
{
diff --git a/PrusaSL1Viewer/EmguExtensions.cs b/UVtools.GUI/EmguExtensions.cs
index 3abda84..30a3d61 100644
--- a/PrusaSL1Viewer/EmguExtensions.cs
+++ b/UVtools.GUI/EmguExtensions.cs
@@ -8,11 +8,11 @@
using Emgu.CV;
using Emgu.CV.Structure;
-using PrusaSL1Reader;
+using UVtools.Parser;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.PixelFormats;
-namespace PrusaSL1Viewer
+namespace UVtools.GUI
{
public static class EmguExtensions
{
diff --git a/PrusaSL1Viewer/Forms/FrmAbout.Designer.cs b/UVtools.GUI/Forms/FrmAbout.Designer.cs
index 9eb96a1..8da432a 100644
--- a/PrusaSL1Viewer/Forms/FrmAbout.Designer.cs
+++ b/UVtools.GUI/Forms/FrmAbout.Designer.cs
@@ -1,4 +1,4 @@
-namespace PrusaSL1Viewer.Forms
+namespace UVtools.GUI.Forms
{
partial class FrmAbout
{
@@ -68,7 +68,7 @@
// logoPictureBox
//
this.logoPictureBox.Dock = System.Windows.Forms.DockStyle.Fill;
- this.logoPictureBox.Image = global::PrusaSL1Viewer.Properties.Resources.PrusaSL1Viewer;
+ this.logoPictureBox.Image = global::UVtools.GUI.Properties.Resources.UVtools;
this.logoPictureBox.Location = new System.Drawing.Point(4, 5);
this.logoPictureBox.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.logoPictureBox.Name = "logoPictureBox";
diff --git a/PrusaSL1Viewer/Forms/FrmAbout.cs b/UVtools.GUI/Forms/FrmAbout.cs
index 76a467d..ca313bd 100644
--- a/PrusaSL1Viewer/Forms/FrmAbout.cs
+++ b/UVtools.GUI/Forms/FrmAbout.cs
@@ -10,9 +10,9 @@ using System;
using System.Linq;
using System.Reflection;
using System.Windows.Forms;
-using PrusaSL1Reader;
+using UVtools.Parser;
-namespace PrusaSL1Viewer.Forms
+namespace UVtools.GUI.Forms
{
partial class FrmAbout : Form
{
diff --git a/PrusaSL1Viewer/Forms/FrmAbout.resx b/UVtools.GUI/Forms/FrmAbout.resx
index 1af7de1..1af7de1 100644
--- a/PrusaSL1Viewer/Forms/FrmAbout.resx
+++ b/UVtools.GUI/Forms/FrmAbout.resx
diff --git a/PrusaSL1Viewer/Forms/FrmInputBox.Designer.cs b/UVtools.GUI/Forms/FrmInputBox.Designer.cs
index 34aa275..283592f 100644
--- a/PrusaSL1Viewer/Forms/FrmInputBox.Designer.cs
+++ b/UVtools.GUI/Forms/FrmInputBox.Designer.cs
@@ -1,4 +1,4 @@
-namespace PrusaSL1Viewer.Forms
+namespace UVtools.GUI.Forms
{
partial class FrmInputBox
{
@@ -100,7 +100,7 @@
//
this.btnModify.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.btnModify.Enabled = false;
- this.btnModify.Image = global::PrusaSL1Viewer.Properties.Resources.Ok_24x24;
+ this.btnModify.Image = global::UVtools.GUI.Properties.Resources.Ok_24x24;
this.btnModify.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.btnModify.Location = new System.Drawing.Point(193, 227);
this.btnModify.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
@@ -116,7 +116,7 @@
//
this.btnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
- this.btnCancel.Image = global::PrusaSL1Viewer.Properties.Resources.Cancel_24x24;
+ this.btnCancel.Image = global::UVtools.GUI.Properties.Resources.Cancel_24x24;
this.btnCancel.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.btnCancel.Location = new System.Drawing.Point(359, 227);
this.btnCancel.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
diff --git a/PrusaSL1Viewer/Forms/FrmInputBox.cs b/UVtools.GUI/Forms/FrmInputBox.cs
index 1fe4412..0f6e8f5 100644
--- a/PrusaSL1Viewer/Forms/FrmInputBox.cs
+++ b/UVtools.GUI/Forms/FrmInputBox.cs
@@ -9,9 +9,9 @@
using System;
using System.Globalization;
using System.Windows.Forms;
-using PrusaSL1Reader;
+using UVtools.Parser;
-namespace PrusaSL1Viewer.Forms
+namespace UVtools.GUI.Forms
{
public partial class FrmInputBox : Form
{
diff --git a/PrusaSL1Viewer/Forms/FrmInputBox.resx b/UVtools.GUI/Forms/FrmInputBox.resx
index 39be3be..39be3be 100644
--- a/PrusaSL1Viewer/Forms/FrmInputBox.resx
+++ b/UVtools.GUI/Forms/FrmInputBox.resx
diff --git a/PrusaSL1Viewer/Forms/FrmLoading.Designer.cs b/UVtools.GUI/Forms/FrmLoading.Designer.cs
index e8c3a08..ebb59d5 100644
--- a/PrusaSL1Viewer/Forms/FrmLoading.Designer.cs
+++ b/UVtools.GUI/Forms/FrmLoading.Designer.cs
@@ -1,4 +1,4 @@
-namespace PrusaSL1Viewer.Forms
+namespace UVtools.GUI.Forms
{
partial class FrmLoading
{
diff --git a/PrusaSL1Viewer/Forms/FrmLoading.cs b/UVtools.GUI/Forms/FrmLoading.cs
index 9257201..71a4942 100644
--- a/PrusaSL1Viewer/Forms/FrmLoading.cs
+++ b/UVtools.GUI/Forms/FrmLoading.cs
@@ -2,7 +2,7 @@
using System.Diagnostics;
using System.Windows.Forms;
-namespace PrusaSL1Viewer.Forms
+namespace UVtools.GUI.Forms
{
public partial class FrmLoading : Form
{
diff --git a/PrusaSL1Viewer/Forms/FrmLoading.resx b/UVtools.GUI/Forms/FrmLoading.resx
index 7f578ad..7f578ad 100644
--- a/PrusaSL1Viewer/Forms/FrmLoading.resx
+++ b/UVtools.GUI/Forms/FrmLoading.resx
diff --git a/PrusaSL1Viewer/Forms/FrmMutation.Designer.cs b/UVtools.GUI/Forms/FrmMutation.Designer.cs
index 6f9d72d..e5076f5 100644
--- a/PrusaSL1Viewer/Forms/FrmMutation.Designer.cs
+++ b/UVtools.GUI/Forms/FrmMutation.Designer.cs
@@ -1,4 +1,6 @@
-namespace PrusaSL1Viewer.Forms
+using UVtools.GUI.Controls;
+
+namespace UVtools.GUI.Forms
{
partial class FrmMutation
{
@@ -42,21 +44,21 @@
this.btnLayerRangeCurrentLayer = new System.Windows.Forms.ToolStripMenuItem();
this.btnLayerRangeBottomLayers = new System.Windows.Forms.ToolStripMenuItem();
this.btnLayerRangeNormalLayers = new System.Windows.Forms.ToolStripMenuItem();
- this.btnCancel = new System.Windows.Forms.Button();
- this.btnPreview = new System.Windows.Forms.Button();
- this.pbInfo = new System.Windows.Forms.PictureBox();
- this.btnMutate = new System.Windows.Forms.Button();
this.lbIterationsStop = new System.Windows.Forms.Label();
this.nmIterationsEnd = new System.Windows.Forms.NumericUpDown();
this.cbIterationsFade = new System.Windows.Forms.CheckBox();
this.toolTip = new System.Windows.Forms.ToolTip(this.components);
- this.btnLayerRangeSelect = new PrusaSL1Viewer.Controls.SplitButton();
+ this.btnLayerRangeSelect = new UVtools.GUI.Controls.SplitButton();
+ this.btnCancel = new System.Windows.Forms.Button();
+ this.btnPreview = new System.Windows.Forms.Button();
+ this.pbInfo = new System.Windows.Forms.PictureBox();
+ this.btnMutate = new System.Windows.Forms.Button();
((System.ComponentModel.ISupportInitialize)(this.numIterationsStart)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.nmLayerRangeStart)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.nmLayerRangeEnd)).BeginInit();
this.cmLayerRange.SuspendLayout();
- ((System.ComponentModel.ISupportInitialize)(this.pbInfo)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.nmIterationsEnd)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.pbInfo)).BeginInit();
this.SuspendLayout();
//
// lbDescription
@@ -193,65 +195,6 @@
this.btnLayerRangeNormalLayers.Text = "&Normal Layers";
this.btnLayerRangeNormalLayers.Click += new System.EventHandler(this.ItemClicked);
//
- // btnCancel
- //
- this.btnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
- this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
- this.btnCancel.Image = global::PrusaSL1Viewer.Properties.Resources.Cancel_24x24;
- this.btnCancel.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
- this.btnCancel.Location = new System.Drawing.Point(447, 230);
- this.btnCancel.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
- this.btnCancel.Name = "btnCancel";
- this.btnCancel.Size = new System.Drawing.Size(150, 48);
- this.btnCancel.TabIndex = 6;
- this.btnCancel.Text = "&Cancel";
- this.btnCancel.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
- this.btnCancel.UseVisualStyleBackColor = true;
- this.btnCancel.Click += new System.EventHandler(this.ItemClicked);
- //
- // btnPreview
- //
- this.btnPreview.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
- this.btnPreview.Enabled = false;
- this.btnPreview.Image = global::PrusaSL1Viewer.Properties.Resources.eye_24x24;
- this.btnPreview.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
- this.btnPreview.Location = new System.Drawing.Point(131, 230);
- this.btnPreview.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
- this.btnPreview.Name = "btnPreview";
- this.btnPreview.Size = new System.Drawing.Size(150, 48);
- this.btnPreview.TabIndex = 4;
- this.btnPreview.Text = "&Preview";
- this.btnPreview.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
- this.btnPreview.UseVisualStyleBackColor = true;
- this.btnPreview.Visible = false;
- //
- // pbInfo
- //
- this.pbInfo.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
- | System.Windows.Forms.AnchorStyles.Right)));
- this.pbInfo.Location = new System.Drawing.Point(604, 14);
- this.pbInfo.Name = "pbInfo";
- this.pbInfo.Size = new System.Drawing.Size(311, 264);
- this.pbInfo.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
- this.pbInfo.TabIndex = 7;
- this.pbInfo.TabStop = false;
- this.pbInfo.Visible = false;
- //
- // btnMutate
- //
- this.btnMutate.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
- this.btnMutate.Image = global::PrusaSL1Viewer.Properties.Resources.Ok_24x24;
- this.btnMutate.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
- this.btnMutate.Location = new System.Drawing.Point(289, 230);
- this.btnMutate.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
- this.btnMutate.Name = "btnMutate";
- this.btnMutate.Size = new System.Drawing.Size(150, 48);
- this.btnMutate.TabIndex = 5;
- this.btnMutate.Text = "&Mutate";
- this.btnMutate.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
- this.btnMutate.UseVisualStyleBackColor = true;
- this.btnMutate.Click += new System.EventHandler(this.ItemClicked);
- //
// lbIterationsStop
//
this.lbIterationsStop.AutoSize = true;
@@ -312,6 +255,65 @@
this.btnLayerRangeSelect.Text = "Select";
this.btnLayerRangeSelect.UseVisualStyleBackColor = true;
//
+ // btnCancel
+ //
+ this.btnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+ this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+ this.btnCancel.Image = global::UVtools.GUI.Properties.Resources.Cancel_24x24;
+ this.btnCancel.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ this.btnCancel.Location = new System.Drawing.Point(447, 230);
+ this.btnCancel.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
+ this.btnCancel.Name = "btnCancel";
+ this.btnCancel.Size = new System.Drawing.Size(150, 48);
+ this.btnCancel.TabIndex = 6;
+ this.btnCancel.Text = "&Cancel";
+ this.btnCancel.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
+ this.btnCancel.UseVisualStyleBackColor = true;
+ this.btnCancel.Click += new System.EventHandler(this.ItemClicked);
+ //
+ // btnPreview
+ //
+ this.btnPreview.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+ this.btnPreview.Enabled = false;
+ this.btnPreview.Image = global::UVtools.GUI.Properties.Resources.eye_24x24;
+ this.btnPreview.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ this.btnPreview.Location = new System.Drawing.Point(131, 230);
+ this.btnPreview.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
+ this.btnPreview.Name = "btnPreview";
+ this.btnPreview.Size = new System.Drawing.Size(150, 48);
+ this.btnPreview.TabIndex = 4;
+ this.btnPreview.Text = "&Preview";
+ this.btnPreview.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
+ this.btnPreview.UseVisualStyleBackColor = true;
+ this.btnPreview.Visible = false;
+ //
+ // pbInfo
+ //
+ this.pbInfo.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.pbInfo.Location = new System.Drawing.Point(604, 14);
+ this.pbInfo.Name = "pbInfo";
+ this.pbInfo.Size = new System.Drawing.Size(311, 264);
+ this.pbInfo.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
+ this.pbInfo.TabIndex = 7;
+ this.pbInfo.TabStop = false;
+ this.pbInfo.Visible = false;
+ //
+ // btnMutate
+ //
+ this.btnMutate.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+ this.btnMutate.Image = global::UVtools.GUI.Properties.Resources.Ok_24x24;
+ this.btnMutate.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ this.btnMutate.Location = new System.Drawing.Point(289, 230);
+ this.btnMutate.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
+ this.btnMutate.Name = "btnMutate";
+ this.btnMutate.Size = new System.Drawing.Size(150, 48);
+ this.btnMutate.TabIndex = 5;
+ this.btnMutate.Text = "&Mutate";
+ this.btnMutate.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
+ this.btnMutate.UseVisualStyleBackColor = true;
+ this.btnMutate.Click += new System.EventHandler(this.ItemClicked);
+ //
// FrmMutation
//
this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 20F);
@@ -347,8 +349,8 @@
((System.ComponentModel.ISupportInitialize)(this.nmLayerRangeStart)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.nmLayerRangeEnd)).EndInit();
this.cmLayerRange.ResumeLayout(false);
- ((System.ComponentModel.ISupportInitialize)(this.pbInfo)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.nmIterationsEnd)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.pbInfo)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
diff --git a/PrusaSL1Viewer/Forms/FrmMutation.cs b/UVtools.GUI/Forms/FrmMutation.cs
index 78b3969..0729e88 100644
--- a/PrusaSL1Viewer/Forms/FrmMutation.cs
+++ b/UVtools.GUI/Forms/FrmMutation.cs
@@ -9,7 +9,7 @@
using System;
using System.Windows.Forms;
-namespace PrusaSL1Viewer.Forms
+namespace UVtools.GUI.Forms
{
public partial class FrmMutation : Form
{
@@ -56,7 +56,8 @@ namespace PrusaSL1Viewer.Forms
DialogResult = DialogResult.Cancel;
if (defaultIterations == 0 ||
- mutation.Mutate == Mutation.Mutates.PyrDownUp)
+ mutation.Mutate == Mutation.Mutates.PyrDownUp ||
+ mutation.Mutate == Mutation.Mutates.Solidify)
{
lbIterationsStart.Enabled =
numIterationsStart.Enabled =
diff --git a/PrusaSL1Viewer/Forms/FrmMutation.resx b/UVtools.GUI/Forms/FrmMutation.resx
index 40776f4..40776f4 100644
--- a/PrusaSL1Viewer/Forms/FrmMutation.resx
+++ b/UVtools.GUI/Forms/FrmMutation.resx
diff --git a/PrusaSL1Viewer/Forms/FrmMutationResize.Designer.cs b/UVtools.GUI/Forms/FrmMutationResize.Designer.cs
index 4da0566..97af6c4 100644
--- a/PrusaSL1Viewer/Forms/FrmMutationResize.Designer.cs
+++ b/UVtools.GUI/Forms/FrmMutationResize.Designer.cs
@@ -1,4 +1,6 @@
-namespace PrusaSL1Viewer.Forms
+using UVtools.GUI.Controls;
+
+namespace UVtools.GUI.Forms
{
partial class FrmMutationResize
{
@@ -50,7 +52,8 @@
this.toolTip = new System.Windows.Forms.ToolTip(this.components);
this.label1 = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label();
- this.btnLayerRangeSelect = new PrusaSL1Viewer.Controls.SplitButton();
+ this.btnLayerRangeSelect = new UVtools.GUI.Controls.SplitButton();
+ this.cbFade = new System.Windows.Forms.CheckBox();
((System.ComponentModel.ISupportInitialize)(this.nmX)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.nmLayerRangeStart)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.nmLayerRangeEnd)).BeginInit();
@@ -203,7 +206,7 @@
//
this.btnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
- this.btnCancel.Image = global::PrusaSL1Viewer.Properties.Resources.Cancel_24x24;
+ this.btnCancel.Image = global::UVtools.GUI.Properties.Resources.Cancel_24x24;
this.btnCancel.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.btnCancel.Location = new System.Drawing.Point(434, 230);
this.btnCancel.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
@@ -218,7 +221,7 @@
// btnMutate
//
this.btnMutate.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
- this.btnMutate.Image = global::PrusaSL1Viewer.Properties.Resources.Ok_24x24;
+ this.btnMutate.Image = global::UVtools.GUI.Properties.Resources.Ok_24x24;
this.btnMutate.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.btnMutate.Location = new System.Drawing.Point(276, 230);
this.btnMutate.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
@@ -319,12 +322,23 @@
this.btnLayerRangeSelect.Text = "Select";
this.btnLayerRangeSelect.UseVisualStyleBackColor = true;
//
+ // cbFade
+ //
+ this.cbFade.AutoSize = true;
+ this.cbFade.Location = new System.Drawing.Point(90, 230);
+ this.cbFade.Name = "cbFade";
+ this.cbFade.Size = new System.Drawing.Size(170, 24);
+ this.cbFade.TabIndex = 18;
+ this.cbFade.Text = "Fade towards 100%";
+ this.cbFade.UseVisualStyleBackColor = true;
+ //
// FrmMutationResize
//
this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 20F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.CancelButton = this.btnCancel;
this.ClientSize = new System.Drawing.Size(599, 292);
+ this.Controls.Add(this.cbFade);
this.Controls.Add(this.label2);
this.Controls.Add(this.label1);
this.Controls.Add(this.cbConstrainXY);
@@ -383,5 +397,6 @@
private System.Windows.Forms.ToolTip toolTip;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Label label2;
+ private System.Windows.Forms.CheckBox cbFade;
}
} \ No newline at end of file
diff --git a/PrusaSL1Viewer/Forms/FrmMutationResize.cs b/UVtools.GUI/Forms/FrmMutationResize.cs
index 33e8266..0260726 100644
--- a/PrusaSL1Viewer/Forms/FrmMutationResize.cs
+++ b/UVtools.GUI/Forms/FrmMutationResize.cs
@@ -9,7 +9,7 @@
using System;
using System.Windows.Forms;
-namespace PrusaSL1Viewer.Forms
+namespace UVtools.GUI.Forms
{
public partial class FrmMutationResize : Form
{
@@ -31,13 +31,13 @@ namespace PrusaSL1Viewer.Forms
public float X
{
- get => (uint) nmX.Value;
+ get => (float)nmX.Value;
set => nmX.Value = (decimal) value;
}
public float Y
{
- get => (uint)nmY.Value;
+ get => (float)nmY.Value;
set => nmY.Value = (decimal) value;
}
@@ -46,6 +46,12 @@ namespace PrusaSL1Viewer.Forms
get => cbConstrainXY.Checked;
set => cbConstrainXY.Checked = value;
}
+
+ public bool Fade
+ {
+ get => cbFade.Checked;
+ set => cbFade.Checked = value;
+ }
#endregion
#region Constructors
diff --git a/PrusaSL1Viewer/Forms/FrmMutationResize.resx b/UVtools.GUI/Forms/FrmMutationResize.resx
index b3fb34c..b3fb34c 100644
--- a/PrusaSL1Viewer/Forms/FrmMutationResize.resx
+++ b/UVtools.GUI/Forms/FrmMutationResize.resx
diff --git a/PrusaSL1Viewer/Forms/FrmRepairLayers.Designer.cs b/UVtools.GUI/Forms/FrmRepairLayers.Designer.cs
index ab4cb16..d5227c9 100644
--- a/PrusaSL1Viewer/Forms/FrmRepairLayers.Designer.cs
+++ b/UVtools.GUI/Forms/FrmRepairLayers.Designer.cs
@@ -1,4 +1,6 @@
-namespace PrusaSL1Viewer.Forms
+using UVtools.GUI.Controls;
+
+namespace UVtools.GUI.Forms
{
partial class FrmRepairLayers
{
@@ -49,7 +51,7 @@
this.cbRepairIslands = new System.Windows.Forms.CheckBox();
this.label1 = new System.Windows.Forms.Label();
this.numOpeningIterations = new System.Windows.Forms.NumericUpDown();
- this.btnLayerRangeSelect = new PrusaSL1Viewer.Controls.SplitButton();
+ this.btnLayerRangeSelect = new SplitButton();
((System.ComponentModel.ISupportInitialize)(this.numClosingIterations)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.nmLayerRangeStart)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.nmLayerRangeEnd)).BeginInit();
@@ -188,7 +190,7 @@
//
this.btnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
- this.btnCancel.Image = global::PrusaSL1Viewer.Properties.Resources.Cancel_24x24;
+ this.btnCancel.Image = global::UVtools.GUI.Properties.Resources.Cancel_24x24;
this.btnCancel.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.btnCancel.Location = new System.Drawing.Point(447, 246);
this.btnCancel.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
@@ -203,7 +205,7 @@
// btnRepair
//
this.btnRepair.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
- this.btnRepair.Image = global::PrusaSL1Viewer.Properties.Resources.Ok_24x24;
+ this.btnRepair.Image = global::UVtools.GUI.Properties.Resources.Ok_24x24;
this.btnRepair.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.btnRepair.Location = new System.Drawing.Point(289, 246);
this.btnRepair.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
diff --git a/PrusaSL1Viewer/Forms/FrmRepairLayers.cs b/UVtools.GUI/Forms/FrmRepairLayers.cs
index 8f4e3c4..e065d1a 100644
--- a/PrusaSL1Viewer/Forms/FrmRepairLayers.cs
+++ b/UVtools.GUI/Forms/FrmRepairLayers.cs
@@ -9,7 +9,7 @@
using System;
using System.Windows.Forms;
-namespace PrusaSL1Viewer.Forms
+namespace UVtools.GUI.Forms
{
public partial class FrmRepairLayers : Form
{
diff --git a/PrusaSL1Viewer/Forms/FrmRepairLayers.resx b/UVtools.GUI/Forms/FrmRepairLayers.resx
index b58bc91..b58bc91 100644
--- a/PrusaSL1Viewer/Forms/FrmRepairLayers.resx
+++ b/UVtools.GUI/Forms/FrmRepairLayers.resx
diff --git a/PrusaSL1Viewer/FrmMain.Designer.cs b/UVtools.GUI/FrmMain.Designer.cs
index 6427dd8..a726ab1 100644
--- a/PrusaSL1Viewer/FrmMain.Designer.cs
+++ b/UVtools.GUI/FrmMain.Designer.cs
@@ -1,4 +1,4 @@
-namespace PrusaSL1Viewer
+namespace UVtools.GUI
{
partial class FrmMain
{
@@ -194,7 +194,7 @@
//
// menuFileOpen
//
- this.menuFileOpen.Image = global::PrusaSL1Viewer.Properties.Resources.Open_16x16;
+ this.menuFileOpen.Image = global::UVtools.GUI.Properties.Resources.Open_16x16;
this.menuFileOpen.Name = "menuFileOpen";
this.menuFileOpen.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.O)));
this.menuFileOpen.Size = new System.Drawing.Size(261, 22);
@@ -203,7 +203,7 @@
//
// menuFileOpenNewWindow
//
- this.menuFileOpenNewWindow.Image = global::PrusaSL1Viewer.Properties.Resources.Open_16x16;
+ this.menuFileOpenNewWindow.Image = global::UVtools.GUI.Properties.Resources.Open_16x16;
this.menuFileOpenNewWindow.Name = "menuFileOpenNewWindow";
this.menuFileOpenNewWindow.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift)
| System.Windows.Forms.Keys.O)));
@@ -213,7 +213,7 @@
//
// menuFileReload
//
- this.menuFileReload.Image = global::PrusaSL1Viewer.Properties.Resources.File_Refresh_16x16;
+ this.menuFileReload.Image = global::UVtools.GUI.Properties.Resources.File_Refresh_16x16;
this.menuFileReload.Name = "menuFileReload";
this.menuFileReload.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.F5)));
this.menuFileReload.Size = new System.Drawing.Size(261, 22);
@@ -223,7 +223,7 @@
// menuFileSave
//
this.menuFileSave.Enabled = false;
- this.menuFileSave.Image = global::PrusaSL1Viewer.Properties.Resources.Save_16x16;
+ this.menuFileSave.Image = global::UVtools.GUI.Properties.Resources.Save_16x16;
this.menuFileSave.Name = "menuFileSave";
this.menuFileSave.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.S)));
this.menuFileSave.Size = new System.Drawing.Size(261, 22);
@@ -233,7 +233,7 @@
// menuFileSaveAs
//
this.menuFileSaveAs.Enabled = false;
- this.menuFileSaveAs.Image = global::PrusaSL1Viewer.Properties.Resources.SaveAs_16x16;
+ this.menuFileSaveAs.Image = global::UVtools.GUI.Properties.Resources.SaveAs_16x16;
this.menuFileSaveAs.Name = "menuFileSaveAs";
this.menuFileSaveAs.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift)
| System.Windows.Forms.Keys.S)));
@@ -244,7 +244,7 @@
// menuFileClose
//
this.menuFileClose.Enabled = false;
- this.menuFileClose.Image = global::PrusaSL1Viewer.Properties.Resources.File_Close_16x16;
+ this.menuFileClose.Image = global::UVtools.GUI.Properties.Resources.File_Close_16x16;
this.menuFileClose.Name = "menuFileClose";
this.menuFileClose.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.W)));
this.menuFileClose.Size = new System.Drawing.Size(261, 22);
@@ -259,7 +259,7 @@
// menuFileExtract
//
this.menuFileExtract.Enabled = false;
- this.menuFileExtract.Image = global::PrusaSL1Viewer.Properties.Resources.Extract_object_16x16;
+ this.menuFileExtract.Image = global::UVtools.GUI.Properties.Resources.Extract_object_16x16;
this.menuFileExtract.Name = "menuFileExtract";
this.menuFileExtract.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.E)));
this.menuFileExtract.Size = new System.Drawing.Size(261, 22);
@@ -269,7 +269,7 @@
// menuFileConvert
//
this.menuFileConvert.Enabled = false;
- this.menuFileConvert.Image = global::PrusaSL1Viewer.Properties.Resources.Convert_16x16;
+ this.menuFileConvert.Image = global::UVtools.GUI.Properties.Resources.Convert_16x16;
this.menuFileConvert.Name = "menuFileConvert";
this.menuFileConvert.Size = new System.Drawing.Size(261, 22);
this.menuFileConvert.Text = "&Convert To";
@@ -281,7 +281,7 @@
//
// menuFileExit
//
- this.menuFileExit.Image = global::PrusaSL1Viewer.Properties.Resources.Exit_16x16;
+ this.menuFileExit.Image = global::UVtools.GUI.Properties.Resources.Exit_16x16;
this.menuFileExit.Name = "menuFileExit";
this.menuFileExit.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Alt | System.Windows.Forms.Keys.F4)));
this.menuFileExit.Size = new System.Drawing.Size(261, 22);
@@ -314,7 +314,7 @@
// menuToolsRepairLayers
//
this.menuToolsRepairLayers.Enabled = false;
- this.menuToolsRepairLayers.Image = global::PrusaSL1Viewer.Properties.Resources.Wrench_16x16;
+ this.menuToolsRepairLayers.Image = global::UVtools.GUI.Properties.Resources.Wrench_16x16;
this.menuToolsRepairLayers.Name = "menuToolsRepairLayers";
this.menuToolsRepairLayers.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Alt)
| System.Windows.Forms.Keys.R)));
@@ -343,7 +343,7 @@
//
// menuHelpWebsite
//
- this.menuHelpWebsite.Image = global::PrusaSL1Viewer.Properties.Resources.Global_Network_icon_16x16;
+ this.menuHelpWebsite.Image = global::UVtools.GUI.Properties.Resources.Global_Network_icon_16x16;
this.menuHelpWebsite.Name = "menuHelpWebsite";
this.menuHelpWebsite.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.F1)));
this.menuHelpWebsite.Size = new System.Drawing.Size(231, 22);
@@ -352,7 +352,7 @@
//
// menuHelpDonate
//
- this.menuHelpDonate.Image = global::PrusaSL1Viewer.Properties.Resources.Donate_16x16;
+ this.menuHelpDonate.Image = global::UVtools.GUI.Properties.Resources.Donate_16x16;
this.menuHelpDonate.Name = "menuHelpDonate";
this.menuHelpDonate.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift)
| System.Windows.Forms.Keys.F1)));
@@ -362,7 +362,7 @@
//
// menuHelpAbout
//
- this.menuHelpAbout.Image = global::PrusaSL1Viewer.Properties.Resources.Button_Info_16x16;
+ this.menuHelpAbout.Image = global::UVtools.GUI.Properties.Resources.Button_Info_16x16;
this.menuHelpAbout.Name = "menuHelpAbout";
this.menuHelpAbout.ShortcutKeys = System.Windows.Forms.Keys.F1;
this.menuHelpAbout.Size = new System.Drawing.Size(231, 22);
@@ -376,7 +376,7 @@
//
// menuHelpInstallPrinters
//
- this.menuHelpInstallPrinters.Image = global::PrusaSL1Viewer.Properties.Resources.CNCMachine_16x16;
+ this.menuHelpInstallPrinters.Image = global::UVtools.GUI.Properties.Resources.CNCMachine_16x16;
this.menuHelpInstallPrinters.Name = "menuHelpInstallPrinters";
this.menuHelpInstallPrinters.Size = new System.Drawing.Size(231, 22);
this.menuHelpInstallPrinters.Text = "Install profiles into PrusaSlicer";
@@ -475,7 +475,7 @@
this.tsLayerImageExport.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;
this.tsLayerImageExport.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
this.tsLayerImageExport.Enabled = false;
- this.tsLayerImageExport.Image = global::PrusaSL1Viewer.Properties.Resources.Save_16x16;
+ this.tsLayerImageExport.Image = global::UVtools.GUI.Properties.Resources.Save_16x16;
this.tsLayerImageExport.ImageTransparentColor = System.Drawing.Color.Magenta;
this.tsLayerImageExport.Name = "tsLayerImageExport";
this.tsLayerImageExport.Size = new System.Drawing.Size(23, 22);
@@ -496,7 +496,7 @@
this.tsLayerImageRotate.Checked = true;
this.tsLayerImageRotate.CheckOnClick = true;
this.tsLayerImageRotate.CheckState = System.Windows.Forms.CheckState.Checked;
- this.tsLayerImageRotate.Image = global::PrusaSL1Viewer.Properties.Resources.Rotate_16x16;
+ this.tsLayerImageRotate.Image = global::UVtools.GUI.Properties.Resources.Rotate_16x16;
this.tsLayerImageRotate.ImageTransparentColor = System.Drawing.Color.Magenta;
this.tsLayerImageRotate.Name = "tsLayerImageRotate";
this.tsLayerImageRotate.Size = new System.Drawing.Size(117, 22);
@@ -513,7 +513,7 @@
// tsLayerImageLayerDifference
//
this.tsLayerImageLayerDifference.CheckOnClick = true;
- this.tsLayerImageLayerDifference.Image = global::PrusaSL1Viewer.Properties.Resources.layers_16x16;
+ this.tsLayerImageLayerDifference.Image = global::UVtools.GUI.Properties.Resources.layers_16x16;
this.tsLayerImageLayerDifference.ImageTransparentColor = System.Drawing.Color.Magenta;
this.tsLayerImageLayerDifference.Name = "tsLayerImageLayerDifference";
this.tsLayerImageLayerDifference.Size = new System.Drawing.Size(81, 22);
@@ -546,7 +546,7 @@
this.tsLayerImageHighlightIssues.Checked = true;
this.tsLayerImageHighlightIssues.CheckOnClick = true;
this.tsLayerImageHighlightIssues.CheckState = System.Windows.Forms.CheckState.Checked;
- this.tsLayerImageHighlightIssues.Image = global::PrusaSL1Viewer.Properties.Resources.warning_16x16;
+ this.tsLayerImageHighlightIssues.Image = global::UVtools.GUI.Properties.Resources.warning_16x16;
this.tsLayerImageHighlightIssues.ImageTransparentColor = System.Drawing.Color.Magenta;
this.tsLayerImageHighlightIssues.Name = "tsLayerImageHighlightIssues";
this.tsLayerImageHighlightIssues.Size = new System.Drawing.Size(58, 22);
@@ -562,7 +562,7 @@
// tsLayerImageLayerOutline
//
this.tsLayerImageLayerOutline.CheckOnClick = true;
- this.tsLayerImageLayerOutline.Image = global::PrusaSL1Viewer.Properties.Resources.Geometry_16x16;
+ this.tsLayerImageLayerOutline.Image = global::UVtools.GUI.Properties.Resources.Geometry_16x16;
this.tsLayerImageLayerOutline.ImageTransparentColor = System.Drawing.Color.Magenta;
this.tsLayerImageLayerOutline.Name = "tsLayerImageLayerOutline";
this.tsLayerImageLayerOutline.Size = new System.Drawing.Size(66, 22);
@@ -578,7 +578,7 @@
// tsLayerImagePixelEdit
//
this.tsLayerImagePixelEdit.CheckOnClick = true;
- this.tsLayerImagePixelEdit.Image = global::PrusaSL1Viewer.Properties.Resources.pixel_16x16;
+ this.tsLayerImagePixelEdit.Image = global::UVtools.GUI.Properties.Resources.pixel_16x16;
this.tsLayerImagePixelEdit.ImageTransparentColor = System.Drawing.Color.Magenta;
this.tsLayerImagePixelEdit.Name = "tsLayerImagePixelEdit";
this.tsLayerImagePixelEdit.Size = new System.Drawing.Size(75, 22);
@@ -593,7 +593,7 @@
//
// tsLayerImageZoom
//
- this.tsLayerImageZoom.Image = global::PrusaSL1Viewer.Properties.Resources.search_16x16;
+ this.tsLayerImageZoom.Image = global::UVtools.GUI.Properties.Resources.search_16x16;
this.tsLayerImageZoom.Name = "tsLayerImageZoom";
this.tsLayerImageZoom.Size = new System.Drawing.Size(89, 22);
this.tsLayerImageZoom.Text = "Zoom: 100%";
@@ -607,7 +607,7 @@
//
// tsLayerImageMouseLocation
//
- this.tsLayerImageMouseLocation.Image = global::PrusaSL1Viewer.Properties.Resources.pointer_16x16;
+ this.tsLayerImageMouseLocation.Image = global::UVtools.GUI.Properties.Resources.pointer_16x16;
this.tsLayerImageMouseLocation.Name = "tsLayerImageMouseLocation";
this.tsLayerImageMouseLocation.Size = new System.Drawing.Size(79, 22);
this.tsLayerImageMouseLocation.Text = "{X=0, Y=0}";
@@ -701,7 +701,7 @@
//
this.tsThumbnailsPrevious.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
this.tsThumbnailsPrevious.Enabled = false;
- this.tsThumbnailsPrevious.Image = global::PrusaSL1Viewer.Properties.Resources.Back_16x16;
+ this.tsThumbnailsPrevious.Image = global::UVtools.GUI.Properties.Resources.Back_16x16;
this.tsThumbnailsPrevious.ImageTransparentColor = System.Drawing.Color.Magenta;
this.tsThumbnailsPrevious.Name = "tsThumbnailsPrevious";
this.tsThumbnailsPrevious.Size = new System.Drawing.Size(23, 22);
@@ -721,7 +721,7 @@
//
this.tsThumbnailsNext.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
this.tsThumbnailsNext.Enabled = false;
- this.tsThumbnailsNext.Image = global::PrusaSL1Viewer.Properties.Resources.Next_16x16;
+ this.tsThumbnailsNext.Image = global::UVtools.GUI.Properties.Resources.Next_16x16;
this.tsThumbnailsNext.ImageTransparentColor = System.Drawing.Color.Magenta;
this.tsThumbnailsNext.Name = "tsThumbnailsNext";
this.tsThumbnailsNext.Size = new System.Drawing.Size(23, 22);
@@ -734,7 +734,7 @@
this.tsThumbnailsExport.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;
this.tsThumbnailsExport.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
this.tsThumbnailsExport.Enabled = false;
- this.tsThumbnailsExport.Image = global::PrusaSL1Viewer.Properties.Resources.Save_16x16;
+ this.tsThumbnailsExport.Image = global::UVtools.GUI.Properties.Resources.Save_16x16;
this.tsThumbnailsExport.ImageTransparentColor = System.Drawing.Color.Magenta;
this.tsThumbnailsExport.Name = "tsThumbnailsExport";
this.tsThumbnailsExport.Size = new System.Drawing.Size(23, 22);
@@ -765,6 +765,7 @@
this.lvProperties.TabIndex = 1;
this.lvProperties.UseCompatibleStateImageBehavior = false;
this.lvProperties.View = System.Windows.Forms.View.Details;
+ this.lvProperties.KeyUp += new System.Windows.Forms.KeyEventHandler(this.EventKeyUp);
//
// lvChKey
//
@@ -812,7 +813,7 @@
this.tsPropertiesButtonSave.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;
this.tsPropertiesButtonSave.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
this.tsPropertiesButtonSave.Enabled = false;
- this.tsPropertiesButtonSave.Image = global::PrusaSL1Viewer.Properties.Resources.Save_16x16;
+ this.tsPropertiesButtonSave.Image = global::UVtools.GUI.Properties.Resources.Save_16x16;
this.tsPropertiesButtonSave.ImageTransparentColor = System.Drawing.Color.Magenta;
this.tsPropertiesButtonSave.Name = "tsPropertiesButtonSave";
this.tsPropertiesButtonSave.Size = new System.Drawing.Size(23, 22);
@@ -877,7 +878,7 @@
//
this.tsGCodeButtonSave.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;
this.tsGCodeButtonSave.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
- this.tsGCodeButtonSave.Image = global::PrusaSL1Viewer.Properties.Resources.Save_16x16;
+ this.tsGCodeButtonSave.Image = global::UVtools.GUI.Properties.Resources.Save_16x16;
this.tsGCodeButtonSave.ImageTransparentColor = System.Drawing.Color.Magenta;
this.tsGCodeButtonSave.Name = "tsGCodeButtonSave";
this.tsGCodeButtonSave.Size = new System.Drawing.Size(23, 22);
@@ -944,7 +945,7 @@
// lvIssuesPixels
//
this.lvIssuesPixels.Text = "Pixels";
- this.lvIssuesPixels.Width = 55;
+ this.lvIssuesPixels.Width = 70;
//
// tsIssues
//
@@ -968,7 +969,7 @@
//
this.tsIssuePrevious.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
this.tsIssuePrevious.Enabled = false;
- this.tsIssuePrevious.Image = global::PrusaSL1Viewer.Properties.Resources.Back_16x16;
+ this.tsIssuePrevious.Image = global::UVtools.GUI.Properties.Resources.Back_16x16;
this.tsIssuePrevious.ImageTransparentColor = System.Drawing.Color.Magenta;
this.tsIssuePrevious.Name = "tsIssuePrevious";
this.tsIssuePrevious.Size = new System.Drawing.Size(23, 22);
@@ -987,7 +988,7 @@
//
this.tsIssueNext.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
this.tsIssueNext.Enabled = false;
- this.tsIssueNext.Image = global::PrusaSL1Viewer.Properties.Resources.Next_16x16;
+ this.tsIssueNext.Image = global::UVtools.GUI.Properties.Resources.Next_16x16;
this.tsIssueNext.ImageTransparentColor = System.Drawing.Color.Magenta;
this.tsIssueNext.Name = "tsIssueNext";
this.tsIssueNext.Size = new System.Drawing.Size(23, 22);
@@ -1004,7 +1005,7 @@
//
this.tsIsuesRefresh.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;
this.tsIsuesRefresh.Enabled = false;
- this.tsIsuesRefresh.Image = global::PrusaSL1Viewer.Properties.Resources.refresh_16x16;
+ this.tsIsuesRefresh.Image = global::UVtools.GUI.Properties.Resources.refresh_16x16;
this.tsIsuesRefresh.ImageTransparentColor = System.Drawing.Color.Magenta;
this.tsIsuesRefresh.Name = "tsIsuesRefresh";
this.tsIsuesRefresh.Size = new System.Drawing.Size(61, 22);
@@ -1015,7 +1016,7 @@
// tsIssueRemove
//
this.tsIssueRemove.Enabled = false;
- this.tsIssueRemove.Image = global::PrusaSL1Viewer.Properties.Resources.delete_16x16;
+ this.tsIssueRemove.Image = global::UVtools.GUI.Properties.Resources.delete_16x16;
this.tsIssueRemove.ImageTransparentColor = System.Drawing.Color.Magenta;
this.tsIssueRemove.Name = "tsIssueRemove";
this.tsIssueRemove.Size = new System.Drawing.Size(70, 22);
@@ -1033,7 +1034,7 @@
//
this.tsIssuesRepair.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;
this.tsIssuesRepair.Enabled = false;
- this.tsIssuesRepair.Image = global::PrusaSL1Viewer.Properties.Resources.Wrench_16x16;
+ this.tsIssuesRepair.Image = global::UVtools.GUI.Properties.Resources.Wrench_16x16;
this.tsIssuesRepair.ImageTransparentColor = System.Drawing.Color.Magenta;
this.tsIssuesRepair.Name = "tsIssuesRepair";
this.tsIssuesRepair.Size = new System.Drawing.Size(60, 22);
@@ -1076,7 +1077,7 @@
// btnPreviousLayer
//
this.btnPreviousLayer.Enabled = false;
- this.btnPreviousLayer.Image = global::PrusaSL1Viewer.Properties.Resources.arrow_down_16x16;
+ this.btnPreviousLayer.Image = global::UVtools.GUI.Properties.Resources.arrow_down_16x16;
this.btnPreviousLayer.Location = new System.Drawing.Point(3, 623);
this.btnPreviousLayer.Name = "btnPreviousLayer";
this.btnPreviousLayer.Size = new System.Drawing.Size(118, 26);
@@ -1092,7 +1093,7 @@
//
this.btnNextLayer.Dock = System.Windows.Forms.DockStyle.Fill;
this.btnNextLayer.Enabled = false;
- this.btnNextLayer.Image = global::PrusaSL1Viewer.Properties.Resources.arrow_up_16x16;
+ this.btnNextLayer.Image = global::UVtools.GUI.Properties.Resources.arrow_up_16x16;
this.btnNextLayer.Location = new System.Drawing.Point(3, 53);
this.btnNextLayer.Name = "btnNextLayer";
this.btnNextLayer.Size = new System.Drawing.Size(118, 26);
@@ -1169,7 +1170,7 @@
//
this.btnFindLayer.Dock = System.Windows.Forms.DockStyle.Fill;
this.btnFindLayer.Enabled = false;
- this.btnFindLayer.Image = global::PrusaSL1Viewer.Properties.Resources.search_16x16;
+ this.btnFindLayer.Image = global::UVtools.GUI.Properties.Resources.search_16x16;
this.btnFindLayer.Location = new System.Drawing.Point(37, 0);
this.btnFindLayer.Name = "btnFindLayer";
this.btnFindLayer.Size = new System.Drawing.Size(44, 26);
@@ -1183,7 +1184,7 @@
//
this.btnLastLayer.Dock = System.Windows.Forms.DockStyle.Right;
this.btnLastLayer.Enabled = false;
- this.btnLastLayer.Image = global::PrusaSL1Viewer.Properties.Resources.arrow_top_16x16;
+ this.btnLastLayer.Image = global::UVtools.GUI.Properties.Resources.arrow_top_16x16;
this.btnLastLayer.Location = new System.Drawing.Point(81, 0);
this.btnLastLayer.Name = "btnLastLayer";
this.btnLastLayer.Size = new System.Drawing.Size(37, 26);
@@ -1197,7 +1198,7 @@
//
this.btnFirstLayer.Dock = System.Windows.Forms.DockStyle.Left;
this.btnFirstLayer.Enabled = false;
- this.btnFirstLayer.Image = global::PrusaSL1Viewer.Properties.Resources.arrow_end_16x16;
+ this.btnFirstLayer.Image = global::UVtools.GUI.Properties.Resources.arrow_end_16x16;
this.btnFirstLayer.Location = new System.Drawing.Point(0, 0);
this.btnFirstLayer.Name = "btnFirstLayer";
this.btnFirstLayer.Size = new System.Drawing.Size(37, 26);
@@ -1234,7 +1235,7 @@
this.MainMenuStrip = this.menu;
this.MinimumSize = new System.Drawing.Size(1000, 600);
this.Name = "FrmMain";
- this.Text = "PrusaSL1Viewer";
+ this.Text = "UVtools";
this.menu.ResumeLayout(false);
this.menu.PerformLayout();
this.mainTable.ResumeLayout(false);
diff --git a/PrusaSL1Viewer/FrmMain.cs b/UVtools.GUI/FrmMain.cs
index 52a594f..acb5cad 100644
--- a/PrusaSL1Viewer/FrmMain.cs
+++ b/UVtools.GUI/FrmMain.cs
@@ -12,17 +12,20 @@ using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
+using System.Numerics;
using System.Reflection;
+using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Emgu.CV;
using Emgu.CV.CvEnum;
using Emgu.CV.Structure;
-using PrusaSL1Reader;
-using PrusaSL1Viewer.Forms;
+using Emgu.CV.Util;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.PixelFormats;
using SixLabors.ImageSharp.Processing;
+using UVtools.GUI.Forms;
+using UVtools.Parser;
using Color = System.Drawing.Color;
using Image = SixLabors.ImageSharp.Image;
using Point = System.Drawing.Point;
@@ -30,7 +33,7 @@ using PointF = System.Drawing.PointF;
using Rectangle = System.Drawing.Rectangle;
using Size = System.Drawing.Size;
-namespace PrusaSL1Viewer
+namespace UVtools.GUI
{
public partial class FrmMain : Form
{
@@ -47,6 +50,11 @@ namespace PrusaSL1Viewer
"NOTE 1: Build volume bounds are not validated after operation, please ensure scaling stays inside your limits.\n" +
"NOTE 2: X and Y are applied to original image, not to the rotated preview (If enabled)."
)},
+ {Mutation.Mutates.Solidify, new Mutation(Mutation.Mutates.Solidify,
+ "Solidifies the selected layers, closes all inner holes.\n" +
+ "Warning: All surrounded holes are filled, no exceptions! Make sure you don't require any of holes in layer path.",
+ Properties.Resources.mutation_solidify
+ )},
{Mutation.Mutates.Erode, new Mutation(Mutation.Mutates.Erode,
"The basic idea of erosion is just like soil erosion only, it erodes away the boundaries of foreground object (Always try to keep foreground in white). " +
"So what happends is that, all the pixels near boundary will be discarded depending upon the size of kernel. So the thickness or size of the foreground object decreases or simply white region decreases in the image. It is useful for removing small white noises, detach two connected objects, etc.",
@@ -1469,7 +1477,7 @@ namespace PrusaSL1Viewer
void UpdateTitle()
{
- Text = $"{FrmAbout.AssemblyTitle} Version: {FrmAbout.AssemblyVersion} File: {Path.GetFileName(SlicerFile.FileFullPath)}";
+ Text = $"{FrmAbout.AssemblyTitle} File: {Path.GetFileName(SlicerFile.FileFullPath)} Version: {FrmAbout.AssemblyVersion}";
}
void RefreshInfo()
@@ -1614,13 +1622,41 @@ namespace PrusaSL1Viewer
if (tsLayerImageLayerOutline.Checked)
{
Image<Gray, byte> grayscale = ActualLayerImage.ToEmguImage();
+ //ThresholdBinary(new Gray(127), new Gray(255) )
+ ListViewItem item = new ListViewItem();
grayscale = grayscale.Canny(80, 40, 3, true);
+ //var grayscaleInv = grayscale.ThresholdBinaryInv(new Gray(200), new Gray(255));
+
+ /*VectorOfVectorOfPoint contours = new VectorOfVectorOfPoint();
+ Mat external = new Mat();
+
+ CvInvoke.FindContours(grayscale, contours, external, RetrType.Ccomp, ChainApproxMethod.ChainApproxSimple);
+
+ var arr = external.GetData();
+
+
+ //
+ // hierarchy[i][0]: the index of the next contour of the same level
+ // hierarchy[i][1]: the index of the previous contour of the same level
+ // hierarchy[i][2]: the index of the first child
+ // hierarchy[i][3]: the index of the parent
+ //
+ for (int i = 0; i < contours.Size; i++)
+ {
+ if ((int)arr.GetValue(0, i, 2) != -1 || (int)arr.GetValue(0, i, 3) == -1) continue;
+ var r = CvInvoke.BoundingRectangle(contours[i]);
+ //CvInvoke.Rectangle(grayscale, r, new MCvScalar(125), 5);
+
+ grayscale.FillConvexPoly(contours[i].ToArray(), new Gray(125), LineType.FourConnected);
+
+ Debug.WriteLine(CvInvoke.PointPolygonTest(contours, new PointF(900, 2200), false));
+ }/*
- var grayscaleinv = grayscale.ThresholdBinaryInv(new Gray(0), new Gray(255));
+ //var grayscaleinv = grayscale.ThresholdBinaryInv(new Gray(200), new Gray(255));
- grayscale = ActualLayerImage.ToEmguImage() & grayscaleinv;
+ //grayscale =grayscaleinv;
/*grayscale = grayscale.Dilate(1).Erode(1);
Gray gray = new Gray(255);
@@ -1849,6 +1885,58 @@ namespace PrusaSL1Viewer
private void EventKeyUp(object sender, KeyEventArgs e)
{
+ if (ReferenceEquals(sender, lvProperties))
+ {
+ if (e.KeyCode == Keys.Escape)
+ {
+ foreach (ListViewItem item in lvProperties.Items)
+ {
+ item.Selected = false;
+ }
+ e.Handled = true;
+ return;
+ }
+
+ if (e.Control && e.KeyCode == Keys.A)
+ {
+ foreach (ListViewItem item in lvProperties.Items)
+ {
+ item.Selected = true;
+ }
+ e.Handled = true;
+ return;
+ }
+
+ if (e.KeyCode == Keys.Multiply)
+ {
+ foreach (ListViewItem item in lvProperties.Items)
+ {
+ item.Selected = !item.Selected;
+ }
+ e.Handled = true;
+ return;
+ }
+
+ if (e.Control && e.KeyCode == Keys.C)
+ {
+ StringBuilder clip = new StringBuilder();
+ foreach (ListViewItem item in lvProperties.Items)
+ {
+ if(!item.Selected) continue;
+ if (clip.Length > 0) clip.AppendLine();
+ clip.Append($"{item.Text}: {item.SubItems[1].Text}");
+ }
+
+ if (clip.Length > 0)
+ {
+ Clipboard.SetText(clip.ToString());
+ }
+ e.Handled = true;
+ return;
+ }
+ return;
+ }
+
if (ReferenceEquals(sender, lvIssues))
{
if (e.KeyCode == Keys.Escape)
@@ -1881,6 +1969,24 @@ namespace PrusaSL1Viewer
return;
}
+ if (e.Control && e.KeyCode == Keys.C)
+ {
+ StringBuilder clip = new StringBuilder();
+ foreach (ListViewItem item in lvIssues.Items)
+ {
+ if (!item.Selected) continue;
+ if (clip.Length > 0) clip.AppendLine();
+ clip.Append($"{item.Text}: {item.SubItems[1].Text} Layer: {item.SubItems[2].Text} X,Y: {{{item.SubItems[3].Text}}} Pixels: {item.SubItems[4].Text}");
+ }
+
+ if (clip.Length > 0)
+ {
+ Clipboard.SetText(clip.ToString());
+ }
+ e.Handled = true;
+ return;
+ }
+
if (e.KeyCode == Keys.Delete)
{
tsIssueRemove.PerformClick();
@@ -1965,6 +2071,7 @@ namespace PrusaSL1Viewer
layerEnd = inputBox.LayerRangeEnd;
x = inputBox.X;
y = inputBox.Y;
+ fade = inputBox.Fade;
}
break;
@@ -2000,26 +2107,26 @@ namespace PrusaSL1Viewer
{
if (type == Mutation.Mutates.Resize)
{
- SlicerFile.Resize(layerStart, layerEnd, x / 100f, y / 100f);
+ SlicerFile.Resize(layerStart, layerEnd, x / 100f, y / 100f, fade);
}
else
{
- Parallel.For(layerStart, layerEnd + 1, i =>
+ Parallel.For(layerStart, layerEnd + 1, layerIndex =>
{
var iterations = iterationsStart;
if (fade)
{
// calculate iterations based on range
iterations = iterationsStart < iterationsEnd
- ? (uint) ((i + 1 - layerStart) * iterationSteps)
- : (uint) (iterationsStart - (i - layerStart) * iterationSteps);
+ ? (uint) (iterationsStart + (layerIndex - layerStart) * iterationSteps)
+ : (uint) (iterationsStart - (layerIndex - layerStart) * iterationSteps);
// constrain
iterations = Math.Min(Math.Max(1, iterations), maxIteration);
//Debug.WriteLine($"A Layer: {i} = {iterations}");
}
- Layer layer = SlicerFile[i];
+ Layer layer = SlicerFile[layerIndex];
var image = layer.Image;
var imageEgmu = image.ToEmguImage();
switch (type)
@@ -2028,6 +2135,39 @@ namespace PrusaSL1Viewer
var resizedImage = imageEgmu.Resize( (int) (iterationsStart / 100.0 * image.Width), (int) (iterationsEnd / 100.0 * image.Height), Inter.Lanczos4);
imageEgmu = resizedImage.Copy(new Rectangle(0, 0, image.Width, image.Height));
break;
+ case Mutation.Mutates.Solidify:
+ for (byte pass = 0; pass < 2; pass++) // Passes
+ {
+ var imageThreshold = imageEgmu.ThresholdBinary(new Gray(254), new Gray(255)); // Clean AA
+ VectorOfVectorOfPoint contours = new VectorOfVectorOfPoint();
+ Mat hierarchy = new Mat();
+
+ CvInvoke.FindContours(imageThreshold, contours, hierarchy, RetrType.Ccomp, ChainApproxMethod.ChainApproxSimple);
+
+ var arr = hierarchy.GetData();
+
+ /*
+ * hierarchy[i][0]: the index of the next contour of the same level
+ * hierarchy[i][1]: the index of the previous contour of the same level
+ * hierarchy[i][2]: the index of the first child
+ * hierarchy[i][3]: the index of the parent
+ */
+ for (int i = 0; i < contours.Size; i++)
+ {
+ if ((int)arr.GetValue(0, i, 2) != -1 || (int)arr.GetValue(0, i, 3) == -1) continue;
+ var r = CvInvoke.BoundingRectangle(contours[i]);
+ imageEgmu.FillConvexPoly(contours[i].ToArray(), new Gray(255));
+ //imageThreshold.FillConvexPoly(contours[i].ToArray(), new Gray(255));
+ //CvInvoke.po
+ }
+
+ // Attempt to close any tiny region
+ //imageEgmu = imageEgmu.Dilate(2).Erode(2);
+ }
+
+
+
+ break;
case Mutation.Mutates.Erode:
imageEgmu = imageEgmu.Erode((int) iterations);
break;
@@ -2143,6 +2283,89 @@ namespace PrusaSL1Viewer
try
{
Issues = SlicerFile.LayerManager.GetAllIssues();
+
+ /*Dictionary<uint, List<Point[]>> LayersContours = new Dictionary<uint, List<Point[]>>();
+
+ for (uint i = 0; i < SlicerFile.LayerCount; i++)
+ {
+ LayersContours.Add(i, new List<Point[]>());
+ }
+
+ Parallel.ForEach(SlicerFile, layer =>
+ {
+ Image<Gray, byte> grayscale = layer.Image.ToEmguImage().ThresholdBinary(new Gray(254), new Gray(255));
+
+ //grayscale = grayscale.Canny(80, 40, 3, true);
+ //var grayscaleInv = grayscale.ThresholdBinaryInv(new Gray(200), new Gray(255));
+
+ VectorOfVectorOfPoint contours = new VectorOfVectorOfPoint();
+ Mat external = new Mat();
+
+ CvInvoke.FindContours(grayscale, contours, external, RetrType.Ccomp, ChainApproxMethod.ChainApproxSimple);
+
+ var arr = external.GetData();
+ //
+ //hierarchy[i][0]: the index of the next contour of the same level
+ //hierarchy[i][1]: the index of the previous contour of the same level
+ //hierarchy[i][2]: the index of the first child
+ //hierarchy[i][3]: the index of the parent
+ //
+ for (int i = 0; i < contours.Size; i++)
+ {
+ if ((int)arr.GetValue(0, i, 2) != -1 || (int)arr.GetValue(0, i, 3) == -1) continue;
+
+ LayersContours[layer.Index].Add(contours[i].ToArray());
+ }
+ });
+
+ for (uint i = 0; i < SlicerFile.LayerCount; i++)
+ {
+ if (LayersContours[i].Count == 0)
+ LayersContours.Remove(i);
+ }
+
+ Image<Gray, byte> emguCurrentImage;
+ Image<Gray, byte> emguNextImage;
+
+ for (uint i = 0; i < SlicerFile.LayerCount; i++)
+ {
+ if(!LayersContours.TryGetValue(i, out var currentPoints)) continue;
+ var image = new Image<Gray, byte>((int) SlicerFile.ResolutionY, (int) SlicerFile.ResolutionX);
+ foreach (var points in currentPoints)
+ {
+ VectorOfPoint vec = new VectorOfPoint(points);
+ CvInvoke.FillConvexPoly(image, vec, new MCvScalar(255));
+ }
+
+ SlicerFile[i].Image = image.ToImageSharpL8();
+
+ /*if (!LayersContours.TryGetValue(i+1, out var nextPoints))
+ {
+ if (!LayersContours.TryGetValue(i - 1, out var PreviousPoints))
+ {
+ if (!Issues.TryGetValue(i, out var layerIssues))
+ {
+ layerIssues = new List<LayerIssue>();
+ Issues.Add(i, layerIssues);
+ }
+
+ foreach (var points in currentPoints)
+ {
+ Issues[i].Add(new LayerIssue(SlicerFile[i], LayerIssue.IssueType.ResinTrap,
+ points));
+ }
+ }
+
+ continue;
+ };
+ }
+
+ foreach (var layersContour in LayersContours)
+ {
+ emguCurrentImage = new Image<Gray, byte>((int)SlicerFile.ResolutionX, (int)SlicerFile.ResolutionY);
+ emguNextImage = emguCurrentImage.CopyBlank();
+ }*/
+
result = true;
}
catch (Exception ex)
diff --git a/PrusaSL1Viewer/FrmMain.resx b/UVtools.GUI/FrmMain.resx
index 720daa6..0d12783 100644
--- a/PrusaSL1Viewer/FrmMain.resx
+++ b/UVtools.GUI/FrmMain.resx
@@ -126,6 +126,12 @@
<metadata name="tsLayer.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>201, 17</value>
</metadata>
+ <metadata name="tsThumbnails.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>291, 17</value>
+ </metadata>
+ <metadata name="tsProperties.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>649, 17</value>
+ </metadata>
<metadata name="tsGCode.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>551, 17</value>
</metadata>
@@ -139,85 +145,70 @@
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
- ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAABG
- DgAAAk1TRnQBSQFMAgEBBAEAAdgBAwHYAQMBEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA
+ ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAABA
+ DgAAAk1TRnQBSQFMAgEBBAEAAegBAwHoAQMBEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA
AwABIAMAAQEBAAEgBgABIP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8AZgADUAGjA1IBqQNS
- AakDUgGpA1IBqQNSAakDUgGpA1IBqQNSAakDUgGpA1IBqQNSAakDUgGpA1ABo1wAAxUBHQE3AYoBnwH1
- ATcBlwGrAfcDQwF3AlsBXQHIAkIBlwH1AlgBbQHjA0oBjAMKAQ0EAANVAbQDWQHHAy8BSQMAAQEDGwEm
- AxwBJwMcAScDHAEnAxwBJwMcAScDHAEnAxwBJwMcAScDHAEnAxwBJwMCAQMEAANSAakwAANSAakQAAMn
- AToDMAFMAzABTAMwAUwDMAFMAzABTAMwAUwDMAFMAzABTAMnAToUAAMFAQcDTAGSAVYCWAHBAxUBHQM9
- AWkBEgHIAfMB/wEgAZAB5gH/AjYB3AH/AjYB3QH/AmsB4wH/AkEB3gH/AjYB3QH/AlgBXQHLAwYBCAMA
- Af8DAAH/A0MBdwMpAT4DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMy
- AVEEAANSAakEAANQAZ0DUwGqA1MBqgNTAaoDUwGqA1MBqgNTAaoDUAGdDAADUgGpEAADTgH7AwAB/wMA
- Af8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DTgH7FAABMAIxAU0BEwHJAfMB/wETAckB9AH/AVEBeQGD
- AesBWAFhAWQB2QEWAcAB8QH/ATcBPwHfAf8COQHgAf8COQHgAf8CcgHpAf8CRAHiAf8COQHgAf8COQHg
- Af8DQAFxA1EBogNWAbYDKgFABAADEAEVAxEBFwMRARcDEQEXAxEBFwMRARcDEQEXAxEBFwMRARcDEQEX
- AxABFggAA1IBqQQAA1ABnQNTAaoDUwGqAx8BLBwAA1IBqRMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMA
- Af8DAAH/AwAB/wMAAf8UAAMHAQoBRQGLAZwB8gEVAcoB9AH/ARUBygH0Af8BFQHKAfQB/wEhAaEB7gH/
- AjwB4wH/AjwB4wH/AjwB4wH/AqkB7wH/AkMB4wH/AjwB4wH/AjwB4wH/AlYBWAG5AwoBDgMRARcDAAEB
- OAADUgGpMAADUgGpEwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wwAAxUBHQM9
- AWkDOgFiAVsBYAFjAdQBFgHLAfUB/wEWAcsB9QH/ARYBywH1Af8BJAGgAfAB/wI/AeYB/wI/AeYB/wI/
- AeYB/wLCAfYB/wJXAegB/wI/AeYB/wI/AeYB/wJXAVkBvwNSAfQDAAH/Az4BbAMOARMDQgF2A0MBdwND
- AXcDQwF3A0MBdwNDAXcDQwF3A0MBdwNDAXcDQwF3A0IBdgMUARsEAANSAakDIgEyA1IBqQNSAakDUgGp
- A1IBqQNSAakDUgGpA1IBqQNSAakDUgGpA1IBqQMiATIDUgGpEwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/
- AwAB/wMAAf8DAAH/AwAB/wwAAUsCTAGQARcBywH2Af8BFwHLAfYB/wEXAcsB9gH/ARcBywH2Af8BKQGm
- AcYB+gNDAXgDIgEyAksBxAH7AkIB6QH/AkIB6QH/As0B+AH/AmYB7QH/AkIB6QH/AkIB6QH/A1ABngMA
- Af4DAAH/A0MBdwMeASsDVwHFA1kBxwNZAccDWQHHA1kBxwNZAccDWQHHA1kBxwNZAccDWQHHA1gBxgMm
- ATkEAANSAakDNAFVAzQBVSAAAzQBVQM0AVUDUgGpEwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMA
- Af8DAAH/AwAB/wwAA1EBoAEZAcwB9wH/ARkBzAH3Af8BGQHMAfcB/wEZAcwB9wH/A0MBdwgAA0oBjQJF
- AewB/wJFAewB/wJhAe8B/wJJAewB/wJFAewB/wFBAVIB7QH/AVICUwGoAzMBUwM8AWcDFAEcOAADUgGp
- AzQBVQM0AVUDRgGAA1IBqQNSAakDUgGpA1IBqQNSAakDUgGpA0UBfwM0AVUDNAFVA1IBqRMAAf8DAAH/
- AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8PAAEBAT8CQAFvAToBoQG6AfgBGgHNAfcB/wEa
- Ac0B9wH/AxIBGAgAAwEBAgNGAX4CUgGPAfACSAHuAf8BSAFJAe4B/wFAAWEB1wH9AUUCRgF+AwMBBAMz
- AVMDPAFnAxQBHDgAA1IBqQM0AVUDNAFVAz8BbgMyAVAQAAMnATsDRAF8AzQBVQM0AVUDUgGpEwAB/wMA
- Af8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/w8AAQEBPwJAAW8BOwGgAboB+AEbAc4B+AH/
- ARsBzgH4Af8DEgEYEAADFwEgASIBvAH3Af8BHwHEAfcB/wEtAbsB3QH9AUUCRgF+AwMBBAMAAf4DAAH/
- A0MBdwMfASwDVwHFA1kBxwNZAccDWQHHA1kBxwNZAccDWQHHA1kBxwNZAccDWQHHA1gBxgMmATkEAANS
- AakDNAFVAzQBVQMFAQcDVQG1AxEBFwNSAakDKQE+BAADUAGfAxEBFwM0AVUDNAFVA1IBqRMAAf8DAAH/
- AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8MAANRAaABHQHOAfgB/wEdAc8B+QH/AR0BzwH5
- Af8BHQHPAfkB/wNDAXcQAANEAXoBHQHPAfkB/wEdAc8B+QH/AR0BzwH5Af8BHQHOAfgB/wFSAlMBqANS
- AfQDAAH/Az4BbAMOARMDQgF1A0MBdwNDAXcDQwF3A0MBdwNDAXcDQwF3A0MBdwNDAXcDQwF3A0MBdwMU
- ARsEAANSAakDNAFVAzQBVQQAAzwBaANWAb4DIwE0A1UBtQMSARkDUQGgBAADNAFVAzQBVQNSAakTAAH/
- AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DXAHfDAABSwJMAZABHgHQAfoB/wEeAdAB+gH/
- AR4B0AH6Af8BHgHQAfoB/wEpAaYBxQH6A0MBeAMSARkDEwEaA0QBegEoAasBywH7AR4B0AH6Af8BHgHQ
- AfoB/wEeAdAB+gH/AR4B0AH6Af8DSgGMAwoBDgMRARcDAAEBOAADUgGpAzQBVQM0AVUDAAEBAy0BRgMK
- AQ4EAAM5AV8DXAHOAygBPAQAAzQBVQM0AVUDUgGpEwAB/wOCAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMA
- Af8DXAHfAxcBIAwAAxUBHQM9AWkDOgFiAVwCYwHUAR8B0QH6Af8BHwHRAfoB/wEfAdAB+gH/AR8BywHz
- Af8BHwHLAfMB/wEfAdAB+gH/AR8B0QH6Af8BHwHRAfoB/wFXAWoBcgHiAzoBYgM9AWkDFAEcA1EBogNW
- AbYDKgFABAADEAEVAxEBFwMRARcDEQEXAxEBFwMRARcDEQEXAxEBFwMRARcDEQEXAxABFggAA1IBqQM0
- AVUDNAFVAzMBUwNSAaYDSgGMBwABAQNHAYMIAAM0AVUDNAFVA1IBqRMAAf8DmQH/A4UB/wMAAf8DAAH/
- AwAB/wMAAf8DXAHfAxcBIBgAAwcBCgFIAYwBnAHyASEB0gH7Af8BIQHSAfsB/wEhAdIB+wH/ASEB0gH7
- Af8BIQHSAfsB/wEhAdIB+wH/ASEB0gH7Af8BIQHSAfsB/wErAa8BzAH7AxEBFwsAAf8DAAH/A0MBdwMp
- AT4DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMyAVEEAANSAakDNAFV
- AzQBVQMRARcDUAGeAyQBNhQAAzQBVQM0AVUDUgGpEAADUAH7AwAB/wMAAf8DAAH/AwAB/wMAAf8DXAHf
- AxcBIBwAATACMQFNASIB0gH8Af8BIgHSAfwB/wFVAX4BhwHrAVgBYwFlAdkBIgHSAfwB/wEiAdIB/AH/
- AVoBbQFxAeEBVwFrAXIB4gEiAdIB/AH/ASIB0gH8Af8DOAFeCAADVQG0A1kBxwMvAUkDAAEBAxsBJgMc
- AScDHAEnAxwBJwMcAScDHAEnAxwBJwMcAScDHAEnAxwBJwMcAScDAgEDBAADUgGpAyIBMgNSAakDUgGp
- A1IBqQNSAakDUgGpA1IBqQNSAakDUgGpA1IBqQNSAakDIgEyA1IBqRAAAyABLgMpAT8DKQE/AykBPwMp
- AT8DKQE/AxEBFyAAAwUBBwNMAZIBVgJYAcEDFQEdAz0BaQEjAdMB/AH/ASMB0wH8Af8BRQJGAX8DEAEV
- A1YBswFLAkwBjwMEAQZMAANQAaMDUgGpA1IBqQNSAakDUgGpA1IBqQNSAakDUgGpA1IBqQNSAakDUgGp
- A1IBqQNSAakDUAGjXAADFQEdAUIBlwGrAfUBPAGkAbsB9wMgAS8YAAFCAU0BPgcAAT4DAAEoAwABQAMA
- ASADAAEBAQABAQYAAQEWAAP/gQAC/wGAAQEC/wH8AQECAAG/Af0B4AEHAcADAAGgAR0B4AEHAcABAAEQ
- AQEBoQH9AeABBwHAAQABHwH/Ab8B/QHgAQcEAAGAAQEB4AEHBAABjwHxAeABBwEDAQABHwH/AYABAQHg
- AQcBAwEAAR8B/wGDAcEB4AEHAQMBwAIAAYABQQHgAQcBAwHAAgABiAERAeABBwIAAR8B/wGBAREB4AEH
- AgABEAEBAYEBMQHgAQ8BwAEDAgABgQHxAeABHwHAAQMCAAGAAQEB4AE/AcABAwL/AYABAQL/AfwBPws=
+ AakDUgGpA1IBqQNSAakDUgGpA1IBqQNSAakDUgGpA1IBqQNSAakDUgGpA1ABo1wAAxUBHQE9AYUBlwH1
+ ATkBjwGkAfcDQwF3A1sByAJCAY0B9QJYAWYB4wNKAYwDCgENBAADVQG0A1kBxwMvAUkDAAEBAxsBJgMc
+ AScDHAEnAxwBJwMcAScDHAEnAxwBJwMcAScDHAEnAxwBJwMcAScDAgEDBAADUgGpMAADUgGpEAADJwE6
+ AzABTAMwAUwDMAFMAzABTAMwAUwDMAFMAzABTAMwAUwDJwE6FAADBQEHA0wBkgFWAlgBwQMVAR0DPQFp
+ ARAByAHzAf8BHgGQAeYB/wI0AdwB/wI0Ad0B/wJpAeMB/wI/Ad4B/wI0Ad0B/wJYAVsBywMGAQgDAAH/
+ AwAB/wNDAXcDKQE+AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DMgFR
+ BAADUgGpBAADUAGdA1MBqgNTAaoDUwGqA1MBqgNTAaoDUwGqA1ABnQwAA1IBqRAAA04B+wMAAf8DAAH/
+ AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/A04B+xQAATACMQFNAREByQHzAf8BEQHJAfQB/wFVAXQBewHr
+ AVoBXwFgAdkBFAHAAfEB/wE1AT0B3wH/AjcB4AH/AjcB4AH/AnAB6QH/AkIB4gH/AjcB4AH/AjcB4AH/
+ A0ABcQNRAaIDVgG2AyoBQAQAAxABFQMRARcDEQEXAxEBFwMRARcDEQEXAxEBFwMRARcDEQEXAxEBFwMQ
+ ARYIAANSAakEAANQAZ0DUwGqA1MBqgMfASwcAANSAakTAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/
+ AwAB/wMAAf8DAAH/FAADBwEKAUgBhAGQAfIBEwHKAfQB/wETAcoB9AH/ARMBygH0Af8BHwGhAe4B/wI6
+ AeMB/wI6AeMB/wI6AeMB/wKpAe8B/wJBAeMB/wI6AeMB/wI6AeMB/wJWAVgBuQMKAQ4DEQEXAwABATgA
+ A1IBqTAAA1IBqRMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8MAAMVAR0DPQFp
+ AzoBYgFcAmAB1AEUAcsB9QH/ARQBywH1Af8BFAHLAfUB/wEiAaAB8AH/Aj0B5gH/Aj0B5gH/Aj0B5gH/
+ AsIB9gH/AlUB6AH/Aj0B5gH/Aj0B5gH/AlcBWQG/A1IB9AMAAf8DPgFsAw4BEwNCAXYDQwF3A0MBdwND
+ AXcDQwF3A0MBdwNDAXcDQwF3A0MBdwNDAXcDQgF2AxQBGwQAA1IBqQMiATIDUgGpA1IBqQNSAakDUgGp
+ A1IBqQNSAakDUgGpA1IBqQNSAakDUgGpAyIBMgNSAakTAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/
+ AwAB/wMAAf8DAAH/DAABSwJMAZABFQHLAfYB/wEVAcsB9gH/ARUBywH2Af8BFQHLAfYB/wEpAaIBvAH6
+ A0MBeAMiATICSwG+AfsCQAHpAf8CQAHpAf8CzQH4Af8CZAHtAf8CQAHpAf8CQAHpAf8DUAGeAwAB/gMA
+ Af8DQwF3Ax4BKwNXAcUDWQHHA1kBxwNZAccDWQHHA1kBxwNZAccDWQHHA1kBxwNZAccDWAHGAyYBOQQA
+ A1IBqQM0AVUDNAFVIAADNAFVAzQBVQNSAakTAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMA
+ Af8DAAH/DAADUQGgARcBzAH3Af8BFwHMAfcB/wEXAcwB9wH/ARcBzAH3Af8DQwF3CAADSgGNAkMB7AH/
+ AkMB7AH/Al8B7wH/AkcB7AH/AkMB7AH/AT8BUAHtAf8BUgJTAagDMwFTAzwBZwMUARw4AANSAakDNAFV
+ AzQBVQNGAYADUgGpA1IBqQNSAakDUgGpA1IBqQNSAakDRQF/AzQBVQM0AVUDUgGpEwAB/wMAAf8DAAH/
+ AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/w8AAQEBPwJAAW8BPAGbAbEB+AEYAc0B9wH/ARgBzQH3
+ Af8DEgEYCAADAQECA0YBfgJSAYYB8AJGAe4B/wFGAUcB7gH/AUABXQHRAf0BRQJGAX4DAwEEAzMBUwM8
+ AWcDFAEcOAADUgGpAzQBVQM0AVUDPwFuAzIBUBAAAycBOwNEAXwDNAFVAzQBVQNSAakTAAH/AwAB/wMA
+ Af8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/DwABAQE/AkABbwE9AZsBsQH4ARkBzgH4Af8BGQHO
+ AfgB/wMSARgQAAMXAiABvAH3Af8BHQHEAfcB/wEvAbkB1wH9AUUCRgF+AwMBBAMAAf4DAAH/A0MBdwMf
+ ASwDVwHFA1kBxwNZAccDWQHHA1kBxwNZAccDWQHHA1kBxwNZAccDWQHHA1gBxgMmATkEAANSAakDNAFV
+ AzQBVQMFAQcDVQG1AxEBFwNSAakDKQE+BAADUAGfAxEBFwM0AVUDNAFVA1IBqRMAAf8DAAH/AwAB/wMA
+ Af8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8MAANRAaABGwHOAfgB/wEbAc8B+QH/ARsBzwH5Af8BGwHP
+ AfkB/wNDAXcQAANEAXoBGwHPAfkB/wEbAc8B+QH/ARsBzwH5Af8BGwHOAfgB/wFSAlMBqANSAfQDAAH/
+ Az4BbAMOARMDQgF1A0MBdwNDAXcDQwF3A0MBdwNDAXcDQwF3A0MBdwNDAXcDQwF3A0MBdwMUARsEAANS
+ AakDNAFVAzQBVQQAAzwBaANWAb4DIwE0A1UBtQMSARkDUQGgBAADNAFVAzQBVQNSAakTAAH/AwAB/wMA
+ Af8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DXAHfDAABSwJMAZABHAHQAfoB/wEcAdAB+gH/ARwB0AH6
+ Af8BHAHQAfoB/wEpAaIBuwH6A0MBeAMSARkDEwEaA0QBegEoAaMBxQH7ARwB0AH6Af8BHAHQAfoB/wEc
+ AdAB+gH/ARwB0AH6Af8DSgGMAwoBDgMRARcDAAEBOAADUgGpAzQBVQM0AVUDAAEBAy0BRgMKAQ4EAAM5
+ AV8DXAHOAygBPAQAAzQBVQM0AVUDUgGpEwAB/wOCAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DXAHf
+ AxcBIAwAAxUBHQM9AWkDOgFiAVwCYAHUAR0B0QH6Af8BHQHRAfoB/wEdAdAB+gH/AR0BywHzAf8BHQHL
+ AfMB/wEdAdAB+gH/AR0B0QH6Af8BHQHRAfoB/wFaAWUBagHiAzoBYgM9AWkDFAEcA1EBogNWAbYDKgFA
+ BAADEAEVAxEBFwMRARcDEQEXAxEBFwMRARcDEQEXAxEBFwMRARcDEQEXAxABFggAA1IBqQM0AVUDNAFV
+ AzMBUwNSAaYDSgGMBwABAQNHAYMIAAM0AVUDNAFVA1IBqRMAAf8DmQH/A4UB/wMAAf8DAAH/AwAB/wMA
+ Af8DXAHfAxcBIBgAAwcBCgFKAYUBkAHyAR8B0gH7Af8BHwHSAfsB/wEfAdIB+wH/AR8B0gH7Af8BHwHS
+ AfsB/wEfAdIB+wH/AR8B0gH7Af8BHwHSAfsB/wErAacBxQH7AxEBFwsAAf8DAAH/A0MBdwMpAT4DAAH/
+ AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMyAVEEAANSAakDNAFVAzQBVQMR
+ ARcDUAGeAyQBNhQAAzQBVQM0AVUDUgGpEAADUAH7AwAB/wMAAf8DAAH/AwAB/wMAAf8DXAHfAxcBIBwA
+ ATACMQFNASAB0gH8Af8BIAHSAfwB/wFXAXcBfQHrAVoBXwFgAdkBIAHSAfwB/wEgAdIB/AH/AVsBZwFp
+ AeEBWgFmAWoB4gEgAdIB/AH/ASAB0gH8Af8DOAFeCAADVQG0A1kBxwMvAUkDAAEBAxsBJgMcAScDHAEn
+ AxwBJwMcAScDHAEnAxwBJwMcAScDHAEnAxwBJwMcAScDAgEDBAADUgGpAyIBMgNSAakDUgGpA1IBqQNS
+ AakDUgGpA1IBqQNSAakDUgGpA1IBqQNSAakDIgEyA1IBqRAAAyABLgMpAT8DKQE/AykBPwMpAT8DKQE/
+ AxEBFyAAAwUBBwNMAZIBVgJYAcEDFQEdAz0BaQEhAdMB/AH/ASEB0wH8Af8BRQJGAX8DEAEVA1YBswFL
+ AkwBjwMEAQZMAANQAaMDUgGpA1IBqQNSAakDUgGpA1IBqQNSAakDUgGpA1IBqQNSAakDUgGpA1IBqQNS
+ AakDUAGjXAADFQEdAUIBjQGfAfUBPgGeAa8B9wMgAS8YAAFCAU0BPgcAAT4DAAEoAwABQAMAASADAAEB
+ AQABAQYAAQEWAAP/gQAC/wGAAQEC/wH8AQECAAG/Af0B4AEHAcADAAGgAR0B4AEHAcABAAEQAQEBoQH9
+ AeABBwHAAQABHwH/Ab8B/QHgAQcEAAGAAQEB4AEHBAABjwHxAeABBwEDAQABHwH/AYABAQHgAQcBAwEA
+ AR8B/wGDAcEB4AEHAQMBwAIAAYABQQHgAQcBAwHAAgABiAERAeABBwIAAR8B/wGBAREB4AEHAgABEAEB
+ AYEBMQHgAQ8BwAEDAgABgQHxAeABHwHAAQMCAAGAAQEB4AE/AcABAwL/AYABAQL/AfwBPws=
</value>
</data>
- <metadata name="tsThumbnails.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
- <value>291, 17</value>
- </metadata>
- <metadata name="tsProperties.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
- <value>649, 17</value>
- </metadata>
- <metadata name="tsGCode.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
- <value>551, 17</value>
- </metadata>
- <metadata name="tsIssues.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
- <value>765, 17</value>
- </metadata>
- <metadata name="toolTipInformation.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
- <value>863, 17</value>
- </metadata>
<metadata name="toolTipInformation.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>863, 17</value>
</metadata>
diff --git a/PrusaSL1Viewer/ImageSharpExtensions.cs b/UVtools.GUI/ImageSharpExtensions.cs
index 6a67601..9c56f29 100644
--- a/PrusaSL1Viewer/ImageSharpExtensions.cs
+++ b/UVtools.GUI/ImageSharpExtensions.cs
@@ -8,11 +8,11 @@
using System.IO;
using Emgu.CV;
using Emgu.CV.Structure;
-using PrusaSL1Reader;
+using UVtools.Parser;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.PixelFormats;
-namespace PrusaSL1Viewer
+namespace UVtools.GUI
{
public static class ImageSharpExtensions
{
diff --git a/PrusaSL1Viewer/Images/Back-16x16.png b/UVtools.GUI/Images/Back-16x16.png
index c28c621..c28c621 100644
--- a/PrusaSL1Viewer/Images/Back-16x16.png
+++ b/UVtools.GUI/Images/Back-16x16.png
Binary files differ
diff --git a/PrusaSL1Viewer/Images/Button-Info-16x16.png b/UVtools.GUI/Images/Button-Info-16x16.png
index 6b0d295..6b0d295 100644
--- a/PrusaSL1Viewer/Images/Button-Info-16x16.png
+++ b/UVtools.GUI/Images/Button-Info-16x16.png
Binary files differ
diff --git a/PrusaSL1Viewer/Images/CNCMachine-16x16.png b/UVtools.GUI/Images/CNCMachine-16x16.png
index e2a5e4b..e2a5e4b 100644
--- a/PrusaSL1Viewer/Images/CNCMachine-16x16.png
+++ b/UVtools.GUI/Images/CNCMachine-16x16.png
Binary files differ
diff --git a/PrusaSL1Viewer/Images/Cancel-24x24.png b/UVtools.GUI/Images/Cancel-24x24.png
index 74e4559..74e4559 100644
--- a/PrusaSL1Viewer/Images/Cancel-24x24.png
+++ b/UVtools.GUI/Images/Cancel-24x24.png
Binary files differ
diff --git a/PrusaSL1Viewer/Images/Cancel-32x32.png b/UVtools.GUI/Images/Cancel-32x32.png
index a732caa..a732caa 100644
--- a/PrusaSL1Viewer/Images/Cancel-32x32.png
+++ b/UVtools.GUI/Images/Cancel-32x32.png
Binary files differ
diff --git a/PrusaSL1Viewer/Images/Convert-16x16.png b/UVtools.GUI/Images/Convert-16x16.png
index 76cf3c4..76cf3c4 100644
--- a/PrusaSL1Viewer/Images/Convert-16x16.png
+++ b/UVtools.GUI/Images/Convert-16x16.png
Binary files differ
diff --git a/PrusaSL1Viewer/Images/DataList-16x16.png b/UVtools.GUI/Images/DataList-16x16.png
index a4e784c..a4e784c 100644
--- a/PrusaSL1Viewer/Images/DataList-16x16.png
+++ b/UVtools.GUI/Images/DataList-16x16.png
Binary files differ
diff --git a/PrusaSL1Viewer/Images/Donate-16x16.png b/UVtools.GUI/Images/Donate-16x16.png
index 6ce3e86..6ce3e86 100644
--- a/PrusaSL1Viewer/Images/Donate-16x16.png
+++ b/UVtools.GUI/Images/Donate-16x16.png
Binary files differ
diff --git a/PrusaSL1Viewer/Images/Error-128x128.png b/UVtools.GUI/Images/Error-128x128.png
index d676c15..d676c15 100644
--- a/PrusaSL1Viewer/Images/Error-128x128.png
+++ b/UVtools.GUI/Images/Error-128x128.png
Binary files differ
diff --git a/PrusaSL1Viewer/Images/Exit-16x16.png b/UVtools.GUI/Images/Exit-16x16.png
index 863566c..863566c 100644
--- a/PrusaSL1Viewer/Images/Exit-16x16.png
+++ b/UVtools.GUI/Images/Exit-16x16.png
Binary files differ
diff --git a/PrusaSL1Viewer/Images/Extract-object-16x16.png b/UVtools.GUI/Images/Extract-object-16x16.png
index 9bdb1d2..9bdb1d2 100644
--- a/PrusaSL1Viewer/Images/Extract-object-16x16.png
+++ b/UVtools.GUI/Images/Extract-object-16x16.png
Binary files differ
diff --git a/PrusaSL1Viewer/Images/File-Close-16x16.png b/UVtools.GUI/Images/File-Close-16x16.png
index ef36711..ef36711 100644
--- a/PrusaSL1Viewer/Images/File-Close-16x16.png
+++ b/UVtools.GUI/Images/File-Close-16x16.png
Binary files differ
diff --git a/PrusaSL1Viewer/Images/File-Refresh-16x16.png b/UVtools.GUI/Images/File-Refresh-16x16.png
index 39d6920..39d6920 100644
--- a/PrusaSL1Viewer/Images/File-Refresh-16x16.png
+++ b/UVtools.GUI/Images/File-Refresh-16x16.png
Binary files differ
diff --git a/PrusaSL1Viewer/Images/GCode-16x16.png b/UVtools.GUI/Images/GCode-16x16.png
index 127cecc..127cecc 100644
--- a/PrusaSL1Viewer/Images/GCode-16x16.png
+++ b/UVtools.GUI/Images/GCode-16x16.png
Binary files differ
diff --git a/PrusaSL1Viewer/Images/Geometry-16x16.png b/UVtools.GUI/Images/Geometry-16x16.png
index da022c5..da022c5 100644
--- a/PrusaSL1Viewer/Images/Geometry-16x16.png
+++ b/UVtools.GUI/Images/Geometry-16x16.png
Binary files differ
diff --git a/PrusaSL1Viewer/Images/Global-Network-icon-16x16.png b/UVtools.GUI/Images/Global-Network-icon-16x16.png
index 0c4e3be..0c4e3be 100644
--- a/PrusaSL1Viewer/Images/Global-Network-icon-16x16.png
+++ b/UVtools.GUI/Images/Global-Network-icon-16x16.png
Binary files differ
diff --git a/PrusaSL1Viewer/Images/Next-16x16.png b/UVtools.GUI/Images/Next-16x16.png
index 9d8f5e4..9d8f5e4 100644
--- a/PrusaSL1Viewer/Images/Next-16x16.png
+++ b/UVtools.GUI/Images/Next-16x16.png
Binary files differ
diff --git a/PrusaSL1Viewer/Images/Ok-24x24.png b/UVtools.GUI/Images/Ok-24x24.png
index e4cc79d..e4cc79d 100644
--- a/PrusaSL1Viewer/Images/Ok-24x24.png
+++ b/UVtools.GUI/Images/Ok-24x24.png
Binary files differ
diff --git a/PrusaSL1Viewer/Images/Open-16x16.png b/UVtools.GUI/Images/Open-16x16.png
index 40fcd9a..40fcd9a 100644
--- a/PrusaSL1Viewer/Images/Open-16x16.png
+++ b/UVtools.GUI/Images/Open-16x16.png
Binary files differ
diff --git a/PrusaSL1Viewer/Images/PhotoInfo-16x16.png b/UVtools.GUI/Images/PhotoInfo-16x16.png
index f6a4c2f..f6a4c2f 100644
--- a/PrusaSL1Viewer/Images/PhotoInfo-16x16.png
+++ b/UVtools.GUI/Images/PhotoInfo-16x16.png
Binary files differ
diff --git a/PrusaSL1Viewer/Images/Rotate-16x16.png b/UVtools.GUI/Images/Rotate-16x16.png
index 55f04c6..55f04c6 100644
--- a/PrusaSL1Viewer/Images/Rotate-16x16.png
+++ b/UVtools.GUI/Images/Rotate-16x16.png
Binary files differ
diff --git a/PrusaSL1Viewer/Images/Save-16x16.png b/UVtools.GUI/Images/Save-16x16.png
index 38ce759..38ce759 100644
--- a/PrusaSL1Viewer/Images/Save-16x16.png
+++ b/UVtools.GUI/Images/Save-16x16.png
Binary files differ
diff --git a/PrusaSL1Viewer/Images/SaveAs-16x16.png b/UVtools.GUI/Images/SaveAs-16x16.png
index e22cce7..e22cce7 100644
--- a/PrusaSL1Viewer/Images/SaveAs-16x16.png
+++ b/UVtools.GUI/Images/SaveAs-16x16.png
Binary files differ
diff --git a/PrusaSL1Viewer/Images/Screenshots/SL1ToCbddlp.png b/UVtools.GUI/Images/Screenshots/SL1ToCbddlp.png
index 4da7c62..4da7c62 100644
--- a/PrusaSL1Viewer/Images/Screenshots/SL1ToCbddlp.png
+++ b/UVtools.GUI/Images/Screenshots/SL1ToCbddlp.png
Binary files differ
diff --git a/UVtools.GUI/Images/Screenshots/UVtools_GUI.png b/UVtools.GUI/Images/Screenshots/UVtools_GUI.png
new file mode 100644
index 0000000..39122a6
--- /dev/null
+++ b/UVtools.GUI/Images/Screenshots/UVtools_GUI.png
Binary files differ
diff --git a/PrusaSL1Viewer/Images/Screenshots/PrusaSL1Viewer_GUI_Islands.png b/UVtools.GUI/Images/Screenshots/UVtools_GUI_Islands.png
index 305a643..305a643 100644
--- a/PrusaSL1Viewer/Images/Screenshots/PrusaSL1Viewer_GUI_Islands.png
+++ b/UVtools.GUI/Images/Screenshots/UVtools_GUI_Islands.png
Binary files differ
diff --git a/PrusaSL1Viewer/Images/Wrench-16x16.png b/UVtools.GUI/Images/Wrench-16x16.png
index 2838a76..2838a76 100644
--- a/PrusaSL1Viewer/Images/Wrench-16x16.png
+++ b/UVtools.GUI/Images/Wrench-16x16.png
Binary files differ
diff --git a/PrusaSL1Viewer/Images/arrow-down-16x16.png b/UVtools.GUI/Images/arrow-down-16x16.png
index 9ce51bb..9ce51bb 100644
--- a/PrusaSL1Viewer/Images/arrow-down-16x16.png
+++ b/UVtools.GUI/Images/arrow-down-16x16.png
Binary files differ
diff --git a/PrusaSL1Viewer/Images/arrow-down-double-16x16.png b/UVtools.GUI/Images/arrow-down-double-16x16.png
index 7393d68..7393d68 100644
--- a/PrusaSL1Viewer/Images/arrow-down-double-16x16.png
+++ b/UVtools.GUI/Images/arrow-down-double-16x16.png
Binary files differ
diff --git a/PrusaSL1Viewer/Images/arrow-down.ico b/UVtools.GUI/Images/arrow-down.ico
index ff5240c..ff5240c 100644
--- a/PrusaSL1Viewer/Images/arrow-down.ico
+++ b/UVtools.GUI/Images/arrow-down.ico
Binary files differ
diff --git a/PrusaSL1Viewer/Images/arrow-end-16x16.png b/UVtools.GUI/Images/arrow-end-16x16.png
index ce9d9c7..ce9d9c7 100644
--- a/PrusaSL1Viewer/Images/arrow-end-16x16.png
+++ b/UVtools.GUI/Images/arrow-end-16x16.png
Binary files differ
diff --git a/PrusaSL1Viewer/Images/arrow-top-16x16.png b/UVtools.GUI/Images/arrow-top-16x16.png
index 8afa1a0..8afa1a0 100644
--- a/PrusaSL1Viewer/Images/arrow-top-16x16.png
+++ b/UVtools.GUI/Images/arrow-top-16x16.png
Binary files differ
diff --git a/PrusaSL1Viewer/Images/arrow-up-16x16.png b/UVtools.GUI/Images/arrow-up-16x16.png
index 585744a..585744a 100644
--- a/PrusaSL1Viewer/Images/arrow-up-16x16.png
+++ b/UVtools.GUI/Images/arrow-up-16x16.png
Binary files differ
diff --git a/PrusaSL1Viewer/Images/arrow-up.ico b/UVtools.GUI/Images/arrow-up.ico
index 19ee15f..19ee15f 100644
--- a/PrusaSL1Viewer/Images/arrow-up.ico
+++ b/UVtools.GUI/Images/arrow-up.ico
Binary files differ
diff --git a/PrusaSL1Viewer/Images/delete-16x16.png b/UVtools.GUI/Images/delete-16x16.png
index b5842b7..b5842b7 100644
--- a/PrusaSL1Viewer/Images/delete-16x16.png
+++ b/UVtools.GUI/Images/delete-16x16.png
Binary files differ
diff --git a/PrusaSL1Viewer/Images/eye-16x16.png b/UVtools.GUI/Images/eye-16x16.png
index 4f3c7e2..4f3c7e2 100644
--- a/PrusaSL1Viewer/Images/eye-16x16.png
+++ b/UVtools.GUI/Images/eye-16x16.png
Binary files differ
diff --git a/PrusaSL1Viewer/Images/eye-24x24.png b/UVtools.GUI/Images/eye-24x24.png
index 4f3c7e2..4f3c7e2 100644
--- a/PrusaSL1Viewer/Images/eye-24x24.png
+++ b/UVtools.GUI/Images/eye-24x24.png
Binary files differ
diff --git a/PrusaSL1Viewer/Images/filter-filled-16x16.png b/UVtools.GUI/Images/filter-filled-16x16.png
index b751a71..b751a71 100644
--- a/PrusaSL1Viewer/Images/filter-filled-16x16.png
+++ b/UVtools.GUI/Images/filter-filled-16x16.png
Binary files differ
diff --git a/PrusaSL1Viewer/Images/gui/mutation_blackhat.png b/UVtools.GUI/Images/gui/mutation_blackhat.png
index 80f1cd0..80f1cd0 100644
--- a/PrusaSL1Viewer/Images/gui/mutation_blackhat.png
+++ b/UVtools.GUI/Images/gui/mutation_blackhat.png
Binary files differ
diff --git a/PrusaSL1Viewer/Images/gui/mutation_closing.png b/UVtools.GUI/Images/gui/mutation_closing.png
index 79e02c6..79e02c6 100644
--- a/PrusaSL1Viewer/Images/gui/mutation_closing.png
+++ b/UVtools.GUI/Images/gui/mutation_closing.png
Binary files differ
diff --git a/PrusaSL1Viewer/Images/gui/mutation_dilation.png b/UVtools.GUI/Images/gui/mutation_dilation.png
index 92e1952..92e1952 100644
--- a/PrusaSL1Viewer/Images/gui/mutation_dilation.png
+++ b/UVtools.GUI/Images/gui/mutation_dilation.png
Binary files differ
diff --git a/PrusaSL1Viewer/Images/gui/mutation_erosion.png b/UVtools.GUI/Images/gui/mutation_erosion.png
index 8f2422c..8f2422c 100644
--- a/PrusaSL1Viewer/Images/gui/mutation_erosion.png
+++ b/UVtools.GUI/Images/gui/mutation_erosion.png
Binary files differ
diff --git a/PrusaSL1Viewer/Images/gui/mutation_gradient.png b/UVtools.GUI/Images/gui/mutation_gradient.png
index 7b60d70..7b60d70 100644
--- a/PrusaSL1Viewer/Images/gui/mutation_gradient.png
+++ b/UVtools.GUI/Images/gui/mutation_gradient.png
Binary files differ
diff --git a/PrusaSL1Viewer/Images/gui/mutation_opening.png b/UVtools.GUI/Images/gui/mutation_opening.png
index 6ddb9f5..6ddb9f5 100644
--- a/PrusaSL1Viewer/Images/gui/mutation_opening.png
+++ b/UVtools.GUI/Images/gui/mutation_opening.png
Binary files differ
diff --git a/UVtools.GUI/Images/gui/mutation_solidify.png b/UVtools.GUI/Images/gui/mutation_solidify.png
new file mode 100644
index 0000000..c584ca2
--- /dev/null
+++ b/UVtools.GUI/Images/gui/mutation_solidify.png
Binary files differ
diff --git a/PrusaSL1Viewer/Images/gui/mutation_tophat.png b/UVtools.GUI/Images/gui/mutation_tophat.png
index 60c1c84..60c1c84 100644
--- a/PrusaSL1Viewer/Images/gui/mutation_tophat.png
+++ b/UVtools.GUI/Images/gui/mutation_tophat.png
Binary files differ
diff --git a/PrusaSL1Viewer/Images/island-16x16.png b/UVtools.GUI/Images/island-16x16.png
index d9b45d6..d9b45d6 100644
--- a/PrusaSL1Viewer/Images/island-16x16.png
+++ b/UVtools.GUI/Images/island-16x16.png
Binary files differ
diff --git a/PrusaSL1Viewer/Images/layers-16x16.png b/UVtools.GUI/Images/layers-16x16.png
index b8f66f5..b8f66f5 100644
--- a/PrusaSL1Viewer/Images/layers-16x16.png
+++ b/UVtools.GUI/Images/layers-16x16.png
Binary files differ
diff --git a/PrusaSL1Viewer/Images/pixel-16x16.png b/UVtools.GUI/Images/pixel-16x16.png
index d7c46a7..d7c46a7 100644
--- a/PrusaSL1Viewer/Images/pixel-16x16.png
+++ b/UVtools.GUI/Images/pixel-16x16.png
Binary files differ
diff --git a/PrusaSL1Viewer/Images/plus.ico b/UVtools.GUI/Images/plus.ico
index 2bfd834..2bfd834 100644
--- a/PrusaSL1Viewer/Images/plus.ico
+++ b/UVtools.GUI/Images/plus.ico
Binary files differ
diff --git a/PrusaSL1Viewer/Images/pointer-16x16.png b/UVtools.GUI/Images/pointer-16x16.png
index 5fbfcdf..5fbfcdf 100644
--- a/PrusaSL1Viewer/Images/pointer-16x16.png
+++ b/UVtools.GUI/Images/pointer-16x16.png
Binary files differ
diff --git a/PrusaSL1Viewer/Images/refresh-16x16.png b/UVtools.GUI/Images/refresh-16x16.png
index 3ea0349..3ea0349 100644
--- a/PrusaSL1Viewer/Images/refresh-16x16.png
+++ b/UVtools.GUI/Images/refresh-16x16.png
Binary files differ
diff --git a/PrusaSL1Viewer/Images/search-16x16.png b/UVtools.GUI/Images/search-16x16.png
index ea9d8e2..ea9d8e2 100644
--- a/PrusaSL1Viewer/Images/search-16x16.png
+++ b/UVtools.GUI/Images/search-16x16.png
Binary files differ
diff --git a/PrusaSL1Viewer/Images/warning-16x16.png b/UVtools.GUI/Images/warning-16x16.png
index d29b583..d29b583 100644
--- a/PrusaSL1Viewer/Images/warning-16x16.png
+++ b/UVtools.GUI/Images/warning-16x16.png
Binary files differ
diff --git a/PrusaSL1Viewer/Libraries/ApplicationManagement.dll b/UVtools.GUI/Libraries/ApplicationManagement.dll
index 3e7d793..3e7d793 100644
--- a/PrusaSL1Viewer/Libraries/ApplicationManagement.dll
+++ b/UVtools.GUI/Libraries/ApplicationManagement.dll
Binary files differ
diff --git a/PrusaSL1Viewer/Mutation.cs b/UVtools.GUI/Mutation.cs
index 6828469..0ae56d7 100644
--- a/PrusaSL1Viewer/Mutation.cs
+++ b/UVtools.GUI/Mutation.cs
@@ -8,7 +8,7 @@
using System.Drawing;
-namespace PrusaSL1Viewer
+namespace UVtools.GUI
{
public class Mutation
{
@@ -16,6 +16,7 @@ namespace PrusaSL1Viewer
public enum Mutates : byte
{
Resize,
+ Solidify,
//LayerSmash,
Erode,
Dilate,
@@ -27,7 +28,8 @@ namespace PrusaSL1Viewer
HitMiss,
PyrDownUp,
SmoothMedian,
- SmoothGaussian
+ SmoothGaussian,
+
}
#endregion
diff --git a/PrusaSL1Viewer/Program.cs b/UVtools.GUI/Program.cs
index c6a8ad8..366e4be 100644
--- a/PrusaSL1Viewer/Program.cs
+++ b/UVtools.GUI/Program.cs
@@ -13,10 +13,10 @@ using System.Threading;
using System.Windows.Forms;
using ApplicationManagement;
using Emgu.CV;
-using PrusaSL1Reader;
-using PrusaSL1Viewer.Forms;
+using UVtools.Parser;
+using UVtools.GUI.Forms;
-namespace PrusaSL1Viewer
+namespace UVtools.GUI
{
static class Program
{
diff --git a/PrusaSL1Viewer/Properties/AssemblyInfo.cs b/UVtools.GUI/Properties/AssemblyInfo.cs
index 18c0823..3b5069b 100644
--- a/PrusaSL1Viewer/Properties/AssemblyInfo.cs
+++ b/UVtools.GUI/Properties/AssemblyInfo.cs
@@ -5,11 +5,11 @@ using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
-[assembly: AssemblyTitle("PrusaSL1Viewer")]
-[assembly: AssemblyDescription("Open, view, edit, extract, convert, mutate and island checker for DLP files generated from Slicers.")]
+[assembly: AssemblyTitle("UVtools")]
+[assembly: AssemblyDescription("MSLA/DLP, file analysis, repair, conversion and manipulation")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("PTRTECH")]
-[assembly: AssemblyProduct("PrusaSL1Viewer")]
+[assembly: AssemblyProduct("UVtools")]
[assembly: AssemblyCopyright("Copyright © 2020 PTRTECH")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
@@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("0.5.0.0")]
-[assembly: AssemblyFileVersion("0.5.0.0")]
+[assembly: AssemblyVersion("0.5.1.0")]
+[assembly: AssemblyFileVersion("0.5.1.0")]
diff --git a/PrusaSL1Viewer/Properties/Resources.Designer.cs b/UVtools.GUI/Properties/Resources.Designer.cs
index 6fd118f..c9e5647 100644
--- a/PrusaSL1Viewer/Properties/Resources.Designer.cs
+++ b/UVtools.GUI/Properties/Resources.Designer.cs
@@ -8,7 +8,7 @@
// </auto-generated>
//------------------------------------------------------------------------------
-namespace PrusaSL1Viewer.Properties {
+namespace UVtools.GUI.Properties {
using System;
@@ -39,7 +39,7 @@ namespace PrusaSL1Viewer.Properties {
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
- global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("PrusaSL1Viewer.Properties.Resources", typeof(Resources).Assembly);
+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("UVtools.GUI.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
@@ -393,6 +393,16 @@ namespace PrusaSL1Viewer.Properties {
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
+ internal static System.Drawing.Bitmap mutation_solidify {
+ get {
+ object obj = ResourceManager.GetObject("mutation_solidify", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ /// <summary>
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ /// </summary>
internal static System.Drawing.Bitmap mutation_tophat {
get {
object obj = ResourceManager.GetObject("mutation_tophat", resourceCulture);
@@ -463,16 +473,6 @@ namespace PrusaSL1Viewer.Properties {
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
- internal static System.Drawing.Bitmap PrusaSL1Viewer {
- get {
- object obj = ResourceManager.GetObject("PrusaSL1Viewer", resourceCulture);
- return ((System.Drawing.Bitmap)(obj));
- }
- }
-
- /// <summary>
- /// Looks up a localized resource of type System.Drawing.Bitmap.
- /// </summary>
internal static System.Drawing.Bitmap refresh_16x16 {
get {
object obj = ResourceManager.GetObject("refresh-16x16", resourceCulture);
@@ -523,6 +523,16 @@ namespace PrusaSL1Viewer.Properties {
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
+ internal static System.Drawing.Bitmap UVtools {
+ get {
+ object obj = ResourceManager.GetObject("UVtools", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ /// <summary>
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ /// </summary>
internal static System.Drawing.Bitmap warning_16x16 {
get {
object obj = ResourceManager.GetObject("warning-16x16", resourceCulture);
diff --git a/PrusaSL1Viewer/Properties/Resources.resx b/UVtools.GUI/Properties/Resources.resx
index e198f5b..c23e8cb 100644
--- a/PrusaSL1Viewer/Properties/Resources.resx
+++ b/UVtools.GUI/Properties/Resources.resx
@@ -118,15 +118,18 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+ <data name="CNCMachine-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Images\CNCMachine-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ </data>
<data name="Error-128x128" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Images\Error-128x128.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
- <data name="Cancel-24x24" type="System.Resources.ResXFileRef, System.Windows.Forms">
- <value>..\Images\Cancel-24x24.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
- </data>
<data name="layers-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Images\layers-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
+ <data name="mutation_closing" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Images\gui\mutation_closing.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ </data>
<data name="eye-24x24" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Images\eye-24x24.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
@@ -157,14 +160,17 @@
<data name="arrow-up-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Images\arrow-up-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
+ <data name="warning-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Images\warning-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ </data>
<data name="Wrench-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Images\Wrench-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="arrow-down-double-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Images\arrow-down-double-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
- <data name="PrusaSL1Viewer" type="System.Resources.ResXFileRef, System.Windows.Forms">
- <value>..\PrusaSL1Viewer.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ <data name="UVtools" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\UVtools.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="arrow-up" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Images\arrow-up.ico;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
@@ -175,9 +181,6 @@
<data name="Button-Info-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Images\Button-Info-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
- <data name="arrow-down-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
- <value>..\Images\arrow-down-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
- </data>
<data name="Geometry-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Images\Geometry-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
@@ -193,9 +196,6 @@
<data name="Open-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Images\Open-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
- <data name="pointer-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
- <value>..\Images\pointer-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
- </data>
<data name="File-Close-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Images\File-Close-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
@@ -235,20 +235,23 @@
<data name="SaveAs-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Images\SaveAs-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
- <data name="CNCMachine-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
- <value>..\Images\CNCMachine-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
- </data>
<data name="delete-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Images\delete-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
+ <data name="arrow-down-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Images\arrow-down-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ </data>
+ <data name="pointer-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Images\pointer-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ </data>
<data name="mutation_opening" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Images\gui\mutation_opening.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="mutation_blackhat" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Images\gui\mutation_blackhat.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
- <data name="mutation_closing" type="System.Resources.ResXFileRef, System.Windows.Forms">
- <value>..\Images\gui\mutation_closing.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ <data name="Cancel-24x24" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Images\Cancel-24x24.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="arrow-down" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Images\arrow-down.ico;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
@@ -259,7 +262,7 @@
<data name="island-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Images\island-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
- <data name="warning-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
- <value>..\Images\warning-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ <data name="mutation_solidify" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Images\gui\mutation_solidify.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
</root> \ No newline at end of file
diff --git a/PrusaSL1Viewer/Properties/Settings.Designer.cs b/UVtools.GUI/Properties/Settings.Designer.cs
index 40053e5..c398559 100644
--- a/PrusaSL1Viewer/Properties/Settings.Designer.cs
+++ b/UVtools.GUI/Properties/Settings.Designer.cs
@@ -8,11 +8,11 @@
// </auto-generated>
//------------------------------------------------------------------------------
-namespace PrusaSL1Viewer.Properties {
+namespace UVtools.GUI.Properties {
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
- [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.5.0.0")]
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.6.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
diff --git a/PrusaSL1Viewer/Properties/Settings.settings b/UVtools.GUI/Properties/Settings.settings
index 3964565..3964565 100644
--- a/PrusaSL1Viewer/Properties/Settings.settings
+++ b/UVtools.GUI/Properties/Settings.settings
diff --git a/PrusaSL1Viewer/PrusaSL1Viewer.csproj b/UVtools.GUI/UVtools.GUI.csproj
index 48c2a3f..6f67f72 100644
--- a/PrusaSL1Viewer/PrusaSL1Viewer.csproj
+++ b/UVtools.GUI/UVtools.GUI.csproj
@@ -7,8 +7,8 @@
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{E7389EE3-CF56-464B-9BA1-816B31D1E6FF}</ProjectGuid>
<OutputType>WinExe</OutputType>
- <RootNamespace>PrusaSL1Viewer</RootNamespace>
- <AssemblyName>PrusaSL1Viewer</AssemblyName>
+ <RootNamespace>UVtools.GUI</RootNamespace>
+ <AssemblyName>UVtools</AssemblyName>
<TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
@@ -54,7 +54,10 @@
<Prefer32Bit>false</Prefer32Bit>
</PropertyGroup>
<PropertyGroup>
- <ApplicationIcon>PrusaSL1Viewer.ico</ApplicationIcon>
+ <ApplicationIcon>UVtools.ico</ApplicationIcon>
+ </PropertyGroup>
+ <PropertyGroup>
+ <StartupObject>UVtools.GUI.Program</StartupObject>
</PropertyGroup>
<ItemGroup>
<Reference Include="ApplicationManagement">
@@ -251,14 +254,15 @@
<None Include="App.config" />
</ItemGroup>
<ItemGroup>
- <ProjectReference Include="..\PrusaSL1Reader\PrusaSL1Reader.csproj">
+ <ProjectReference Include="..\UVtools.Parser\UVtools.Parser.csproj">
<Project>{53b884ca-e640-4171-8aa2-03935ac076d2}</Project>
- <Name>PrusaSL1Reader</Name>
+ <Name>UVtools.Parser</Name>
<EmbedInteropTypes>False</EmbedInteropTypes>
</ProjectReference>
</ItemGroup>
<ItemGroup>
- <None Include="PrusaSL1Viewer.png" />
+ <Content Include="UVtools.ico" />
+ <None Include="UVtools.png" />
<None Include="Images\Exit-16x16.png" />
<None Include="Images\Open-16x16.png" />
<None Include="Images\Extract-object-16x16.png" />
@@ -306,7 +310,7 @@
<None Include="Images\arrow-end-16x16.png" />
<None Include="Images\arrow-top-16x16.png" />
<None Include="Images\warning-16x16.png" />
- <Content Include="PrusaSL1Viewer.ico" />
+ <None Include="Images\gui\mutation_solidify.png" />
</ItemGroup>
<ItemGroup>
<BootstrapperPackage Include=".NETFramework,Version=v4.8">
diff --git a/PrusaSL1Viewer/PrusaSL1Viewer.fw.png b/UVtools.GUI/UVtools.fw.png
index 54bce6f..54bce6f 100644
--- a/PrusaSL1Viewer/PrusaSL1Viewer.fw.png
+++ b/UVtools.GUI/UVtools.fw.png
Binary files differ
diff --git a/PrusaSL1Viewer/PrusaSL1Viewer.ico b/UVtools.GUI/UVtools.ico
index 2a642ec..2a642ec 100644
--- a/PrusaSL1Viewer/PrusaSL1Viewer.ico
+++ b/UVtools.GUI/UVtools.ico
Binary files differ
diff --git a/PrusaSL1Viewer/PrusaSL1Viewer.png b/UVtools.GUI/UVtools.png
index 0fd6e6b..0fd6e6b 100644
--- a/PrusaSL1Viewer/PrusaSL1Viewer.png
+++ b/UVtools.GUI/UVtools.png
Binary files differ
diff --git a/PrusaSL1Viewer/packages.config b/UVtools.GUI/packages.config
index dbfcb79..dbfcb79 100644
--- a/PrusaSL1Viewer/packages.config
+++ b/UVtools.GUI/packages.config
diff --git a/PrusaSL1Reader/About.cs b/UVtools.Parser/About.cs
index ad6592d..ee7fa78 100644
--- a/PrusaSL1Reader/About.cs
+++ b/UVtools.Parser/About.cs
@@ -6,14 +6,14 @@
* of this license document, but changing it is not allowed.
*/
-namespace PrusaSL1Reader
+namespace UVtools.Parser
{
public static class About
{
- public static string Software = "PrusaSL1Viewer";
+ public static string Software = "UVtools";
public static string Author = "Tiago Conceição";
public static string Company = "PTRTECH";
- public static string Website = "https://github.com/sn4k3/PrusaSL1Viewer";
+ public static string Website = "https://github.com/sn4k3/UVtools";
public static string Donate = "https://paypal.me/SkillTournament";
}
}
diff --git a/PrusaSL1Reader/CWSFile.cs b/UVtools.Parser/CWSFile.cs
index 912965a..52939a4 100644
--- a/PrusaSL1Reader/CWSFile.cs
+++ b/UVtools.Parser/CWSFile.cs
@@ -5,6 +5,7 @@
* Everyone is permitted to copy and distribute verbatim copies
* of this license document, but changing it is not allowed.
*/
+
using System;
using System.ComponentModel;
using System.IO;
@@ -12,25 +13,25 @@ using System.IO.Compression;
using System.Linq;
using System.Reflection;
using System.Text;
-using PrusaSL1Reader.Extensions;
+using UVtools.Parser.Extensions;
-namespace PrusaSL1Reader
+namespace UVtools.Parser
{
public class CWSFile : FileFormat
{
#region Constants
- public const string GCodeStart = "G28{0}" +
+ public const string GCodeStart = "G28{0} ; Auto Home" +
"G21 ;Set units to be mm{0}" +
- "G91; Relative Positioning{0}" +
+ "G91 ;Relative Positioning{0}" +
"M17 ;Enable motors{0}" +
"<Slice> Blank{0}" +
"M106 S0{0}{0}";
- public const string GCodeEnd = "{0}M18 ;Disable Motors{0}" +
- "M106 SO{0}" +
- "G1 Z{1}{0}" +
- ";<Completed>{0}";
+ public const string GCodeEnd = "M106 S0{0}" +
+ "G1 Z{1}{0}" +
+ "{0}M18 ;Disable Motors{0}" +
+ ";<Completed>{0}";
public const string GCodeKeywordSlice = ";<Slice>";
public const string GCodeKeywordSliceBlank = ";<Slice> Blank";
diff --git a/PrusaSL1Reader/ChituboxFile.cs b/UVtools.Parser/ChituboxFile.cs
index d11e32c..f640d99 100644
--- a/PrusaSL1Reader/ChituboxFile.cs
+++ b/UVtools.Parser/ChituboxFile.cs
@@ -7,20 +7,19 @@
*/
// https://github.com/cbiffle/catibo/blob/master/doc/cbddlp-ctb.adoc
+
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
-using System.Runtime.CompilerServices;
-using System.Security.Cryptography.X509Certificates;
using System.Threading.Tasks;
using BinarySerialization;
-using PrusaSL1Reader.Extensions;
+using UVtools.Parser.Extensions;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.PixelFormats;
-namespace PrusaSL1Reader
+namespace UVtools.Parser
{
public class ChituboxFile : FileFormat
{
diff --git a/UVtools.Parser/ChituboxZipFile.cs b/UVtools.Parser/ChituboxZipFile.cs
new file mode 100644
index 0000000..2430b8c
--- /dev/null
+++ b/UVtools.Parser/ChituboxZipFile.cs
@@ -0,0 +1,435 @@
+/*
+ * GNU AFFERO GENERAL PUBLIC LICENSE
+ * Version 3, 19 November 2007
+ * Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
+ * Everyone is permitted to copy and distribute verbatim copies
+ * of this license document, but changing it is not allowed.
+ */
+
+using System;
+using System.ComponentModel;
+using System.IO;
+using System.IO.Compression;
+using System.Linq;
+using System.Reflection;
+using System.Text;
+using SixLabors.ImageSharp;
+using UVtools.Parser.Extensions;
+using Size = System.Drawing.Size;
+
+namespace UVtools.Parser
+{
+ public class ChituboxZipFile : FileFormat
+ {
+ #region Constants
+
+ public const string GCodeStart = ";START_GCODE_BEGIN{0}" +
+ "G21 ;Set units to be mm{0}" +
+ "G90 ;Absolute Positioning{0}" +
+ "M17 ;Enable motors{0}" +
+ "G28 Z0 ;Home Z{0}" +
+ //"G91 ;Relative Positioning{0}" +
+ "M106 S0 ;Light off{0}" +
+ ";START_GCODE_END{0}{0}";
+
+ public const string GCodeEnd = ";END_GCODE_BEGIN{0}" +
+ "M106 S0 ;Light off{0}" +
+ "G1 Z{1} F25 ;Raize Z{0}" +
+ "M18 ;Disable Motors{0}" +
+ ";END_GCODE_END{0}";
+
+ #endregion
+
+ #region Sub Classes
+
+ public class Header
+ {
+ // ;(****Build and Slicing Parameters****)
+ [DisplayName("fileName")] public string Filename { get; set; } = string.Empty;
+ [DisplayName("machineType")] public string MachineType { get; set; } = "Default";
+ [DisplayName("estimatedPrintTime")] public float EstimatedPrintTime { get; set; }
+ [DisplayName("volume")] public float Volume { get; set; }
+ [DisplayName("resin")] public string Resin { get; set; } = "Normal";
+ [DisplayName("weight")] public float Weight { get; set; }
+ [DisplayName("price")] public float Price { get; set; }
+ [DisplayName("layerHeight")] public float LayerHeight { get; set; }
+ [DisplayName("resolutionX")] public uint ResolutionX { get; set; }
+ [DisplayName("resolutionY")] public uint ResolutionY { get; set; }
+ [DisplayName("machineX")] public float MachineX { get; set; }
+ [DisplayName("machineY")] public float MachineY { get; set; }
+ [DisplayName("machineZ")] public float MachineZ { get; set; }
+ [DisplayName("projectType")] public string ProjectType { get; set; } = "Normal";
+ [DisplayName("normalExposureTime")] public float LayerExposureTime { get; set; } = 7; // 35s
+ [DisplayName("bottomLayExposureTime")] public float BottomLayExposureTime { get; set; } = 35; // 35s
+ [DisplayName("bottomLayerExposureTime")] public float BottomLayerExposureTime { get; set; } = 35; // 35s
+ [DisplayName("normalDropSpeed")] public float RetractSpeed { get; set; } = 150; // 150 mm/m
+ [DisplayName("normalLayerLiftSpeed")] public float LayerLiftSpeed { get; set; } = 60; // 60 mm/m
+ [DisplayName("normalLayerLiftHeight")] public float LayerLiftHeight { get; set; } = 5; // 5 mm
+ [DisplayName("zSlowUpDistance")] public float ZSlowUpDistance { get; set; }
+ [DisplayName("bottomLayCount")] public ushort BottomLayCount { get; set; } = 4;
+ [DisplayName("bottomLayerCount")] public ushort BottomLayerCount { get; set; } = 4;
+ [DisplayName("mirror")] public byte Mirror { get; set; } // 0/1
+ [DisplayName("totalLayer")] public uint LayerCount { get; set; }
+ [DisplayName("bottomLayerLiftHeight")] public float BottomLayerLiftHeight { get; set; } = 5;
+ [DisplayName("bottomLayerLiftSpeed")] public float BottomLayerLiftSpeed { get; set; } = 60;
+ [DisplayName("bottomLightOffTime")] public float BottomLightOffTime { get; set; }
+ [DisplayName("lightOffTime")] public float LayerLightOffTime { get; set; }
+ [DisplayName("bottomPWMLight")] public byte BottomLightPWM { get; set; } = 255;
+ [DisplayName("PWMLight")] public byte LayerLightPWM { get; set; } = 255;
+ [DisplayName("antiAliasLevel")] public byte AntiAliasing { get; set; } = 1;
+ }
+
+ #endregion
+
+ #region Properties
+ public Header HeaderSettings { get; } = new Header();
+
+ public override FileFormatType FileType => FileFormatType.Archive;
+
+ public override FileExtension[] FileExtensions { get; } = {
+ new FileExtension("zip", "Chitubox Zip Files")
+ };
+
+ public override Type[] ConvertToFormats { get; } = null;
+
+ public override PrintParameterModifier[] PrintParameterModifiers { get; } = {
+ PrintParameterModifier.InitialLayerCount,
+ PrintParameterModifier.InitialExposureSeconds,
+ PrintParameterModifier.ExposureSeconds,
+
+ PrintParameterModifier.BottomLayerOffTime,
+ PrintParameterModifier.LayerOffTime,
+ PrintParameterModifier.BottomLiftHeight,
+ PrintParameterModifier.BottomLiftSpeed,
+ PrintParameterModifier.LiftHeight,
+ PrintParameterModifier.LiftSpeed,
+ PrintParameterModifier.RetractSpeed,
+
+ PrintParameterModifier.BottomLightPWM,
+ PrintParameterModifier.LightPWM,
+ };
+
+ public override byte ThumbnailsCount { get; } = 2;
+
+ public override Size[] ThumbnailsOriginalSize { get; } = {new Size(954, 850), new Size(168, 150)};
+
+ public override uint ResolutionX => HeaderSettings.ResolutionX;
+
+ public override uint ResolutionY => HeaderSettings.ResolutionY;
+ public override byte AntiAliasing => HeaderSettings.AntiAliasing;
+
+ public override float LayerHeight => HeaderSettings.LayerHeight;
+
+ public override ushort InitialLayerCount => HeaderSettings.BottomLayerCount;
+
+ public override float InitialExposureTime => HeaderSettings.BottomLayerExposureTime;
+
+ public override float LayerExposureTime => HeaderSettings.LayerExposureTime;
+
+ public override float LiftHeight => HeaderSettings.LayerLiftHeight;
+
+ public override float LiftSpeed => HeaderSettings.LayerLiftSpeed;
+
+ public override float RetractSpeed => HeaderSettings.RetractSpeed;
+
+ public override float PrintTime => HeaderSettings.EstimatedPrintTime;
+
+ public override float UsedMaterial => HeaderSettings.Weight;
+
+ public override float MaterialCost => HeaderSettings.Price;
+
+ public override string MaterialName => HeaderSettings.Resin;
+
+ public override string MachineName => HeaderSettings.MachineType;
+
+ public override object[] Configs => new object[] { HeaderSettings };
+ #endregion
+
+ #region Methods
+
+ public override void Clear()
+ {
+ base.Clear();
+ GCode = null;
+ }
+
+ public override void Encode(string fileFullPath)
+ {
+ base.Encode(fileFullPath);
+ using (ZipArchive outputFile = ZipFile.Open(fileFullPath, ZipArchiveMode.Update))
+ {
+ for(uint layerIndex = 0; layerIndex < LayerCount; layerIndex++)
+ {
+ Layer layer = this[layerIndex];
+ outputFile.PutFileContent($"{layerIndex+1}.png", layer.RawData);
+ }
+
+ if (Thumbnails.Length > 0 && !ReferenceEquals(Thumbnails[0], null))
+ {
+ using (Stream stream = outputFile.CreateEntry("preview.png").Open())
+ {
+ Thumbnails[0].Save(stream, Helpers.PngEncoder);
+ stream.Close();
+ }
+ }
+
+ if (Thumbnails.Length > 1 && !ReferenceEquals(Thumbnails[1], null))
+ {
+ using (Stream stream = outputFile.CreateEntry("preview_cropping.png").Open())
+ {
+ Thumbnails[1].Save(stream, Helpers.PngEncoder);
+ stream.Close();
+ }
+ }
+
+ UpdateGCode();
+ outputFile.PutFileContent("run.gcode", GCode.ToString());
+ }
+ }
+
+ public override void Decode(string fileFullPath)
+ {
+ base.Decode(fileFullPath);
+
+ FileFullPath = fileFullPath;
+ using (var inputFile = ZipFile.Open(FileFullPath, ZipArchiveMode.Read))
+ {
+ var entry = inputFile.GetEntry("run.gcode");
+ if (ReferenceEquals(entry, null))
+ {
+ Clear();
+ throw new FileLoadException("run.gcode not found", fileFullPath);
+ }
+
+ using (TextReader tr = new StreamReader(entry.Open()))
+ {
+ string line;
+ GCode = new StringBuilder();
+ while ((line = tr.ReadLine()) != null)
+ {
+ GCode.AppendLine(line);
+ if (string.IsNullOrEmpty(line)) continue;
+
+ if (line[0] != ';')
+ {
+ continue;
+ }
+
+ var splitLine = line.Split(':');
+ if (splitLine.Length < 2) continue;
+
+ foreach (var propertyInfo in HeaderSettings.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance))
+ {
+ var displayNameAttribute = propertyInfo.GetCustomAttributes(false).OfType<DisplayNameAttribute>().FirstOrDefault();
+ if (ReferenceEquals(displayNameAttribute, null)) continue;
+ if (!splitLine[0].Trim(' ', ';').Equals(displayNameAttribute.DisplayName)) continue;
+ Helpers.SetPropertyValue(propertyInfo, HeaderSettings, splitLine[1].Trim());
+ }
+ }
+ tr.Close();
+ }
+
+
+ LayerManager = new LayerManager(HeaderSettings.LayerCount);
+
+ for (uint layerIndex = 0; layerIndex < HeaderSettings.LayerCount; layerIndex++)
+ {
+ entry = inputFile.GetEntry($"{layerIndex+1}.png");
+ if (ReferenceEquals(entry, null))
+ {
+ Clear();
+ throw new FileLoadException($"Layer {layerIndex+1} not found", fileFullPath);
+ }
+
+ LayerManager[layerIndex] = new Layer(layerIndex, entry.Open(), entry.Name);
+ }
+
+ entry = inputFile.GetEntry("preview.png");
+ if (!ReferenceEquals(entry, null))
+ {
+ Thumbnails[0] = Image.Load(entry.Open().ToArray());
+ }
+
+ entry = inputFile.GetEntry("preview_cropping.png");
+ if (!ReferenceEquals(entry, null))
+ {
+ Thumbnails[CreatedThumbnailsCount] = Image.Load(entry.Open().ToArray());
+ }
+ }
+ }
+
+ public override object GetValueFromPrintParameterModifier(PrintParameterModifier modifier)
+ {
+ var baseValue = base.GetValueFromPrintParameterModifier(modifier);
+ if (!ReferenceEquals(baseValue, null)) return baseValue;
+ if (ReferenceEquals(modifier, PrintParameterModifier.BottomLayerOffTime)) return HeaderSettings.BottomLightOffTime;
+ if (ReferenceEquals(modifier, PrintParameterModifier.LayerOffTime)) return HeaderSettings.LayerLightOffTime;
+ if (ReferenceEquals(modifier, PrintParameterModifier.BottomLiftHeight)) return HeaderSettings.BottomLayerLiftHeight;
+ if (ReferenceEquals(modifier, PrintParameterModifier.BottomLiftSpeed)) return HeaderSettings.BottomLayerLiftSpeed;
+ /*if (ReferenceEquals(modifier, PrintParameterModifier.LiftHeight)) return PrintParametersSettings.LiftHeight;
+ if (ReferenceEquals(modifier, PrintParameterModifier.LiftSpeed)) return PrintParametersSettings.LiftingSpeed;
+ if (ReferenceEquals(modifier, PrintParameterModifier.RetractSpeed)) return PrintParametersSettings.RetractSpeed;*/
+
+ if (ReferenceEquals(modifier, PrintParameterModifier.BottomLightPWM)) return HeaderSettings.BottomLightPWM;
+ if (ReferenceEquals(modifier, PrintParameterModifier.LightPWM)) return HeaderSettings.LayerLightPWM;
+
+
+
+ return null;
+ }
+
+ public override bool SetValueFromPrintParameterModifier(PrintParameterModifier modifier, string value)
+ {
+ if (ReferenceEquals(modifier, PrintParameterModifier.InitialLayerCount))
+ {
+ HeaderSettings.BottomLayerCount =
+ HeaderSettings.BottomLayCount = value.Convert<ushort>();
+ UpdateGCode();
+ return true;
+ }
+ if (ReferenceEquals(modifier, PrintParameterModifier.InitialExposureSeconds))
+ {
+ HeaderSettings.BottomLayerExposureTime = value.Convert<float>();
+ UpdateGCode();
+ return true;
+ }
+
+ if (ReferenceEquals(modifier, PrintParameterModifier.ExposureSeconds))
+ {
+ HeaderSettings.LayerExposureTime = value.Convert<float>();
+ UpdateGCode();
+ return true;
+ }
+
+ if (ReferenceEquals(modifier, PrintParameterModifier.BottomLayerOffTime))
+ {
+ HeaderSettings.BottomLightOffTime = value.Convert<float>();
+ UpdateGCode();
+ return true;
+ }
+ if (ReferenceEquals(modifier, PrintParameterModifier.LayerOffTime))
+ {
+ HeaderSettings.LayerLightOffTime = value.Convert<float>();
+ UpdateGCode();
+ return true;
+ }
+ if (ReferenceEquals(modifier, PrintParameterModifier.BottomLiftHeight))
+ {
+ HeaderSettings.BottomLayerLiftHeight = value.Convert<float>();
+ UpdateGCode();
+ return true;
+ }
+ if (ReferenceEquals(modifier, PrintParameterModifier.BottomLiftSpeed))
+ {
+ HeaderSettings.LayerLiftSpeed = value.Convert<float>();
+ UpdateGCode();
+ return true;
+ }
+ if (ReferenceEquals(modifier, PrintParameterModifier.LiftHeight))
+ {
+ HeaderSettings.LayerLiftHeight = value.Convert<float>();
+ UpdateGCode();
+ return true;
+ }
+ if (ReferenceEquals(modifier, PrintParameterModifier.LiftSpeed))
+ {
+ HeaderSettings.LayerLiftSpeed = value.Convert<float>();
+ UpdateGCode();
+ return true;
+ }
+ if (ReferenceEquals(modifier, PrintParameterModifier.RetractSpeed))
+ {
+ HeaderSettings.RetractSpeed = value.Convert<float>();
+ UpdateGCode();
+ return true;
+ }
+
+ if (ReferenceEquals(modifier, PrintParameterModifier.BottomLightPWM))
+ {
+ HeaderSettings.BottomLightPWM = value.Convert<byte>();
+ UpdateGCode();
+ return true;
+ }
+ if (ReferenceEquals(modifier, PrintParameterModifier.LightPWM))
+ {
+ HeaderSettings.LayerLightPWM = value.Convert<byte>();
+ UpdateGCode();
+ return true;
+ }
+
+ return false;
+ }
+
+ public override void SaveAs(string filePath = null)
+ {
+ if (!string.IsNullOrEmpty(filePath))
+ {
+ File.Copy(FileFullPath, filePath, true);
+ FileFullPath = filePath;
+ }
+
+ using (var outputFile = ZipFile.Open(FileFullPath, ZipArchiveMode.Update))
+ {
+ foreach (var zipentry in outputFile.Entries)
+ {
+ if (zipentry.Name.EndsWith(".gcode"))
+ {
+ zipentry.Delete();
+ break;
+ }
+ }
+
+ outputFile.PutFileContent("run.gcode", GCode.ToString());
+
+ foreach (var layer in this)
+ {
+ if (!layer.IsModified) continue;
+ outputFile.PutFileContent(layer.Filename, layer.RawData);
+ layer.IsModified = false;
+ }
+ }
+
+ //Decode(FileFullPath);
+ }
+
+ public override bool Convert(Type to, string fileFullPath)
+ {
+ throw new NotImplementedException();
+ }
+
+ private void UpdateGCode()
+ {
+ string arch = Environment.Is64BitOperatingSystem ? "64-bits" : "32-bits";
+ GCode = new StringBuilder();
+ GCode.AppendLine($"; {About.Website} {About.Software} {Assembly.GetExecutingAssembly().GetName().Version} {arch} {DateTime.Now}");
+
+ foreach (var propertyInfo in HeaderSettings.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance))
+ {
+ var displayNameAttribute = propertyInfo.GetCustomAttributes(false).OfType<DisplayNameAttribute>().FirstOrDefault();
+ if (ReferenceEquals(displayNameAttribute, null)) continue;
+ GCode.AppendLine($";{displayNameAttribute.DisplayName}:{propertyInfo.GetValue(HeaderSettings)}");
+ }
+
+ GCode.AppendLine();
+ GCode.AppendFormat(GCodeStart, Environment.NewLine);
+
+ for (uint layerIndex = 0; layerIndex < LayerCount; layerIndex++)
+ {
+ GCode.AppendLine($";LAYER_START:{layerIndex}");
+ GCode.AppendLine($";currPos:{GetHeightFromLayer(layerIndex, false)}");
+ GCode.AppendLine($"M6054 \"{layerIndex+1}.png\";show Image");
+ GCode.AppendLine($"G0 Z{(layerIndex < InitialLayerCount ? HeaderSettings.BottomLayerLiftHeight : HeaderSettings.LayerLiftHeight) +GetHeightFromLayer(layerIndex, false)} F{(layerIndex < InitialLayerCount ? HeaderSettings.BottomLayerLiftSpeed : HeaderSettings.LayerLiftSpeed)};Z Lift");
+ GCode.AppendLine($"G0 Z{GetHeightFromLayer(layerIndex)} F{HeaderSettings.RetractSpeed};Layer position");
+ GCode.AppendLine($"G4 P{(layerIndex < InitialLayerCount ? HeaderSettings.BottomLightOffTime : HeaderSettings.LayerLightOffTime)*1000};Before cure delay");
+ GCode.AppendLine($"M106 S{(layerIndex < InitialLayerCount ? HeaderSettings.BottomLightPWM : HeaderSettings.LayerLightPWM)};light on");
+ GCode.AppendLine($"G4 P{(layerIndex < InitialLayerCount ? HeaderSettings.BottomLayerExposureTime : HeaderSettings.LayerExposureTime) * 1000};Cure time");
+ GCode.AppendLine("M106 S0;light off");
+ GCode.AppendLine(";LAYER_END");
+ GCode.AppendLine();
+ }
+
+ GCode.AppendFormat(GCodeEnd, Environment.NewLine, HeaderSettings.MachineZ);
+ }
+ #endregion
+ }
+}
diff --git a/PrusaSL1Reader/Extensions/FileStreamExtensions.cs b/UVtools.Parser/Extensions/FileStreamExtensions.cs
index 3d1dd61..f9ab1cc 100644
--- a/PrusaSL1Reader/Extensions/FileStreamExtensions.cs
+++ b/UVtools.Parser/Extensions/FileStreamExtensions.cs
@@ -8,7 +8,7 @@
using System.IO;
-namespace PrusaSL1Reader.Extensions
+namespace UVtools.Parser.Extensions
{
public static class FileStreamExtensions
{
diff --git a/PrusaSL1Reader/Extensions/StreamExtensions.cs b/UVtools.Parser/Extensions/StreamExtensions.cs
index f1e98cb..d46ba1d 100644
--- a/PrusaSL1Reader/Extensions/StreamExtensions.cs
+++ b/UVtools.Parser/Extensions/StreamExtensions.cs
@@ -9,7 +9,7 @@
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
-namespace PrusaSL1Reader.Extensions
+namespace UVtools.Parser.Extensions
{
public static class StreamExtensions
{
diff --git a/PrusaSL1Reader/Extensions/StringExtensions.cs b/UVtools.Parser/Extensions/StringExtensions.cs
index 039a633..6cea2e0 100644
--- a/PrusaSL1Reader/Extensions/StringExtensions.cs
+++ b/UVtools.Parser/Extensions/StringExtensions.cs
@@ -10,7 +10,7 @@ using System;
using System.ComponentModel;
using System.Linq;
-namespace PrusaSL1Reader.Extensions
+namespace UVtools.Parser.Extensions
{
public static class StringExtensions
{
diff --git a/PrusaSL1Reader/Extensions/ZipArchiveExtensions.cs b/UVtools.Parser/Extensions/ZipArchiveExtensions.cs
index 6f7b874..b3c83f9 100644
--- a/PrusaSL1Reader/Extensions/ZipArchiveExtensions.cs
+++ b/UVtools.Parser/Extensions/ZipArchiveExtensions.cs
@@ -12,7 +12,7 @@ using System.IO;
using System.IO.Compression;
using System.Linq;
-namespace PrusaSL1Reader.Extensions
+namespace UVtools.Parser.Extensions
{
public static class ZipArchiveExtensions
{
diff --git a/PrusaSL1Reader/FileExtension.cs b/UVtools.Parser/FileExtension.cs
index 07df03f..cb56563 100644
--- a/PrusaSL1Reader/FileExtension.cs
+++ b/UVtools.Parser/FileExtension.cs
@@ -7,7 +7,7 @@
*/
using System.Collections.Generic;
-namespace PrusaSL1Reader
+namespace UVtools.Parser
{
/// <summary>
/// Represents a file extension for slicer file formats
diff --git a/PrusaSL1Reader/FileFormat.cs b/UVtools.Parser/FileFormat.cs
index 83a2133..cacaa86 100644
--- a/PrusaSL1Reader/FileFormat.cs
+++ b/UVtools.Parser/FileFormat.cs
@@ -12,14 +12,15 @@ using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
-using PrusaSL1Reader.Extensions;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Advanced;
using SixLabors.ImageSharp.PixelFormats;
using SixLabors.ImageSharp.Processing;
+using UVtools.Parser;
+using UVtools.Parser.Extensions;
using Size = System.Drawing.Size;
-namespace PrusaSL1Reader
+namespace UVtools.Parser
{
/// <summary>
/// Slicer <see cref="FileFormat"/> representation
@@ -131,6 +132,7 @@ namespace PrusaSL1Reader
public static FileFormat[] AvaliableFormats { get; } =
{
new SL1File(), // Prusa SL1
+ new ChituboxZipFile(), // Zip
new ChituboxFile(), // cbddlp, cbt, photon
new PHZFile(), // phz
new PWSFile(), // PSW
@@ -588,9 +590,9 @@ namespace PrusaSL1Reader
}
}
- public virtual float GetHeightFromLayer(uint layerIndex)
+ public virtual float GetHeightFromLayer(uint layerIndex, bool realHeight = true)
{
- return (float)Math.Round((layerIndex+1) * LayerHeight, 2);
+ return (float)Math.Round((layerIndex+(realHeight ? 1 : 0)) * LayerHeight, 2);
}
public virtual object GetValueFromPrintParameterModifier(PrintParameterModifier modifier)
@@ -634,17 +636,50 @@ namespace PrusaSL1Reader
return Convert(to.GetType(), fileFullPath);
}
- public void Resize(uint startLayerIndex, uint endLayerIndex, float x, float y)
+ public void Resize(uint startLayerIndex, uint endLayerIndex, float x, float y, bool fade)
{
- if (x == 1 && y == 1) return;
+ if (x == 1f && y == 1f) return;
- Parallel.For(startLayerIndex, endLayerIndex+1, layerIndex =>
+ Parallel.For(startLayerIndex, endLayerIndex+1, /*new ParallelOptions { MaxDegreeOfParallelism = 1 },*/ layerIndex =>
{
+ var newX = x;
+ var newY = y;
+ if (fade)
+ {
+ if (newX != 1f)
+ {
+ double steps = Math.Abs(newX - 1.0) / (endLayerIndex - startLayerIndex);
+ //maxIteration = Math.Max(iterationsStart, iterationsEnd);
+
+ newX = (float) (newX < 1f
+ ? newX + (layerIndex - startLayerIndex) * steps
+ : newX - (layerIndex - startLayerIndex) * steps);
+
+ // constrain
+ //iterations = Math.Min(Math.Max(1, iterations), maxIteration);
+ }
+
+ if (y != 1f)
+ {
+ double steps = Math.Abs(newY - 1.0) / (endLayerIndex - startLayerIndex);
+ //maxIteration = Math.Max(iterationsStart, iterationsEnd);
+
+ newY = (float) (newY < 1f
+ ? newY + (layerIndex - startLayerIndex) * steps
+ : newY - (layerIndex - startLayerIndex) * steps);
+
+ // constrain
+ //iterations = Math.Min(Math.Max(1, iterations), maxIteration);
+ }
+ }
+
+ if (newX == 1f && newY == 1f) return;
+
var image = this[layerIndex].Image;
var newImage = new Image<L8>(image.GetConfiguration(), image.Width, image.Height);
- int width = (int)(image.Width * x);
- int height = (int)(image.Height * y);
+ int width = (int)(image.Width * newX);
+ int height = (int)(image.Height * newY);
Point location = new Point(image.Width/2 - width/2, image.Height/2 - height/2);
diff --git a/PrusaSL1Reader/Helpers.cs b/UVtools.Parser/Helpers.cs
index af4a56f..ef0262d 100644
--- a/PrusaSL1Reader/Helpers.cs
+++ b/UVtools.Parser/Helpers.cs
@@ -14,13 +14,13 @@ using System.Runtime.InteropServices;
using System.Security.Cryptography;
using BinarySerialization;
using Newtonsoft.Json;
-using PrusaSL1Reader.Extensions;
+using UVtools.Parser.Extensions;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Formats.Bmp;
using SixLabors.ImageSharp.Formats.Png;
using SixLabors.ImageSharp.PixelFormats;
-namespace PrusaSL1Reader
+namespace UVtools.Parser
{
/// <summary>
/// A helper class with utilities
diff --git a/PrusaSL1Reader/IFileFormat.cs b/UVtools.Parser/IFileFormat.cs
index bda3925..d9d9cba 100644
--- a/PrusaSL1Reader/IFileFormat.cs
+++ b/UVtools.Parser/IFileFormat.cs
@@ -11,7 +11,7 @@ using System.Text;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.PixelFormats;
-namespace PrusaSL1Reader
+namespace UVtools.Parser
{
/// <summary>
/// Slicer file format representation interface
@@ -273,8 +273,9 @@ namespace PrusaSL1Reader
/// Get height in mm from layer height
/// </summary>
/// <param name="layerIndex"></param>
+ /// <param name="realHeight"></param>
/// <returns>The height in mm</returns>
- float GetHeightFromLayer(uint layerIndex);
+ float GetHeightFromLayer(uint layerIndex, bool realHeight = true);
/// <summary>
/// Gets the value attributed to <see cref="FileFormat.PrintParameterModifier"/>
@@ -331,9 +332,10 @@ namespace PrusaSL1Reader
/// </summary>
/// <param name="startLayerIndex">Layer index to start</param>
/// <param name="endLayerIndex">Layer index to end</param>
- /// <param name="x">X factor</param>
- /// <param name="y">Y factor</param>
- void Resize(uint startLayerIndex, uint endLayerIndex, float x, float y);
+ /// <param name="x">X factor, starts at 1</param>
+ /// <param name="y">Y factor, starts at 1</param>
+ /// <param name="fade">Fade X/Y towards 100%</param>
+ void Resize(uint startLayerIndex, uint endLayerIndex, float x, float y, bool fade);
/// <summary>
/// Validate AntiAlias Level
diff --git a/PrusaSL1Reader/ImageFile.cs b/UVtools.Parser/ImageFile.cs
index 8845882..09e788f 100644
--- a/PrusaSL1Reader/ImageFile.cs
+++ b/UVtools.Parser/ImageFile.cs
@@ -5,7 +5,7 @@ using SixLabors.ImageSharp.PixelFormats;
using SixLabors.ImageSharp.Processing;
using Size = System.Drawing.Size;
-namespace PrusaSL1Reader
+namespace UVtools.Parser
{
public class ImageFile : FileFormat
{
diff --git a/PrusaSL1Reader/LayerManager.cs b/UVtools.Parser/LayerManager.cs
index 3b3fbfb..f2cb107 100644
--- a/PrusaSL1Reader/LayerManager.cs
+++ b/UVtools.Parser/LayerManager.cs
@@ -12,12 +12,12 @@ using System.Collections.Generic;
using System.IO;
using System.Runtime.InteropServices;
using System.Threading.Tasks;
-using PrusaSL1Reader.Extensions;
+using UVtools.Parser.Extensions;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.PixelFormats;
using Point = System.Drawing.Point;
-namespace PrusaSL1Reader
+namespace UVtools.Parser
{
#region LayerIssue Class
diff --git a/PrusaSL1Reader/PHZFile.cs b/UVtools.Parser/PHZFile.cs
index ff7a385..d3a7f5b 100644
--- a/PrusaSL1Reader/PHZFile.cs
+++ b/UVtools.Parser/PHZFile.cs
@@ -15,11 +15,12 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
using BinarySerialization;
-using PrusaSL1Reader.Extensions;
+using UVtools.Parser.Extensions;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.PixelFormats;
+using UVtools.Parser;
-namespace PrusaSL1Reader
+namespace UVtools.Parser
{
public class PHZFile : FileFormat
{
diff --git a/PrusaSL1Reader/PWSFile.cs b/UVtools.Parser/PWSFile.cs
index 85eb25d..3d42e62 100644
--- a/PrusaSL1Reader/PWSFile.cs
+++ b/UVtools.Parser/PWSFile.cs
@@ -12,11 +12,11 @@ using System.Diagnostics;
using System.IO;
using System.Threading.Tasks;
using BinarySerialization;
-using PrusaSL1Reader.Extensions;
+using UVtools.Parser.Extensions;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.PixelFormats;
-namespace PrusaSL1Reader
+namespace UVtools.Parser
{
public class PWSFile : FileFormat
{
diff --git a/PrusaSL1Reader/SL1File.cs b/UVtools.Parser/SL1File.cs
index 9575de7..c6f1aba 100644
--- a/PrusaSL1Reader/SL1File.cs
+++ b/UVtools.Parser/SL1File.cs
@@ -12,11 +12,12 @@ using System.IO;
using System.IO.Compression;
using System.Linq;
using System.Reflection;
-using PrusaSL1Reader.Extensions;
+using UVtools.Parser.Extensions;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.PixelFormats;
+using UVtools.Parser;
-namespace PrusaSL1Reader
+namespace UVtools.Parser
{
public class SL1File : FileFormat
{
@@ -57,14 +58,14 @@ namespace PrusaSL1Reader
public string BedCustomModel { get; set; }
public string BedCustomTexture { get; set; }
public string BedShape { get; set; }
- public ushort MaxPrintHeight { get; set; }
+ public float MaxPrintHeight { get; set; }
#endregion
#region Display
public float DisplayWidth { get; set; }
public float DisplayHeight { get; set; }
- public ushort DisplayPixelsX { get; set; }
- public ushort DisplayPixelsY { get; set; }
+ public uint DisplayPixelsX { get; set; }
+ public uint DisplayPixelsY { get; set; }
public string DisplayOrientation { get; set; }
public bool DisplayMirrorX { get; set; }
public bool DisplayMirrorY { get; set; }
@@ -292,6 +293,7 @@ namespace PrusaSL1Reader
public override Type[] ConvertToFormats { get; } =
{
typeof(ChituboxFile),
+ typeof(ChituboxZipFile),
typeof(PWSFile),
typeof(PHZFile),
typeof(ZCodexFile),
@@ -644,6 +646,66 @@ namespace PrusaSL1Reader
return true;
}
+ if (to == typeof(ChituboxZipFile))
+ {
+ ChituboxZipFile defaultFormat = (ChituboxZipFile)FindByType(typeof(ChituboxZipFile));
+ ChituboxZipFile file = new ChituboxZipFile
+ {
+ LayerManager = LayerManager,
+ HeaderSettings =
+ {
+ Filename = Path.GetFileName(FileFullPath),
+
+ ResolutionX = ResolutionX,
+ ResolutionY = ResolutionY,
+ MachineX = PrinterSettings.DisplayWidth,
+ MachineY = PrinterSettings.DisplayHeight,
+ MachineZ = PrinterSettings.MaxPrintHeight,
+ MachineType = MachineName,
+ ProjectType = PrinterSettings.DisplayMirrorX ? "LCD_mirror" : "Normal",
+
+ Resin = MaterialName,
+ Price = MaterialCost,
+ Weight = (float) Math.Round(UsedMaterial * MaterialSettings.MaterialDensity, 2),
+ Volume = UsedMaterial,
+ Mirror = (byte) (PrinterSettings.DisplayMirrorX ? 1 : 0),
+
+
+ BottomLayerLiftHeight = LookupCustomValue<float>(Keyword_BottomLiftHeight, defaultFormat.HeaderSettings.BottomLayerLiftHeight),
+ LayerLiftHeight = LookupCustomValue<float>(Keyword_LiftHeight, defaultFormat.HeaderSettings.LayerLiftHeight),
+ BottomLayerLiftSpeed = LookupCustomValue<float>(Keyword_BottomLiftSpeed, defaultFormat.HeaderSettings.BottomLayerLiftSpeed),
+ LayerLiftSpeed = LookupCustomValue<float>(Keyword_LiftSpeed, defaultFormat.HeaderSettings.LayerLiftSpeed),
+ RetractSpeed = LookupCustomValue<float>(Keyword_RetractSpeed, defaultFormat.HeaderSettings.RetractSpeed),
+ BottomLayCount = InitialLayerCount,
+ BottomLayerCount = InitialLayerCount,
+ BottomLightOffTime = LookupCustomValue<float>(Keyword_BottomLightOffDelay, defaultFormat.HeaderSettings.BottomLightOffTime),
+ LayerLightOffTime = LookupCustomValue<float>(Keyword_LightOffDelay, defaultFormat.HeaderSettings.LayerLightOffTime),
+ BottomLayExposureTime = InitialExposureTime,
+ BottomLayerExposureTime = InitialExposureTime,
+ LayerExposureTime = LayerExposureTime,
+ LayerHeight = LayerHeight,
+ LayerCount = LayerCount,
+ AntiAliasing = ValidateAntiAliasingLevel(),
+ BottomLightPWM = LookupCustomValue<byte>(Keyword_BottomLightPWM, defaultFormat.HeaderSettings.BottomLightPWM),
+ LayerLightPWM = LookupCustomValue<byte>(Keyword_LightPWM, defaultFormat.HeaderSettings.LayerLightPWM),
+
+ EstimatedPrintTime = PrintTime
+ },
+ };
+
+
+ if (LookupCustomValue<bool>("FLIP_XY", false, true))
+ {
+ file.HeaderSettings.ResolutionX = PrinterSettings.DisplayPixelsY;
+ file.HeaderSettings.ResolutionY = PrinterSettings.DisplayPixelsX;
+ }
+
+ file.SetThumbnails(Thumbnails);
+ file.Encode(fileFullPath);
+
+ return true;
+ }
+
if (to == typeof(PWSFile))
{
PWSFile defaultFormat = (PWSFile)FindByType(typeof(PWSFile));
diff --git a/PrusaSL1Reader/Statistics.cs b/UVtools.Parser/Statistics.cs
index fa877b4..aa4fbe9 100644
--- a/PrusaSL1Reader/Statistics.cs
+++ b/UVtools.Parser/Statistics.cs
@@ -9,7 +9,7 @@ using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
-namespace PrusaSL1Reader
+namespace UVtools.Parser
{
public class Statistics
{
diff --git a/UVtools.Parser/UVtools.Parser.csproj b/UVtools.Parser/UVtools.Parser.csproj
new file mode 100644
index 0000000..84af844
--- /dev/null
+++ b/UVtools.Parser/UVtools.Parser.csproj
@@ -0,0 +1,33 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+ <PropertyGroup>
+ <TargetFramework>netstandard2.0</TargetFramework>
+ <Authors>Tiago Conceição</Authors>
+ <Company>PTRTECH</Company>
+ <PackageProjectUrl>https://github.com/sn4k3/UVtools</PackageProjectUrl>
+ <PackageIcon></PackageIcon>
+ <RepositoryUrl>https://github.com/sn4k3/UVtools</RepositoryUrl>
+ <AssemblyVersion>0.5.1.0</AssemblyVersion>
+ <FileVersion>0.5.1.0</FileVersion>
+ <Version>0.5.1</Version>
+ <Description>MSLA/DLP, file analysis, repair, conversion and manipulation</Description>
+ <PackageId>UVtoolsParser</PackageId>
+ <PackageLicenseFile>LICENSE</PackageLicenseFile>
+ <Product>UVtoolsParser</Product>
+ </PropertyGroup>
+
+ <ItemGroup>
+ <None Include="..\LICENSE" Link="LICENSE" />
+ <None Include="..\LICENSE">
+ <Pack>True</Pack>
+ <PackagePath></PackagePath>
+ </None>
+ </ItemGroup>
+
+ <ItemGroup>
+ <PackageReference Include="BinarySerializer" Version="8.5.1" />
+ <PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
+ <PackageReference Include="SixLabors.ImageSharp" Version="1.0.0-rc0002" />
+ </ItemGroup>
+
+</Project>
diff --git a/PrusaSL1Reader/ZCodexFile.cs b/UVtools.Parser/ZCodexFile.cs
index c3eb73f..a7409f2 100644
--- a/PrusaSL1Reader/ZCodexFile.cs
+++ b/UVtools.Parser/ZCodexFile.cs
@@ -12,11 +12,11 @@ using System.IO.Compression;
using System.Text;
using System.Text.RegularExpressions;
using Newtonsoft.Json;
-using PrusaSL1Reader.Extensions;
+using UVtools.Parser.Extensions;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.PixelFormats;
-namespace PrusaSL1Reader
+namespace UVtools.Parser
{
public class ZCodexFile : FileFormat
{
diff --git a/PrusaSL1Viewer.sln b/UVtools.sln
index 4253ca5..3556488 100644
--- a/PrusaSL1Viewer.sln
+++ b/UVtools.sln
@@ -3,12 +3,12 @@ Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.29926.136
MinimumVisualStudioVersion = 10.0.40219.1
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PrusaSL1Viewer", "PrusaSL1Viewer\PrusaSL1Viewer.csproj", "{E7389EE3-CF56-464B-9BA1-816B31D1E6FF}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UVtools.GUI", "UVtools.GUI\UVtools.GUI.csproj", "{E7389EE3-CF56-464B-9BA1-816B31D1E6FF}"
ProjectSection(ProjectDependencies) = postProject
{53B884CA-E640-4171-8AA2-03935AC076D2} = {53B884CA-E640-4171-8AA2-03935AC076D2}
EndProjectSection
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PrusaSL1Reader", "PrusaSL1Reader\PrusaSL1Reader.csproj", "{53B884CA-E640-4171-8AA2-03935AC076D2}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "UVtools.Parser", "UVtools.Parser\UVtools.Parser.csproj", "{53B884CA-E640-4171-8AA2-03935AC076D2}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution