diff --git a/CHANGELOG.md b/CHANGELOG.md index 05b020a..95198a0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,20 @@ # Changelog +## 15/09/2022 - v3.6.4 + +- **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) + ## 30/08/2022 - v3.6.3 - **File formats:** @@ -16,7 +31,7 @@ ## 21/08/2022 - v3.6.2 -- (Add) Debug sub menu to test some behaviours (Only when compiled in debug mode, not visible on public release) +- (Add) Debug sub menu to test some behaviors (Only when compiled in debug mode, not visible on public release) - (Add) Utility method `LayerExists` to the file formats to know if specific layer index exists in the collection - (Improvement) Add loaded file information to the crash dialog message - (Fix) Message dialog height do not expand with text (#537) @@ -190,7 +205,7 @@ - (Add) File formats: Property `IsUsingTSMC` - Indicates whatever file globals are using TSMC or not - (Change) Lithophane: Noise removal and gap closing iterations defaults to 0 - (Fix) Anycubic files: Printers are unable to use TSMC values after save (#457) -- (Fix) Pixel Editor button is hidden when using screens with scalling > 100% [dirty-fix] (#458) +- (Fix) Pixel Editor button is hidden when using screens with scaling > 100% [dirty-fix] (#458) - (Upgrade) .NET from 6.0.3 to 6.0.4 ## 11/04/2022 - v3.3.1 @@ -243,7 +258,7 @@ - (Fix) Remove anti-aliased edges from Tabs - (Improvement) Core: Minor clean-up - (Fix) Issue repair error when 'Auto repair layers and issues on file load' is enabled (#446) -- (Fix) UI: Selecting a object with ROI when flip is verically, will cause 1px up-shift on the preview +- (Fix) UI: Selecting a object with ROI when flip is vertically, will cause 1px up-shift on the preview - (Fix) macOS permission error due loss of attributes on the build script, WSL have bug with mv, using ln&rm instead ## 02/04/2022 - v3.2.1 @@ -256,7 +271,7 @@ - (Add) Concentric infill type - (Add) Gyroid infill type (#443) - (Change) Increase the default spacing from 200px to 300px - - (Improvement) Fastter infill processing by use the model bounds + - (Improvement) Faster infill processing by use the model bounds - (Add) `FormatSpeedUnit` property to file formats to get the speed unit which the file use internally - (Fix) UI: ROI rectangle can overlap scroll bars while selecting @@ -280,7 +295,7 @@ - (Improvement) When saving files the .tmp extension is no longer shown on `FileFullPath`, which now `TemporaryOutputFileFullPath` is who holds the file.tmp - (Fix) After load files they was flagged as requiring a full encode, preventing fast save a fresh file - **UVtoolsCmd:** - - Bring back the commandline project + - Bring back the command line 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:** @@ -353,7 +368,7 @@ - **(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:** + - **Available 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. @@ -392,19 +407,19 @@ - **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 + - (Improvement) Remove layers: Will not recalculate and reset properties of layers anymore, allowing removing layers on dynamic layer height models and others + - (Improvement) Clone layers: Will not recalculate 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 + - (Improvement) Set a MinHeight for the rows to prevent splitter 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) +- (Add) Native support for MacOS ARM64 architecture (Mac M1 and upcoming Mac's) (#187) - (Exchange) Dependency Newtonsoft Json by System.Text.Json to parse the json documents - (Remove) Dependency: MoreLinq - (Remove) "Automations - Light-off delay" in favor of new suggestion "wait time before cure" module @@ -433,7 +448,7 @@ - (Improvement) Optimize lift for virtual layer mode, allowing set a slow and fast lift / retract by using another virtual layer to emulate a lift - (Improvement) Allow to define slow and fast speed for virtual layer mode even if TSMC isn't supported - (Add) Fade exposure time: Setting 'Disable firmware transition layers' - Attempt to disable firmware strict transition layers in favor of this tool - - (Add) Calibration tests: Attempt to auto disable the firmware transifiton layers + - (Add) Calibration tests: Attempt to auto disable the firmware transition layers - (Change) Edit print parameters: Allow set `BottomLiftHeight` and `LiftHeight` to 0mm - **UI:** - (Improvement) Disallow drop files into UI when is processing data / disabled and prevent crashing from that action @@ -477,7 +492,7 @@ - **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 + - (Fix) The dummy pixel was being 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 @@ -488,9 +503,9 @@ - **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) Layer information: Only show the "Exposure time" when its available 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 +- (Improvement) Set default culture info at top most of the program to avoid strange problems with command line 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) @@ -519,8 +534,8 @@ ## 05/01/2022 - v2.27.5 - **Pixel Arithmetic:** - - (Add) Corode: Noise pixel area, defaulting to 3px² - - (Change) Corode: Cryptonumeric random to normal random to speed up calculation + - (Add) Corrode: Noise pixel area, defaulting to 3px² + - (Change) Corrode: Cryptonumeric random to normal random to speed up calculation - (Change) Fuzzy skin preset: Set a ignore threshold area of 5000px2 - (Improvement) Masking performance and auto crop the layer to speed up the processing when using an "Apply to" other than "All" - (Fix) Some "Apply to" methods was creating a wrong mask with some operators @@ -554,7 +569,7 @@ - (Add) Property: IsLastLayer - Gets if is the last layer - (Rename) Property: RelativeLayerHeight to RelativePositionZ - **VDT:** - - (Add) Keyword 'FILEFORMAT_xxx' to allow set the file format to auto convertion on machine notes + - (Add) Keyword 'FILEFORMAT_xxx' to allow set the file format to auto conversion on machine notes - (Add) Keyword 'FILEVERSION_n' to allow set the file format version/revision on machine notes ## 22/12/2021 - v2.27.1 @@ -566,7 +581,7 @@ - (Fix) Encoding or converting a new file with version 516 was setting wrong length for the new tables - (Fix) Setting bottom lift height or speed was not working and keep the same value - (Add) FileFormats: Abstract `Version` property to set or get the version on file formats -- (Add) CXDLP: Compability with new file v2 revsion (#376) +- (Add) CXDLP: Compatibility with new file v2 revision (#376) - (Upgrade) AvaloniaUI from 0.10.8 to 0.10.11 - ## 18/12/2021 - v2.27.0 @@ -627,7 +642,7 @@ - (Add) Processor name - (Add) Memory RAM (Used / Total GB) - (Add) OpenCV and Assemblies tab - - (Add) "Copy information" button to copy the whole dialog information, usefull for bug reports + - (Add) "Copy information" button to copy the whole dialog information, useful for bug reports - (Improvement) Enumerate the loaded assemblies - (Improvement) Rearrange the elements and put them inside scroll viewers to not strech the window - (Improvement) Allow to resize and maximize the window @@ -712,7 +727,7 @@ ## 12/10/2021 - v2.23.6 - **(Improvement) SL1:** (#314) - - Complete the SL1 file format with some defaults for convertions + - Complete the SL1 file format with some defaults for conversions - Change some data types from bool to byte as in recent prusaslicer changes - (Upgrade) .NET from 5.0.10 to 5.0.11 - (Upgrade) AvaloniaUI from 0.10.7 to 0.10.8 @@ -731,7 +746,7 @@ - **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 + - (Add) Preset: Fuzzy skin - (Improvement) Speed up the Corrode method - (Change) Heal anti-aliasing threshold from 169 to 119 - **Calibration - Grayscale:** @@ -804,7 +819,7 @@ - (Fix) Outline - Hollow areas: Not outlining the second closing contour for contours with child - (Fix) Pixel editor - Eraser: It was selecting the whole blob even if have inner parents - (Fix) Setting window: When open it will change tabs quickly to fix the windows height/scroll problem - - (Fix) Minor problems with autosizes on some input boxes + - (Fix) Minor problems with auto-sizes on some input boxes - **Tools:** - **Import layers:** - (Add) 'MergeMax' to import type (#289) @@ -823,7 +838,7 @@ - (Improvement) New and improved algorithm for resin trap detection - **Settings:** - (Add) Option: Loads the last recent file on startup if no file was specified - - (Change) Resin trap hightlight default color + - (Change) Resin trap highlight default color - (Fix) Unable to set resin trap threshold to 0 (disabled) - (Improvement) Better random generation for benchmark - (Improvement) Allow to cancel the new version download @@ -836,11 +851,11 @@ - **(Add) Layer outline:** - Blob outline: Outline all separate blobs - - Centroids: Draw a dot at the gemoetric center of a blob + - Centroids: Draw a dot at the geometric center of a blob - (Add) Adjust layer height: Allow to change exposure time on the dialog and inform that different layer thickness require different exposure times - (Add) Resin trap detection: Allow to choose the starting layer index for resin trap detection which will also be considered a drain layer. Use this setting to bypass complicated rafts by selected the model first real layer (#221) -- (Improvement) Disable mirroed preview when loading a file that is not mirroed +- (Improvement) Disable mirrored preview when loading a file that is not mirrored ## 03/09/2021 - v2.21.0 @@ -861,7 +876,7 @@ - **Dynamic Lifts:** - (Improvement) Select normal layers by default - (Improvement) Hide light-off delay fields when the file format don't support them - - (Fix) Light-off delay fields was not hidding when set a mode that dont require the extra time fields + - (Fix) Light-off delay fields was not hiding when set a mode that don't require the extra time fields - **Exposure time finder:** - (Fix) Fix the 'light-off delay' field not being show on files that support wait time before cure - (Change) Field name 'Light-off delay' to 'Wait time before cure' @@ -907,7 +922,7 @@ - Prevent 'Wait time' properties from having negative values - The `RetractSpeed` and `RetractSpeed2` property wasn't setting the bottom speed for bottom layers, instead the normal retract speed was always used - Setting the `RetractHeight2` and `RetractSpeed2` property was not notifying the timer to update the print time - - Propagate the whole global settings to layers now identfies the bottom layers per height instead of the layer index + - Propagate the whole global settings to layers now identifies the bottom layers per height instead of the layer index - (Add) UVJ: Support TSMC for the file format - (Fix) UVJ: Soft save was not updating the layer settings - (Fix) CTB: TSMC not working properly due incorrect layer `LiftHeight` value calculation @@ -916,7 +931,7 @@ - **UI:** - (Add) Pixel position on lcd millimeters to the pixel picker information - - (Add) Pixel size information when availiable below zoom on status bar + - (Add) Pixel size information when available below zoom on status bar - (Add) Click on Zoom button will zoom to 100% and shift click will set to the user defined value - **CTB:** - (Add) Allow to change wait time for bottoms and normal layers separately @@ -939,13 +954,6 @@ - AnyCubic Photon Mono SQ - AnyCubic Photon Ultra - (Add) Pixel arithmetic: Preset "Elephant foot compensation" - ## 22/08/2021 - v2.19.5 @@ -954,7 +962,7 @@ - Force version 3 when on version 4 and converting to photon or cbddlp - **(Improvement) Export to SVG image:** - Group \ all layer objects - - Intersect all childs on same \ + - Intersect all child's on same \ - **PrusaSlicer:** - (Rename) Printer keywords notes: - BottomWaitBeforeCure -> BottomWaitTimeBeforeCure @@ -1010,7 +1018,7 @@ - **File formats:** - Add and remove some image types that can be open - - (Add) `CanProcess` method to know if a file can be read under a format and to allow diferent formats with same extension + - (Add) `CanProcess` method to know if a file can be read under a format and to allow different formats with same extension - (Fix) `LiftHeightTotal` and `RetractHeight` was rounding to no decimals and returning wrong values - (Improvement) Round all float setters on `Layer` class - (Improvement) Decode/encode RAM usage and performance by processing in batch groups @@ -1028,7 +1036,7 @@ - **CTBv4:** - (Fix) More Unknown fields discovered and implemented - (Fix) Reserved table is 384 bytes instead of 420 - - (Fix) When full encoding it was forcing to change to version 3. This also affected convertions. (#263) + - (Fix) When full encoding it was forcing to change to version 3. This also affected conversions. (#263) - (Fix) `BottomRetractHeight2` was being set to `BottomRetractSpeed2` - (Fix) `RetractHeight2` was being set to `RetracSpeed2` - (Fix) The PrintParametersV4 table address @@ -1065,13 +1073,13 @@ - (Add) Implement TSMC (Two Stage Motor Control) for the supported formats - (Add) Implement 'Bottom retract speed' for the supported formats - (Add) LGS: Support for lgs120 and lg4k (#218) - - (Add) CTB: Special/virtual file extensions .v2.ctb, .v3.ctb, .v4.ctb to force a convertion to the set version (2 to 4). The .ctb is Version 3 by default when creating/converting files + - (Add) CTB: Special/virtual file extensions .v2.ctb, .v3.ctb, .v4.ctb to force a conversion to the set version (2 to 4). The .ctb is Version 3 by default when creating/converting files - (Improvement) Better performance for file formats that decode images in sequential pixels groups - **GCode:** - (Improvement) Better parsing of the movements / lifts - (Improvement) Better handling of lifts performed after cure the layer - (Improvement) More fail-safe checks and sanitize of gcode while parsing -- (Improvement) CTBv3: Enable per layer settings if disabled when fast save without reencode +- (Improvement) CTBv3: Enable per layer settings if disabled when fast save without re-encode - (Upgrade) .NET from 5.0.8 to 5.0.9 - (Fix) PrusaSlicer printer: Longer Orange 4k with correct resolution and display size - (Fix) Odd error when changing properties too fast in multi-thread @@ -1083,7 +1091,7 @@ - (Improvement) Mark program and all files as x64 - (Improvement) Add UVtools logo to side panel and top banner - (Improvement) Add open-source logo to side panel - - (Improvement) License text aligment and bold title + - (Improvement) License text alignment and bold title - (Add) File format: OSLA / ODLP / OMSLA - Universal binary file format - (Add) Calibration - Lift height: Generates test models with various strategies and increments to measure the optimal lift height or peel forces for layers given the printed area - (Add) Layer Actions - Export layers to images (PNG, JPG/JPEG, JP2, TIF/TIFF, BMP, PBM, PGM, SR/RAS and SVG) @@ -1111,7 +1119,7 @@ - **(Fix) macOS:** - Version auto-upgrade (Will only work on future releases and if running v2.16.0 or greater) - Demo file not loading - - Auto disable windows scaling factor when on Monjave or greater on new instalations + - Auto disable windows scaling factor when on Monjave or greater on new installations - (Add) Tool: Raise platform on print finish (#247) - (Add) CXDLP: Support for Halot MAX CL-133 - (Improvement) Tools: Better handling/validation of tools that are unable to run with abstraction @@ -1180,7 +1188,7 @@ - (Fix) macOS: Include libusb-1.0.0.dylib - Note: `brew install libusb` still required - **UI:** - - (Add) Shorcuts: Arrow up and down to navigate layers while layer image is on focus + - (Add) Shortcuts: Arrow up and down to navigate layers while layer image is on focus - (Fix) Refresh gcode does not update text on UI for ZIP, CWS, ZCODEX files - (Fix) Operations: Import a .uvtop file by drag and drop into the UI would not load the layer range - (Change) When convert a file, the result dialog will have Yes, No and Cancel actions, where No will open the converted file on current window, while Cancel will not perform any action (The old No behaviour) @@ -1203,7 +1211,7 @@ - (Fix) Error with 'Pattern loaded model' fails when generating more models than build plate can afford (#239) - **GCode:** - (Fix) When the last layer have no lifts and a move to top command is set on end, that value were being set incorrectly as last layer position - - (Fix) Layer parsing from mm/s to mm/m bad convertion + - (Fix) Layer parsing from mm/s to mm/m bad conversion - (Add) File formats: Setter `SuppressRebuildGCode` to disable or enable the gcode auto rebuild when needed, set this to false to manually write your own gcode - (Add) UVtools version to error logs - (Fix) ZCode: Some test files come with layer height of 0mm on a property, in that case lookup layer height on the second property as fallback @@ -1313,13 +1321,13 @@ - (Improvement) Add a check to layer `LightPWM` if 0 it will force to 255 - (Add) Allow to save the selected region (ROI) to a image file - (Update) .NET 5.0.5 to 5.0.6 -- (Fix) Getting the transposed rectangle in fliped images are offseting the position by -1 +- (Fix) Getting the transposed rectangle in flipped images are offsetting the position by -1 - (Fix) Tools: Hide ROI Region text when empty/not selected ## 13/05/2021 - v2.11.2 -- (Improvement) Applied some refactorings on code -- (Fix) MDLP, GR1 and CXDLP: Bad enconde of display width, display height and layer height properties +- (Improvement) Applied some refactoring on code +- (Fix) MDLP, GR1 and CXDLP: Bad encode of display width, display height and layer height properties ## 11/05/2021 - v2.11.1 @@ -1356,7 +1364,7 @@ - (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) Solidify 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 @@ -1404,7 +1412,7 @@ - Fix a error when generating tests with multiple exposures - Fix some typos - **XYZ accuracy test:** - - Change 'Wall thickess' default from 2.5mm to 3.0mm + - Change 'Wall thickness' default from 2.5mm to 3.0mm - (Improvement) Allow compute print time without a lift sequence ## 30/04/2021 - v2.9.2 @@ -1413,16 +1421,16 @@ - (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 + - Auto refresh issues on the vertical highlight tracker once catch 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 + - Unlock the possibility 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 + - Change previous default color from (255, 0, 255) to (81, 131, 82) for better depth perception + - Change next default color from (0, 255, 255) to (81, 249, 252) for better depth perception + - Change previous & next default color from (255, 0, 0) to (246, 240, 216) for better depth perception - **(Fix) Pixel editor:** - Modification was append instead of prepend on the list - Modification was not updating the index number on the list @@ -1452,13 +1460,13 @@ * When decoding a file and have a empty resolution (Width: 0 or Height: 0) it will auto fix it by get and set the first layer image resolution to the file * Fix when decoding a file it was already set to require a full encode, preventing fast saves on print parameters edits * **GUI:** - * When file resolution dismatch from layer resolution, it is now possible to auto fix it by set the layer resolution to the file + * When file resolution mismatch from layer resolution, it is now possible to auto fix it by set the layer resolution to the file * When loading a file with auto scan for issues disabled it will force auto scan for issues types that are instant to check (print height and empty layers), if any exists it will auto select issues tab * **(Add) PrusaSlicer printers:** * Creality HALOT-SKY CL-89 * Creality HALOT-SKY CL-60 * (Improvement) Tool - Adjust layer height: Improve the performance when multiplying layers / go with higher layer height -* (Fix) PrusaSlicer Printer - Wanhao D7: Change the auto convertion format from .zip to .xml.cws +* (Fix) PrusaSlicer Printer - Wanhao D7: Change the auto conversion format from .zip to .xml.cws ## 08/04/2021 - v2.8.4 @@ -1509,10 +1517,10 @@ * For more information see the script sample: https://github.com/sn4k3/UVtools/tree/master/UVtools.ScriptSample * To run scripts go to: Tools - Scripting * **File formats:** - * Add a check and warning when opening an file that have a diferent layer and file resolution + * Add a check and warning when opening an file that have a different layer and file resolution * **Issues:** * Add "Print height" as new type of issue detection, all layers that goes beyond maximum printer Z height will be flagged as PrintHeight issue - * Print height issues will not be automatical fixed, however user can fix it by remove some layers to counter the problem, still is recommended to resize object on slicer + * Print height issues will not be automatically fixed, however user can fix it by remove some layers to counter the problem, still is recommended to resize object on slicer * Fix unable to compute issues when only islands or overhangs are selected to be detected alone (#177) * **Settings:** * Add default directory for scripts on "General - File dialogs" @@ -1530,8 +1538,8 @@ * **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 + * Fix a bug when changing 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 cancellation 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 @@ -1539,7 +1547,7 @@ * 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 + * Add the ability 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 @@ -1552,13 +1560,13 @@ * **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 + * Fix a wrong cast causing seconds to milliseconds conversion to be caped to the wrong value + * Internally if a layer collection was replaced, all new layers will be marked as modified to avoid forgetting 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 + * Layer Import: Canceling the operation while importing layers was permanent suppressing layer properties update when changing a base property +* (Change) PrusaSlicer print profiles: Improved raft height and bottom layer count for better print success, less lamination, shorter time and reduce wear of FEP * (Scripts): Add operation "Validate" pattern to docs and examples (#172) ## 19/03/2021 - v2.7.0 @@ -1583,24 +1591,24 @@ * Change drawings brush diameter limit from 255 to 4000 maximum * When using layers below go lower than layer 0 it no longer apply the modifications * **File formats:** - * Add an internal GCodeBuilder to generate identical gcode within formats with auto convertion, managing features and parsing information + * Add an internal GCodeBuilder to generate identical gcode within formats with auto conversion, managing features and parsing information * Internally rearrange formats properties and pass values to the base class * Fix "Save As" filename when using formats with dual extensions * CBDDLP and CTB: "LightPWM" was setting "BottomLightPWM" instead * CWS: Fix problem with filenames with dots (.) and ending with numbers (#171) - * CWS: Improved the enconding and decoding performance - * CWS: Implement all available print paramenters and per layer, missing values are got from gcode interpretation + * CWS: Improved the encoding and decoding performance + * CWS: Implement all available print parameters and per layer, missing values are got from gcode interpretation * CWS: Use set "light off delay" layer value instead of calculating it * CWS: Get light off delay per layer parsed from gcode - * CWS - RGB flavour (Bene4 Mono): Warn about wrong resolution if width not multiples of 3 (#171) - * ZCode: Allow to set Bottom and Light intensity (LightPWM) on paramters and per layer + * CWS - RGB flavor (Bene4 Mono): Warn about wrong resolution if width not multiples of 3 (#171) + * ZCode: Allow to set Bottom and Light intensity (LightPWM) on parameters and per layer * ZCode: Allow to change bottom light pwm independent from normal light pwm * LGS: Light off and bottom light off was setting the value on the wrong units * UVJ: Unable to set per layer parameters * **Issues:** - * When computing islands and resin traps together, they will not compute in parallel anymore to prevent CPU and tasks exaustion, it will calculate islands first and then resin traps, this should also speed up the process on weaker machines + * When computing islands and resin traps together, they will not compute in parallel anymore to prevent CPU and tasks exhaustion, it will calculate islands first and then resin traps, this should also speed up the process on weaker machines * Gather resin trap areas together when computing for other issues to spare a decoding cycle latter - * When using a threshold for islands detection it was also appling it to the overhangs + * When using a threshold for islands detection it was also applying it to the overhangs * Fix the spare decoding conditional cycle for partial scans * Change resin trap search from parallel to sync to prevent fake detections and missing joints at cost of speed (#13) * **Tools:** @@ -1611,13 +1619,13 @@ ## 05/03/2021 - v2.6.2 -* (Add) Edit print paramenters: Option to enable or disable the 'Propagate modifications to layers' when working with global parameters +* (Add) Edit print parameters: Option to enable or disable the 'Propagate modifications to layers' when working with global parameters * (Change) PrusaSlicer printer: Auto convert format from ctb to photon for Anycubic Photon * **(Fix) Change resolution:** * It was placing the object on random layers on the wrong position, shifting the object - * Add informaton on the tool description to warn about diferent pixel pitch for target printer + * Add information on the tool description to warn about different pixel pitch for target printer * Add current pixel pitch in microns if available -* (Fix) Exposure time finder: Multiple exposures was getting bottom and normal time from base file instead of commum properties fields +* (Fix) Exposure time finder: Multiple exposures was getting bottom and normal time from base file instead of common properties fields ## 03/03/2021 - v2.6.1 @@ -1629,10 +1637,10 @@ * 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 supports dilate kernel from Ellipse 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) Tools: Set a default profile isn't working * (Fix) Redoing the last operation was not recovering the custom ROI on the operation ## 02/03/2021 - v2.6.0 @@ -1642,7 +1650,7 @@ * (Add) Extract: Output an "Layer.ini" file containing per layer data and include the Configuration.ini for Zip file formats * (Improvement) Zip: Increase the GCode parsing performance * (Fix) File formats: Wasn't set bottom / light off delay per individual layer on generic formats, defaulting every layer to 0 -* (Fix) Edit print parameters: When changing bottom layer count, layers didnt update thier properties +* (Fix) Edit print parameters: When changing bottom layer count, layers didn't update their properties ## 25/02/2021 - v2.5.1 @@ -1721,7 +1729,7 @@ * ROI calculation error leading to not process images that can potential fit inside the volumes * Out-of-bounds calculation for Stack type * Replace type was calculating out-of-bounds calculation like Stack type when is not required to and can lead to skip images - * Better image ROI colection for Insert and Replace types instead of capture the center most + * Better image ROI collection for Insert and Replace types instead of capture the center most * (Fix) Settings window: Force a redraw on open to fix auto sizes ## 12/02/2021 - v2.4.5 @@ -1733,7 +1741,7 @@ * (Change) Setting: Windows vertical margin to 60px * (Fix) Export file was getting a "Parameter count mismatch" on some file formats (#140) * (Fix) photon and cbddlp file formats with version 3 to never hash images -* (Fix) Windows was not geting the screen bounds from the active monitor +* (Fix) Windows was not getting the screen bounds from the active monitor * (Fix) Tool windows height, vertical margin and position * **(Fix) Exposure time finder:** * Text label @@ -1803,11 +1811,11 @@ * (Fix) Auto converted files from SL1 where clipping filename at first dot (.), now it only strips known extensions * (Fix) SL1 encoded files wasn't generating the right information and lead to printer crash * (Fix) PrusaSlicer printer "Anycubic Photon S" LiftSpeed was missing and contains a typo (#135) -* (Fix) PrusaSlicer profile manager wasnt marking missing profiles to be installed (#135) +* (Fix) PrusaSlicer profile manager wasn't marking missing profiles to be installed (#135) * (Fix) PrusaSlicer folder search on linux to also look at %HOME%/.config/PrusaSlicer (#135, #136) * (Fix) Operations were revised and some bug fixed, most about can't cancel the progress * (Fix) Some typos on tooltips -* (Fix) Prevent PhotonS from enconding, it will trigger error now as this format is read-only +* (Fix) Prevent PhotonS from encoding, it will trigger error now as this format is read-only * **(Fix) Ctrl + Shift + Z to redo the last operation:** * The layer range is reseted instead of pull the used values * Tool - Arithmetic always disabled @@ -1825,7 +1833,7 @@ * (Add) PrusaSlicer printer: UVtools Prusa SL1, for SL1 owners must use this profile to be UVtools compatible when using advanced tools * (Fix) Tool - Calculator - Optimal model tilt: Layer height wasn't get pulled from loaded file and fixed to 0.05mm * **(Fix) FileFormats:** - * When change a global print paramenter, it will only set this same parameter on every layer, keeping other parameters intact, it was reseting every parameter per layer to globals + * When change a global print parameter, it will only set this same parameter on every layer, keeping other parameters intact, it was reseting every parameter per layer to globals * SL1: Verify if files are malformed and if there's missing configuration files (#126) * CTBv3: Set EncryptionMode to 0x2000000F, this allow the use of per layer settings @@ -1835,7 +1843,7 @@ * **In this release is recommended to discard your printer and refresh it with uvtools updated printer or replace notes over** * (Add) FILEFORMAT_XXX variable to auto-convert to that file format once open in UVtools * (Update) Print profiles fields with new PrusaSlicer version - * (Remove) LayerOffDelay from printer notes and use only the LightOffDelay variable instead, both were being used, to avoid redundacy LayerOffDelay was dropped. Please update your printer accordingly! + * (Remove) LayerOffDelay from printer notes and use only the LightOffDelay variable instead, both were being used, to avoid redundancy LayerOffDelay was dropped. Please update your printer accordingly! * (Remove) FLIP_XY compability from printers * (Remove) AntiAlias variable from printers * **(Add) Settings - Automations:** @@ -1852,7 +1860,7 @@ * (Fix) Files with upper case extensions doesn't load in * (Add) Calculator - Optimal model tilt: Calculates the optimal model tilt angle for printing and to minimize the visual layer effect * (Add) Bottom layer count to the status bar -* (Add) ZCodex: Print paramenter light-off delay" +* (Add) ZCodex: Print parameter light-off delay" * (Change) Island Repair: "Remove Islands Below Equal Pixels" limit from 255 to 65535 (#124) * **(Fix) SL1:** * Prevent error when bottle volume is 0 @@ -1885,7 +1893,7 @@ * (Fix) Tool - Morph: Set a rectangular 3x3 kernel by default * (Fix) Tool - Blur: Set a rectangular 3x3 kernel by default * (Fix) Calibration - Elephant Foot: Include part scale on profile text -* (Fix) MSI dont store instalation path (#121) +* (Fix) MSI don't store installation path (#121) ## 03/01/2021 - v2.1.2 @@ -1898,7 +1906,7 @@ * (Add) About box: Primary screen identifier and open on screen identifier * (Add) Calibrator - External tests -* (Change) Rewrite 'Action - Import Layer(s)' to support file formats and add the followig importation types: +* (Change) Rewrite 'Action - Import Layer(s)' to support file formats and add the following importation types: * **Insert:** Insert layers. (Requires images with bounds equal or less than file resolution) * **Replace:** Replace layers. (Requires images with bounds equal or less than file resolution) * **Stack:** Stack layers content. (Requires images with bounds equal or less than file resolution) @@ -1914,8 +1922,8 @@ * (Add) Tool - Redraw model/supports: Redraw the model or supports with a set brightness. This requires an extra sliced file from same object but without any supports and raft, straight to the build plate. * (Add) Tool - Raft Relief: - * Allow ignore a number of layer(s) to start only after that number, detault is 0 - * Allow set a pixel brightness for the operation, detault is 0 + * Allow ignore a number of layer(s) to start only after that number, default is 0 + * Allow set a pixel brightness for the operation, default is 0 * New "dimming" type, works like relief but instead of drill raft it set to a brightness level * (Add) Arch-x64 package (#104) * (Fix) A OS dependent startup crash when there's no primary screen set (#115) @@ -1960,7 +1968,7 @@ This release bump the major version due the introduction of .NET 5.0, the discon * (Fix) When unable to save the file it will change extension and not delete the temporary file * (Fix) Pixel dimming wasn't saving all the fields on profiles * (Fix) Prevent a rare startup crash when using demo file -* (Fix) Tool - Solifiy: Increase AA clean up threshold range, previous value wasn't solidifing when model has darker tones +* (Fix) Tool - Solidify: Increase AA clean up threshold range, previous value wasn't solidifying when model has darker tones * (Fix) Sanitize per layer settings, due some slicers are setting 0 at some properties that can cause problems with UVtools calculations, those values are now sanitized and set to the general value if 0 * (Fix) Update partial islands: * Was leaving visible issues when the result returns an empty list of new issues @@ -2007,7 +2015,7 @@ This release bump the major version due the introduction of .NET 5.0, the discon * (Add) Tools: Warn where layer preview is critical for use the tool, must disable layer rotation first (#100) * (Add) CWS: Bottom lift speed property * (Add) CWS: Support Wanhao Workshop CWX and Wanhao Creation Workshop file types (#98) -* (Add) CWS: Split format into virtual extensions (.cws, .rgb.cws, .xml.cws) to support diferent file formats and diferent printers under same main .cws extensions. That will affect file converts only to let UVtools know what type of encoding to use. Load and save a xxx.cws file will always auto decode/encode the file for the correct target format no matter the extension. +* (Add) CWS: Split format into virtual extensions (.cws, .rgb.cws, .xml.cws) to support different file formats and different printers under same main .cws extensions. That will affect file converts only to let UVtools know what type of encoding to use. Load and save a xxx.cws file will always auto decode/encode the file for the correct target format no matter the extension. * (Improvement) CWS: It no longer search for a specific filename in the zip file, instead it look for extension to get the files to ensure it always found them no matter the file name system * (Fix) CWS: When "Save as" the file were generating sub files with .cws extension, eg: filename0001.cws.png * (Change) Allow read empty layers without error from Anycubic files (PWS, PW0, PWxx) due a bug on slicer software under macOS @@ -2032,7 +2040,7 @@ This release bump the major version due the introduction of .NET 5.0, the discon * (Add) Pixel area as "px²" to the layer bounds and ROI at layer bottom information bar * (Add) Pixel dimming: Alternate pattern every x layers * (Add) Pixel dimming: Lattice infill -* (Add) Solidify: Required minimum/maximum area to solidify found areas (Default values will produce the old behaviour) +* (Add) Solidify: Required minimum/maximum area to solidify found areas (Default values will produce the old behavior) * (Add) Issues: Allow to hide and ignore selected issues * (Add) Issue - Touch boundary: Allow to configure Left, Top, Right, Bottom margins in pixels, defaults to 5px (#94) * (Add) UVJ: Allow convert to another formats (#96) @@ -2045,10 +2053,10 @@ This release bump the major version due the introduction of .NET 5.0, the discon * (Fix) Issues: Detect button has a incorrect "save" icon * (Fix) SL1: Increase NumSlow property limit * (Fix) UVJ: not decoding nor showing preview images -* (Fix) "Convert to" menu shows same options than previous loaded file when current file dont support convertions (#96) +* (Fix) "Convert to" menu shows same options than previous loaded file when current file don't support conversions (#96) * (Fix) Hides "Convert to" menu when unable to convert to another format (#96) * (Fix) Program crash when demo file is disabled and tries to load a file in -* (Fix) Rare crash on startup when mouse dont move in startup period and user types a key in meanwhile +* (Fix) Rare crash on startup when mouse don't move in startup period and user types a key in meanwhile * (Fix) On a slow startup on progress window it will show "Decoded layers" as default text, changed to "Initializing" ## 08/11/2020 - v1.2.1 @@ -2066,7 +2074,7 @@ This release bump the major version due the introduction of .NET 5.0, the discon * (Add) Clipboard manager: Undo (Ctrl + Z) and Redo (Ctrl + Y) modifications (Memory optimized) * (Add) Current layer properties on information tab * (Fix) Long windows with system zoom bigger than 100% were being hidden and overflow (#90) -* (Fix) Do not recompute issues nor properties nor reshow layer if operation is cancelled or failed +* (Fix) Do not recompute issues nor properties nor reshow layer if operation is canceled or failed ## 05/11/2020 - v1.1.3 @@ -2099,7 +2107,7 @@ On Windows the user must close all instances and continue with the shown MSI ins * (Change) Deploy UVtools self-contained per platform specific: (#89) * Platform optimized * Reduced the package size - * Includes .NET Core assemblies and dont require the installation of .NET Core + * Includes .NET Core assemblies and don't require the installation of .NET Core * Can execute UVtools by double click on "UVtools" file or via "./UVtools" on terminal * **Naming:** UVtools_[os]-[architecture]_v[version].zip * **"universal"** zip file that includes the portable version, os and architecture independent but requires dotnet to run, these build were used in all previous versions @@ -2127,7 +2135,7 @@ On Windows the user must close all instances and continue with the shown MSI ins * (Change) When converting to photon or cbddlp, version 2 of the file will be used * (Change) New logo, thanks to (Vinicius Silva @photonsters) * (Fix) MSI installer was creating multiple entries/uninstallers on windows Apps and Features (#79) -* (Fix) Release builder script (CreateRelease.WPF.ps1): Replace backslash with shash for zip releases (#82) +* (Fix) Release builder script (CreateRelease.WPF.ps1): Replace backslash with slash for zip releases (#82) * (Fix) CWS file reader when come from Chitubox (#84) * (Fix) CWS was introducing a big delay after each layer, LiftHeight was being used 2 times instead of LiftSpeed (#85) * (Fix) CWS fix Build Direction property name, was lacking a whitespace @@ -2161,7 +2169,7 @@ On Windows the user must close all instances and continue with the shown MSI ins * (Add) Fullscreen support (F11) * (Change) GUI was rewritten from Windows Forms to WPF Avalonia, C# * (Improvement) GUI is now scalable -* (Fix) Some bug found and fixed during convertion +* (Fix) Some bug found and fixed during conversion ## 14/10/2020 - v0.8.6.0 @@ -2182,7 +2190,7 @@ On Windows the user must close all instances and continue with the shown MSI ins ## 13/10/2020 - v0.8.4.3 * (Add) Tool - Layer repair: Allow remove islands recursively (#74) -* (Fix) Pixel Editor: Cursor dimentions when using brushes with thickness > 1 (#73) +* (Fix) Pixel Editor: Cursor dimensions when using brushes with thickness > 1 (#73) ## 10/10/2020 - v0.8.4.2 @@ -2226,7 +2234,7 @@ On Windows the user must close all instances and continue with the shown MSI ins * (Fix) PrusaSlicer Printer: Phrozen Shuffle Lite - display width/height * (Fix) All PrusaSlicer Printers were reviewed and some bugs were fixed * (Fix) Chitubox 3D preview when use files converted with UVtools (#68) -* (Fix) Overhangs: False-positives when previous or current layer has draker pixels, it now threshold pixels before proceed (#64) +* (Fix) Overhangs: False-positives when previous or current layer has darker pixels, it now threshold pixels before proceed (#64) * (Change) Tools: Placed "Threshold" menu item after "Morph" ## 30/09/2020 - v0.8.3.0 @@ -2269,8 +2277,8 @@ On Windows the user must close all instances and continue with the shown MSI ins * (Improvement) When unable to convert a format from SL1 to other, advice users to check used printer on PrusaSlicer (#60) * (Improvement) Information on "Install profiles on PrusaSlicer" (#60) * (Fix) LGS: Change resolution tool was defining wrong Y -* (Fix) ctb and pws: Renders a bad file after save, this was introduced with cancelled saves feature -* (Fix) When cancel a file convertion, it now deletes the target file +* (Fix) ctb and pws: Renders a bad file after save, this was introduced with canceled saves feature +* (Fix) When cancel a file conversion, it now deletes the target file ## 13/09/2020 - v0.8.2.0 @@ -2285,9 +2293,9 @@ On Windows the user must close all instances and continue with the shown MSI ins * (Change) Customized cursor for Pixel Edit mode (#51) * (Change) Layer overlay tooltip is now semi-transparent * (Change) File - Save As is always available (#56) -* (Fix) File - Save when cancelled no longer keep a invalid file, old restored (#54) -* (Fix) File - Save As when cancelled no longer keep a invalid file, that will be deleted (#54, #55) -* (Fix) When a operation is cancelled affected layers will revert to the original form (#57) +* (Fix) File - Save when canceled no longer keep a invalid file, old restored (#54) +* (Fix) File - Save As when canceled no longer keep a invalid file, that will be deleted (#54, #55) +* (Fix) When a operation is canceled affected layers will revert to the original form (#57) * (Fix) Misc. text cleanup (#52, #53, #58) ## 12/09/2020 - v0.8.1.0 @@ -2316,7 +2324,7 @@ On Windows the user must close all instances and continue with the shown MSI ins * (Add) Layer issue Z map paired with layer navigation tracker bar * (Add) Setting: Pixel editor can be configured to exit after each apply operation (#45) * (Add) More abstraction on GUI and operations -* (Add) Verbose log - More a developer feature to cath bugs +* (Add) Verbose log - More a developer feature to catch bugs * (Improvement) Redesign tools and mutator windows * (Improvement) Erode, dilate, gap closing and noise removal converted into one window (Morph model) * (Improvement) Convert add edit parameters into one tool window, edit all at once now @@ -2332,7 +2340,7 @@ Less frequently used settings for gap and noise removal iterations have been mov * (Change) Tool - Rotate - icon * (Upgrade) OpenCV from 4.2 to 4.3 * (Upgrade) BinarySerializer from 8.5.2 to 8.5.3 -* (Remove) Menu - Tools - Layer Removal and Layer clone for redudancy they now home at layer preview toolbar under "Actions" dropdown button +* (Remove) Menu - Tools - Layer Removal and Layer clone for redundancy they now home at layer preview toolbar under "Actions" dropdown button * (Fix) CWS: Add missing Platform X,Y,Z size when converting from SL1 * (Fix) CWS: Invert XY resolution when converting from SL1 * (Fix) Layer Preview: When selecting issues using SHIFT in the layer preview, the selected issue doesn't update in the issue list until after shift is released and slow operation @@ -2390,7 +2398,7 @@ Less frequently used settings for gap and noise removal iterations have been mov * Shift-Left-Click will perform an add operations (add pixel, text, etc). * Shift-Right-Click will perform a remove operation (remove pixel, etc). * (Change) Mouse coordinates on status bar now only change when SHIFT key is press, this allow to lock a position for debug -* (Remove) Confirmation for detect issues as they can now be cancelled +* (Remove) Confirmation for detect issues as they can now be canceled * (Fix) When next layer or previous layer button got disabled while pressing it get stuck * (Fix) Partial island detection wasn't checking next layer as it should * (Fix) chitubox: Keep some original values when read from chitubox sliced files @@ -2417,7 +2425,7 @@ Less frequently used settings for gap and noise removal iterations have been mov * (Add) Elapsed time to the Log list * (Add) Setting - Issues - Islands: Allow diagonal bonds with default to false (#22, #23) * (Change) Tool - Repair Layers: Allow set both iterations to 0 to skip closing and opening operations and allow remove islands independently -* (Change) Title - file open time from miliseconds to seconds +* (Change) Title - file open time from milliseconds to seconds * (Improvement) Tool - Repair Layers: Layer image will only read/save if required and if current layer got modified * (Fix) Setting - Issues - Islands: "Pixels below this value will turn black, otherwise white" (Threshold) was not using the set value and was forcing 1 * (Fix) Remove duplicated log for repair layers and issues @@ -2487,7 +2495,7 @@ Less frequently used settings for gap and noise removal iterations have been mov * (Add) Tool: Layer Repair - Allow remove islands below or equal to a pixel count (Suggested by: Nicholas Taylor) * (Add) Issues: Allow sort columns by click them (Suggested by: Nicholas Taylor) * (Improvement) Tool: Pattern - Prevent open this tool when unable to pattern due lack of space -* (Fix) Tool: Layer Repair - When issues are not caculated before, they are computed but user settings are ignored +* (Fix) Tool: Layer Repair - When issues are not calculated before, they are computed but user settings are ignored ## 24/07/2020 - v0.6.3.2 @@ -2510,7 +2518,7 @@ Less frequently used settings for gap and noise removal iterations have been mov * (Add) Pixel Editor: Double click items will track and position over the draw * (Fix) Pixel Editor: Label "Operations" was not reset to 0 after apply the modifications * (Fix) Pixel Editor: Button "Remove" tooltip -* (Fix) Pixel Editor: Drawing - Bursh Area - px to px² +* (Fix) Pixel Editor: Drawing - Brush Area - px to px² ## 19/07/2020 - v0.6.3.0 @@ -2527,11 +2535,11 @@ Less frequently used settings for gap and noise removal iterations have been mov * (Add) Toolbar and pushed layer information to bottom * (Add) Information: Cure pixel count per layer and percentage against total lcd pixels * (Add) Information: Bounds per layer -* (Add) Zip: Compability with Formware zip files +* (Add) Zip: Compatibility with Formware zip files ## 14/07/2020 - v0.6.2.2 -* (Add) cbddlp, photon and ctb version 3 compability (Chitubox >= 1.6.5) +* (Add) cbddlp, photon and ctb version 3 compatibility (Chitubox >= 1.6.5) ## 14/07/2020 - v0.6.2.1 @@ -2543,9 +2551,9 @@ Less frequently used settings for gap and noise removal iterations have been mov * (Add) PrusaSlicer Printer: Creality LD-002H * (Add) PrusaSlicer Printer: Voxelab Polaris * (Add) File Format: UVJ (#8) -* (Add) Mutataor: Pixel Dimming +* (Add) Mutator: Pixel Dimming * (Add) Pixel Editor tab with new drawing functions -* (Add) Pixel Editor: Bursh area and shape +* (Add) Pixel Editor: Brush area and shape * (Add) Pixel Editor: Supports * (Add) Pixel Editor: Drain holes * (Add) Settings for pixel editor @@ -2554,7 +2562,7 @@ Less frequently used settings for gap and noise removal iterations have been mov * (Add) Setting: File extract default directory * (Add) Setting: File convert default directory * (Add) Setting: File save prompt for overwrite (#10) -* (Add) Setting: File save preffix and suffix name +* (Add) Setting: File save prefix and suffix name * (Add) Setting: UVtools version to the title bar * (Improvement) Force same directory as input file on dialogs * (Improvement) Pattern: Better positioning when not using an anchor, now it's more center friendly @@ -2614,7 +2622,7 @@ Less frequently used settings for gap and noise removal iterations have been mov * (Add) Outline - Layer bounds * (Add) Outline - Hollow areas * (Add) Double click layer picture to Zoom To Fit -* (Improvement) Huge performance boost in layer reparing and in every mutator +* (Improvement) Huge performance boost in layer repairing and in every mutator * (Improvement) Layer preview is now faster * (Improvement) Islands detection is now better and don't skip any pixel, more islands will show or the region will be bigger * (Improvement) Islands search are now faster, it will jump from island to island instead of search in every pixel by pixel @@ -2628,7 +2636,7 @@ Less frequently used settings for gap and noise removal iterations have been mov * (Removed) ImageSharp dependency * (Removed) UVtools.Parser project * (Fix) Nova3D Elfin printer values changed to Display Width : 131mm / Height : 73mm & Screen X: 2531 / Y: 1410 (#5) -* (Fix) Fade resizes make image offset a pixel from layer to layer because of integer placement, now it matain the correct position +* (Fix) Fade resizes make image offset a pixel from layer to layer because of integer placement, now it maintain the correct position * (Fix) sl1: AbsoluteCorrection, GammaCorrection, MinExposureTime, MaxExposureTime, FastTiltTime, SlowTiltTime and AreaFill was byte and float values prevents the file from open (#4) * (Fix) zcodex: XCorrection and YCorrection was byte and float values prevents the file from open (#4) * (Fix) cws: XCorrection and YCorrection was byte and float values prevents the file from open (#4) @@ -2659,10 +2667,10 @@ Less frequently used settings for gap and noise removal iterations have been mov * (Add) Button save layer image to Clipboard * (Change) Go to issue now zoom at bounding area instead of first pixels -* (Change) Layer navigation panel width increased in 20 pixels, in some cases it was overlaping the slider +* (Change) Layer navigation panel width increased in 20 pixels, in some cases it was overlapping the slider * (Change) Actual layer information now have a depth border * (Change) Increased main GUI size to X: 1800 and Y: 850 pixels -* (Change) If the GUI window is bigger than current screen resolution, it will start maximized istead +* (Change) If the GUI window is bigger than current screen resolution, it will start maximized instead * (Fix) cbddlp: AntiAlias is number of _greys_, not number of significant bits (ezrec/uv3dp#75) * (Fix) Outline not working as before, due a forget to remove test code @@ -2671,7 +2679,7 @@ Less frequently used settings for gap and noise removal iterations have been mov * (Add) Able to install only the desired profiles and not the whole lot (Suggested by: Ingo Strohmenger) * (Add) Update manager for PrusaSlicer profiles * (Add) If PrusaSlicer not installed on system it prompt for installation (By open the official website) -* (Fix) Prevent profiles instalation when PrusaSlicer is not installed on system +* (Fix) Prevent profiles installation when PrusaSlicer is not installed on system * (Fix) The "Issues" computation sometimes fails triggering an error due the use of non concurrent dictionary * (Fix) Print profiles won't install into PrusaSlicer @@ -2721,7 +2729,7 @@ Less frequently used settings for gap and noise removal iterations have been mov * (Add) Show current layer and height near tracker position * (Add) Auto compute issues when click "Issues" tab for the first time for the open file * (Add) "AntiAliasing_x" note under PrusaSlicer printer to enable AntiAliasing on supported formats, printers lacking this note are not supported -* (Add) AntiAliasing capable convertions +* (Add) AntiAliasing capable conversions * (Add) Touching Bounds detection under issues * (Change) Scroll bar to track bar * (Change) Keyword "LiftingSpeed" to "LiftSpeed" under PrusaSlicer notes (Please update printers notes or import them again) @@ -2734,7 +2742,7 @@ Less frequently used settings for gap and noise removal iterations have been mov * (Improvement) Smooth mutators descriptions * (Improvement) Disallow invalid iteration numbers for smooth mutators * (Improvement) File reload now reshow current layer after reload -* (Improvement) Some dependecies were updated and ZedGraph removed +* (Improvement) Some dependencies were updated and ZedGraph removed * (Fix) AntiAlias decodes for photon and cbddlp * (Fix) AntiAlias encodes and decodes for cbt * (Fix) Save the preview thumbnail image trigger an error @@ -2774,11 +2782,11 @@ Less frequently used settings for gap and noise removal iterations have been mov * (Add) "Detect" text to compute layers button * (Add) "Repair" islands button on Islands tab * (Add) "Highlight islands" button on layer toolbar -* (Add) Possible error cath on island computation +* (Add) Possible error catch on island computation * (Add) After load new file layer is rotated or not based on it width, landscape will not rotate while portrait will * (Improvement) Highlighted islands now also show AA pixels as a darker yellow * (Improvement) Island detection now need a certain number of touching pixels to consider a island or not, ie: it can't lay on only one pixel -* (Fix) Island detection now don't consider dark fadded AA pixels as safe land +* (Fix) Island detection now don't consider dark faded AA pixels as safe land * (Fix) Epax X1 printer properties ## 03/06/2020 - v0.4.2 - Beta @@ -2794,9 +2802,9 @@ Less frequently used settings for gap and noise removal iterations have been mov ## 01/06/2020 - v0.4.1 - Beta * (Add) Opening, Closing and Gradient Mutators -* (Add) Choose layer range when appling a mutator #1 -* (Add) Choose iterations range/fading when appling a mutator (Thanks to Renos Makrosellis) -* (Add) Global and unhandled exceptions are now logged to be easier to report a bug +* (Add) Choose layer range when applying a mutator #1 +* (Add) Choose iterations range/fading when applying a mutator (Thanks to Renos Makrosellis) +* (Add) Global and unhanded exceptions are now logged to be easier to report a bug * (Change) Current layer and layer count text was reduced by 1 to match indexes on mutators * (Improvement) Better mutator dialogs and explanation * (Improvement) Compressed GUI images size @@ -2822,12 +2830,12 @@ Less frequently used settings for gap and noise removal iterations have been mov * (Fix) SL1 files not accepting float numbers for exposures * (Fix) SL1 files was calculating the wrong layer count when using slow layer settings * (Fix) Modifiers can't accept float values -* (Fix) Sonic Mini prints mirroed +* (Fix) Sonic Mini prints mirrored * (Fix) Layer resolution shows wrong values ## 21/05/2020 - v0.3.3.1 - Beta -* (Fix) Unable to convert Chitubox or PHZ files when enconter repeated layer images +* (Fix) Unable to convert Chitubox or PHZ files when encounter repeated layer images ## 19/05/2020 - v0.3.3 - Beta @@ -2835,15 +2843,15 @@ Less frequently used settings for gap and noise removal iterations have been mov * (Add) "Phrozen Sonic Mini" printer * (Add) Convert Chitubox files to PHZ files and otherwise * (Add) Convert Chitubox and PHZ files to ZCodex -* (Add) Elapsed seconds to convertion and extract dialog +* (Add) Elapsed seconds to conversion and extract dialog * (Improvement) "Convert To" menu now only show available formats to convert to, if none menu is disabled * (Fix) Enforce cbt encryption -* (Fix) Not implemented convertions stay processing forever +* (Fix) Not implemented conversions stay processing forever ## 11/05/2020 - v0.3.2 - Beta -* (Add) Show layer differences where daker pixels were also present on previous layer and the white pixels the difference between previous and current layer. +* (Add) Show layer differences where darker pixels were also present on previous layer and the white pixels the difference between previous and current layer. * (Add) Layer preview process time in milliseconds * (Add) Long operations no longer freeze the GUI and a progress message will shown on those cases * (Improvement) Cache layers were possible for faster operation @@ -2851,7 +2859,7 @@ Less frequently used settings for gap and noise removal iterations have been mov * (Improvement) Speed up extraction with parallelism * (Improvement) Extract output folder dialog now open by default on from same folder as input file * (Improvement) Extract now create a folder with same file name to dump the content -* (Fix) Extract to folder was wiping the target folder, this is now disabled to prevent acidental data lost, target files will be overwritten +* (Fix) Extract to folder was wiping the target folder, this is now disabled to prevent accidental data lost, target files will be overwritten ## 30/04/2020 - v0.3.1 - Beta @@ -2864,9 +2872,9 @@ Less frequently used settings for gap and noise removal iterations have been mov * (Improvement) Optimized layer read from cbddlp file * (Improvement) Add layer hash code to encoded Chitubox layers in order to optimize file size in case of repeated layer images * (Improvement) GUI thumbnail preview now auto scale splitter height to a max of 400px when change thumbnail -* (Improvement) After convertion program prompt for open the result file in a new window +* (Improvement) After conversion program prompt for open the result file in a new window * (Change) Move layer rotate from view menu to layer menu -* (Change) Cbbdlp convertion name to Chitubox +* (Change) Cbbdlp conversion name to Chitubox * (Change) On convert, thumbnails are now resized to match exactly the target thumbnail size * (Change) GUI will now show thumbnails from smaller to larger * (Fix) RetractFeedrate was incorrectly used instead of LiftFeedrate on Zcodex gcode @@ -2876,10 +2884,10 @@ Less frequently used settings for gap and noise removal iterations have been mov * (Add) zcodex file format * (Add) Zortrax Inkspire Printer * (Add) Properties menu -- Shows total keys and allow save information to a file -* (Add) "GCode" viewer Tab -- Only for formats that incldue gcode into file (ie: zcodex) +* (Add) "GCode" viewer Tab -- Only for formats that include gcode into file (ie: zcodex) * (Add) Save gcode to a text file * (Add) Allow to vertical arrange height between thumbnails and properties -* (Improvement) Thumbnail section is now hidden if no thumbnails avaliable +* (Improvement) Thumbnail section is now hidden if no thumbnails available * (Improvement) Thumbnail section now vertical auto scales to the image height on file load * (Improvement) On "modify properties" window, ENTER key can now be used to accept and submit the form * (Fixed) Current model height doesn't calculate when viewing cbddlp files @@ -2893,7 +2901,7 @@ Less frequently used settings for gap and noise removal iterations have been mov * (Add) File -> Reload * (Add) File -> Save * (Add) File -> Save As -* (Add) Can now ajust some print properties +* (Add) Can now adjust some print properties * (Add) 'Initial Layer Count' to status bar * (Add) Allow cbbdlp format to extract 'File -> Extract' * (Add) Thumbnail resolution label @@ -2910,7 +2918,7 @@ Less frequently used settings for gap and noise removal iterations have been mov * (Add) Rotate layer image * (Add) Close file * (Change) more abstraction -* (Change) from PNG to BMP compression to speed up bitmap coversion +* (Change) from PNG to BMP compression to speed up bitmap conversion * (Change) Faster layer preview ## 12/04/2020 - v0.2 - Beta diff --git a/PrusaSlicer/printer/Peopoly Phenom Forge.ini b/PrusaSlicer/printer/Peopoly Phenom Forge.ini new file mode 100644 index 0000000..08fba78 --- /dev/null +++ b/PrusaSlicer/printer/Peopoly Phenom Forge.ini @@ -0,0 +1,41 @@ +# generated by PrusaSlicer 2.4.2+win64 on 2022-09-05 at 16:45:08 UTC +absolute_correction = 0 +area_fill = 50 +bed_custom_model = +bed_custom_texture = +bed_shape = 0x0,288x0,288x162,0x162 +default_sla_material_profile = Prusa Orange Tough 0.05 +default_sla_print_profile = 0.05 Normal +display_height = 162 +display_mirror_x = 1 +display_mirror_y = 0 +display_orientation = landscape +display_pixels_x = 5760 +display_pixels_y = 3240 +display_width = 288 +elefant_foot_compensation = 0.2 +elefant_foot_min_width = 0.2 +fast_tilt_time = 5 +gamma_correction = 1 +host_type = octoprint +inherits = Original Prusa SL1 +max_exposure_time = 120 +max_initial_exposure_time = 300 +max_print_height = 350 +min_exposure_time = 1 +min_initial_exposure_time = 1 +print_host = +printer_model = SL1 +printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_SL1\nPRINTER_VENDOR_PEOPOLY\nPRINTER_MODEL_PHENOM_FORGE\nFILEFORMAT_OSF\n\nSTART_CUSTOM_VALUES\nBottomWaitTimeBeforeCure_3\nWaitTimeBeforeCure_2.5\nBottomWaitTimeAfterCure_3\nWaitTimeAfterCure_1\nBottomLiftHeight_7\nLiftHeight_5\nBottomLiftSpeed_80\nLiftSpeed_80\nBottomWaitTimeAfterLift_0\nWaitTimeAfterLift_0\nRetractSpeed_150\nBottomLightPWM_255\nLightPWM_255\nEND_CUSTOM_VALUES +printer_settings_id = +printer_technology = SLA +printer_variant = default +printer_vendor = +printhost_apikey = +printhost_cafile = +relative_correction = 1,1 +relative_correction_x = 1 +relative_correction_y = 1 +relative_correction_z = 1 +slow_tilt_time = 8 +thumbnails = 400x400,800x480 diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md index f55bf64..fbedafa 100644 --- a/RELEASE_NOTES.md +++ b/RELEASE_NOTES.md @@ -1,12 +1,13 @@ -- **File formats:** - - **Anycubic file format:** - - (Add) Compatibility with the next version 517 of the format - - (Improvement) Discovered and implemented more unknown fields - - (Improvement) Dispose layer RLE bytes after encoding - - (Fix) When creating or converting to anycubic file, it don't set the extra table mark name - - (Fix) Only attempt to activate the advanced mode (TSMC) when the BottomLiftHeight2 or LiftHeight2 gets changed - - (Add) Methods: `OnBeforeEncode` and `OnAfterEncode` - - (Improvement) `IsUsingTSMC` now also checks for BottomLiftHeight2 and BottomRetractHeight2 - - (Fix) OSF: Can't decode some files -- (Fix) Undo cause application to crash (#543) +- **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) diff --git a/UVtools.Core/Extensions/EmguExtensions.cs b/UVtools.Core/Extensions/EmguExtensions.cs index abf84de..b39f829 100644 --- a/UVtools.Core/Extensions/EmguExtensions.cs +++ b/UVtools.Core/Extensions/EmguExtensions.cs @@ -284,10 +284,10 @@ public static class EmguExtensions /// Fill a mat span with a color /// /// Mat to fill - /// Start position, this reference will increment by the + /// Start position, this reference will increment by the /// Length to fill /// Color to fill with - /// Ignore and sum to if is less than the threshold value + /// Ignore and fill to if is less than the threshold value public static void FillSpan(this Mat mat, ref int startPosition, int length, byte color, byte colorFillMinThreshold = 1) { if (length <= 0) return; @@ -309,7 +309,7 @@ public static class EmguExtensions /// /// Length to fill /// Color to fill with - /// Ignore and sum to if is less than the threshold value + /// Ignore and set to if is less than the threshold value public static void FillSpan(this Mat mat, int x, int y, int length, byte color, byte colorFillMinThreshold = 1) { if (length <= 0 || color < colorFillMinThreshold) return; // Ignore threshold (mostly if blacks), spare cycles @@ -323,7 +323,7 @@ public static class EmguExtensions /// /// Length to fill /// Color to fill with - /// Ignore and sum to if is less than the threshold value + /// Ignore and fill to if is less than the threshold value public static void FillSpan(this Mat mat, Point position, int length, byte color, byte colorFillMinThreshold = 1) => mat.FillSpan(position.X, position.Y, length, color, colorFillMinThreshold); #endregion @@ -544,7 +544,7 @@ public static class EmguExtensions /// /// Source to be copied to /// Size of the center offset - /// Target to paste the + /// Target to paste the public static void CopyCenterToCenter(this Mat src, Size size, Mat dst) { var srcRoi = src.RoiFromCenter(size); @@ -556,7 +556,7 @@ public static class EmguExtensions /// /// Source to be copied to /// Region to copy - /// Target to paste the + /// Target to paste the public static void CopyRegionToCenter(this Mat src, Rectangle region, Mat dst) { var srcRoi = src.Roi(region); @@ -567,7 +567,7 @@ public static class EmguExtensions /// Copy a to center of other /// /// Source to be copied to - /// Target to paste the + /// Target to paste the public static void CopyToCenter(this Mat src, Mat dst) { var srcStep = src.GetRealStep(); @@ -773,7 +773,7 @@ public static class EmguExtensions } /// - /// Finds the first pixel that is + /// Finds the first pixel that is /// /// /// @@ -793,7 +793,7 @@ public static class EmguExtensions } /// - /// Finds the first pixel that is at less than + /// Finds the first pixel that is at less than /// /// /// @@ -813,7 +813,7 @@ public static class EmguExtensions } /// - /// Finds the first pixel that is at less or equal than + /// Finds the first pixel that is at less or equal than /// /// /// @@ -833,7 +833,7 @@ public static class EmguExtensions } /// - /// Finds the first pixel that is at greater than + /// Finds the first pixel that is at greater than /// /// /// @@ -853,7 +853,7 @@ public static class EmguExtensions } /// - /// Finds the first pixel that is at equal or greater than + /// Finds the first pixel that is at equal or greater than /// /// /// @@ -902,6 +902,7 @@ public static class EmguExtensions /// /// /// + /// /// public static void Rotate(this Mat src, Mat dst, double angle, Size newSize = default, double scale = 1.0) { diff --git a/UVtools.Core/Extensions/FileStreamExtensions.cs b/UVtools.Core/Extensions/FileStreamExtensions.cs index 12fb0d8..2994c17 100644 --- a/UVtools.Core/Extensions/FileStreamExtensions.cs +++ b/UVtools.Core/Extensions/FileStreamExtensions.cs @@ -158,7 +158,6 @@ public static class FileStreamExtensions /// /// /// - /// public static void SeekDoWorkAndRewind(this FileStream fs, long offset, Action action) => fs.SeekDoWorkAndRewind(offset, SeekOrigin.Begin, action); diff --git a/UVtools.Core/Extensions/TypeExtensions.cs b/UVtools.Core/Extensions/TypeExtensions.cs index 1c52839..39be38e 100644 --- a/UVtools.Core/Extensions/TypeExtensions.cs +++ b/UVtools.Core/Extensions/TypeExtensions.cs @@ -19,6 +19,7 @@ public static class TypeExtensions /// Creates a new instance of this type /// /// + /// public static object? CreateInstance(this Type type, params object[]? paramArray) { return Activator.CreateInstance(type, paramArray); @@ -30,7 +31,7 @@ public static class TypeExtensions /// Target type /// /// - /// New instance of + /// New instance of {T} public static T? CreateInstance(this Type type, params object[]? paramArray) { var instance = Activator.CreateInstance(type, paramArray); diff --git a/UVtools.Core/Extensions/ZipArchiveExtensions.cs b/UVtools.Core/Extensions/ZipArchiveExtensions.cs index 8345a74..050b3d6 100644 --- a/UVtools.Core/Extensions/ZipArchiveExtensions.cs +++ b/UVtools.Core/Extensions/ZipArchiveExtensions.cs @@ -99,7 +99,7 @@ public static class ZipArchiveExtensions /// /// The root of where the file is going /// - /// True to preserve full name and create all directories up to the file, otherwise false to extract the file just to + /// True to preserve full name and create all directories up to the file, otherwise false to extract the file just to /// /// Specifies how we are going to handle an existing file. /// The default is Overwrite.IfNewer. @@ -162,6 +162,7 @@ public static class ZipArchiveExtensions /// /// Specifies how we are going to handle an existing archive /// + /// /// /// Specifies what type of compression to use - defaults to Optimal /// diff --git a/UVtools.Core/FileFormats/FileFormat.cs b/UVtools.Core/FileFormats/FileFormat.cs index a49b7d4..bf4fdca 100644 --- a/UVtools.Core/FileFormats/FileFormat.cs +++ b/UVtools.Core/FileFormats/FileFormat.cs @@ -3168,7 +3168,7 @@ public abstract class FileFormat : BindableBase, IDisposable, IEquatable /// /// Extension to check without the dot (.) - /// True if is a full file path, otherwise false for extension only + /// True if is a full file path, otherwise false for extension only /// True if valid, otherwise false public bool IsExtensionValid(string extension, bool isFilePath = false) { @@ -3360,11 +3360,12 @@ public abstract class FileFormat : BindableBase, IDisposable, IEquatable - /// Sets a property value attributed to + /// Sets a property value attributed to /// /// Modifier to use /// Value to set - /// True if set, otherwise false = not found + /// True if set, otherwise false not found public bool SetValueFromPrintParameterModifier(PrintParameterModifier modifier, decimal value) { if (ReferenceEquals(modifier, PrintParameterModifier.BottomLayerCount)) @@ -4496,8 +4497,9 @@ public abstract class FileFormat : BindableBase, IDisposable, IEquatable - /// Attempt to set wait time before cure if supported, otherwise fallback to light-off delay + /// Attempt to set wait time before cure if supported, otherwise fall-back to light-off delay /// + /// True to set to bottom properties, otherwise false /// The time to set /// When true and time is zero, it will calculate light-off delay without extra time, otherwise false to set light-off delay to 0 when time is 0 public void SetWaitTimeBeforeCureOrLightOffDelay(bool isBottomLayer, float time = 0, bool zeroLightOffDelayCalculateBase = false) @@ -4601,10 +4603,11 @@ public abstract class FileFormat : BindableBase, IDisposable, IEquatable /// + /// /// The new Layer array public Layer[] AllocateFromMat(Mat[] mats, OperationProgress? progress = null) { @@ -5418,6 +5422,7 @@ public abstract class FileFormat : BindableBase, IDisposable, IEquatable /// + /// /// /// The new Layer array public Layer[] AllocateAndSetFromMat(Mat[] mats, OperationProgress? progress = null) { diff --git a/UVtools.Core/FileFormats/OSFFile.cs b/UVtools.Core/FileFormats/OSFFile.cs index 551b2e0..028fb8d 100644 --- a/UVtools.Core/FileFormats/OSFFile.cs +++ b/UVtools.Core/FileFormats/OSFFile.cs @@ -44,31 +44,7 @@ public class OSFFile : FileFormat [FieldEndianness(Endianness.Big)] public byte ImageLog { get; set; } = 2; - /// - /// 148 * 80 * 2 - /// - //[FieldOrder(3)] public UInt24BigEndian Preview1Length { get; set; } = new(23680); - //[FieldOrder(3)] [FieldCount(nameof(UInt24BigEndian.Value), )] public UInt24BigEndian Preview1sssLength { get; set; } = new(23680); - /*[FieldOrder(3)] - [FieldEndianness(Endianness.Big)] - [FieldBitLength(24)] - public uint Preview1Length { get; set; } = 23680; - */ - /// - /// RGB565 - /// - //[FieldOrder(4)] [FieldLength(nameof(Preview1Length.Value))] public byte[] Preview1Data { get; set; } - - /*/// - /// 300 * 140 * 2 - /// - [FieldOrder(5)][FieldBitLength(24)] public uint Preview2Length { get; set; } = 84000;*/ - - /*/// - /// RGB565 - /// - [FieldOrder(6)] [FieldLength(nameof(Preview2Length))] public byte[] Preview2Data { get; set; }*/ - + public override string ToString() { return $"{nameof(HeaderLength)}: {HeaderLength}, {nameof(Version)}: {Version}, {nameof(ImageLog)}: {ImageLog}"; diff --git a/UVtools.Core/Managers/MaterialManager.cs b/UVtools.Core/Managers/MaterialManager.cs index db34814..ad51f11 100644 --- a/UVtools.Core/Managers/MaterialManager.cs +++ b/UVtools.Core/Managers/MaterialManager.cs @@ -30,7 +30,7 @@ public class MaterialManager : BindableBase, IList new(() => new MaterialManager()); /// - /// Instance of (singleton) + /// Instance of (singleton) /// public static MaterialManager Instance => _instanceHolder.Value; diff --git a/UVtools.Core/Objects/BindableBase.cs b/UVtools.Core/Objects/BindableBase.cs index 4fbfa04..4e3c46e 100644 --- a/UVtools.Core/Objects/BindableBase.cs +++ b/UVtools.Core/Objects/BindableBase.cs @@ -28,34 +28,6 @@ public abstract class BindableBase : INotifyPropertyChanged remove => _propertyChanged -= value; } - /// - /// Checks if a property already matches a desired value. Sets the property and - /// notifies listeners only when necessary. - /// - /// Type of the property. - /// Reference to a property with both getter and setter. - /// Desired value for the property. - /// - /// Name of the property used to notify listeners. This - /// value is optional and can be provided automatically when invoked from compilers that - /// support CallerMemberName. - /// - /// - /// True if the value was changed, false if the existing value matched the - /// desired value. - /// - /*protected bool SetProperty(ref T storage, T value, [CallerMemberName] string propertyName = null) - { - if (Equals(storage, value)) - { - return false; - } - - storage = value; - RaisePropertyChanged(propertyName); - return true; - }*/ - protected bool RaiseAndSetIfChanged(ref T field, T value, [CallerMemberName] string? propertyName = null) { if (EqualityComparer.Default.Equals(field, value)) return false; diff --git a/UVtools.Core/Objects/RangeObservableCollection.cs b/UVtools.Core/Objects/RangeObservableCollection.cs index ececee5..6e76c3a 100644 --- a/UVtools.Core/Objects/RangeObservableCollection.cs +++ b/UVtools.Core/Objects/RangeObservableCollection.cs @@ -140,7 +140,7 @@ public class RangeObservableCollection : ObservableCollection /// Inserts the elements of a collection into the at the specified index. /// /// The zero-based index at which the new elements should be inserted. - /// The collection whose elements should be inserted into the List. + /// The collection whose elements should be inserted into the List{T}. /// The collection itself cannot be null, but it can contain elements that are null, if type T is a reference type. /// is null. /// is not in the collection range. @@ -390,7 +390,6 @@ public class RangeObservableCollection : ObservableCollection /// is out of range. /// is out of range. /// is null. - /// is null. public void ReplaceRange(int index, int count, IEnumerable collection) { if (index < 0) @@ -589,7 +588,6 @@ public class RangeObservableCollection : ObservableCollection /// /// /// When overriding this method, either call its base implementation - /// or call to guard against reentrant collection changes. /// protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e) { diff --git a/UVtools.Core/Operations/Operation.cs b/UVtools.Core/Operations/Operation.cs index 4bc6802..2332c13 100644 --- a/UVtools.Core/Operations/Operation.cs +++ b/UVtools.Core/Operations/Operation.cs @@ -550,21 +550,21 @@ public abstract class Operation : BindableBase, IDisposable public Size GetRoiSizeOrDefault() => GetRoiSizeOrDefault(SlicerFile.Resolution); /// - /// Gets the size, but if empty returns size instead + /// Gets the size, but if empty returns size instead /// /// /// public Size GetRoiSizeOrDefault(Mat? src) => src is null ? GetRoiSizeOrDefault() : GetRoiSizeOrDefault(src.Size); /// - /// Gets the size, but if empty returns the size from instead + /// Gets the size, but if empty returns the size from instead /// /// /// public Size GetRoiSizeOrDefault(Rectangle fallbackRectangle) => GetRoiSizeOrDefault(fallbackRectangle.Size); /// - /// Gets the size, but if empty returns the instead + /// Gets the size, but if empty returns the instead /// /// /// @@ -580,7 +580,7 @@ public abstract class Operation : BindableBase, IDisposable public Size GetRoiSizeOrVolumeSize() => GetRoiSizeOrVolumeSize(_originalBoundingRectangle.Size); /// - /// Gets the size, but if empty returns the instead + /// Gets the size, but if empty returns the instead /// /// /// @@ -590,7 +590,7 @@ public abstract class Operation : BindableBase, IDisposable } /// - /// Gets a cropped shared from by the , but if empty return the instead + /// Gets a cropped shared from by the , but if empty return the instead /// /// /// @@ -600,7 +600,7 @@ public abstract class Operation : BindableBase, IDisposable } /// - /// Gets a cropped shared from by the , but if empty crop by + /// Gets a cropped shared from by the , but if empty crop by /// /// /// @@ -613,7 +613,7 @@ public abstract class Operation : BindableBase, IDisposable } /// - /// Gets a cropped shared from by the , but if empty crop by + /// Gets a cropped shared by the , but if empty crop by /// /// /// @@ -662,7 +662,7 @@ public abstract class Operation : BindableBase, IDisposable } /// - /// Apply a mask to a mat + /// Apply a mask to a mat /// /// Original untouched mat /// Mat to modify and apply the mask diff --git a/UVtools.Core/Printer/Machine.cs b/UVtools.Core/Printer/Machine.cs index 76c997f..de5a890 100644 --- a/UVtools.Core/Printer/Machine.cs +++ b/UVtools.Core/Printer/Machine.cs @@ -266,6 +266,7 @@ namespace UVtools.Core.Printer new(PrinterBrand.Peopoly, "Peopoly Phenom Noir", "Phenom Noir", 3840, 2160, 293.76f, 165.24f, 400f, FlipDirection.Horizontally), new(PrinterBrand.Peopoly, "Peopoly Phenom XXL", "Phenom XXL", 3840, 2160, 527.04f, 296.46f, 550f, FlipDirection.Horizontally), new(PrinterBrand.Peopoly, "Peopoly Phenom", "Phenom", 3840, 2160, 276.48f, 155.52f, 400f, FlipDirection.Horizontally), + new(PrinterBrand.Peopoly, "Peopoly Phenom Forge", "Phenom Forge", 5760, 3240, 288f, 162f, 350f, FlipDirection.Horizontally), new(PrinterBrand.Phrozen, "Phrozen Shuffle 16", "Shuffle 16", 3840, 2160, 337.92f, 190.08f, 400f, FlipDirection.Horizontally), new(PrinterBrand.Phrozen, "Phrozen Shuffle 4K", "Shuffle 4K", 2160, 3840, 68.04f, 120.96f, 170f, FlipDirection.None), diff --git a/UVtools.Core/UVtools.Core.csproj b/UVtools.Core/UVtools.Core.csproj index 691b7bd..9723ae4 100644 --- a/UVtools.Core/UVtools.Core.csproj +++ b/UVtools.Core/UVtools.Core.csproj @@ -10,7 +10,7 @@ https://github.com/sn4k3/UVtools https://github.com/sn4k3/UVtools MSLA/DLP, file analysis, calibration, repair, conversion and manipulation - 3.6.3 + 3.6.4 Copyright © 2020 PTRTECH UVtools.png AnyCPU;x64 @@ -20,23 +20,28 @@ UVtools.ico README.md enable + True true - + ..\documentation\$(AssemblyName).xml + 1701;1702;1591 true + 1701;1702;1591 true + 1701;1702;1591 true + 1701;1702;1591 @@ -67,11 +72,11 @@ - + - + diff --git a/UVtools.Installer/Code/HeatGeneratedFileList.wxs b/UVtools.Installer/Code/HeatGeneratedFileList.wxs index 097666f..a1c0dcc 100644 --- a/UVtools.Installer/Code/HeatGeneratedFileList.wxs +++ b/UVtools.Installer/Code/HeatGeneratedFileList.wxs @@ -323,8 +323,8 @@ - - + + @@ -878,6 +878,9 @@ + + + @@ -1139,6 +1142,9 @@ + + + @@ -1661,7 +1667,7 @@ - + @@ -1846,6 +1852,7 @@ + @@ -1932,6 +1939,7 @@ + diff --git a/UVtools.WPF/App.axaml.cs b/UVtools.WPF/App.axaml.cs index 674362a..9a240b5 100644 --- a/UVtools.WPF/App.axaml.cs +++ b/UVtools.WPF/App.axaml.cs @@ -345,8 +345,8 @@ public class App : Application #region Utilities public static string ApplicationPath => AppContext.BaseDirectory; - public static readonly string AppExecutable = Environment.ProcessPath!; - public static readonly string AppExecutableQuoted = $"\"{AppExecutable}\""; + public static string AppExecutable => Environment.ProcessPath!; + public static string AppExecutableQuoted => $"\"{AppExecutable}\""; public static void NewInstance(string filePath) { try diff --git a/UVtools.WPF/MainWindow.Information.cs b/UVtools.WPF/MainWindow.Information.cs index 36d7e2b..92021fd 100644 --- a/UVtools.WPF/MainWindow.Information.cs +++ b/UVtools.WPF/MainWindow.Information.cs @@ -16,7 +16,6 @@ using Avalonia; using Avalonia.Controls; using Avalonia.Input; using MessageBox.Avalonia.Enums; -using UVtools.Core; using UVtools.Core.Layers; using UVtools.Core.Objects; using UVtools.Core.SystemOS; @@ -239,11 +238,11 @@ public partial class MainWindow try { - using TextWriter tw = new StreamWriter(file); + await using TextWriter tw = new StreamWriter(file); foreach (var config in SlicerFile.Configs) { var type = config.GetType(); - tw.WriteLine($"[{type.Name}]"); + await tw.WriteLineAsync($"[{type.Name}]"); foreach (var property in type.GetProperties(BindingFlags.Public | BindingFlags.Instance)) { if (property.Name.Equals("Item")) continue; @@ -253,14 +252,14 @@ public partial class MainWindow case null: continue; case IList list: - tw.WriteLine($"{property.Name} = {list.Count}"); + await tw.WriteLineAsync($"{property.Name} = {list.Count}"); break; default: - tw.WriteLine($"{property.Name} = {value}"); + await tw.WriteLineAsync($"{property.Name} = {value}"); break; } } - tw.WriteLine(); + await tw.WriteLineAsync(); } tw.Close(); } @@ -312,7 +311,6 @@ public partial class MainWindow public void RefreshProperties() { SlicerProperties.Clear(); - if (SlicerFile.Configs is null) return; foreach (var config in SlicerFile.Configs) { var type = config.GetType(); diff --git a/UVtools.WPF/UVtools.WPF.csproj b/UVtools.WPF/UVtools.WPF.csproj index e776d8e..b01e5f0 100644 --- a/UVtools.WPF/UVtools.WPF.csproj +++ b/UVtools.WPF/UVtools.WPF.csproj @@ -12,7 +12,7 @@ LICENSE https://github.com/sn4k3/UVtools Git - 3.6.3 + 3.6.4 AnyCPU;x64 UVtools.png README.md @@ -44,9 +44,9 @@ - - - + + + diff --git a/build/createRelease.ps1 b/build/createRelease.ps1 index 3f8b30b..a593403 100644 --- a/build/createRelease.ps1 +++ b/build/createRelease.ps1 @@ -223,7 +223,18 @@ $installer = "UVtools.Installer" $msiOutputFile = "$rootFolder\UVtools.Installer\bin\x64\Release\UVtools.msi" $msiProductFile = "$rootFolder\UVtools.Installer\Code\Product.wxs" $msiSourceFiles = "$rootFolder\$publishFolder\${software}_win-x64_v$version" -$msbuild = "`"${env:ProgramFiles}\Microsoft Visual Studio\2022\Enterprise\MSBuild\Current\Bin\MSBuild.exe`" /t:Build /p:Configuration=`"$buildWith`" /p:MSIProductVersion=`"$version`" /p:HarvestPath=`"$msiSourceFiles`"" + +$msbuildPaths = "${env:ProgramFiles}\Microsoft Visual Studio\2022\Enterprise\MSBuild\Current\Bin\MSBuild.exe", + "${env:ProgramFiles(x86)}\Microsoft Visual Studio\2019\Enterprise\MSBuild\Current\Bin\MSBuild.exe", + "${env:ProgramFiles(x86)}\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin\MSBuild.exe" +$msbuild = $null +foreach($path in $msbuildPaths) { + if (Test-Path -Path $path -PathType Leaf) + { + $msbuild = "`"$path`" /t:Build /p:Configuration=`"$buildWith`" /p:MSIProductVersion=`"$version`" /p:HarvestPath=`"$msiSourceFiles`"" + break; + } +} Write-Output " #################################### @@ -329,7 +340,7 @@ if($null -ne $enableNugetPublish -and $enableNugetPublish) } } -foreach ($obj in $runtimes.GetEnumerator()) { +foreach ($obj in $runtimes.GetEnumerator()) { if(![string]::IsNullOrWhiteSpace($buildOnly) -and !$buildOnly.Equals($obj.Name)) {continue} # Configuration $deployStopWatch.Restart() @@ -381,13 +392,13 @@ foreach ($obj in $runtimes.GetEnumerator()) { } else { - $args = '-b' # Bundle + $buildArgs = '-b' # Bundle if($null -ne $zipPackages -and $zipPackages) { - $args += ' -z' # Zip + $buildArgs += ' -z' # Zip } - bash -c "'build/createRelease.sh' $args $runtime" - #Start-Job { bash -c "'build/createRelease.sh' $using:args $using:runtime" } + bash -c "'build/createRelease.sh' $buildArgs $runtime" + #Start-Job { bash -c "'build/createRelease.sh' $using:buildArgs$buildArgs $using:runtime" } } $deployStopWatch.Stop() @@ -441,65 +452,71 @@ if($null -ne $enableMSI -and $enableMSI) $publishName = "${software}_${runtime}_v$version"; if ((Test-Path -Path $msiSourceFiles) -and ((Get-ChildItem "$msiSourceFiles" | Measure-Object).Count) -gt 0) { - $msiTargetFile = "$publishFolder\$publishName.msi" - Write-Output "################################" - Write-Output "Clean and build MSI components manifest file" - - Remove-Item "$msiTargetFile" -ErrorAction Ignore - - <# - (Get-Content "$msiComponentsFile") -replace 'SourceDir="\.\.\\publish\\.+"', "SourceDir=`"..\publish\$publishName`"" | Out-File "$msiComponentsFile" - - $msiComponentsXml = [Xml] (Get-Content "$msiComponentsFile") - foreach($element in $msiComponentsXml.Wix.Module.Directory.Directory) + if ($null -ne $msbuild) { - if($element.Id -eq 'MergeRedirectFolder') + $msiTargetFile = "$publishFolder\$publishName.msi" + Write-Output "################################" + Write-Output "Clean and build MSI components manifest file" + + Remove-Item "$msiTargetFile" -ErrorAction Ignore + + <# + (Get-Content "$msiComponentsFile") -replace 'SourceDir="\.\.\\publish\\.+"', "SourceDir=`"..\publish\$publishName`"" | Out-File "$msiComponentsFile" + + $msiComponentsXml = [Xml] (Get-Content "$msiComponentsFile") + foreach($element in $msiComponentsXml.Wix.Module.Directory.Directory) { - wixCleanUpElement $element $msiSourceFiles - $msiComponentsXml.Save($msiComponentsFile) - break + if($element.Id -eq 'MergeRedirectFolder') + { + wixCleanUpElement $element $msiSourceFiles + $msiComponentsXml.Save($msiComponentsFile) + break + } } + #> + + if(Test-Path "$publishFolder\$publishName\UVtools.Core.dll" -PathType Leaf){ + Add-Type -Path "$publishFolder\$publishName\UVtools.Core.dll" + } else { + Write-Error "Unable to find UVtools.Core.dll" + return + } + + # Add edit with UVtools possible extensions + $extensions = [UVtools.Core.FileFormats.FileFormat]::AllFileExtensions; + $extensionList = New-Object Collections.Generic.List[String] + foreach($ext in $extensions) + { + if($ext.Extension.Contains('.')) { continue; } # Virtual extension + + $extKey = "System.FileName:"*.$($ext.Extension.ToLowerInvariant())""; + if($extensionList.Contains($extKey)) { continue; } # Already here + $extensionList.Add($extKey); + } + if($extensionList.Count -gt 0) + { + $regValue = [String]::Join(' OR ', $extensionList) + (Get-Content "$msiProductFile") -replace '(? - - if(Test-Path "$publishFolder\$publishName\UVtools.Core.dll" -PathType Leaf){ - Add-Type -Path "$publishFolder\$publishName\UVtools.Core.dll" - } else { - Write-Error "Unable to find UVtools.Core.dll" - return + else { + Write-Error "MSI build is enabled but can't run due the msbuild.exe path was not found." } - - # Add edit with UVtools possible extensions - $extensions = [UVtools.Core.FileFormats.FileFormat]::AllFileExtensions; - $extensionList = New-Object Collections.Generic.List[String] - foreach($ext in $extensions) - { - if($ext.Extension.Contains('.')) { continue; } # Virtual extension - - $extKey = "System.FileName:"*.$($ext.Extension.ToLowerInvariant())""; - if($extensionList.Contains($extKey)) { continue; } # Already here - $extensionList.Add($extKey); - } - if($extensionList.Count -gt 0) - { - $regValue = [String]::Join(' OR ', $extensionList) - (Get-Content "$msiProductFile") -replace '(? + + + UVtools.Core + + + + + Gets UVtools born date and time + + + + + Gets UVtools years + + + + + Return full age in a readable string + + + + + Checks if today is UVtools birthday + + + + + Converts a speed from one unit to another + + + + + + + + + + + Converts seconds to milliseconds + + + + + + + + Converts seconds to milliseconds + + + + + + + Converts milliseconds to seconds + + + + + + + + Gets or sets the maximum number of concurrent tasks enabled by this ParallelOptions instance. + Less or equal to 0 will set to auto number + 1 = Single thread + n = Multi threads + + + + + Gets the ParallelOptions with set + + + + + Gets the ParallelOptions with and the set + + + + + Gets the ParallelOptions with and the set + + + + + Gets or sets if operations run via CUDA when possible + + + + + Gets if we can use cuda on operations + + + + + Gets or sets the default compression type for layers + + + + + The average resin 1000ml bottle cost, to use when bottle cost is not available. + Use 0 to disable. + + + + + Gets the default folder to save the settings + + + + + Gets the default folder to save the settings + + + + + A contour cache for OpenCV + + + + + Gets the area of the contour + + + + + Gets the perimeter of the contours + + + + + Gets the centroid of the contour + + + + + Gets or sets the contour + + + + + Gets if this contour have any point + + + + + Checks if a given is inside the contour rectangle bounds + + + + + + + Gets if a given is inside the contour + + + + + + + Utility methods for contour handling. + Use only with Tree type + + + + + Gets contours inside a point + + + + + If true it will include all limiting area, otherwise only outer contour will be returned + + + + + Gets a contour given a location. + + + + Contour index, -1 if not exists + null if not exists + + + + Gets only the outer most external contours + Only compatible with Tree type of contour detection + + + + + + + + Gets contours inside contours that are black pixels + + + + + + + + Gets contours that are positive and negative pixels and group them by areas + Only compatible with Tree type of contour detection + + + + + + Gets contours that are positive pixels and group them by areas + Only compatible with Tree type of contour detection + + + + + + Gets contours inside contours that are black pixels and group them by areas + Only compatible with Tree type of contour detection + + + + + + Gets contour real area for a limited area + + + + + + + Gets the largest contour area from a contour list + + Contour list + + + + + Gets contours real area for a group of contours + + Grouped contours + True to run in parallel + Array with same size with contours area + + + + Checks if two contours intersects + + Contour 1 + Contour 2 + + + + + Gets index start number, if starts on 0 or 1 + + + + + Flip direction, same as , but add None which must be taken care/ignored on code + + + + + Rotate direction, same as , but add None which must be taken care/ignored on code + + + + Rotate 90 degrees clockwise (0) + + + Rotate 180 degrees clockwise (1) + + + Rotate 270 degrees clockwise (2) + + + + mm/s + + + + + mm/m + + + + + cm/m + + + + + ms + + + + + s + + + + + Default order of issues to show on the UI list + + + + + Gets the Unix timestamp since Jan 1, 1970 UTC + + + + + Gets the Unix timestamp in seconds since Jan 1, 1970 UTC + + + + + Gets the Unix minutes in seconds since Jan 1, 1970 UTC + + + + + Gets the from a unix timestamp in seconds + + + + + + + Gets the from a unix timestamp in minutes + + + + + + + Calculates the age in years of the current System.DateTime object today. + + The date of birth + Age in years today. 0 is returned for a future date of birth. + + + + Calculates the age in years of the current System.DateTime object on a later date. + + The date of birth + The date on which to calculate the age. + Age in years on a later day. 0 is returned as minimum. + + + + White color: 255, 255, 255, 255 + + + + + Black color: 0, 0, 0, 255 + + + + + Create a byte array of size of this + + + Blank byte array + + + + Creates a new empty with same size and type of the source + + + + + + + Creates a new empty with same size and type of the source + + + + + + + + Creates a new blanked (All zeros) with same size and type of the source + + + Blanked + + + + Creates a new blanked (All zeros) with same size and type of the source + + + Blanked + + + + Creates a with same size and type of the source and set it to a color + + + + + + + + Creates a new and zero it + + + + + + + + + Creates a new and zero it + + + + + + + + + Creates a new and set it to a + + + + + + + + + + Allocates a new array of mat's + + Array size + + + + + Allocates a new array of mat 's + + Array size + Image size to create, use to create a empty Mat + New mat array + + + + Create a new from + + + + + + + Gets the mat bytes as + + + + + + + + Gets the byte pointer of this + + + + + + + Gets the whole data span to manipulate or read pixels + + + + + + + Gets the whole data span to manipulate or read pixels + + + + + + Gets the whole data span to manipulate or read pixels, use this when possibly using ROI + + + + + + Gets the data span to manipulate or read pixels given a length and offset + + + + + + + + + + Gets a single pixel span to manipulate or read pixels + + + + + + + + + + Gets a single pixel span to manipulate or read pixels + + + + + + + + + Gets a row span to manipulate or read pixels + + + + + + + + + + + Gets a col span to manipulate or read pixels + + + + + + + + + + + Fill a mat span with a color + + Mat to fill + Start position, this reference will increment by the + Length to fill + Color to fill with + Ignore and fill to if is less than the threshold value + + + + Fill a mat span with a color + + Mat to fill + + + Length to fill + Color to fill with + Ignore and set to if is less than the threshold value + + + + Fill a mat span with a color + + Mat to fill + + Length to fill + Color to fill with + Ignore and fill to if is less than the threshold value + + + + .Step return the original Mat step, if ROI step still from original matrix which lead to errors. + Use this to get the real step size + + + + + + + Gets the total length of this + + + The total length of this + + + + Gets a pixel index position on a span given X and Y + + + X coordinate + Y coordinate + The pixel index position + + + + Gets a pixel index position on a span given X and Y + + + X and Y Location + The pixel index position + + + + Gets a byte array copy of this + + + Byte array + + + + Gets a byte pixel at a position + + + + + + + + Gets a byte pixel at a position + + + + + + + + + Gets a byte pixel at a position + + + + + + + + Sets a byte pixel at a position + + + + + + + + Sets a byte pixel at a position + + + + + + + + Sets a byte pixel at a position + + + + + + + + + Sets a byte pixel at a position + + + + + + + + + Sets bytes + + + + + + + Gets PNG byte array + + + + + + + Copy a region from to center of other + + Source to be copied to + Size of the center offset + Target to paste the + + + + Copy a region from to center of other + + Source to be copied to + Region to copy + Target to paste the + + + + Copy a to center of other + + Source to be copied to + Target to paste the + + + + Gets a Roi, but return source when roi is empty or have same size as source + + + + + + + + Gets a Roi at x=0 and y=0 given a size, but return source when roi is empty or have same size as source + + + + + + + + Gets a Roi from a mat size, but return source when roi is empty or have same size as source + + + + + + + + Gets a Roi from center, but return source when have same size as source + + + + + + + + Gets a new mat obtained from it center at a target size and roi + + + + + + + + + Gets if a is all zeroed by a threshold + + + Pixel brightness threshold + Start pixel position + Pixel span length + + + + + Finds the first negative (Black) pixel + + + Start pixel position + Pixel span length + Pixel position in the span, or -1 if not found + + + + Finds the first positive pixel + + + Start pixel position + Pixel span length + Pixel position in the span, or -1 if not found + + + + Finds the first pixel that is + + + + Start pixel position + Pixel span length + Pixel position in the span, or -1 if not found + + + + Finds the first pixel that is at less than + + + + Start pixel position + Pixel span length + Pixel position in the span, or -1 if not found + + + + Finds the first pixel that is at less or equal than + + + + Start pixel position + Pixel span length + Pixel position in the span, or -1 if not found + + + + Finds the first pixel that is at greater than + + + + Start pixel position + Pixel span length + Pixel position in the span, or -1 if not found + + + + Finds the first pixel that is at equal or greater than + + + + Start pixel position + Pixel span length + Pixel position in the span, or -1 if not found + + + + Rotates a Mat by an angle while keeping the image size + + + Angle in degrees to rotate + + + + + + Rotates a Mat by an angle while keeping the image size + + + + + + + + + + Rotates a Mat by an angle while adjusting bounds to fit the rotated content + + + + + + + + Rotates a Mat by an angle while adjusting bounds to fit the rotated content + + + + + + + + + Scale image from it center, preserving src bounds + https://stackoverflow.com/a/62543674/933976 + + to transform + X scale factor + Y scale factor + X translation + Y translation + Destination size + Interpolation mode + + + + Resize source mat proportional to a scale + + + + + + + + Correct openCV thickness which always results larger than specified + + Thickness to correct + + + + + Draw a rotated square around a center point + + + + + + + + + + + + Draw a rotated rectangle around a center point + + + + + + + + + + + + Draw a polygon given number of sides and length + + + Number of polygon sides, Special: use 1 to draw a line and >= 100 to draw a native OpenCV circle + Radius + Center position + + + + + + + + + Left aligned without trimming, openCV default call + + + + + Left aligned and trimmed + + + + + Center aligned and trimmed + + + + + Right aligned and trimmed + + + + + Extended OpenCV PutText to accepting line breaks and line alignment + + + + + Extended OpenCV PutText to accepting line breaks, line alignment and rotation + + + + + Extended OpenCV PutText to accepting line breaks, line alignment and rotation + + + + + Retrieves contours from the binary image as a contour tree. The pointer firstContour is filled by the function. It is provided as a convenient way to obtain the hierarchy value as int[,]. + The function modifies the source image content + + The source 8-bit single channel image. Non-zero pixels are treated as 1s, zero pixels remain 0s - that is image treated as binary. To get such a binary image from grayscale, one may use cvThreshold, cvAdaptiveThreshold or cvCanny. The function modifies the source image content + Retrieval mode + Approximation method (for all the modes, except CV_RETR_RUNS, which uses built-in approximation). + Offset, by which every contour point is shifted. This is useful if the contours are extracted from the image ROI and then they should be analyzed in the whole image context + The contour hierarchy + + + + Retrieves contours from the binary image as a contour tree. The pointer firstContour is filled by the function. It is provided as a convenient way to obtain the hierarchy value as int[,]. + The function modifies the source image content + + The source 8-bit single channel image. Non-zero pixels are treated as 1s, zero pixels remain 0s - that is image treated as binary. To get such a binary image from grayscale, one may use cvThreshold, cvAdaptiveThreshold or cvCanny. The function modifies the source image content + The contour hierarchy + Retrieval mode + Approximation method (for all the modes, except CV_RETR_RUNS, which uses built-in approximation). + Offset, by which every contour point is shifted. This is useful if the contours are extracted from the image ROI and then they should be analyzed in the whole image context + Detected contours. Each contour is stored as a vector of points. + + + + Determine the area (i.e. total number of pixels in the image), + initialize the output skeletonized image, and construct the + morphological structuring element + + + Number of iterations required to perform the skeletoize + + + + + + Determine the area (i.e. total number of pixels in the image), + initialize the output skeletonized image, and construct the + morphological structuring element + + + + + + + + Reduces iterations to 1 and generate a kernel to match the iterations effect + + + + + + + + Dispose this if it's a sub matrix / roi + + Mat to dispose + + + + Read from current position to the end of the file + + + + + + + Seek to a position, do work and rewind to initial position + + + + + + + + Gets a temporary directory path + + Prepend a string to temporary directory name + True to create that directory, otherwise false + The temporary directory path + + + + Gets a temporary directory path + + True to create that directory, otherwise false + The temporary directory path + + + + Gets a temporary file with a extension and a prepend string + + Extension name without the dot (.) + Optional prepend file name + + + + + Gets if this size have a zero value on width or height + + + + + + + Exchange width with height + + + + + + + Gets if this size have a zero value on width or height + + + + + + + Converts stream into byte array + + Input + Byte array data + + + + Upper the first character in a string + + Input string + Modified string with fist character upper + + + + Converts a string into a target type + + Target type to convert into + Value + Converted value into target type + + + + Creates a new instance of this type + + + + + + + Creates a new instance of this type + + Target type + + + New instance of {T} + + + + 1 inch to 1 mm + + + + + 1 mm to 1 inch + + + + + Used to specify what our overwrite policy + is for files we are extracting. + + + + + Used to identify what we will do if we are + trying to create a zip file and it already + exists. + + + + + Unzips the specified file to the given folder in a safe + manner. This plans for missing paths and existing files + and handles them gracefully. + + + The name of the zip file to be extracted + + + The directory to extract the zip file to + + + Specifies how we are going to handle an existing file. + The default is IfNewer. + + + + + Unzips the specified file to the given folder in a safe + manner. This plans for missing paths and existing files + and handles them gracefully. + + + The zip file to be extracted + + + The directory to extract the zip file to + + + Specifies how we are going to handle an existing file. + The default is IfNewer. + + The number of extracted files + + + + Safely extracts a single file from a zip file + + + The zip entry we are pulling the file from + + + The root of where the file is going + + True to preserve full name and create all directories up to the file, otherwise false to extract the file just to + + Specifies how we are going to handle an existing file. + The default is Overwrite.IfNewer. + + The extracted file path + + + + Allows you to add files to an archive, whether the archive + already exists or not + + + The name of the archive to you want to add your files to + + + A set of file names that are to be added + + + Specifies how we are going to handle an existing archive + + + + Specifies what type of compression to use - defaults to Optimal + + + + + Get or put a file into archive + + + Filename to create + Created + + + + Create or update a file into archive and write content to it + + + Filename to create + Content to write + + Created + + + + Create or update a file into archive and write content to it + + + Filename to create + Content to write + + Created + + + + Create or update a file into archive and write content to it + + + Filename to create + Content to write + + Created + + + + Gets a magic number identifying the file type. + 0x12fd_0019 for cbddlp + 0x12fd_0086 for ctb + + + + + Gets the software version + + + + + Gets dimensions of the printer’s X output volume, in millimeters. + + + + + Gets dimensions of the printer’s Y output volume, in millimeters. + + + + + Gets dimensions of the printer’s Z output volume, in millimeters. + + + + + Gets the height of the model described by this file, in millimeters. + + + + + Gets the layer height setting used at slicing, in millimeters. Actual height used by the machine is in the layer table. + + + + + Gets the exposure time setting used at slicing, in seconds, for normal (non-bottom) layers, respectively. Actual time used by the machine is in the layer table. + + + + + Gets the exposure time setting used at slicing, in seconds, for bottom layers. Actual time used by the machine is in the layer table. + + + + + Gets the light off time setting used at slicing, for normal layers, in seconds. Actual time used by the machine is in the layer table. Note that light_off_time_s appears in both the file header and ExtConfig. + + + + + Gets number of layers configured as "bottom." Note that this field appears in both the file header and ExtConfig.. + + + + + Gets the printer resolution along X axis, in pixels. This information is critical to correctly decoding layer images. + + + + + Gets the printer resolution along Y axis, in pixels. This information is critical to correctly decoding layer images. + + + + + Gets the file offsets of ImageHeader records describing the larger preview images. + + + + + Gets the file offset of a table of LayerHeader records giving parameters for each printed layer. + + + + + Gets the number of records in the layer table for the first level set. In ctb files, that’s equivalent to the total number of records, but records may be multiplied in antialiased cbddlp files. + + + + + Gets the file offsets of ImageHeader records describing the smaller preview images. + + + + + Gets the estimated duration of print, in seconds. + + + + + Gets the records whether this file was generated assuming normal (0) or mirrored (1) image projection. LCD printers are "mirrored" for this purpose. + + + + + Gets the print parameters table offset + + + + + Gets the print parameters table size in bytes. + + + + + Gets the number of times each layer image is repeated in the file. + This is used to implement antialiasing in cbddlp files. When greater than 1, + the layer table will actually contain layer_table_count * level_set_count entries. + See the section on antialiasing for details. + 1 for ctb + + + + + Gets the PWM duty cycle for the UV illumination source on normal levels, respectively. + This appears to be an 8-bit quantity where 0xFF is fully on and 0x00 is fully off. + + + + + Gets the PWM duty cycle for the UV illumination source on bottom levels, respectively. + This appears to be an 8-bit quantity where 0xFF is fully on and 0x00 is fully off. + + + + + Gets the key used to encrypt layer data, or 0 if encryption is not used. + + + + + Gets the slicer tablet offset + + + + + Gets the slicer table size in bytes + + + + + Gets the distance to lift the build platform away from the vat after bottom layers, in millimeters. + + + + + Gets the speed at which to lift the build platform away from the vat after bottom layers, in millimeters per minute. + + + + + Gets the distance to lift the build platform away from the vat after normal layers, in millimeters. + + + + + Gets the speed at which to lift the build platform away from the vat after normal layers, in millimeters per minute. + + + + + Gets the speed to use when the build platform re-approaches the vat after lift, in millimeters per minute. + + + + + Gets the estimated required resin, measured in milliliters. The volume number is derived from the model. + + + + + Gets the estimated grams, derived from volume using configured factors for density. + + + + + Gets the estimated cost based on currency unit the user had configured. Derived from volume using configured factors for density and cost. + + + + + Gets the light off time setting used at slicing, for bottom layers, in seconds. Actual time used by the machine is in the layer table. Note that light_off_time_s appears in both the file header and ExtConfig. + + + + + Gets the light off time setting used at slicing, for normal layers, in seconds. Actual time used by the machine is in the layer table. Note that light_off_time_s appears in both the file header and ExtConfig. + + + + + Gets number of layers configured as "bottom." Note that this field appears in both the file header and ExtConfig. + + + + + Gets the machine name offset to a string naming the machine type, and its length in bytes. + + + + + Gets the machine size in bytes + + + + + Gets the parameter used to control encryption. + Not totally understood. 0/8 for cbddlp files, 0xF (15) for ctb files, 0x2000000F (536870927) for v3 ctb and 1073741839 for v4 ctb files to allow per layer parameters + + + + + Gets the minutes since Jan 1, 1970 UTC + + + + + Gets the user-selected antialiasing level. For cbddlp files this will match the level_set_count. For ctb files, this number is essentially arbitrary. + + + + + Gets a version of software that generated this file, encoded with major, minor, and patch release in bytes starting from the MSB down. + (No provision is made to name the software being used, so this assumes that only one software package can generate the files. + Probably best to hardcode it at 0x01060300.) + 17170480 + + + + Gets the machine name. string is not nul-terminated. + The character encoding is currently unknown — all observed files in the wild use 7-bit ASCII characters only. + Note that the machine type here is set in the software profile, and is not the name the user assigned to the machine. + + + + + The files contain two preview images. + These are shown on the printer display when choosing which file to print, sparing the poor printer from needing to render a 3D image from scratch. + + + + + Gets the X dimension of the preview image, in pixels. + + + + + Gets the Y dimension of the preview image, in pixels. + + + + + Gets the image offset of the encoded data blob. + + + + + Gets the image length in bytes. + + + + + Gets the build platform Z position for this layer, measured in millimeters. + + + + + Gets the exposure time for this layer, in seconds. + + + + + Gets how long to keep the light off after exposing this layer, in seconds. + + + + + Gets the layer image offset to encoded layer data, and its length in bytes. + + + + + Gets the layer image length in bytes. + + + + + Gets a copy of layer data definition + + + + + Gets the total size of ctbImageInfo and Image data + + + + + Checksum of unix timestamp + + + + + The files contain two preview images. + These are shown on the printer display when choosing which file to print, sparing the poor printer from needing to render a 3D image from scratch. + + + + + Gets the X dimension of the preview image, in pixels. + + + + + Gets the Y dimension of the preview image, in pixels. + + + + + Gets the image offset of the encoded data blob. + + + + + Gets the image length in bytes. + + + + + Gets the size of the header + + + + + Gets the header name + + + + + Gets the size of the printer model + + + + + Gets the printer model + + + + + Gets the number of records in the layer table + + + + + Gets the printer resolution along X axis, in pixels. This information is critical to correctly decoding layer images. + + + + + Gets the printer resolution along Y axis, in pixels. This information is critical to correctly decoding layer images. + + + + + Gets the size of the header + + + + + Gets the header name + + + + + Gets the size of the header + + + + + Gets the header name + + + + + Gets the number of records in the layer table + + + + + Gets the printer resolution along X axis, in pixels. This information is critical to correctly decoding layer images. + + + + + Gets the printer resolution along Y axis, in pixels. This information is critical to correctly decoding layer images. + + + + + Gets the size of the header + + + + + Gets the header name + + + + + Gets a magic number identifying the file type. + 0xBD3C7AC8 for fdg + + + + + Gets the software version + + + + + Gets the number of records in the layer table + + + + + Gets number of layers configured as "bottom." Note that this field appears in both the file header and ExtConfig.. + + + + + Gets the records whether this file was generated assuming normal (0) or mirrored (1) image projection. LCD printers are "mirrored" for this purpose. + + + + + Gets the printer resolution along X axis, in pixels. This information is critical to correctly decoding layer images. + + + + + Gets the printer resolution along Y axis, in pixels. This information is critical to correctly decoding layer images. + + + + + Gets the layer height setting used at slicing, in millimeters. Actual height used by the machine is in the layer table. + + + + + Gets the exposure time setting used at slicing, in seconds, for normal (non-bottom) layers, respectively. Actual time used by the machine is in the layer table. + + + + + Gets the exposure time setting used at slicing, in seconds, for bottom layers. Actual time used by the machine is in the layer table. + + + + + Gets the file offsets of ImageHeader records describing the larger preview images. + + + + + Gets the file offsets of ImageHeader records describing the smaller preview images. + + + + + Gets the file offset of a table of LayerHeader records giving parameters for each printed layer. + + + + + Gets the estimated duration of print, in seconds. + + + + + ? + + + + + Gets the PWM duty cycle for the UV illumination source on normal levels, respectively. + This appears to be an 8-bit quantity where 0xFF is fully on and 0x00 is fully off. + + + + + Gets the PWM duty cycle for the UV illumination source on bottom levels, respectively. + This appears to be an 8-bit quantity where 0xFF is fully on and 0x00 is fully off. + + + + + Gets the height of the model described by this file, in millimeters. + + + + + Gets dimensions of the printer’s X output volume, in millimeters. + + + + + Gets dimensions of the printer’s Y output volume, in millimeters. + + + + + Gets dimensions of the printer’s Z output volume, in millimeters. + + + + + Gets the key used to encrypt layer data, or 0 if encryption is not used. + + + + + Gets the estimated required resin, measured in milliliters. The volume number is derived from the model. + + + + + Gets the estimated grams, derived from volume using configured factors for density. + + + + + Gets the estimated cost based on currency unit the user had configured. Derived from volume using configured factors for density and cost. + + + + + Gets the machine name offset to a string naming the machine type, and its length in bytes. + + + + + Gets the machine size in bytes + + + + + Gets the machine name. string is not nul-terminated. + The character encoding is currently unknown — all observed files in the wild use 7-bit ASCII characters only. + Note that the machine type here is set in the software profile, and is not the name the user assigned to the machine. + + + + + Gets the light off time setting used at slicing, for bottom layers, in seconds. Actual time used by the machine is in the layer table. Note that light_off_time_s appears in both the file header and ExtConfig. + + + + + Gets the light off time setting used at slicing, for normal layers, in seconds. Actual time used by the machine is in the layer table. Note that light_off_time_s appears in both the file header and ExtConfig. + + + + + Gets the distance to lift the build platform away from the vat after bottom layers, in millimeters. + + + + + Gets the speed at which to lift the build platform away from the vat after bottom layers, in millimeters per minute. + + + + + Gets the distance to lift the build platform away from the vat after normal layers, in millimeters. + + + + + Gets the speed at which to lift the build platform away from the vat after normal layers, in millimeters per minute. + + + + + Gets the speed to use when the build platform re-approaches the vat after lift, in millimeters per minute. + + + + + Gets the minutes since Jan 1, 1970 UTC + + + + + The files contain two preview images. + These are shown on the printer display when choosing which file to print, sparing the poor printer from needing to render a 3D image from scratch. + + + + + Gets the X dimension of the preview image, in pixels. + + + + + Gets the Y dimension of the preview image, in pixels. + + + + + Gets the image offset of the encoded data blob. + + + + + Gets the image length in bytes. + + + + + Gets the build platform Z position for this layer, measured in millimeters. + + + + + Gets the exposure time for this layer, in seconds. + + + + + Gets how long to keep the light off after exposing this layer, in seconds. + + + + + Gets the layer image offset to encoded layer data, and its length in bytes. + + + + + Gets the layer image length in bytes. + + + + + Represents a file extension for slicer file formats + + + + + Stores a specific type that should be used to create with this FileExtension instance + + + + + Gets the extension name without the dot (.) + + + + + Gets the extension description + + + + + Gets if the extension shows up on open file dialog filters + + + + + Gets if the extension shows up on convert to menu + + + + + Gets a tag object + + + + + Gets the file filter for open and save dialogs + + + + + Constructor + + The exact type + The extension name without the dot (.) + The extension description + True if this extension is visible on open file dialog filters + True if this extension is visible on convert to menu + Tag object + + + + Slicer representation + + + + + Enumeration of file format types + + + + + Enumeration of file thumbnail size types + + + + + Firmware transition layers are handled by printer firmware + + + + + Software transition layers are handled by software and written on layer data + + + + + File decode type + + + + + Decodes all the file information and caches layer images + + + + + Decodes only the information in the file and thumbnails, no layer image is read nor cached, fast + + + + + Image data type + + + + + eg: Nova Bene4 + + + + + eg: Uniformation GKone + + + + + Available Print Parameters to modify + + + + + Gets the name + + + + + Gets the description + + + + + Gets the value unit + + + + + Gets the minimum value + + + + + Gets the maximum value + + + + + Gets the incrementing value for the dropdown + + + + + Gets the number of decimal plates + + + + + Gets or sets the current / old value + + + + + Gets or sets the new value + + + + + Gets if the value has changed + + + + + Gets the available formats to process + + + + + Gets all filters for open and save file dialogs + + + + + Gets the count of available file extensions + + + + + Find by an extension + + name to find + True to create a new instance of found file format, otherwise will return a pre created one which should be used for read-only purpose + object or null if not found + + + + Find by an extension + + name to find + Number of file formats sharing the input extension + True to create a new instance of found file format, otherwise will return a pre created one which should be used for read-only purpose + object or null if not found + + + + Find by an type name + + Type name to find + True to create a new instance of found file format, otherwise will return a pre created one which should be used for read-only purpose + object or null if not found + + + + Find by any means (type name, extension, filepath) + + Name to find + True to create a new instance of found file format, otherwise will return a pre created one which should be used for read-only purpose + object or null if not found + + + + Find by an type + + Type to find + True to create a new instance of found file format, otherwise will return a pre created one which should be used for read-only purpose + object or null if not found + + + + Copy parameters from one file to another + + From source file + To target file + Number of affected parameters + + + + Compress a layer from a + + to compress + Compressed byte array + + + + Compress a layer from a byte array + + byte array to compress + Compressed byte array + + + + Decompress a layer from a byte array + + byte array to decompress + Decompressed byte array + + + + Gets the file format type + + + + + Gets the layer image data type used on this file format + + + + + Gets the valid file extensions for this + + + + + The speed unit used by this file format in his internal data + + + + + Gets the available + + + + + Gets the available per layer + + + + + Checks if a exists on print parameters + + + True if exists, otherwise false + + + + Checks if a exists on layer parameters + + + True if exists, otherwise false + + + + Gets the file filter for open and save dialogs + + + + + Gets all valid file extensions for Avalonia file dialog + + + + + Gets all valid file extensions in "*.extension1;*.extension2" format + + + + + Gets or sets if change a global property should rebuild every layer data based on them + + + + + Gets the temporary output file path to use on save and encode + + + + + Gets the input file path loaded into this + + + + + Gets the available versions to set in this file format + + + + + Gets the amount of available versions in this file format + + + + + Gets the default version to use in this file when not setting the version + + + + + Gets or sets the version of this file format + + + + + Gets the thumbnails count present in this file format + + + + + Gets the number of created thumbnails + + + + + Gets the original thumbnail sizes + + + + + Gets the thumbnails for this + + + + + Layers List + + + + + First layer index, this is always 0 + + + + + Gets the last layer index + + + + + Gets the first layer + + + + + Gets the last bottom layer + + + + + Gets the first normal layer + + + + + Gets the last layer + + + + + Gets the smallest bottom layer using the pixel count + + + + + Gets the largest bottom layer using the pixel count + + + + + Gets the smallest normal layer using the pixel count + + + + + Gets the largest layer using the pixel count + + + + + Gets the smallest normal layer using the pixel count + + + + + Gets the largest layer using the pixel count + + + + + Gets all bottom layers + + + + + + Gets all normal layers + + + + + + Gets all transition layers + + + + + + Gets all layers that use TSMC values + + + + + + Gets all layers on same position but exclude the first layer on that position + + + + + True if all layers are using same value parameters as global settings, otherwise false + + + + + True if any layer is using TSMC, otherwise false when none of layers is using TSMC + + + + + True if the file global property is using TSMC, otherwise false when not using + + + + + Gets if any layer got modified, otherwise false + Sets all layers `IsModified` flag + + + + + Gets the bounding rectangle of the model + + + + + Gets the bounding rectangle of the object in millimeters + + + + + Gets or sets if modifications require a full encode to save + + + + + Gets the image width and height resolution + + + + + Gets the image width resolution + + + + + Gets the image height resolution + + + + + Gets the display total number of pixels ( * ) + + + + + Gets the size of display in millimeters + + + + + Gets or sets the display width in millimeters + + + + + Gets or sets the display height in millimeters + + + + + Gets the display diagonal in millimeters + + + + + Gets the display diagonal in inch's + + + + + Gets the display ratio + + + + + Gets or sets if images need to be mirrored on lcd to print on the correct orientation + + + + + Gets if the display is in portrait mode + + + + + Gets if the display is in landscape mode + + + + + Gets or sets the maximum printer build Z volume + + + + + Gets or sets the pixels per mm on X direction + + + + + Gets or sets the pixels per mm on Y direction + + + + + Gets or sets the pixels per mm + + + + + Gets the maximum (Width or Height) pixels per mm + + + + + Gets the pixel width in millimeters + + + + + Gets the pixel height in millimeters + + + + + Gets the pixel size in millimeters + + + + + Gets the maximum pixel between width and height in millimeters + + + + + Gets the pixel area in millimeters + + + + + Gets the pixel width in microns + + + + + Gets the pixel height in microns + + + + + Gets the pixel size in microns + + + + + Gets the maximum pixel between width and height in microns + + + + + Gets the pixel area in millimeters + + + + + Gets the file volume (XYZ) in mm^3 + + + + + Checks if this file have AntiAliasing + + + + + Gets if the AntiAliasing is emulated/fake with fractions of the time or if is real grey levels + + + + + Gets or sets the AntiAliasing level + + + + + Gets Layer Height in mm + + + + + Gets Layer Height in um + + + + + Gets or sets the print height in mm + + + + + Checks if this file format supports per layer settings + + + + + Gets or sets the layer count + + + + + Gets or sets the total height for the bottom layers in millimeters + + + + + Gets or sets the number of initial layer count + + + + + Gets the transition layer type + + + + + Gets or sets the number of transition layers + + + + + Gets if have transition layers + + + + + Gets the maximum transition layers this layer collection supports + + + + + Gets the number of normal layer count + + + + + Gets or sets the bottom layer off time in seconds + + + + + Gets or sets the layer off time in seconds + + + + + Gets or sets the bottom time in seconds to wait before cure the layer + + + + + Gets or sets the time in seconds to wait after cure the layer + + + + + Gets or sets the initial exposure time for in seconds + + + + + Gets or sets the normal layer exposure time in seconds + + + + + Gets or sets the bottom time in seconds to wait after cure the layer + + + + + Gets or sets the time in seconds to wait after cure the layer + + + + + Gets: Total bottom lift height (lift1 + lift2) + Sets: Bottom lift1 with value and lift2 with 0 + + + + + Gets: Total lift height (lift1 + lift2) + Sets: Lift1 with value and lift2 with 0 + + + + + Gets or sets the bottom lift height in mm + + + + + Gets or sets the bottom lift speed in mm/min + + + + + Gets or sets the lift height in mm + + + + + Gets or sets the speed in mm/min + + + + + Gets or sets the second bottom lift height in mm + + + + + Gets or sets the second bottom lift speed in mm/min + + + + + Gets or sets the second lift height in mm (This is the closer to fep retract) + + + + + Gets or sets the second speed in mm/min (This is the closer to fep retract) + + + + + Gets or sets the bottom time in seconds to wait after lift / before retract + + + + + Gets or sets the time in seconds to wait after lift / before retract + + + + + Gets: Total bottom retract height (retract1 + retract2) alias of + + + + + Gets: Total retract height (retract1 + retract2) alias of + + + + + Gets the bottom retract height in mm + + + + + Gets the speed in mm/min for the bottom retracts + + + + + Gets the retract height in mm + + + + + Gets the speed in mm/min for the retracts + + + + + Gets or sets the second bottom retract height in mm + + + + + Gets the speed in mm/min for the retracts + + + + + Gets or sets the second retract height in mm + + + + + Gets the speed in mm/min for the retracts + + + + + Gets or sets the bottom pwm value from 0 to 255 + + + + + Gets or sets the pwm value from 0 to 255 + + + + + Gets the minimum used speed for bottom layers in mm/min + + + + + Gets the minimum used speed for normal bottom layers in mm/min + + + + + Gets the minimum used speed in mm/min + + + + + Gets the maximum used speed for bottom layers in mm/min + + + + + Gets the maximum used speed for normal bottom layers in mm/min + + + + + Gets the maximum used speed in mm/min + + + + + Gets the estimate print time in seconds + + + + + Gets the calculated estimate print time in seconds + + + + + Gets the estimate print time in hours + + + + + Gets the estimate print time in hours and minutes formatted + + + + + Gets the starting material milliliters when the file was loaded + + + + + Gets the estimate used material in ml + + + + + Gets the estimate material in grams + + + + + Gets the starting material cost when the file was loaded + + + + + Gets the estimate material cost + + + + + Gets the material cost per one milliliter + + + + + Gets the material name + + + + + Gets the machine name + + + + + Gets the GCode, returns null if not supported + + + + + Gets the GCode, returns null if not supported + + + + + Gets if this file format supports gcode + + + + + Gets if this file have available gcode to read + + + + + Disable or enable the gcode auto rebuild when needed, set this to false to manually write your own gcode + + + + + Get all configuration objects with properties and values + + + + + Gets if this file is valid to read + + + + + Sets a layer + + Layer index + Layer to add + True to add a clone of the layer + + + + Add a list of layers + + Layers to add + True to add a clone of layers + + + + Get layer given index + + Layer index + + + + + Clears all definitions and properties, it also dispose valid candidates + + + + + Check if a file is valid and can be processed before read it against the decode scheme + + + + + + + Validate if a file is a valid + + Full file path + + + + Checks if a extension is valid under the + + Extension to check without the dot (.) + True if is a full file path, otherwise false for extension only + True if valid, otherwise false + + + + Gets all valid file extensions in a specified format + + + + + Gets a thumbnail by it height or lower + + Max height allowed + + + + + Gets a thumbnail by the largest or smallest + + True to get the largest, otherwise false + + + + + Sets thumbnails from a list of thumbnails and clone them + + + + + + Sets all thumbnails the same image + + Image to set + + + + Sets a thumbnail from a disk file + + Thumbnail index + + + + + Triggers before attempt to save/encode the file + + + + + Triggers after save/encode the file + + + + + Encode to an output file + + + + + + Encode to an output file + + Output file + + + + + Decode a slicer file + + + + + + Decode a slicer file + + file path to load, use null to reload file + + + + + Decode a slicer file + + file path to load, use null to reload file + + + + + + Reloads the file + + + + + + + Reloads the file + + + + + + Reloads the file + + + + + + + Reloads the file + + + + + + Extract contents to a folder + + Path to folder where content will be extracted + + + + + + + Re-set exposure time to the transition layers + + True to default all the previous transition layers exposure time, otherwise false + + + + Set transition layers and exposure times, but do not set that count to file property + + Number of transition layers to set + True to default all the previous transition layers exposure time, otherwise false + + + + Get height in mm from layer height + + + + The height in mm + + + + Gets the global value for bottom or normal layers based on layer index + + Type of value + Layer index + Initial value + Normal value + + + + + Gets the global value for bottom or normal layers based on layer + + Type of value + Layer + Initial value + Normal value + + + + + Refresh print parameters globals with this file settings + + + + + Refresh print parameters per layer globals with this file settings + + + + + Gets the value attributed to + + Modifier to use + A value + + + + Sets a property value attributed to + + Modifier to use + Value to set + True if set, otherwise false not found + + + + Sets properties from print parameters + + Number of affected parameters + + + + Gets the bottom wait time before cure, if not available calculate it from light off delay + + + + + + Gets the wait time before cure, if not available calculate it from light off delay + + + + + + Attempt to set wait time before cure if supported, otherwise fall-back to light-off delay + + True to set to bottom properties, otherwise false + The time to set + When true and time is zero, it will calculate light-off delay without extra time, otherwise false to set light-off delay to 0 when time is 0 + + + + Rebuilds GCode based on current settings + + + + + Saves current configuration on input file + + + + + + Saves current configuration on a copy + + File path to save copy as, use null to overwrite active file (Same as ) + + + + + + Partial save of the file, this is the file information only. + When this function is called it's already ready to save to file + + + + + + Triggers when a conversion is valid and before start converting values + + Source file format + True to continue the conversion, otherwise false to stop + + + + Triggers when a conversion is valid and before start converting values + + Target file format + True to continue the conversion, otherwise false to stop + + + + Triggers when the conversion is made but before encoding + + Source file format + True to continue the conversion, otherwise false to stop + + + + Triggers when the conversion is made but before encoding + + Output file format + True to continue the conversion, otherwise false to stop + + + + Converts this file type to another file type + + Target file format + Output path file + File version to use + + The converted file if successful, otherwise null + + + + Converts this file type to another file type + + Target file format + Output path file + File version + + TThe converted file if successful, otherwise null + + + + Changes the compression method of all layers to a new method + + The new method to change to + + + + + Validate AntiAlias Level + + + + + SuppressRebuildProperties = true, call the invoker and reset SuppressRebuildProperties = false + + Action work + True to force rebuild the layer properties after the work and before reset to false + True to recalculate z position of each layer (requires = true), otherwise false + Property name to change for each layer, use null to update all properties (requires = true) + + + + SuppressRebuildProperties = true, call the invoker and reset SuppressRebuildProperties = false + + Action work + True to force rebuild the layer properties after the work and before reset to false + True to recalculate z position of each layer (requires = true), otherwise false + Property name to change for each layer, use null to update all properties (requires = true) + + + + Converts millimeters to pixels given the current resolution and display size + + Millimeters to convert + Fallback to this value in pixels if no ratio is available to make the convertion + Pixels + + + + Converts millimeters to pixels given the current resolution and display size + + Millimeters to convert + Fallback to this value in pixels if no ratio is available to make the convertion + Pixels + + + + Converts millimeters to pixels given the current resolution and display size + + Millimeters to convert + Fallback to this value in pixels if no ratio is available to make the convertion + Pixels + + + + From a pixel position get the equivalent position on the display + + X position in pixels + Decimal precision + Display position in millimeters + + + + From a pixel position get the equivalent position on the display + + Y position in pixels + Decimal precision + Display position in millimeters + + + + From a pixel position get the equivalent position on the display + + X position in pixels + Y position in pixels + Decimal precision + Resolution position in pixels + + + + From a pixel position get the equivalent position on the display + + X position in millimeters + Resolution position in pixels + + + + From a pixel position get the equivalent position on the display + + Y position in millimeters + Resolution position in pixels + + + + From a pixel position get the equivalent position on the display + + X position in millimeters + Y position in millimeters + Resolution position in pixels + + + + Creates a empty mat of file size and create a dummy pixel to prevent a empty layer detection + + Location to set the dummy pixel, use a negative value (-1,-1) to set to the bounding center + Dummy pixel brightness + + + + + Creates a empty mat of file size and create a dummy pixel to prevent a empty layer detection + + Location to set the dummy pixel, use a negative value (-1,-1) to set to the bounding center + + + + + Creates a empty mat of file size + + Dummy pixel brightness + + + + + Creates a empty mat of file size + + + + + + Creates a empty mat of file size + + True to black out the mat + + + + + Clone layers + + + + + + Reallocate with new size + + + + + + Reallocate layer count with a new size + + New layer count + + + + + Reallocate at given index + + + + + + Reallocate at a kept range + + + + + + + Reallocate at start + + + + + + Reallocate at end + + + + + + Allocate layers from a Mat array + + + + The new Layer array + + + + Allocate layers from a Mat array and set them to the current file + + + + /// The new Layer array + + + + Checks if a layer index exists in the collection + + Layer index to check + + + + + Checks if a layer index exists in the collection + + Layer index to check + + + + + Re-assign layer indexes and parent + + + + + Sanitize file and thrown exception if a severe problem is found + + True if one or more corrections has been applied, otherwise false + + + + Rebuild layer properties based on slice settings + + + + + Set LiftHeight to 0 if previous and current have same PositionZ + If true also set light off to 0, otherwise current value will be kept. + + + + + The files contain two preview images. + These are shown on the printer display when choosing which file to print, sparing the poor printer from needing to render a 3D image from scratch. + + + + + Gets or sets the identifier, BM = bitmap? + + + + + Gets or sets the table total size + + + + + Gets the Y dimension of the preview image, in pixels. + + + + + Gets the file tag = MKSDLP + + + + + Gets the model name + + + + + Gets the file tag = MKSDLP + + + + + (0x00 not mirrored, 0x01 X-axis mirroring, 0x02 Y-axis mirroring, 0x03 XY-axis mirroring) + + + + + (0x00 linear transition) + + + + + (0x00: S-shaped acceleration, 0x01: T-shaped acceleration, Default Value: S-shaped acceleration, currently only supports S-shaped acceleration) + + + + + OD OA begins, indicating that the model + support is included; the beginning of 0D 0B, indicating that the layer only has support data + + + + + Gets the X dimension of the preview image, in pixels. + + + + + Gets the Y dimension of the preview image, in pixels. + + + + + Gets the image length in bytes. + + + + + Gets the file mark placeholder + Fixed to "ANYCUBIC" + 00 + + + + + Gets the file format version + 0C + + + + + Gets the area num + 10, 4 for v1, 5 for v515, 8 for v516? + + + + + Gets the header start address + 14 + + + + + 18 + + + + + Gets the preview start offset + 1C + + + + + 20, Spotted on version 515 only + + + + + Gets the layer definition start address + 24 + + + + + 28, Spotted on version 516 only + + + + + 2C, Spotted on version 516 only + + + + + Gets layer image start address + + + + + Spotted on version 517 only + + + + + Gets the section mark placeholder + + + + + Gets the length of this section + + + + + 30 + + + + + 40 + + + + + Layer height in mm + 44 + + + + + 48 + + + + + 4C + + + + + 50 + + + + + 54 + + + + + 58 + + + + + Gets the lift speed in mm/s + 5C + + + + + Gets the retract speed in mm/s + 60 + + + + + 64 + + + + + 68 + + + + + 6C + + + + + 70 + + + + + 74 + + + + + 78 + + + + + 24 00 00 00 $ or Â¥ C2 A5 00 00 or € = E2 82 AC 00 + 7C + + + + + 80 + + + + + 84 + + + + + 88, spotted on 516 + + + + + 8C, spotted on 516 + + + + + 0 = Basic mode | 1 = Advanced mode which allows TSMC + + + + + The files contain two preview images. + These are shown on the printer display when choosing which file to print, sparing the poor printer from needing to render a 3D image from scratch. + + + + + 90 + + + + + Gets the image width, in pixels. + A0 + + + + + Gets the operation mark 'x' + A4 + + + + + Gets the image height, in pixels. + A8 + + + + + Gets the layer image offset to encoded layer data, and its length in bytes. + + + + + Gets the layer image length in bytes. + + + + + Gets the exposure time for this layer, in seconds. + + + + + Gets the layer height for this layer, measured in millimeters. + + + + + 1269C + + + + + Gets a magic number identifying the file type. + 0x12fd_0019 for cbddlp + 0x12fd_0086 for ctb + 0x9FDA83AE for phz + + + + + Gets the software version + + + + + Gets the layer height setting used at slicing, in millimeters. Actual height used by the machine is in the layer table. + + + + + Gets the exposure time setting used at slicing, in seconds, for normal (non-bottom) layers, respectively. Actual time used by the machine is in the layer table. + + + + + Gets the exposure time setting used at slicing, in seconds, for bottom layers. Actual time used by the machine is in the layer table. + + + + + Gets number of layers configured as "bottom." Note that this field appears in both the file header and ExtConfig.. + + + + + Gets the printer resolution along X axis, in pixels. This information is critical to correctly decoding layer images. + + + + + Gets the printer resolution along Y axis, in pixels. This information is critical to correctly decoding layer images. + + + + + Gets the file offsets of ImageHeader records describing the larger preview images. + + + + + Gets the file offset of a table of LayerHeader records giving parameters for each printed layer. + + + + + Gets the number of records in the layer table for the first level set. In ctb files, that’s equivalent to the total number of records, but records may be multiplied in antialiased cbddlp files. + + + + + Gets the file offsets of ImageHeader records describing the smaller preview images. + + + + + Gets the estimated duration of print, in seconds. + + + + + Gets the records whether this file was generated assuming normal (0) or mirrored (1) image projection. LCD printers are "mirrored" for this purpose. + + + + + Gets the number of times each layer image is repeated in the file. + This is used to implement antialiasing in cbddlp files. When greater than 1, + the layer table will actually contain layer_table_count * level_set_count entries. + See the section on antialiasing for details. + + + + + Gets the PWM duty cycle for the UV illumination source on normal levels, respectively. + This appears to be an 8-bit quantity where 0xFF is fully on and 0x00 is fully off. + + + + + Gets the PWM duty cycle for the UV illumination source on bottom levels, respectively. + This appears to be an 8-bit quantity where 0xFF is fully on and 0x00 is fully off. + + + + + Gets the height of the model described by this file, in millimeters. + + + + + Gets dimensions of the printer’s X output volume, in millimeters. + + + + + Gets dimensions of the printer’s Y output volume, in millimeters. + + + + + Gets dimensions of the printer’s Z output volume, in millimeters. + + + + + Gets the key used to encrypt layer data, or 0 if encryption is not used. + + + + + Gets the light off time setting used at slicing, for bottom layers, in seconds. Actual time used by the machine is in the layer table. Note that light_off_time_s appears in both the file header and ExtConfig. + + + + + Gets the light off time setting used at slicing, for normal layers, in seconds. Actual time used by the machine is in the layer table. Note that light_off_time_s appears in both the file header and ExtConfig. + + + + + Gets number of layers configured as "bottom." Note that this field appears in both the file header and ExtConfig. + + + + + Gets the distance to lift the build platform away from the vat after bottom layers, in millimeters. + + + + + Gets the speed at which to lift the build platform away from the vat after bottom layers, in millimeters per minute. + + + + + Gets the distance to lift the build platform away from the vat after normal layers, in millimeters. + + + + + Gets the speed at which to lift the build platform away from the vat after normal layers, in millimeters per minute. + + + + + Gets the speed to use when the build platform re-approaches the vat after lift, in millimeters per minute. + + + + + Gets the estimated required resin, measured in milliliters. The volume number is derived from the model. + + + + + Gets the estimated grams, derived from volume using configured factors for density. + + + + + Gets the estimated cost based on currency unit the user had configured. Derived from volume using configured factors for density and cost. + + + + + Gets the machine name offset to a string naming the machine type, and its length in bytes. + + + + + Gets the machine size in bytes + + + + + Gets the machine name. string is not nul-terminated. + The character encoding is currently unknown — all observed files in the wild use 7-bit ASCII characters only. + Note that the machine type here is set in the software profile, and is not the name the user assigned to the machine. + + + + + Gets the parameter used to control encryption. + Not totally understood. 0 for cbddlp files, 0xF for ctb files, 0x1c (28) for phz + + + + + Gets the minutes since Jan 1, 1970 UTC + + + + + The files contain two preview images. + These are shown on the printer display when choosing which file to print, sparing the poor printer from needing to render a 3D image from scratch. + + + + + Gets the X dimension of the preview image, in pixels. + + + + + Gets the Y dimension of the preview image, in pixels. + + + + + Gets the image offset of the encoded data blob. + + + + + Gets the image length in bytes. + + + + + Gets the build platform Z position for this layer, measured in millimeters. + + + + + Gets the exposure time for this layer, in seconds. + + + + + Gets how long to keep the light off after exposing this layer, in seconds. + + + + + Gets the layer image offset to encoded layer data, and its length in bytes. + + + + + Gets the layer image length in bytes. + + + + + ms + + + + + s + + + + + mm/s + + + + + mm/m + + + + + cm/m + + + + + Show image at start of each layer block commands + + + + + Show image just before exposing / turning LED ON + + + + + Converts seconds to current gcode norm + + + + + + + Converts speed in mm/min to current gcode norm + + Millimeters per minute + + + + + Converts time from current gcode norm in to s + + Time in + + + + + Converts speed from current gcode norm in to mm/min + + Speed in + + + + + Gets or sets if this command is enabled + + + + + Gets or sets the command name + + + + + Gets or sets the arguments for this command + + + + + Gets or sets the comment + + + + + Set gathered data to the layer + + + + + Gets the index of this aperture + + + + + Gets the aperture name + + + + + Do not omit zeros + + + + + Omit left zeros + + + + + Omit right zeros + + + + + https://www.ucamco.com/files/downloads/file_en/456/gerber-layer-format-specification-revision-2022-02_en.pdf?ac97011bf6bce9aaf0b1aac43d84b05f + + + + + Gets the macro name + + + + + A vector line is a rectangle defined by its line width, start and end points. The line ends are rectangular. + + + + + Exposure off/on (0/1) + 1 + + + + + Width ≥ 0 + 2 + + + + + Height ≥ 0 + 3 + + + + + Center point X coordinate + 4 + + + + + Center point Y coordinate + 5 + + + + + Rotation angle, in degrees counterclockwise, a decimal. + The primitive is rotated around the origin of the macro definition, i.e. the (0, 0) point of macro coordinates. + 6 + + + + + A circle primitive is defined by its center point and diameter. + + + + + Exposure off/on (0/1) + 1 + + + + + Diameter ≥ 0 + 2 + + + + + Center X coordinate. + 3 + + + + + Center Y coordinate. + 4 + + + + + Rotation angle, in degrees counterclockwise, a decimal. + The primitive is rotated around the origin of the macro definition, i.e. the (0, 0) point of macro coordinates. + 5 + + + + + The comment primitive has no effect on the image but adds human-readable comments in an AM command. + The comment primitive starts with the ‘0’ code followed by a space and then a single-line text string. + The text string follows the syntax for strings in section 3.4.3. + + + + + The comment + 1 + + + + + An outline primitive is an area defined by its outline or contour. + The outline is a polygon, consisting of linear segments only, defined by its start vertex and n subsequent vertices. + The outline must be closed, i.e. the last vertex must be equal to the start vertex. + The outline must comply with all the requirements of a contour according to 4.10.3. + + + + + Exposure off/on (0/1) + 1 + + + + + The number of vertices of the outline = the number of coordinate pairs minus one. An integer ≥3. + 2 + + + + + subsequent X and Y coordinates. + The X and Y coordinates are not modal: both X and Y must be specified for all points. + 2+n + + + + + Rotation angle, in degrees counterclockwise, a decimal. + The primitive is rotated around the origin of the macro definition, i.e. the (0, 0) point of macro coordinates. + + + + + A polygon primitive is a regular polygon defined by the number of vertices n, the center point and the diameter of the circumscribed circle. + + + + + Exposure off/on (0/1) + 1 + + + + + Diameter ≥ 0 + 2 + + + + + Center X coordinate. + 3 + + + + + Center Y coordinate. + 4 + + + + + Diameter ≥ 0 + 5 + + + + + Rotation angle, in degrees counterclockwise, a decimal. + The primitive is rotated around the origin of the macro definition, i.e. the (0, 0) point of macro coordinates. + 6 + + + + + A vector line is a rectangle defined by its line width, start and end points. The line ends are rectangular. + + + + + Exposure off/on (0/1) + 1 + + + + + Width of the line ≥ 0 + 2 + + + + + Start point X coordinate + 3 + + + + + Start point Y coordinate + 4 + + + + + End point X coordinate + 5 + + + + + Start point Y coordinate + 6 + + + + + Rotation angle, in degrees counterclockwise, a decimal. + The primitive is rotated around the origin of the macro definition, i.e. the (0, 0) point of macro coordinates. + 7 + + + + + A helper class with utilities + + + + + Gets the instance + + + + + Gets the issue type associated + + + + + Gets the layer where this issue is present + + + + + Gets the layer index + + + + + Gets the bounding rectangle of the area + + + + + Gets the number of pixels + + + + + Gets the area of the issue + + + + + Gets the points contours of the issue + + + + + Gets the points containing the coordinates of the issue + + + + + Represent a Layer + + + + + Gets or sets the parent SlicerFile + + + + + Gets the number of non zero pixels on this layer image + + + + + Gets the ratio between non zero pixels and display number of pixels + + + + + Gets the percentage of non zero pixels relative to the display number of pixels + + + + + Gets if this layer is empty/all black pixels + + + + + Gets the layer area (XY) in mm^2 + Pixel size * number of pixels + + + + + Gets the layer volume (XYZ) in mm^3 + Pixel size * number of pixels * layer height + + + + + Gets the bounding rectangle for the image area + + + + + Gets the bounding rectangle for the image area in millimeters + + + + + Gets if is the first layer + + + + + Gets if layer is between first and last layer, aka, not first nor last layer + + + + + Gets if is the last layer + + + + + Gets if is in the bottom layer group + + + + + Gets if is in the normal layer group + + + + + Gets if this layer is also an transition layer + + + + + Gets the previous layer, returns null if no previous layer + + + + + Gets the previous layer with a different height from the current, returns null if no previous layer + + + + + Gets the previous layer matching at least pixels, returns null if no previous layer + + + + + Gets the next layer, returns null if no next layer + + + + + Gets the next layer with a different height from the current, returns null if no next layer + + + + + Gets the next layer matching at least pixels, returns null if no next layer + + + + + Gets the layer index + + + + + Gets the layer number, 1 started + + + + + Gets or sets the absolute layer position on Z in mm + + + + + Gets the relative layer position on Z in mm (Relative to the previous layer) + + + + + Gets or sets the wait time in seconds before cure the layer + AKA: Light-off delay + Chitubox: Rest time after retract + Lychee: Wait before print + + + + + Gets or sets the exposure time in seconds + + + + + Gets or sets the wait time in seconds after cure the layer + Chitubox: Rest time before lift + Lychee: Wait after print + + + + + Gets or sets the layer off time in seconds + + + + + Gets: Total lift height (lift1 + lift2) + Sets: Lift1 with value and lift2 with 0 + + + + + Gets or sets the lift height in mm + + + + + Gets or sets the speed in mm/min + + + + + Gets or sets the lift height in mm + + + + + Gets or sets the speed in mm/min + + + + + Gets: Total retract height (retract1 + retract2) alias of + + + + + Gets the retract height in mm + + + + + Gets the speed in mm/min for the retracts + + + + + Gets or sets the second retract height in mm + + + + + Gets the speed in mm/min for the retracts + + + + + Gets or sets the pwm value from 0 to 255 + + + + + Gets the minimum used speed in mm/min + + + + + Gets the maximum used speed in mm/min + + + + + Gets if this layer can be exposed to UV light + + + + + Gets the layer height in millimeters of this layer + + + + + Gets the computed material milliliters spent on this layer + + + + + Gets the computed material milliliters percentage compared to the rest of the model + + + + + Gets or sets the compression method used to cache the image + + + + + Gets or sets layer image compressed data + + + + + True if this layer have an valid initialized image, otherwise false + + + + + Gets or sets a new image instance + + + + + Gets a new Brg image instance + + + + + Gets a computed layer filename, padding zeros are equal to layer count digits + + + + + Gets if layer image has been modified + + + + + Gets if this layer have same value parameters as global settings + + + + + True if this layer is using TSMC values, otherwise false + + + + + Reset all parameters to the default values from the global parameters + + + + + Gets the layer area (XY) in mm^2 + Pixel size * number of pixels + + + + + Gets the layer area (XY) in mm^2 + Pixel size * number of pixels + + + + + Gets the layer volume (XYZ) in mm^3 + Pixel size * number of pixels * layer height + + + + + Gets the layer volume (XYZ) in mm^3 + Pixel size * number of pixels * layer height + + + + + Gets the wait time before cure, if not available calculate it from light off delay + + + + + + Attempt to set wait time before cure if supported, otherwise fallback to light-off delay + + The time to set + When true and time is zero, it will calculate light-off delay without extra time, otherwise false to set light-off delay to 0 when time is 0 + + + + Zero all 'wait times / delays' for this layer + + + + + Copy all parameters from this layer to an target layer + + + + + + Copy all exposure parameters from this layer to an target layer + + + + + + Copy all wait parameters from this layer to an target layer + + + + + + Copy all lift parameters from this layer to an target layer + + + + + + Copy the image and related parameters from this layer to an target layer + + + + + + Gets or sets if the detection is enabled + + + + + Gets or sets a list of layers to check for islands, absent layers will not be checked. + Set to null to check every layer + + + + + Combines the island and overhang detections for a better more realistic detection and to discard false-positives. (Slower) + If enabled, and when a island is found, it will check for overhangs on that same island, if no overhang found then the island will be discarded and considered safe, otherwise it will flag as an island issue. + Note: Overhangs settings will be used to configure the detection.Enabling Overhangs is not required for this procedure to work. + + + + + Gets the setting for whether or not diagonal bonds are considered when evaluation islands. + If true, all 8 neighbors of a pixel (including diagonals) will be considered when finding + individual components on the layer, if false only 4 neighbors (right, left, above, below) + will be considered.. + + + + + Gets or sets the binary threshold, all pixels below this value will turn in black, otherwise white + Set to 0 to disable this operation + + + + + Gets the required area size (x*y) to consider process a island (0-65535) + + + + + Gets the required brightness for check a pixel under a island (0-255) + + + + + Gets the required number of pixels to support a island and discard it as a issue (0-255) + + + + + Gets the required multiplier from the island pixels to support same island and discard it as a issue + + + + + Gets the required brightness of supporting pixels to count as a valid support (0-255) + + + + + Overhang configuration + + + + + Gets or sets if the detection is enabled + + + + + Gets or sets a list of layers to check for overhangs, absent layers will not be checked. + Set to null to check every layer + + + + + Gets or sets if should take in consideration the islands, if yes a island can't be a overhang at same time, otherwise islands and overhangs can be shared + + + + + After compute overhangs, masses with a number of pixels bellow this number will be discarded (Not a overhang) + + + + + Previous layer will be subtracted from current layer, after will erode by this value. + The survived pixels are potential overhangs. + + + + + Gets or sets if the detection is enabled + + + + + Gets or sets the starting layer index for the detection which will also be considered a drain layer. + Use this setting to bypass complicated rafts by selected the model first real layer. + + + + + Gets or sets the binary threshold, all pixels below this value will turn in black, otherwise white + Set to 0 to disable this operation + + + + + Gets the required area size (x*y) to consider process a hollow area (0-255) + + + + + Gets the number of black pixels required to consider a drain + + + + + Gets the maximum pixel brightness to be a drain pixel (0-150) + + + + + Gets if suction cups can also be detected together with resin traps + + + + + Required minimum area to be considered a suction cup + + + + + Required minimum height (in mm) to be considered a suction cup + + + + + Gets if the detection is enabled + + + + + Gets the minimum pixel brightness to be a touching bound + + + + + Gets or sets the margin in pixels from left edge to check for touching white pixels + + + + + Gets or sets the margin in pixels from top to check for touching white pixels + + + + + Gets or sets the margin in pixels from right edge to check for touching white pixels + + + + + Gets or sets the margin in pixels from bottom edge to check for touching white pixels + + + + + Gets if the detection is enabled + + + + + Get the offset from top to sum to printer max Z height + + + + + Gets the issue type associated + + + + + Gets the layer where issue is present and starts + + + + + Gets the layer where issue ends + + + + + Gets the layer index + + + + + Gets the layer index + + + + + Gets the number of layers in this range + + + + + Gets the total height that represents this issue + + + + + Gets the bounding rectangle of the area + + + + + Gets the area of the issue + + + + + Gets the area of the issue + + + + + Gets all issues inside this main issue + + + + + Gets the LayerCount for this clip + + + + + Gets the LayerHeight for this clip + + + + + Gets the Resolution for this clip + + + + + Gets the description of this operation + + + + + Gets the index of current item + + + + + Clears the manager + + + + + Clears and init clipboard + + + + + + Snapshot layers and prepare manager to collect modified layers with + + + + + Collect differences and create a clip + + + + + Collect differences and create a clip + + + + + Gets the visible aka not ignored + + + + + + Clears and dispose all the cache + + + + + + + + Gets the slicer file + + + + + Gets or sets the cache count of items to keep in memory + + + + + Gets the number of cached elements per a cache entry + + + + + Gets the starting layer index range + + + + + Gets the ending layer index range + + + + + Gets the size of this collection + + + + + Gets the image rotation to cache + + + + + Gets the image flip to cache + + + + + Gets if striping anti-aliasing is enabled, cache will be threshold'ed + + + + + Gets or sets the cache direction, false to go backwards, true to go forward + + + + + If enabled it will not calculate the cache index given a layer index, set this to true to use your own indexing without pair them with layers + + + + + Gets or sets the auto dispose mode, it will dispose all mat's below of above passed index + + + + + Gets or sets the amount of last mats to keep cached when is enabled + + + + + Gets the cache mat array + + + + + Gets or sets the action to trigger after cache the initial + + + + + Gets the cache index from a layer index, required when layer range is not 0 started + + + + + + + Gets the layer index from the cache index, required when layer range is not 0 started + + + + + + + Gets all cached mat's given an index + + + + + + + Consume and dispose the cached Mats for given layer index + + + + + + Clears and dispose the cache but keep the selected index and optionally the last n indexes + + + + + + + Clears and dispose all the cache + + + + + + + + Instance of (singleton) + + + + + Gets the total number of bottles in stock + + + + + Gets the total number of bottles ever owned + + + + + Gets the total of consumed volume in milliliters + + + + + Gets the total of consumed volume in liters + + + + + Gets the total volume in stock in milliliters + + + + + Gets the total volume in stock in liters + + + + + Gets the total costs + + + + + Gets the total print time in hours + + + + + Gets the total print time + + + + + Load settings from file + + + + + Save settings to file + + + + + Gets the file format for this mesh + + + + + Gets the from model export + + + + + Gets the file path of the stream + + + + + Gets the file name with extension from + + + + + Gets the current file stream + + + + + Gets the number of vertexes, this is often triangle count * 3 + + + + + Gets the number of triangles + + + + + Call once before write content to the file, use this to build up the header if any + + + + + Writes an triangle to the file + + + + + + + + + Call once before close the file, use this to build up the footer if any + + + + + + + + Gets or sets if this device is enabled + + + + + Gets or sets the full path for the location + + + + + Gets or sets the path name alias + + + + + Gets or sets the compatible extensions with this device. + Empty or null to be compatible with everything + + + + + Gets or sets the alias name for this printer. + Not used on requests + + + + + Gets or sets the host/ip for the requests + + + + + Gets or sets the host port for the requests. + Use 0 to not use a port + + + + + Gets or sets the compatible extensions with this device. + Empty or null to be compatible with everything + + + + + Gets if this host is valid + + + + + Gets or sets this request type + + + + + Gets or sets this request method + + + + + Gets or sets the request path, eg: print/file/{0} + + + + + Gets the path with formatted arguments + + + + + + + Implementation of to simplify models. + + + + + Multicast event for property change notifications. + + + + + Notifies listeners that a property value has changed. + + + Name of the property used to notify listeners. This + value is optional and can be provided automatically when invoked from compilers + that support . + + + + + Gets or sets the layer height in millimeters + + + + + Gets or sets the bottom exposure in seconds + + + + + Gets or sets the bottom exposure in seconds + + + + + Gets or sets the brightness level + + + + + Gets or sets if this device is enabled + + + + + Gets or sets the full path for the application + + + + + Gets or sets the path name alias + + + + + Gets or sets the arguments for the application + + + + + Gets or sets the compatible extensions with this device. + Empty or null to be compatible with everything + + + + + Represents a material to feed in the printer + + + + + Gets or sets the bottle volume in milliliters + + + + + Gets or sets the bottle weight in grams + + + + + Gets or sets the material density in g/ml + + + + + Gets or sets the bottle cost + + + + + Gets or sets the number of bottles in stock + + + + + Gets or sets the current bottle remaining material in milliliters + + + + + Gets the total available volume in stock in milliliters + + + + + Gets the number of consumed bottles + + + + + Gets the total number of owned bottles + + + + + Gets or sets the total number of consumed volume in milliliters + + + + + Gets total number of consumed volume in liters + + + + + Gets or sets the total print time using with material in hours + + + + + Gets the cost for a given volume + + Volume in ml + + + + + Gets the grams for a given volume + + Volume in ml + + + + + Consume material from current bottle and manage stock + + Volume to consume in milliliters + Time in seconds it took to print + True if still have bottles in stock, otherwise false + + + + Add print time with this material + + Seconds to add + + + + A string that always end with 0x00 if not null + It contains the string length as uint + + + + + A string that always end with 0x00 if not null + It contains the string length as uint + + + + + Gets or sets from where this option got loaded/imported + + + + + Gets or sets the parent + + + + + Gets the bounding rectangle of the model, preserved from any change during and after execution + + + + + Gets or sets any object which is not used internally + + + + + Gets the ID name of this operation, this comes from class name with "Operation" removed + + + + + Gets the starting layer selection + + + + + Gets the last used layer range selection, returns none if custom + + + + + Gets a string representing the layer range, used with profiles + + + + + Gets if the LayerIndexEnd selector is enabled + + + + + Gets if this operation should set layer range to the actual layer index on layer preview + + + + + Gets if this operation can run in a file open as partial mode + + + + + Gets if this operation can make use of ROI + + + + + Gets if this operation can make use maskable areas + + + + + Gets if this operation can store profiles + + + + + Gets if this operation supports cancellation + + + + + Gets the icon class to show on the UI + + + + + Gets the title of this operation + + + + + Gets a descriptive text of this operation + + + + + Gets the Ok button text + + + + + Gets the confirmation text for the operation + + + + + Gets the progress window title + + + + + Gets the progress action name + + + + + Gets if this operation have a action text + + + + + Gets the start layer index where operation will starts in + + + + + Gets the end layer index where operation will ends in + + + + + Gets if any bottom layer is included in the selected layer range + + + + + Gets if any normal layer is included in the selected layer range + + + + + Gets the number of selected layers + + + + + Gets the name for this profile + + + + + Gets if this profile is the default to load + + + + + Gets or sets an ROI to process this operation + + + + + Gets if there is an ROI associated + + + + + Gets or sets an Mask to process this operation + + + + + Gets if there is masks associated + + + + + Gets if there is roi or masks associated + + + + + Gets if this operation have been executed once + + + + + Gets if this operation have validated at least once + + + + + Gets if the operation can spawn + + + + + Gets if this operation can spawn under the + + + + + Gets if this operation can spawn under the + + + + + Validates the operation, return null or empty if validates + + + + + + Validates the operation + + null or empty if validates, otherwise return a string with error message + + + + Gets if the operation is able to execute + + + + + + Selects all layers from first to last layer + + + + + Selects one layer + + Layer index to select + + + + Selects all bottom layers + + + + + Selects all normal layers + + + + + Select the first layer (0) + + + + + Select the last layer + + + + + Selects from first to a layer index + + To layer index to select + + + + Selects from a layer index to the last layer + + From layer index to select + + + + Selects layer given a range type + + + + + + + Called to init the object when changes + + + + + Clears the ROI and set to empty + + + + + Clear and + + + + + Set only if not set already + + ROI to set + + + + Gets the size, but if empty returns the file resolution size instead + + + + + + Gets the size, but if empty returns size instead + + + + + + + Gets the size, but if empty returns the size from instead + + + + + + + Gets the size, but if empty returns the instead + + + + + + + Gets the size, but if empty returns the model volume bounds size instead + + + + + + Gets the size, but if empty returns the instead + + + + + + + Gets a cropped shared from by the , but if empty return the instead + + + + + + + Gets a cropped shared from by the , but if empty crop by + + + + + + + + Gets a cropped shared by the , but if empty crop by + + + + + + + Gets the , but if empty returns + + + + + + Clears all masks + + + + + Sets masks only if they are empty + + + + + + Returns a mask given + + + + + + + Apply a mask to a mat + + Original untouched mat + Mat to modify and apply the mask + Mask + + + + Gets a mask and apply it + + Original unmodified image + Result image which will also be modified + + + + Execute the operation internally, to be override by class + + + + + + + + Execute the operation + + + + + + + + Execute the operation on a given + + + + + + + + + Get the selected layer range in a new array, array index will not match layer index when a range is selected + + + + + + Copy this operation base configuration to another operation. + Layer range, ROI, Masks + + + + + + Serialize class to XML file + + + + + + + Clone object + + + + + + Deserialize from a XML file + + XML file path + + + + + Deserialize from a XML file + + XML file path + + + + + + Deserialize from a XML file + + XML file path + + + + + + Gets the layers + + + + + + Gets the bottom and normal layers, 0 = bottom | 1 = normal + + + + + + Gets all holes in pixels and ordered + + + + + Gets all holes in pixels and ordered + + + + + Gets all holes in pixels and ordered + + + + + Gets all holes in pixels and ordered + + + + + Gets the bottom and normal layers, 0 = bottom | 1 = normal + + + + + + Gets the bottom and normal layers, 0 = bottom | 1 = normal + + + + + + Gets the exposure table into a dictionary where key is the layer height + + + + + Gets or sets if parameters are global or per layer inside a layer range + + + + + Gets or sets the number of sequential layers to set the parameters + + + + + Gets or sets the number of sequential layers to skip after set a layer + + + + + Number of times this file has been printed + + + + + Gets or sets if cloned layers will keep same position z or get the height rebuilt + + + + + Gets or sets the number of clones + + + + + Get the cached dim mat's + + + + + + Loads mask from a image file + + + + + + + + Fills the plate with maximum cols and rows + + + + + Use the alternate pattern every layers + + + + + Gets or sets if operation can be cancelled + + + + + Gets or sets the item name for the operation + + + + + Gets or sets the item name for the operation + + + + + Gets or sets the number of processed items + + + + + Gets or sets the total of item count on this operation + + + + + Gets or sets an tag + + + + + Gets the remaining items to be processed + + + + + Gets the progress from 0 to 100% + + + + + Sets or gets the Z position to raise to + + + + + True to output a dummy pixel on bounding rectangle position to avoid empty layer and blank image, otherwise set to false + + + + + Gets the minimum required area to solidify it + + + + + Sets or gets the Z position to raise to + + + + + True to output a dummy pixel on bounding rectangle position to avoid empty layer and blank image, otherwise set to false + + + + + Gets or sets the alternating height in millimeters to raise when, it will raise only at each defined millimeters and skip the same next millimeters + + + + + Gets or sets the alternating layer count to raise when, it will raise only at each defined layers and skip the same next layers + + + + + Gets the total number of additional lifts + + + + + Gets or sets if last layer must be ensured in the sequence, + If true, it will generate an obligatory additional layer to cover the last layer + + + + + Gets or sets the index number to show on GUI + + + + + Gets the + + + + + Gets the layer index + + + + + Gets the location of the operation + + + + + Gets the for the draw operation + + + + + Gets the total size of the operation + + + + + Gets or sets the pixels per mm on X direction + + + + + Gets or sets the pixels per mm on Y direction + + + + + Gets or sets the pixels per mm + + + + + Gets the maximum (Width or Height) pixels per mm + + + + + Gets the pixel width in millimeters + + + + + Gets the pixel height in millimeters + + + + + Gets the pixel size in millimeters + + + + + Gets the maximum pixel between width and height in millimeters + + + + + Gets the pixel area in millimeters + + + + + Gets the pixel width in microns + + + + + Gets the pixel height in microns + + + + + Gets the pixel size in microns + + + + + Gets the maximum pixel between width and height in microns + + + + + Gets the pixel area in millimeters + + + + + Preset list of machines + + + + + Gets all machines from PrusaSlicer profiles + + + + + + Gets the input label + + + + + Gets the hover tooltip for this input + + + + + Gets the value representative unit name + + + + + Gets or sets the value for this input + + + + + Gets the script name + + + + + Gets the script description of what it does + + + + + Gets the script author name + + + + + Gets the script version + + + + + Gets the minimum version able to run this script + Scripts were introduced on v2.8 + + + + + List of user inputs to show on GUI for configuration of the script + + + + + Gets or sets the title for the dialog + + + + + Gets or sets the default directory to open the dialog in + + + + + Gets or sets the initial filename to be on the dialog + + + + + Gets or sets the file filters on the dropdown list + + + + + Gets the loaded slicer file + + + + + Gets the progress operation for loading bar + + + + + Gets the current operation holding the layer range, mask, roi, etc + + + + + Gets the script configuration + + + + + Gets the minimum for this input + + + + + Gets the minimum for this input + + + + + Gets the increment value for this + + + + + Gets the number of decimal plates to round the value + + + + + Gets or sets if allow multiple file selection + + + + + Gets or sets the selected files + + + + + Gets the title for the dialog + + + + + Parse the script and clean forbidden keywords + + Text to parse + The parsed text + + + + Gets or sets the default extension for the dialog + + + + + Gets if this input accepts multi lines + + + + + Gets or sets the text when the switch is turned off + + + + + Gets or sets the text when the switch is turned on + + + + + Gets the size of resolution + + + + + Gets the size of display + + + + + Gets the pixels per millimeters + + + + + Gets or sets the + + + + + Gets or sets if this suggestion is enabled + + + + + Gets or sets if this suggestion can be auto applied once file load + + + + + Gets or sets when to apply the suggestion + + + + + Gets if this suggestion is informative only and contain no actions to execute + + + + + Gets if this suggestion is available given the + + + + + Gets if this suggestion is already applied given the + + + + + Gets the title for this suggestion + + + + + Gets the message for this suggestion + + + + + Gets the tooltip message + + + + + Gets the confirmation message before apply the suggestion + + + + + Validates the settings and return a string message if got any error + + + + + + Executes and applies the suggestion + + + + + + + Executes and applies the suggestion + + + + + + + Executes only if this suggestion is marked with as true + + + + + + Gets if is running under Linux and under AppImage format + + + + + Gets if is running under Linux and under AppImage format + + + + + + Gets if is running under MacOS and under app format + + + + + Gets the main name of the operative system + + + + + Gets the main name of the operative system with architecture + + + + + Get the USB handler + + This should be the drive letter. Format: F:/, C:/.. + + + + Eject an USB drive + + This should be the drive letter. Format: F:/, C:/.. + + + + Default filepath for store + + + + + Gets all suggestions + + + + + Instance (singleton) + + + + + Reset to defaults + + True to save settings on file, otherwise false + + + + Load settings from file + + + + + Save settings to file + + + + + Implementation of a dynamic data collection based on generic Collection<T>, + implementing INotifyCollectionChanged to notify listeners + when items get added, removed or the whole list is refreshed. + + + + + Initializes a new instance of ObservableCollection that is empty and has default initial capacity. + + + + + Initializes a new instance of the ObservableCollection class that contains + elements copied from the specified collection and has sufficient capacity + to accommodate the number of elements copied. + + The collection whose elements are copied to the new list. + + The elements are copied onto the ObservableCollection in the + same order they are read by the enumerator of the collection. + + collection is a null reference + + + + Initializes a new instance of the ObservableCollection class + that contains elements copied from the specified list + + The list whose elements are copied to the new list. + + The elements are copied onto the ObservableCollection in the + same order they are read by the enumerator of the list. + + list is a null reference + + + + Gets or sets a value indicating whether this collection acts as a , + disallowing duplicate items, based on . + This might indeed consume background performance, but in the other hand, + it will pay off in UI performance as less required UI updates are required. + + + + + Clear the list and set a collection in place + + + The collection whose elements should be added to the end of the . + The collection itself cannot be null, but it can contain elements that are null, if type T is a reference type. + + is null. + + + + Adds the elements of the specified collection to the end of the . + + + The collection whose elements should be added to the end of the . + The collection itself cannot be null, but it can contain elements that are null, if type T is a reference type. + + is null. + + + + Inserts the elements of a collection into the at the specified index. + + The zero-based index at which the new elements should be inserted. + The collection whose elements should be inserted into the List{T}. + The collection itself cannot be null, but it can contain elements that are null, if type T is a reference type. + is null. + is not in the collection range. + + + + Removes the first occurence of each item in the specified collection from the . + + The items to remove. + is null. + + + + Iterates over the collection and removes all items that satisfy the specified match. + + The complexity is O(n). + + Returns the number of elements that where + is null. + + + + Iterates over the specified range within the collection and removes all items that satisfy the specified match. + + The complexity is O(n). + The index of where to start performing the search. + The number of items to iterate on. + + Returns the number of elements that where + is out of range. + is out of range. + is null. + + + + Removes a range of elements from the >. + + The zero-based starting index of the range of elements to remove. + The number of elements to remove. + The specified range is exceeding the collection. + + + + Clears the current collection and replaces it with the specified collection, + using . + + The items to fill the collection with, after clearing it. + is null. + + + + Removes the specified range and inserts the specified collection in its position, leaving equal items in equal positions intact. + + The index of where to start the replacement. + The number of items to be replaced. + The collection to insert in that location. + is out of range. + is out of range. + is null. + + + + Called by base class Collection<T> when the list is being cleared; + raises a CollectionChanged event to any listeners. + + + + + + + + + + + Raise CollectionChanged event to any listeners. + Properties/methods modifying this ObservableCollection will raise + a collection changed event through this virtual method. + + + When overriding this method, either call its base implementation + + + + + Helper to raise Count property and the Indexer property. + + + + + /// Helper to raise a PropertyChanged event for the Indexer property + /// + + + + Helper to raise CollectionChanged event to any listeners + + + + + Helper to raise CollectionChanged event with action == Reset to any listeners + + + + + Helper to raise event for clustered action and clear cluster. + + The index of the item following the replacement block. + + + + + + To be kept outside , since otherwise, a new instance will be created for each generic type used. + + + +