From 439e0d162cac78bafe4d2aa3e7a6102a67e01dcd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tiago=20Concei=C3=A7=C3=A3o?= Date: Sun, 11 Dec 2022 05:18:33 +0000 Subject: [PATCH] v3.8.2 - **Dynamic lifts:** - (Improvement) Remove the 'light-off delay' set logic as it is now better integrated on 'Wait time before cure' suggestion and should run/applied there if intended - (Fix) Prevent set NaN values to lift height and/or speed - (Fix) Lift height and speed for the current layer must be calculated from previous layer (#618) - (Improvement) Windows auto-updater will install the update without dialogs, just displaying installation progress --- CHANGELOG.md | 8 ++ RELEASE_NOTES.md | 7 +- UVtools.Core/Layers/Layer.cs | 44 ++++++++ .../Operations/OperationDynamicLifts.cs | 90 ++++------------ UVtools.Core/Operations/OperationScripting.cs | 4 +- UVtools.Core/UVtools.Core.csproj | 2 +- .../Tools/ToolDynamicLiftsControl.axaml | 101 +----------------- UVtools.WPF/MainWindow.axaml | 1 + UVtools.WPF/MainWindow.axaml.cs | 4 +- UVtools.WPF/Program.cs | 8 +- UVtools.WPF/Structures/AppVersionChecker.cs | 2 +- UVtools.WPF/UVtools.WPF.csproj | 2 +- build/package-manager/wingetPublish.ps1 | 30 +++++- documentation/UVtools.Core.xml | 30 ++++++ 14 files changed, 152 insertions(+), 181 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 26e62d33..771b093d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## 11/12/2022 - v3.9.2 + +- **Dynamic lifts:** + - (Improvement) Remove the 'light-off delay' set logic as it is now better integrated on 'Wait time before cure' suggestion and should run/applied there if intended + - (Fix) Prevent set NaN values to lift height and/or speed + - (Fix) Lift height and speed for the current layer must be calculated from previous layer (#618) +- (Improvement) Windows auto-updater will install the update without dialogs, just displaying installation progress + ## 03/12/2022 - v3.9.1 - (Improvement) Performance on pixel editor when using high count of layers below and/or above diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md index 89d2cea0..e800c314 100644 --- a/RELEASE_NOTES.md +++ b/RELEASE_NOTES.md @@ -1,3 +1,6 @@ -- (Improvement) Performance on pixel editor when using high count of layers below and/or above -- (Fix) Unable to disable specific issues detection +- **Dynamic lifts:** + - (Improvement) Remove the 'light-off delay' set logic as it is now better integrated on 'Wait time before cure' suggestion and should run/applied there if intended + - (Fix) Prevent set NaN values to lift height and/or speed + - (Fix) Lift height and speed for the current layer must be calculated from previous layer (#618) +- (Improvement) Windows auto-updater will install the update without dialogs, just displaying installation progress diff --git a/UVtools.Core/Layers/Layer.cs b/UVtools.Core/Layers/Layer.cs index 17e77061..ffbdd0e8 100644 --- a/UVtools.Core/Layers/Layer.cs +++ b/UVtools.Core/Layers/Layer.cs @@ -179,6 +179,26 @@ public RectangleF BoundingRectangleMillimeters } } + /// + /// Gets the first pixel index on this layer + /// + public uint FirstPixelIndex => (uint)(BoundingRectangle.Y * SlicerFile.ResolutionX + BoundingRectangle.X); + + /// + /// Gets the last pixel index on this layer + /// + public uint LastPixelIndex => (uint)(BoundingRectangle.Bottom * SlicerFile.ResolutionX + BoundingRectangle.Right); + + /// + /// Gets the first pixel on this layer + /// + public Point FirstPixelPosition => BoundingRectangle.Location; + + /// + /// Gets the last pixel on this layer + /// + public Point LastPixelPosition => new (BoundingRectangle.Right, BoundingRectangle.Bottom); + /// /// Gets if is the first layer /// @@ -245,6 +265,18 @@ public Layer? PreviousLayer } } + /// + /// Gets the previous layer if available, otherwise return the calling layer itself + /// + public Layer PreviousLayerOrThis + { + get + { + if (IsFirstLayer || _index > SlicerFile.Count) return this; + return SlicerFile[_index - 1]; + } + } + /// /// Gets the previous layer with a different height from the current, returns null if no previous layer /// @@ -288,6 +320,18 @@ public Layer? NextLayer } } + /// + /// Gets the next layer if available, otherwise return the calling layer itself + /// + public Layer NextLayerOrThis + { + get + { + if (_index >= SlicerFile.LastLayerIndex) return this; + return SlicerFile[_index + 1]; + } + } + /// /// Gets the next layer with a different height from the current, returns null if no next layer /// diff --git a/UVtools.Core/Operations/OperationDynamicLifts.cs b/UVtools.Core/Operations/OperationDynamicLifts.cs index 11a08d00..dcc815ba 100644 --- a/UVtools.Core/Operations/OperationDynamicLifts.cs +++ b/UVtools.Core/Operations/OperationDynamicLifts.cs @@ -20,7 +20,6 @@ namespace UVtools.Core.Operations; public sealed class OperationDynamicLifts : Operation { #region Enums - public enum DynamicLiftsSetMethod : byte { // Reduces maximal lift height with the number of pixels in layer divided by maximal number of pixels in any layer. Increases the minimal speed with the same ratio. @@ -30,18 +29,6 @@ public enum DynamicLiftsSetMethod : byte [Description("Full Range: Squeezes lift height and lift speed within full range of smallest/largest values")] FullRange } - - public enum DynamicLiftsLightOffDelaySetMode : byte - { - [Description("Set the light-off with an extra delay")] - UpdateWithExtraDelay, - - [Description("Set the light-off without an extra delay")] - UpdateWithoutExtraDelay, - - [Description("Set the light-off to zero")] - SetToZero, - } #endregion #region Members @@ -56,10 +43,6 @@ public enum DynamicLiftsLightOffDelaySetMode : byte private float _slowestLiftSpeed; private float _fastestLiftSpeed; - private float _lightOffDelayBottomExtraTime = 3; - private float _lightOffDelayExtraTime = 2.5f; - private DynamicLiftsLightOffDelaySetMode _lightOffDelaySetMode = DynamicLiftsLightOffDelaySetMode.UpdateWithExtraDelay; - #endregion #region Overrides @@ -135,7 +118,6 @@ public override string ToString() $" [Bottom speed: {_slowestBottomLiftSpeed}/{_fastestBottomLiftSpeed}mm/min]" + $" [Height: {_smallestLiftHeight}/{_largestLiftHeight}mm]" + $" [Speed: {_slowestLiftSpeed}/{_fastestLiftSpeed}mm/min]" + - $" [Light-off: {_lightOffDelaySetMode} {_lightOffDelayBottomExtraTime}/{_lightOffDelayExtraTime}s]" + LayerRangeString; if (!string.IsNullOrEmpty(ProfileName)) result = $"{ProfileName}: {result}"; return result; @@ -199,24 +181,6 @@ public float FastestLiftSpeed set => RaiseAndSetIfChanged(ref _fastestLiftSpeed, (float)Math.Round(value, 2)); } - public DynamicLiftsLightOffDelaySetMode LightOffDelaySetMode - { - get => _lightOffDelaySetMode; - set => RaiseAndSetIfChanged(ref _lightOffDelaySetMode, value); - } - - public float LightOffDelayBottomExtraTime - { - get => _lightOffDelayBottomExtraTime; - set => RaiseAndSetIfChanged(ref _lightOffDelayBottomExtraTime, (float)Math.Round(value, 2)); - } - - public float LightOffDelayExtraTime - { - get => _lightOffDelayExtraTime; - set => RaiseAndSetIfChanged(ref _lightOffDelayExtraTime, (float)Math.Round(value, 2)); - } - //public uint MinBottomLayerPixels => SlicerFile.Where(layer => layer.IsBottomLayer && !layer.IsEmpty && layer.Index >= LayerIndexStart && layer.Index <= LayerIndexEnd).Max(layer => layer.NonZeroPixelCount); public uint MinBottomLayerPixels => (from layer in SlicerFile where layer.IsBottomLayer @@ -271,7 +235,7 @@ public override void InitWithSlicerFile() if (_slowestBottomLiftSpeed <= 0) _slowestBottomLiftSpeed = SlicerFile.BottomLiftSpeed; if (_fastestBottomLiftSpeed <= 0 || _fastestBottomLiftSpeed < _slowestBottomLiftSpeed) _fastestBottomLiftSpeed = _slowestBottomLiftSpeed; - if(_slowestLiftSpeed <= 0) _slowestLiftSpeed = SlicerFile.LiftSpeed; + if (_slowestLiftSpeed <= 0) _slowestLiftSpeed = SlicerFile.LiftSpeed; if (_fastestLiftSpeed <= 0 || _fastestLiftSpeed < _slowestLiftSpeed) _fastestLiftSpeed = _slowestLiftSpeed; } @@ -326,8 +290,10 @@ protected override bool ExecuteInternally(OperationProgress progress) for (uint layerIndex = LayerIndexStart; layerIndex <= LayerIndexEnd; layerIndex++) { progress.ThrowIfCancellationRequested(); - var layer = SlicerFile[layerIndex]; - + var calculateLayer = SlicerFile[layerIndex == 0 ? 0 : layerIndex - 1]; + var setLayer = SlicerFile[layerIndex]; + + // Height // min - largestpixelcount // x - pixelcount @@ -335,20 +301,21 @@ protected override bool ExecuteInternally(OperationProgress progress) // Speed // max - minpixelCount // x - pixelcount - - if (layer.IsBottomLayer) + if (setLayer.IsBottomLayer) { switch (_setMethod) { case DynamicLiftsSetMethod.Traditional: - liftHeight = (_largestBottomLiftHeight * layer.NonZeroPixelCount / maxBottomPixels).Clamp(_smallestBottomLiftHeight, _largestBottomLiftHeight); - liftSpeed = (_fastestBottomLiftSpeed - (_fastestBottomLiftSpeed * layer.NonZeroPixelCount / maxBottomPixels)).Clamp(_slowestBottomLiftSpeed, _fastestBottomLiftSpeed); + liftHeight = (_largestBottomLiftHeight * calculateLayer.NonZeroPixelCount / maxBottomPixels).Clamp(_smallestBottomLiftHeight, _largestBottomLiftHeight); + liftSpeed = (_fastestBottomLiftSpeed - (_fastestBottomLiftSpeed * calculateLayer.NonZeroPixelCount / maxBottomPixels)).Clamp(_slowestBottomLiftSpeed, _fastestBottomLiftSpeed); break; case DynamicLiftsSetMethod.FullRange: - var pixelRatio = (layer.NonZeroPixelCount - minBottomPixels) / (float)(maxBottomPixels - minBottomPixels); // pixel_ratio is between 0 and 1 + var pixelRatio = (calculateLayer.NonZeroPixelCount - minBottomPixels) / (float)(maxBottomPixels - minBottomPixels); // pixel_ratio is between 0 and 1 liftHeight = (_smallestBottomLiftHeight + ((_largestBottomLiftHeight - _smallestBottomLiftHeight) * pixelRatio)).Clamp(_smallestBottomLiftHeight, _largestBottomLiftHeight); liftSpeed = (_fastestBottomLiftSpeed - ((_fastestBottomLiftSpeed - _slowestBottomLiftSpeed) * pixelRatio)).Clamp(_slowestBottomLiftSpeed, _fastestBottomLiftSpeed); break; + default: + throw new NotImplementedException(nameof(SetMethod)); } } @@ -357,36 +324,26 @@ protected override bool ExecuteInternally(OperationProgress progress) switch (_setMethod) { case DynamicLiftsSetMethod.Traditional: - liftHeight = (_largestLiftHeight * layer.NonZeroPixelCount / maxNormalPixels).Clamp(_smallestLiftHeight, _largestLiftHeight); - liftSpeed = (_fastestLiftSpeed - (_fastestLiftSpeed * layer.NonZeroPixelCount / maxNormalPixels)).Clamp(_slowestLiftSpeed, _fastestLiftSpeed); + liftHeight = (_largestLiftHeight * calculateLayer.NonZeroPixelCount / maxNormalPixels).Clamp(_smallestLiftHeight, _largestLiftHeight); + liftSpeed = (_fastestLiftSpeed - (_fastestLiftSpeed * calculateLayer.NonZeroPixelCount / maxNormalPixels)).Clamp(_slowestLiftSpeed, _fastestLiftSpeed); break; case DynamicLiftsSetMethod.FullRange: - var pixelRatio = (layer.NonZeroPixelCount - minNormalPixels) / (float)(maxNormalPixels - minNormalPixels); // pixel_ratio is between 0 and 1 + var pixelRatio = (calculateLayer.NonZeroPixelCount - minNormalPixels) / (float)(maxNormalPixels - minNormalPixels); // pixel_ratio is between 0 and 1 liftHeight = (_smallestLiftHeight + ((_largestLiftHeight - _smallestLiftHeight) * pixelRatio)).Clamp(_smallestLiftHeight, _largestLiftHeight); liftSpeed = (_fastestLiftSpeed - ((_fastestLiftSpeed - _slowestLiftSpeed) * pixelRatio)).Clamp(_slowestLiftSpeed, _fastestLiftSpeed); break; + default: + throw new NotImplementedException(nameof(SetMethod)); } } - layer.RetractHeight2 = 0; - layer.LiftHeightTotal = (float) Math.Round(liftHeight, 1); - layer.LiftSpeed = (float) Math.Round(liftSpeed, 1); - - switch (_lightOffDelaySetMode) + if (!float.IsNaN(liftHeight)) { - case DynamicLiftsLightOffDelaySetMode.UpdateWithExtraDelay: - layer.SetLightOffDelay(layer.IsBottomLayer ? _lightOffDelayBottomExtraTime : _lightOffDelayExtraTime); - break; - case DynamicLiftsLightOffDelaySetMode.UpdateWithoutExtraDelay: - layer.SetLightOffDelay(); - break; - case DynamicLiftsLightOffDelaySetMode.SetToZero: - layer.LightOffDelay = 0; - break; - default: - throw new NotImplementedException(); + setLayer.RetractHeight2 = 0; + setLayer.LiftHeightTotal = (float) Math.Round(liftHeight, 1); + if (!float.IsNaN(liftSpeed)) setLayer.LiftSpeed = (float)Math.Round(liftSpeed, 1); } - + progress++; } @@ -411,7 +368,7 @@ protected override bool ExecuteInternally(OperationProgress progress) private bool Equals(OperationDynamicLifts other) { - return _setMethod == other._setMethod && _smallestBottomLiftHeight.Equals(other._smallestBottomLiftHeight) && _largestBottomLiftHeight.Equals(other._largestBottomLiftHeight) && _smallestLiftHeight.Equals(other._smallestLiftHeight) && _largestLiftHeight.Equals(other._largestLiftHeight) && _slowestBottomLiftSpeed.Equals(other._slowestBottomLiftSpeed) && _fastestBottomLiftSpeed.Equals(other._fastestBottomLiftSpeed) && _slowestLiftSpeed.Equals(other._slowestLiftSpeed) && _fastestLiftSpeed.Equals(other._fastestLiftSpeed) && _lightOffDelayBottomExtraTime.Equals(other._lightOffDelayBottomExtraTime) && _lightOffDelayExtraTime.Equals(other._lightOffDelayExtraTime) && _lightOffDelaySetMode == other._lightOffDelaySetMode; + return _setMethod == other._setMethod && _smallestBottomLiftHeight.Equals(other._smallestBottomLiftHeight) && _largestBottomLiftHeight.Equals(other._largestBottomLiftHeight) && _smallestLiftHeight.Equals(other._smallestLiftHeight) && _largestLiftHeight.Equals(other._largestLiftHeight) && _slowestBottomLiftSpeed.Equals(other._slowestBottomLiftSpeed) && _fastestBottomLiftSpeed.Equals(other._fastestBottomLiftSpeed) && _slowestLiftSpeed.Equals(other._slowestLiftSpeed) && _fastestLiftSpeed.Equals(other._fastestLiftSpeed); } public override bool Equals(object? obj) @@ -431,9 +388,6 @@ public override int GetHashCode() hashCode.Add(_fastestBottomLiftSpeed); hashCode.Add(_slowestLiftSpeed); hashCode.Add(_fastestLiftSpeed); - hashCode.Add(_lightOffDelayBottomExtraTime); - hashCode.Add(_lightOffDelayExtraTime); - hashCode.Add((int)_lightOffDelaySetMode); return hashCode.ToHashCode(); } diff --git a/UVtools.Core/Operations/OperationScripting.cs b/UVtools.Core/Operations/OperationScripting.cs index a0a272c8..9a13b8da 100644 --- a/UVtools.Core/Operations/OperationScripting.cs +++ b/UVtools.Core/Operations/OperationScripting.cs @@ -175,7 +175,9 @@ public void ReloadScriptFromText(string? text = null) ScriptGlobals = new ScriptGlobals { SlicerFile = SlicerFile, Operation = this }; _scriptState = CSharpScript.RunAsync(_scriptText, - ScriptOptions.Default.AddReferences(typeof(About).Assembly).WithAllowUnsafe(true), + ScriptOptions.Default + .AddReferences(typeof(About).Assembly) + .WithAllowUnsafe(true), ScriptGlobals).Result; var result = _scriptState.ContinueWithAsync("ScriptInit();").Result; diff --git a/UVtools.Core/UVtools.Core.csproj b/UVtools.Core/UVtools.Core.csproj index eca31b9f..84564097 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.9.1 + 3.9.2 Copyright © 2020 PTRTECH UVtools.png AnyCPU;x64 diff --git a/UVtools.WPF/Controls/Tools/ToolDynamicLiftsControl.axaml b/UVtools.WPF/Controls/Tools/ToolDynamicLiftsControl.axaml index 03c69261..0db9aaab 100644 --- a/UVtools.WPF/Controls/Tools/ToolDynamicLiftsControl.axaml +++ b/UVtools.WPF/Controls/Tools/ToolDynamicLiftsControl.axaml @@ -6,7 +6,7 @@ x:Class="UVtools.WPF.Controls.Tools.ToolDynamicLiftsControl"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/UVtools.WPF/MainWindow.axaml b/UVtools.WPF/MainWindow.axaml index 2c43184e..bdbaba8f 100644 --- a/UVtools.WPF/MainWindow.axaml +++ b/UVtools.WPF/MainWindow.axaml @@ -355,6 +355,7 @@ diff --git a/UVtools.WPF/MainWindow.axaml.cs b/UVtools.WPF/MainWindow.axaml.cs index a05513b9..747d1ec9 100644 --- a/UVtools.WPF/MainWindow.axaml.cs +++ b/UVtools.WPF/MainWindow.axaml.cs @@ -1699,8 +1699,6 @@ await this.MessageBoxWaring( UpdateLayerTrackerHighlightIssues(); }; - TabGCode.IsVisible = HaveGCode; - if (SlicerFile.DecodeType == FileFormat.FileDecodeType.Full) { if (Settings.Issues.ComputeIssuesOnLoad) @@ -1744,6 +1742,8 @@ await this.MessageBoxWaring( } UserSettings.Save(); } + + TabGCode.IsVisible = HaveGCode; } private void SlicerFileOnPropertyChanged(object? sender, PropertyChangedEventArgs e) diff --git a/UVtools.WPF/Program.cs b/UVtools.WPF/Program.cs index 68406683..608c5749 100644 --- a/UVtools.WPF/Program.cs +++ b/UVtools.WPF/Program.cs @@ -1,7 +1,6 @@ using System; using System.Diagnostics; using System.Globalization; -using System.Text; using System.Threading.Tasks; using Avalonia; using Projektanker.Icons.Avalonia; @@ -55,6 +54,13 @@ public static void Main(string[] args) Console.WriteLine(e); return; } + + /*foreach (var s in FileFormat.AllFileExtensions.Where(extension => !extension.Extension.Contains('.')).DistinctBy(extension => extension.Extension)) + { + Debug.WriteLine($"- {s.Extension}"); + } + Debug.WriteLine(FileFormat.AllFileExtensions.Where(extension => !extension.Extension.Contains('.')).DistinctBy(extension => extension.Extension).Count()); + return;*/ if (Args.Length >= 1) { diff --git a/UVtools.WPF/Structures/AppVersionChecker.cs b/UVtools.WPF/Structures/AppVersionChecker.cs index 1fd13dd1..213c0818 100644 --- a/UVtools.WPF/Structures/AppVersionChecker.cs +++ b/UVtools.WPF/Structures/AppVersionChecker.cs @@ -212,7 +212,7 @@ public async Task AutoUpgrade(OperationProgress progress) if (OperatingSystem.IsWindows()) { - SystemAware.StartProcess(DownloadedFile); + SystemAware.StartProcess(DownloadedFile, "/qb"); } else if (downloadFilename.EndsWith(".AppImage") && Linux.IsRunningAppImageGetPath(out var appImagePath)) // Linux AppImage { diff --git a/UVtools.WPF/UVtools.WPF.csproj b/UVtools.WPF/UVtools.WPF.csproj index 0b39ead6..3ce41f36 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.9.1 + 3.9.2 AnyCPU;x64 UVtools.png README.md diff --git a/build/package-manager/wingetPublish.ps1 b/build/package-manager/wingetPublish.ps1 index 333d4059..874dc8d7 100644 --- a/build/package-manager/wingetPublish.ps1 +++ b/build/package-manager/wingetPublish.ps1 @@ -6,7 +6,12 @@ Set-Location $PSScriptRoot #################################### # Variables $projectAPIUrl = "https://api.github.com/repos/sn4k3/UVtools/releases/latest" -$outputFolder = "manifests" +$projectPackageUrl = "https://github.com/sn4k3/UVtools/releases/tag/v" +$rootPath = $PSScriptRoot +$outputFolder = "$rootPath/manifests" +$localeYaml = "PTRTECH.UVtools.locale.en-US.yaml" +$installerYaml = "PTRTECH.UVtools.installer.yaml" +$releaseDate = Get-Date -Format "yyyy-MM-dd" $msiUrl = $null Write-Output " @@ -37,6 +42,12 @@ if($version.Length -lt 5){ return } +$projectPackageUrl = "$projectPackageUrl$version" + +$manifestsPath = "$outputFolder/p/PTRTECH/UVtools/$version" +$localeYamlFile = "$manifestsPath/$localeYaml" +$installerYamlFile = "$manifestsPath/$installerYaml" + # Parse the MSI url foreach ($asset in $lastRelease.assets) { @@ -61,10 +72,21 @@ Url: $msiUrl $actionInput = Read-Host -Prompt "Do you want to update the manifest with the current release v$($version)? (Y/Yes or N/No)" if($actionInput -eq "y" -or $actionInput -eq "yes") { - Remove-Item $outputFolder -Recurse -ErrorAction Ignore # Clean + # Clean + Remove-Item $outputFolder -Recurse -ErrorAction Ignore + #wingetcreate.exe update PTRTECH.UVtools --interactive - wingetcreate.exe update PTRTECH.UVtools --urls "$msiUrl|x64" --version $version --token $wingetTokenKeyFile --submit - Remove-Item $outputFolder -Recurse -ErrorAction Ignore # Clean + wingetcreate.exe update PTRTECH.UVtools --urls "$msiUrl|x64" --version $version --token $wingetTokenKeyFile + + # Update dynamic content + #(Get-Content "$localeYamlFile") -replace 'ReleaseNotesUrl:.*', "ReleaseNotesUrl: $projectPackageUrl" | Out-File "$localeYamlFile" + #(Get-Content "$installerYamlFile") -replace 'ReleaseDate:.*', "ReleaseDate: $releaseDate" | Out-File "$installerYamlFile" + + # Submit PR + wingetcreate.exe submit --token $wingetTokenKeyFile $outputFolder + + # Clean + Remove-Item $outputFolder -Recurse -ErrorAction Ignore } Write-Output " diff --git a/documentation/UVtools.Core.xml b/documentation/UVtools.Core.xml index 2dcc83c0..0a9dcd2f 100644 --- a/documentation/UVtools.Core.xml +++ b/documentation/UVtools.Core.xml @@ -4766,6 +4766,26 @@ Gets the bounding rectangle for the image area in millimeters + + + Gets the first pixel index on this layer + + + + + Gets the last pixel index on this layer + + + + + Gets the first pixel on this layer + + + + + Gets the last pixel on this layer + + Gets if is the first layer @@ -4801,6 +4821,11 @@ Gets the previous layer, returns null if no previous layer + + + Gets the previous layer if available, otherwise return the calling layer itself + + Gets the previous layer with a different height from the current, returns null if no previous layer @@ -4816,6 +4841,11 @@ Gets the next layer, returns null if no next layer + + + Gets the next layer if available, otherwise return the calling layer itself + + Gets the next layer with a different height from the current, returns null if no next layer