- **File formats:**
- (Add) `TransitionLayerCount` modifier to: Chitubox Zip, CWS, JXS, OSLA, PW*, UVJ, ZCodex, ZCode
- (Add) Utility methods for transition layers calculation/parse
- (Improvement) Calculate and set `TransitionLayerCount` property in file decode based on layer exposure time configuration
- **GCode:**
- (Improvement) GCode: Able to parse layer image file with appended numbers on the filename (Afecting CWS) (#577)
- (Fix) Bad parsing of the file when it comes from Lychee or NovaMaker slicer (Afecting CWS)
- (Fix) Incorrect parse of "Wait time before cure" from layers when printer require wait sync moves (Afecting CWS)
- **Tools:**
- (Add) External tests: The Complete Resin 3D Printing Settings Guide for Beginners
- (Add) External tests: 9 settings for faster printing
- (Improvement) Fade exposure time: Set `TransitionLayerCount` property with the affected layer count
- **Suggestions:**
- (Add) Transition layers: If you are printing flat on the build plate your model will print better when using a smooth transition exposure time instead of a harsh variation, resulting in reduced layer line effect and avoid possible problems due the large exposure difference.
This is not so important when your model print raised under a raft/supports unaffected by the bottom exposure, in that case, it's fine to ignore this.
- (Add) Model position: Printing on a corner will reduce the FEP stretch forces when detaching from the model during a lift sequence, benefits are: Reduced lift height and faster printing, less stretch, less FEP marks, better FEP lifespan, easier to peel, less prone to failure and use the screen pixels more evenly.
If the model is too large to fit within the margin(s) on the screen, it will attempt to center it on that same axis to avoid touching on screen edge(s) and to give a sane margin from it.
- **Status bar:**
- (Add) Transition layers: 0/-0.00s
- (Improvement) Change "Layer Height: 0.000mm" to "Layers: count @ 0.000mm"
- (Improvement) Change "Bottom layers: 0" to "Bottom layers: 0/0.000mm"
- (Change) Show user informative message about CTB Encrypted file format once per ten file loads
- (Upgrade) .NET from 6.0.9 to 6.0.10
- (Fix) Windows MSI installation not upgrading well when downgrade libraries
- **Layer:**
- (Add) Property: `LayerMatBoundingRectangle`
- (Add) Property: `LayerMatModelBoundingRectangle`
- (Add) Method: `GetLayerMat(roi)`
- **Issues:**
- **Islands:**
- (Improvement) Islands detection performance
- (Improvement) Required area to consider an island is now real area instead of bounding box area
- (Fix) Logic bug when combining with overhangs
- **Overhangs:**
- (Improvement) Overhangs detection performance
- (Improvement) Overhangs are now split and identified as separately in the layer
- (Improvement) Overhangs now shows the correct issue area and able to locate the problem region more precisely
- (Improvement) Compress overhangs into contours instead of using whole pixels, resulting in better render performance and less memory to hold the issue
- (Fix) Bug in overhang logic causing to detect the problem twice when combined with supports
- (Improvement) Touching bounds check logic to spare cycles
- **Tool - Raise platform on print finish:**
- (Add) Preset "Minimum": Sets to the minimum position
- (Add) Preset "Medium": Sets to half-way between minimum and maximum position
- (Add) Preset "Maximum": Sets to the maximum position
- (Add) Wait time: Sets the ensured wait time to stay still on the desired position.
This is useful if the printer firmware always move to top and you want to stay still on the set position for at least the desired time.
Note: The print time calculation will take this wait into consideration and display a longer print time.
- (Add) FileFormat: AnyCubic custom machine (.pwc)
- (Downgrade) OpenCV from 4.5.5 to 4.5.4 due a possible crash while detecting islands (Windows)
- **Windows MSI installer:**
- (Add) UVtools folder to start menu with:
- UVtools
- UVtoolsCmd
- Uninstall UVtools
- (Add) Prompt for add open in UVtools when right-click on supported files
- (Add) Prompt for create desktop shortcut
- (Add) Prompt for launch UVtools after the installation
- (Improvement) Cleanup and simplify the install project
- (Add) PrusaSlicer printer: Peopoly Phenom Forge
- (Upgrade) .NET from 6.0.8 to 6.0.9
- (Fix) Corruption in file after attempt to save to a locked file (#551)
- **Tools:**
- (Add) PCB exposure: Converts a gerber file to a pixel perfect image given your printer LCD/resolution to exposure the copper traces.
- (Improvement) Export settings now indent the XML to be more user friendly to edit
- (Improvement) Layer import: Allow to have profiles
- (Improvement) Layer import: Validates if selected files exists before execute
- (Fix) Lithophane: Disallow having start threshold equal to end threshold
- (Add) Windows explorer: Right-click on files will show "Open with UVtools" on context menu which opens the selected file on UVtools (Windows MSI only)
- (Improvement) Island and overhang detection: Ignore detection on all layers that are in direct contact with the plate (On same first layer position)
- (Improvement) Cmd: Better error messages for convert command when using shared extensions and no extension
- **Shortcuts:**
- (Add) **Delete:** While on layer preview and with roi or mask(s) selected, will remove the selected area from layer
- (Add) **Alt + Delete:** While on layer preview and with roi or mask(s) selected, will remove the selected area from all layers
- (Add) **Ctrl + Delete:** While on layer preview, will remove the current layer
- (Add) **Insert:** While on layer preview and with roi or mask(s) selected, will keep only the selected area in layer
- (Add) **Alt + Insert:** While on layer preview and with roi or mask(s) selected, will keep only the selected area in all layers
- (Add) **Ctrl + Insert:** While on layer preview, will clone the current layer
- (Add) **Home:** While on layer preview will go to first layer
- (Add) **End:** While on layer preview will go to last layer
- (Add) **Page up:** While on layer preview will skip +10 layers
- (Add) **Page down:** While on layer preview will skip -10 layers
- (Add) Tool - Lithophane: Generate lithophane from a picture
- (Fix) Pixel arithmetic: When run with masks it produce a incorrect outcome
- (Fix) CXDLP: Layer area table miscalculation, causing slow down prints
- **Core:**
- (Add) Machine presets and able to load machine collection from PrusaSlicer
- (Improvement) Core: Reference EmguCV runtimes into core instead of the UI project
- **File formats:**
- **CXDLP:**
- (Add) Detection support for Halot One Pro
- (Add) Detection support for Halot One Plus
- (Add) Detection support for Halot Sky Plus
- (Add) Detection support for Halot Lite
- (Improvement) Better handling and detection of printer model when converting
- (Improvement) Discovered more fields meanings on format
- (Fix) Exposure time in format is `round(time * 10, 1)`
- (Fix) Speeds in format are in mm/s, was using mm/min before
- (Add) JXS format for Uniformation GKone [Zip+GCode]
- (Improvement) Saving and converting files now handle the file backup on Core instead on the UI, which prevents scripts and other projects lose the original file in case of error while saving
- (Fix) After load files they was flagged as requiring a full encode, preventing fast save a fresh file
- **UVtoolsCmd:**
- Bring back the commandline project
- Consult README to see the available commands and syntax
- Old terminal commands on UVtools still works for now, but consider switch to UVtoolsCmd or redirect the command using `UVtools --cmd "commands"`
- **Tools:**
- **Change print resolution:**
- (Add) Allow to change the display size to match the new printer
- (Add) Machine presets to help set both resolution and display size to a correct printer and auto set fix pixel ratio
- (Improvement) Real pixel pitch fixer due new display size information, this allow full transfers between different printers "without" invalidating the model size
- (Improvement) Better arrangement of the layout
- (Add) Infill: Option "Reinforce infill if possible", it was always on before, now default is off and configurable
- (Improvement) Always allow to export settings from tools
- **GCode:**
- (Improvement) After print the last layer, do one lift with the same layer settings before attempt a fast move to top
- (Improvement) Use the highest defined speed to send the build plate to top after finish print
- (Improvement) Append a wait sync command in the end of gcode if needed
- (Fix) When lift without a retract it still output the motor sync delay for the retract time and the wait time after retract
- **PrusaSlicer:**
- (Add) Printer: Creality Halot One Pro CL-70
- (Add) Printer: Creality Halot One Plus CL-79
- (Add) Printer: Creality Halot Sky Plus CL-92
- (Add) Printer: Creality Halot Lite CL-89L
- (Add) Printer: Creality Halot Lite CL-89L
- (Add) Printer: Creality CT133 Pro
- (Add) Printer: Creality CT-005 Pro
- (Add) Printer: Uniformation GKone
- (Add) Printer: FlashForge Foto 8.9S
- (Add) Printer: Elegoo Mars 2
- (Improvement) Rename all Creality printers
- (Fix) Creality model in print notes
- **(Add) Suggestions:**
- A new module that detect bad or parameters out of a defined range and suggest a change on the file, those can be auto applied if configured to do so
- **Avaliable suggestions:**
- **Bottom layer count:** Bottom layers should be kept to a minimum, usually from 2 to 3, it function is to provide a good adhesion to the first layer on the build plate, using a high count have disadvantages.
- **Wait time before cure:** Rest some time before cure the layer is crucial to let the resin settle after the lift sequence and allow some time for the arm settle at the correct Z position as the resin will offer some resistance and push the structure.
This lead to better quality with more successful prints, less lamination problems, better first layers with more success of stick to the build plate and less elephant foot effect.
- **Wait time after cure:** Rest some time after cure the layer and before the lift sequence can be important to allow the layer to cooldown a bit and detach better from the FEP.
- **Layer height:** Using the right layer height is important to get successful prints:
Thin layers may cause problems on adhesion, lamination, will print much slower and have no real visual benefits.
Thick layers may not fully cure no matter the exposure time you use, causing lamination and other hazards. Read your resin dtasheet to know the limits.
Using layer height with too many decimal digits may produce a wrong positioning due stepper step loss and/or Z axis quality.
- **Core:**
- Convert the project to Nullable aware and "null-safe"
- **File Formats:**
- (Add) `Volume` property to get the total model volume
- (Add) `SanitizeLayers` method to reassign indexes and force attribute parent file
- (Improvement) Merge `LayerManager` into `FileFormat` and cleanup: This affects the whole project and external scripts.
If using scripts please update them, search for `.LayerManager.` and replace by `.`
- (Change) Chitubox encrypted format can now be saved as normal
- (Fix) Converted files layers was pointing to the source file and related to it
- **Layers:**
- (Add) Methods: `ResetParameters`, `CopyParametersTo`, `CopyExposureTo`, `CopyWaitTimesTo`
- (Improvement) `IsBottomLayer` property will also return true when the index is inside bottom layer count
- **Scripting:**
- (Add) Configuration variable: `MinimumVersionToRun` - Sets the minimum version able to run the script
- (Improvement) Allow run scripts written in C# 10 with the new namespace; style as well as nullables methods
- (Improvement) Convert scripts to use Nullable code
- **UI:**
- (Add) Fluent Dark theme
- (Add) Default Light theme
- (Add) Default Dark theme
- (Change) Use fontawesome and material design to render the icons instead of static png images
- (Change) Some icons
- (Change) Move log tab to clipboard tab
- (Change) Tooltip overlay default color
- (Improvement) Windows position for tool windows, sometimes framework can return negative values affecting positions, now limits to 0 (#387)
- (Fix) Center image icon for layer action button
- (Fix) Center image icon for save layer image button
- **Tools:**
- (Add) Layer re-height: Offset mode, change layers position by a defined offset (#423)
- (Improvement) Rotate: Unable to use an angle of 0
- (Improvement) Remove layers: Will not recalcualte and reset properties of layers anymore, allowing removing layers on dynamic layer height models and others
- (Improvement) Clone layers: Will not recalcualte and reset properties of layers anymore, allowing cloning layers on dynamic layer height models and others
- (Fix) Exposure time finder: Very small printers may not print the stock object as it is configured, lead to a unknown error while generating the test. It will now show a better error message and advice a solution (#426)
- **Terminal:**
- (Add) More default namespaces
- (Improvement) Set a MinHeight for the rows to prevent spliter from eat the elements
- (Change) Set working space to the MainWindow instead of TerminalWindow
- **(Upgrade) .NET from 5.0.14 to 6.0.3**
- This brings big performance improvements, better JIT, faster I/O operations and others
- Read more: https://devblogs.microsoft.com/dotnet/performance-improvements-in-net-6
- Due this macOS requirement starts at 10.15 (Catalina)
- Read more: https://github.com/dotnet/core/blob/main/release-notes/6.0/supported-os.md
- (Add) Native support for MacOS ARM64 architecture (Mac M1 and upcomming Mac's) (#187)
- (Exchange) Dependency Newtonsoft Json by System.Text.Json to parse the json documents
- (Remove) "Automations - Light-off delay" in favor of new suggestion "wait time before cure" module
- (Fix) File - Send to: Winrar or 7zip have a wrong extension on the list (uvt) when should be (uvj)
- (Upgrade) AvaloniaUI from 0.10.12 to 0.10.13
- **Core:**
- (Add) Utilities methods (`MinimumSpeed`, `MaximumSpeed`, `CreateMat`, `CreateMatWithDummyPixel`, `FileFormat.CopyParameters`)
- (Improvement) Issues - Print Height: Group all layers outside the valid print height
- **FileFormats:**
- (Add) Generic / Phrozen ZIP format
- (Add) Information/modifier to file formats to tell whatever is possible to use custom PositionZ per layer
- (Add) Safe checks in order to run some tools, related to the previous "PositionZ" point
- (Improvement) if blank, allow the previous layer to have a higher Z position than the successor layer
- (Improvement) SL1: Implement the missing keys from new features of PrusaSlicer 2.4.0
- (Fix) Calling a partial save action without a progress instance would cause a crash
- (Fix) GCode: Unable to parse the "Wait time after lift" when a second lift (TSMC) was present, leading to a sum on "Wait time before cure"
- **Tools:**
- (Add) Timelapse: Raise the build platform to a set position every odd-even height to be able to take a photo and create a time-lapse video of the print
- (Add) Scripting: ScriptToggleSwitchInput
- **Raise on print finish:**
- (Add) Reapply check and prevent run the tool in that case
- (Fix) It was incorrectly marked to be able to run in partial mode
- (Fix) The dummy pixel was beeing set to a wrong location
- **Layers:**:
- (Change) When set Wait times to a negative value, it will set the global wait time value accordingly
- (Change) Allow ExposureTime to be 0
- **Commandline arguments**
- (Add) --run-operation \<input_file\> \<operation_file.uvtop\>
- (Add) --run-script \<input_file\> \<script_file.cs\>
- (Add) --copy-parameters \<from_file\> \<to_file\>
- **UI:**
- (Add) When open a file with missing crucial information, prompt the user to fill in that information (Optional)
- (Add) Warn user about misfunction when open a file with invalid layer height of 0mm
- (Improvement) Layer information: Only show the "Exposure time" when its availiable on the file format
- (Improvement) When a file is about to get auto-converted once loaded and the output file already exists, prompt user for overwrite action
- (Improvement) Set default culture info at top most of the program to avoid strange problems with commandline arguments
- (Upgrade) .NET from 5.0.13 to 5.0.14
- (Downgrade) OpenCV from 4.5.5 to 4.5.4 due the crash while detecting islands (Linux and MacOS) (#411, #415, #416)
- **Tool - Morph:**
- (Add) Operator: White tophat - Removes small isolated pixels and only return its affected pixels (Image - Noise removal)
- (Add) Operator: Black tophat - Closes small holes inside the objects and only return its affected pixels (Gap closing - Image)
- (Add) Operator: Hit or miss - Finds pixels in a given kernel pattern
- (Remove) Operator: 'Isolate features' as that is the same as the 'White tophat' and is already inbuilt into OpenCV
- **Kernels:**
- (Add) Option: Use dynamic kernel to enhancement the quality of the borders (#367)
- (Add) Kernels are now saved with the operation profile
- **PrusaSlicer:**
- (Add) Support to slice files to be converted for encrypted CTB format
- (Add) Printer: Elegoo Mars 3 (#370)
- (Add) Printer: EPAX E10 5K
- (Add) Printer: EPAX X10 5K
- (Add) Printer: Phrozen Sonic Mini 8K
- (Add) Printer: Phrozen Sonic Mega 8K
- (Fix) Printer: AnyCubic Photon Mono 4K - display size (#369)
- (Fix) Printer: AnyCubic Photon Mono X 6K - display size (#369)
- (Add) Tool - Double exposure: Kernel configuration
- (Add) Tool - Pixel arithmetic: Kernel configuration
- (Add) Calibration - Elephant foot: Use dynamic kernel to enhancement the quality of the borders (#367)
- (Fix) Calibrate - Elephant foot: Redo (Ctrl + Z) the operation was crashing the application
- (Fix) CTB, PHZ, FDG: Converting files with a null machine name would cause a exception
- (Fix) Anycubic files: Bottom lift and speed were showing default values instead of real used value
- **Change resolution:**
- (Add) Presets: 5K UHD, 6K and 8K UHD
- (Add) Resulting pixel ratio information
- (Add) Fix the pixel ratio by resize the layers images with the proposed ratio to match the new resolution
- (Fix) New images could have noise when processed on linux and macos
- (Add) Layer slider debounce time to render the image [Configurable] (#343)
- (Fix) CTB v1: Incorrect getter for the LightOffDelay
- (Fix) Reallocating layers were not notifying nor updating the layer collection about the changes, leading to wrong layer count
- (Fix) Undo and redo now also reverts the file resolution when changed
- **File formats:**
- (Add) Allow to partial open the files for read and/or change properties, the layer images won't be read nor cached (Fast)
- (Add) More abstraction on partial save
- **Scripting:**
- (Add) ScriptOpenFolderDialogInput - Selects a folder path
- (Add) ScriptOpenFileDialogInput - Selectes a file to open
- (Add) ScriptSaveFileDialogInput - Selects a file to save
- (Add) [UNSAVED] tag to the title bar when there are unsaved changes on the current session
- (Improvement) Better handling of empty images on the UI
When looking for candidate groups to check intersection of contours, we used to restrict this to only groups whose last item's layer was 1 above tthe current layer. However, in the event that 2 contours on the same layer intersect with the same group end up in a situation where the "last item" has a layer index of the current layer.
To fix this we loosen the restriction and now scan groups that have a lowest layer index of either current layer index or current layer index + 1
Fix for edge case where a contour is in multiple groups and they get merged. Doesn't fix root cause of the contour being placed in 2 groups, but for the time being this works around it be deduping during the merge
- **Pixel arithmetic**
- (Add) Apply to - Model surface: Apply only to model surface/visible pixels
- (Add) Apply to - Model surface & inset: Apply only to model surface/visible pixels and within a inset from walls
- (Add) Preset: Fuzy skin
- (Improvement) Speed up the Corrode method
- (Change) Heal anti-aliasing threshold from 169 to 119
- **Calibration - Grayscale:**
- (Add) Enable or disable text
- (Fix) Calibration - Grayscale: Crash program when redo (Ctrl+Z)
- (Change) Some defaults to better values
- (Fix) Layer arithmetic: Crash program when redo (Ctrl+Z)
- **Issues:**
- (Add) Suction cups: Additional setting to specify the required minimum height to be flagged as a issue (#302)
- (Change) Allow touching bounds to have a bounding rectangle and zoom into the issue
- (Change) Disable the ability to copy issues row text from list as this is crashing the program
- (Change) Decrease cache count of the layers from x10 to x5 to free RAM
- (Fix) Touching bounds are reporting areas of 0
- (Fix) Draw crosshair for issues are called multiple times
- (Fix) Detection error when resin traps are enabled on some cases (#303)
- (Fix) Resin trap false-positives (#305)
- (Fix) When removing multiple islands at once only the first is cleared from the issue list
- **UI:**
- (Change) Tool - Resize icon
- (Change) Move "Crosshairs" button inside "Issues" button
- (Add) Tool - Morph - Offset crop: Like erode but discards the outer pixels
- (Fix) Corrected bottom lift unit label in light-off delay calculator (#304)
This fixes the "layer 28" bug where recesses higher than the point of air contact do not get properly marked as suction cups during 2nd pass of resin trap detection.
- (Change) Allow touching bounds to have a bounding rectangle and zoom into the issue
- (Fix) Touching bounds are reporting areas of 0
- (Fix) Draw crosshair for issues are called multiple times
- (Fix) Issue:Equals
Both the repair operation as well as the deletion of an issue will now leverage common code for executing a repair. Repair operation will repair all suction cups, and deleting a specific suction cup will only repair that one.
- Issues:
- (Add) Suction cups: Add a auto repair feature for this issues by drill a vertical vent hole (#296)
- (Add) Layer issue track bar: Colorize the issue tracker map with it own colors (Configurable)
- (Add) Allow to group issues by type and/or layer
- (Improvement) Order issues by area in descending order
- (Improvement) Always bring the selected issue into view on the list
- (Fix) When manually removing a issue from the list, it will no longer reselect other and make the user lost track of the remove issue
- (Fix) Allow to ignore all issue type
- (Fix) Material ml calculation was calculating a bad value for PhotonWorkshop files
- **Shortcuts:**
- (Add) (Ctrl + Shift + R) to turn on and cycle the Rotate modes
- (Add) (Ctrl + Shift + F) to turn on and cycle the Flip modes
- (Add) (Ctrl + Shift + B) to select the build volume as ROI
- **GUI:**
- (Add) Allow to drag and drop '.uvtop' files into UVtools to sequential show and load operations from files
- (Change) Rotate icon on layer preview
- (Upgrade) AvaloniaUI from 0.10.3 to 0.10.4
- **Tools:**
- (Add) 'Reset to defaults' button on every dialog
- (Improvement) Window size and position handling
- (Improvement) Constrain profile box width to not stretch the window
- (Improvement) ROI section design
- **Dynamic lift:**
- (Add) View buttons to show the largest/smallest layers
- (Add) Light-off mode: Set the light-off with an extra delay
- (Add) Light-off mode: Set the light-off without an extra delay
- (Add) Light-off mode: Set the light-off to zero
- (Improvement) Disable bottom and/or normal layer fields when the selected range is outside
- (Add) Settings - Automations: Light-off delay set modes
- (Fix) Exposure time finder: Add staircase, bullseye and counter triangles to feature count at thumbnail
- **Tools:**
- (Add) Pixel Arithmetic
- (Add) Layer arithmetic: Operator $ to perform a absolute difference
- (Add) Allow to save and auto restore operation settings per session (#195)
- (Add) Allow to auto select the print volume ROI
- (Add) Allow to export and import operation settings from files
- (Improvement) Calculator - LightOff delay: Hide the bottom properties or the tab if the file format don't support them (#193)
- (Change) 'Arithmetic' to 'Layer arithmetic'
- (Remove) 'Threshold pixels'
- (Fix) Solidfy was unable to save profiles
- (Fix) A redo operation (Ctrl + Shift + Z) wasn't restoring the settings when a default profile is set
- **Operations:**
- (Fix) Passing a roi mat to `ApplyMask` would cause unwanted results
- (Improvement) Allow pass a full/original size mask to `ApplyMask`
- **Scripting:**
- (Add) an script to create an printable file to clean the VAT (#170)
- (Improvement) Allow to change user input properties outside the initialization
- (Improvement) Auto format numerical input box with the fixed decimal cases
- (Add) Settings: Section 'Tools'
- (Improvement) GUI: The 'Lift, Retract and Light-off' at status bar now only shows for the supported formats
- (Fix) Print time estimation calculation was wrong since v2.9.3 due a lacking of parentheses on the logic
- (Upgrade) AvaloniaUI from 0.10 to 0.10.2
- (Remove) Unused assemblies
- **Issues**
- Improve the performance when loading big lists of issues into the DataGrid
- Auto refresh issues on the vertical highlight tracker once cath a modification on the Issues list
- **Layer preview - Difference:**
- Layer difference will now only check the pixels inside the union of previous, current and next layer bounding rectangle, increasing the performance and speed
- Previous and next layer pixels if both exists was not showing with the configured color and using the next layer color instead
- Respect Anti-Aliasing pixels and fade colors accordingly
- Unlock the possiblity of using the layer difference on first and last layer
- Add a option to show similar pixels instead of the difference
- Change previous default color from (255, 0, 255) to (81, 131, 82) for better depth preception
- Change next default color from (0, 255, 255) to (81, 249, 252) for better depth preception
- Change previous & next default color from (255, 0, 0) to (246, 240, 216) for better depth preception
- **(Fix) Pixel editor:**
- Modification was append instead of prepend on the list
- Modification was not updating the index number on the list
- (Fix) PrusaSlicer printer: Bene4 Mono screen, bed and height size
* Clipboard Manager: As now full backups are made when removing or adding layers, the undo and redo no longer rebuilds layer properties nor Z heights
* Resin traps: Improved the detection to group areas with cross paths and process them as one whole area, this also increase the detection speed and performance (#179, #13 )
* Action - Layer import: Fix a bug preventing to import layers of any kind
* **Core:**
* Fix some improper locks for progress counter and change to Interlocked instead
* Fix a bug when chaging layer count by remove or add layers it will malform the file after save and crash the program with some tools and/or clipboard
* Fix when a operation fails by other reason different from cancelation it was not restoring the backup
* When manually delete/fix issues it will also backup the layers
* **LayerManager:**
* LayerManager is now readonly and no longer used to transpose layers, each FileFormat have now a unique `LayerManager` instance which is set on the generic constructor
* Implemented `List<Layer>` methods to easy modify the layers array
* Changing the `Layers` instance will now recompute some properties, call the properties rebuild and forced sanitize of the structure
* Better reallocation methods
* **Clipboard Manager:**
* Add the hability to do full backups, they will be marked with an asterisk (*) at clipboard items list
* When a partial backup is made and it backups all the layers it will be converted to full backup
* Clipboard can now restore a snapshot directly with `RestoreSnapshot`
* Prevent restore the initial backup upon file load and when clearing the clipboard
* Clip's that change the layer count will perform a full backup and also do a fail-safe backup behind if previous clip is not a full backup
* **Pixel dimming:**
* Allow to load an image file as a pattern (Do not use very large files or it will take much time to dump the data into the textbox)
* Empty lines on patterns will be discarded and not trigger validation error
* **File formats:**
* Add a layer height check on file load to prevent load files with more decimal digits than supported to avoid precision errors and bugs
* Fix a wrong cast causing seconds to miliseconds convertion to be caped to the wrong value
* Internally if a layer colection was replaced, all new layers will be marked as modified to avoid forgeting and ease the code
* **Tools:**
* Pixel dimming: Better render quality, it now respects AA better and produce better walls (#172)
* Elephant foot: It now respects AA better and produce better walls for wall dimming
* Layer Import: Cancelling the operation while importing layers was permanent supresseing layer properties update when changing a base property
* (Change) PrusaSlicer print profiles: Improved raft height and bottom layer count for better print success, less delamination, shorter time and reduce wear of FEP
* (Scripts): Add operation "Validate" pattern to docs and examples (#172)
* (Add) Setting: Auto repair layers and issues on file load
* (Improvement) When ComputeIssuesOnLoad is enabled and issues are detected it will switch the view to the Issues tab
* **(Improvement) Raft Relief:**
* Add parameter "Mask layer index": Defines the mask layer to use and ignore the white blobs on the raft
* Increase the automatic support detection allowance on more odd shapes
* Prevent layer 0 to be used as a mask, if so it will quit
* If the ignored layer number are set and equal or larger than mask layer index it will quit
* Fix progress count when using ignored layers
* Change supports dilate kernel from Elipse to Rectangle for a better coverage of the pad
* Change the default values for a more conservative values
* (Fix) When both ComputeIssuesOnLoad and ComputeIssuesOnClickTab are enabled, clicking the issues tab will rescan for issues
* (Fix) Tools: Set a default profile insn't working
* (Fix) Redoing the last operation was not recovering the custom ROI on the operation
* (Add) Help - Material manager (F10): Allow to manage material stock and costs with statistic over time
* (Add) File - I printed this file (CTRL + P): Allow to select a material and consume resin from stock and print time from the loaded file
* **(Fix) PhotonWorkshop files: (#149)**
* CurrencySymbol to show the correct symbol and don't convert unknown values to prevent hacking
* Set PerLayerOverride to 1 only if any layer contains modified parameters that are not shared with the globals
* **(Fix) Clipboard:**
* Initing the clipboard for the first time was calling Undo and reseting parameters from layers with base settings
* Undo and redo make layer parameters to reset and recalculate position z, making invalid files when using with advanced tools
* (Fix) Tool - Edit print parameters: When editing per a layer range and reopen the tool it will show the previous set values