diff options
19 files changed, 585 insertions, 235 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index c7c7874..f453633 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,15 @@ # Changelog +## 08/02/2021 - v2.4.3 + +* **(Add) Exposure time finder:** + * Configurable zebra bars + * Configurable text + * Tune defaults values to fill the space + * Add incremental loop circles to fill space on exposure text space +* (Change) Default vertical windows margin from 250 to 400px + + ## 08/02/2021 - v2.4.2 * **(Improvement) Exposure time finder:** diff --git a/UVtools.Core/Operations/OperationCalibrateExposureFinder.cs b/UVtools.Core/Operations/OperationCalibrateExposureFinder.cs index c5b6e4a..2bfc978 100644 --- a/UVtools.Core/Operations/OperationCalibrateExposureFinder.cs +++ b/UVtools.Core/Operations/OperationCalibrateExposureFinder.cs @@ -27,13 +27,13 @@ namespace UVtools.Core.Operations { #region Constants - const byte TextSpacing = 60; - const byte TextLineBreak = 30; - const FontFace FontFace = Emgu.CV.CvEnum.FontFace.HersheyDuplex; - const byte TextStartX = 10; + const byte TextMarkingSpacing = 60; + const byte TextMarkingLineBreak = 30; + const FontFace TextMarkingFontFace = Emgu.CV.CvEnum.FontFace.HersheyDuplex; + const byte TextMarkingStartX = 10; //const byte TextStartY = 50; - const double TextScale = 0.8; - const byte TextThickness = 2; + const double TextMarkingScale = 0.8; + const byte TextMarkingThickness = 2; #endregion @@ -52,11 +52,21 @@ namespace UVtools.Core.Operations private bool _enableAntiAliasing = true; private bool _mirrorOutput; private decimal _baseHeight = 1; - private decimal _holeHeight = 1; - private decimal _holeMargin = 1.5m; + private decimal _featuresHeight = 1; + private decimal _featuresMargin = 1.5m; private Measures _unitOfMeasure = Measures.Pixels; - private string _holeDiametersMm = "0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0"; - private string _holeDiametersPx = "2, 3, 4, 5, 6, 7, 8, 9, 10"; + private string _holeDiametersMm = "0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.2, 1.4, 1.6"; + private string _holeDiametersPx = "2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16"; + private decimal _barSpacing = 1.5m; + private decimal _barLength = 5; + private byte _barVerticalSplitter = 1; + private string _barThicknessesPx = "2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 23"; + private string _barThicknessesMm = "0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1, 1.2, 1.4"; + private FontFace _textFont = TextMarkingFontFace; + private double _textScale = 1; + private byte _textThickness = 2; + private string _text = "ABCDEFGHIJKLMNOPQRSTUVWXYZ/1"; + private bool _multipleLayerHeight; private decimal _multipleLayerHeightMaximum = 0.1m; private decimal _multipleLayerHeightStep = 0.01m; @@ -72,6 +82,7 @@ namespace UVtools.Core.Operations private ObservableCollection<ExposureItem> _exposureTable = new(); private CalibrateExposureFinderShapes _holeShape = CalibrateExposureFinderShapes.Square; + #endregion #region Overrides @@ -144,10 +155,10 @@ namespace UVtools.Core.Operations var result = $"[Layer Height: {_layerHeight}] " + $"[Bottom layers: {_bottomLayers}] " + $"[Exposure: {_bottomExposure}/{_normalExposure}] " + - $"[TB:{_topBottomMargin} LR:{_leftRightMargin} PM:{_partMargin} CM:{_holeMargin}] " + + $"[TB:{_topBottomMargin} LR:{_leftRightMargin} PM:{_partMargin} FM:{_featuresMargin}] " + $"[Chamfer: {_chamferLayers}] [Erode: {_erodeBottomIterations}] " + - $"[Obj height: {_holeHeight}] " + - $"[Holes: {Holes.Length}] " + + $"[Obj height: {_featuresHeight}] " + + $"[Holes: {Holes.Length}] [Bars: {Bars.Length}] [Text: {!string.IsNullOrWhiteSpace(_text)}]" + $"[AA: {_enableAntiAliasing}] [Mirror: {_mirrorOutput}]"; if (!string.IsNullOrEmpty(ProfileName)) result = $"{ProfileName}: {result}"; return result; @@ -266,20 +277,20 @@ namespace UVtools.Core.Operations set => RaiseAndSetIfChanged(ref _baseHeight, Math.Round(value, 2)); } - public decimal HoleHeight + public decimal FeaturesHeight { - get => _holeHeight; - set => RaiseAndSetIfChanged(ref _holeHeight, Math.Round(value, 2)); + get => _featuresHeight; + set => RaiseAndSetIfChanged(ref _featuresHeight, Math.Round(value, 2)); } - public decimal HoleMargin + public decimal TotalHeight => _baseHeight + _featuresHeight; + + public decimal FeaturesMargin { - get => _holeMargin; - set => RaiseAndSetIfChanged(ref _holeMargin, Math.Round(value, 2)); + get => _featuresMargin; + set => RaiseAndSetIfChanged(ref _featuresMargin, Math.Round(value, 2)); } - public decimal TotalHeight => BaseHeight + HoleHeight; - public CalibrateExposureFinderShapes HoleShape { get => _holeShape; @@ -351,7 +362,117 @@ namespace UVtools.Core.Operations public int GetHolesLength(int[] holes) { - return (int) (holes.Sum() + (holes.Length-1) * _holeMargin * Yppmm); + return (int) (holes.Sum() + (holes.Length-1) * _featuresMargin * Yppmm); + } + + public decimal BarSpacing + { + get => _barSpacing; + set => RaiseAndSetIfChanged(ref _barSpacing, value); + } + + public decimal BarLength + { + get => _barLength; + set => RaiseAndSetIfChanged(ref _barLength, value); + } + + public byte BarVerticalSplitter + { + get => _barVerticalSplitter; + set => RaiseAndSetIfChanged(ref _barVerticalSplitter, value); + } + + public string BarThicknessesPx + { + get => _barThicknessesPx; + set => RaiseAndSetIfChanged(ref _barThicknessesPx, value); + } + + public string BarThicknessesMm + { + get => _barThicknessesMm; + set => RaiseAndSetIfChanged(ref _barThicknessesMm, value); + } + + /// <summary> + /// Gets all holes in pixels and ordered + /// </summary> + public int[] Bars + { + get + { + List<int> bars = new(); + + if (_unitOfMeasure == Measures.Millimeters) + { + var split = _barThicknessesMm.Split(',', StringSplitOptions.TrimEntries); + foreach (var mmStr in split) + { + if (string.IsNullOrWhiteSpace(mmStr)) continue; + if (!decimal.TryParse(mmStr, out var mm)) continue; + if (mm <= 0) continue; + var mmPx = (int)Math.Floor(mm * Xppmm); + if (bars.Contains(mmPx) || mmPx > 500) continue; + bars.Add((int)Math.Floor(mm * Xppmm)); + } + } + else + { + var split = _barThicknessesPx.Split(',', StringSplitOptions.TrimEntries); + foreach (var pxStr in split) + { + if (string.IsNullOrWhiteSpace(pxStr)) continue; + if (!int.TryParse(pxStr, out var px)) continue; + if (px <= 0) continue; + if (bars.Contains(px) || px > 500) continue; + bars.Add(px); + } + } + + return bars.OrderBy(pixels => pixels).ToArray(); + } + } + + public int GetBarsWidth(int[] bars) + { + return (int)(bars.Sum() + (bars.Length + 1) * _barSpacing * Yppmm); + } + + public static Array TextFonts => Enum.GetValues(typeof(FontFace)); + + public FontFace TextFont + { + get => _textFont; + set => RaiseAndSetIfChanged(ref _textFont, value); + } + + public double TextScale + { + get => _textScale; + set => RaiseAndSetIfChanged(ref _textScale, Math.Round(value, 2)); + } + + public byte TextThickness + { + get => _textThickness; + set => RaiseAndSetIfChanged(ref _textThickness, value); + } + + public string Text + { + get => _text; + set => RaiseAndSetIfChanged(ref _text, value); + } + + public Size TextSize + { + get + { + if (string.IsNullOrWhiteSpace(_text)) return Size.Empty; + int baseline = 0; + return CvInvoke.GetTextSize(_text, _textFont, _textScale, _textThickness, ref baseline); + } } public bool MultipleLayerHeight @@ -528,9 +649,11 @@ namespace UVtools.Core.Operations #region Equality + + private bool Equals(OperationCalibrateExposureFinder other) { - return _layerHeight == other._layerHeight && _bottomLayers == other._bottomLayers && _bottomExposure == other._bottomExposure && _normalExposure == other._normalExposure && _topBottomMargin == other._topBottomMargin && _leftRightMargin == other._leftRightMargin && _chamferLayers == other._chamferLayers && _erodeBottomIterations == other._erodeBottomIterations && _partMargin == other._partMargin && _enableAntiAliasing == other._enableAntiAliasing && _mirrorOutput == other._mirrorOutput && _baseHeight == other._baseHeight && _holeHeight == other._holeHeight && _holeMargin == other._holeMargin && _holeShape == other._holeShape && _unitOfMeasure == other._unitOfMeasure && _holeDiametersMm == other._holeDiametersMm && _holeDiametersPx == other._holeDiametersPx && _multipleLayerHeight == other._multipleLayerHeight && _multipleLayerHeightMaximum == other._multipleLayerHeightMaximum && _multipleLayerHeightStep == other._multipleLayerHeightStep && _multipleExposures == other._multipleExposures && _exposureGenType == other._exposureGenType && _exposureGenIgnoreBaseExposure == other._exposureGenIgnoreBaseExposure && _exposureGenBottomStep == other._exposureGenBottomStep && _exposureGenNormalStep == other._exposureGenNormalStep && _exposureGenTests == other._exposureGenTests && Equals(_exposureTable, other._exposureTable); + return _layerHeight == other._layerHeight && _bottomLayers == other._bottomLayers && _bottomExposure == other._bottomExposure && _normalExposure == other._normalExposure && _topBottomMargin == other._topBottomMargin && _leftRightMargin == other._leftRightMargin && _chamferLayers == other._chamferLayers && _erodeBottomIterations == other._erodeBottomIterations && _partMargin == other._partMargin && _enableAntiAliasing == other._enableAntiAliasing && _mirrorOutput == other._mirrorOutput && _baseHeight == other._baseHeight && _featuresHeight == other._featuresHeight && _featuresMargin == other._featuresMargin && _unitOfMeasure == other._unitOfMeasure && _holeDiametersMm == other._holeDiametersMm && _holeDiametersPx == other._holeDiametersPx && _barSpacing == other._barSpacing && _barLength == other._barLength && _barVerticalSplitter == other._barVerticalSplitter && _barThicknessesPx == other._barThicknessesPx && _barThicknessesMm == other._barThicknessesMm && _textFont == other._textFont && _textScale.Equals(other._textScale) && _textThickness == other._textThickness && _text == other._text && _multipleLayerHeight == other._multipleLayerHeight && _multipleLayerHeightMaximum == other._multipleLayerHeightMaximum && _multipleLayerHeightStep == other._multipleLayerHeightStep && _multipleExposures == other._multipleExposures && _exposureGenType == other._exposureGenType && _exposureGenIgnoreBaseExposure == other._exposureGenIgnoreBaseExposure && _exposureGenBottomStep == other._exposureGenBottomStep && _exposureGenNormalStep == other._exposureGenNormalStep && _exposureGenTests == other._exposureGenTests && _exposureGenManualLayerHeight == other._exposureGenManualLayerHeight && _exposureGenManualBottom == other._exposureGenManualBottom && _exposureGenManualNormal == other._exposureGenManualNormal && Equals(_exposureTable, other._exposureTable) && _holeShape == other._holeShape; } public override bool Equals(object obj) @@ -553,12 +676,20 @@ namespace UVtools.Core.Operations hashCode.Add(_enableAntiAliasing); hashCode.Add(_mirrorOutput); hashCode.Add(_baseHeight); - hashCode.Add(_holeHeight); - hashCode.Add(_holeMargin); - hashCode.Add((int) _holeShape); + hashCode.Add(_featuresHeight); + hashCode.Add(_featuresMargin); hashCode.Add((int) _unitOfMeasure); hashCode.Add(_holeDiametersMm); hashCode.Add(_holeDiametersPx); + hashCode.Add(_barSpacing); + hashCode.Add(_barLength); + hashCode.Add(_barVerticalSplitter); + hashCode.Add(_barThicknessesPx); + hashCode.Add(_barThicknessesMm); + hashCode.Add((int) _textFont); + hashCode.Add(_textScale); + hashCode.Add(_textThickness); + hashCode.Add(_text); hashCode.Add(_multipleLayerHeight); hashCode.Add(_multipleLayerHeightMaximum); hashCode.Add(_multipleLayerHeightStep); @@ -568,7 +699,11 @@ namespace UVtools.Core.Operations hashCode.Add(_exposureGenBottomStep); hashCode.Add(_exposureGenNormalStep); hashCode.Add(_exposureGenTests); + hashCode.Add(_exposureGenManualLayerHeight); + hashCode.Add(_exposureGenManualBottom); + hashCode.Add(_exposureGenManualNormal); hashCode.Add(_exposureTable); + hashCode.Add((int) _holeShape); return hashCode.ToHashCode(); } @@ -629,31 +764,60 @@ namespace UVtools.Core.Operations public Mat[] GetLayers() { var holes = Holes; - int holeMarginX = (int)(Xppmm * _holeMargin); - int holeMarginY = (int)(Yppmm * _holeMargin); - Rectangle rect = new Rectangle(new Point(1, 1), - new Size(holeMarginX * 4 + holes[^1] * 2, - holeMarginY * 3 + GetHolesLength(holes) + TextSpacing)); + if (holes.Length == 0) return null; + var bars = Bars; + var textSize = TextSize; + + int featuresMarginX = (int)(Xppmm * _featuresMargin); + int featuresMarginY = (int)(Yppmm * _featuresMargin); + + int holePanelWidth = featuresMarginX * 2 + holes[^1]; + + + int yMaxSize = Math.Max(Math.Max(GetHolesLength(holes), GetBarsWidth(bars)), textSize.Width); + + int xSize = holePanelWidth * 2; + int ySize = featuresMarginX * 3 + yMaxSize + TextMarkingSpacing; + + int barLengthPx = (int) (_barLength * Xppmm); + int barSpacingPx = (int) (_barSpacing * Yppmm); + int barsPanelWidth = 0; + if (bars.Length > 0) + { + barsPanelWidth = barLengthPx * 2 + _barVerticalSplitter; + xSize += barsPanelWidth + featuresMarginX; + + } + + + + if (!textSize.IsEmpty) + { + xSize += textSize.Height + featuresMarginX; + } + + int positiveSideWidth = xSize - holePanelWidth; + + Rectangle rect = new Rectangle(new Point(1, 1), new Size(xSize, ySize)); var layers = new Mat[2]; layers[0] = EmguExtensions.InitMat(rect.Size.Inflate(2)); CvInvoke.Rectangle(layers[0], rect, EmguExtensions.WhiteByte, -1, _enableAntiAliasing ? LineType.AntiAlias : LineType.EightConnected); - layers[1] = layers[0].Clone(); - CvInvoke.Rectangle(layers[1], new Rectangle(0, 0, rect.Size.Width / 2, layers[0].Height), EmguExtensions.BlackByte, -1, _enableAntiAliasing ? LineType.AntiAlias : LineType.EightConnected); + layers[1] = layers[0].CloneBlank(); + CvInvoke.Rectangle(layers[1], new Rectangle(rect.Size.Width - holePanelWidth, 0, rect.Size.Width, layers[0].Height), EmguExtensions.WhiteByte, -1, _enableAntiAliasing ? LineType.AntiAlias : LineType.EightConnected); - //int holeXPos = (int) Math.Round(Xppmm * (CylinderMargin + maxCylinder / 2)); // Print holes - int holeXPos = 0; - int holeYPos = 0; + int xPos = 0; + int yPos = 0; for (var layerIndex = 0; layerIndex < layers.Length; layerIndex++) { var layer = layers[layerIndex]; - holeYPos = holeMarginY; + yPos = featuresMarginY; for (int i = 0; i < holes.Length; i++) { var diameter = holes[i]; var radius = diameter / 2; - holeXPos = rect.X + holeMarginX + holes[^1] - diameter; + xPos = layers[0].Width - holePanelWidth - featuresMarginX; CalibrateExposureFinderShapes effectiveShape = _holeShape == CalibrateExposureFinderShapes.Square || diameter < 6 ? CalibrateExposureFinderShapes.Square : CalibrateExposureFinderShapes.Circle; @@ -661,11 +825,11 @@ namespace UVtools.Core.Operations switch (effectiveShape) { case CalibrateExposureFinderShapes.Square: - holeXPos = rect.X + holeMarginX + holes[^1] - diameter; + xPos -= diameter; break; case CalibrateExposureFinderShapes.Circle: - holeXPos = rect.X + holeMarginX + holes[^1] - radius; - holeYPos += radius; + xPos -= radius; + yPos += radius; break; } @@ -675,7 +839,7 @@ namespace UVtools.Core.Operations { if (diameter == 1) { - layer.SetByte(holeXPos, holeYPos, 255); + layer.SetByte(xPos, yPos, 255); } else { @@ -683,13 +847,13 @@ namespace UVtools.Core.Operations { case CalibrateExposureFinderShapes.Square: CvInvoke.Rectangle(layers[layerIndex], - new Rectangle(new Point(holeXPos, holeYPos), new Size(diameter-1, diameter-1)), + new Rectangle(new Point(xPos, yPos), new Size(diameter-1, diameter-1)), EmguExtensions.WhiteByte, -1, _enableAntiAliasing ? LineType.AntiAlias : LineType.EightConnected); break; case CalibrateExposureFinderShapes.Circle: CvInvoke.Circle(layers[layerIndex], - new Point(holeXPos, holeYPos), + new Point(xPos, yPos), radius, EmguExtensions.WhiteByte, -1, _enableAntiAliasing ? LineType.AntiAlias : LineType.EightConnected); break; @@ -702,17 +866,17 @@ namespace UVtools.Core.Operations switch (effectiveShape) { case CalibrateExposureFinderShapes.Square: - holeXPos = layers[0].Width - rect.X - holeMarginX - holes[^1]; + xPos = layers[0].Width - rect.X - featuresMarginX - holes[^1]; break; case CalibrateExposureFinderShapes.Circle: - holeXPos = layers[0].Width - rect.X - holeMarginX - holes[^1] + radius; + xPos = layers[0].Width - rect.X - featuresMarginX - holes[^1] + radius; break; } // Right side if (diameter == 1) { - layer.SetByte(holeXPos, holeYPos, 0); + layer.SetByte(xPos, yPos, 0); } else { @@ -720,13 +884,13 @@ namespace UVtools.Core.Operations { case CalibrateExposureFinderShapes.Square: CvInvoke.Rectangle(layers[layerIndex], - new Rectangle(new Point(holeXPos, holeYPos), new Size(diameter-1, diameter-1)), + new Rectangle(new Point(xPos, yPos), new Size(diameter-1, diameter-1)), EmguExtensions.BlackByte, -1, _enableAntiAliasing ? LineType.AntiAlias : LineType.EightConnected); break; case CalibrateExposureFinderShapes.Circle: CvInvoke.Circle(layers[layerIndex], - new Point(holeXPos, holeYPos), + new Point(xPos, yPos), radius, EmguExtensions.BlackByte, -1, _enableAntiAliasing ? LineType.AntiAlias : LineType.EightConnected); break; @@ -734,25 +898,67 @@ namespace UVtools.Core.Operations } - holeYPos += holeMarginY; + yPos += featuresMarginY; switch (effectiveShape) { case CalibrateExposureFinderShapes.Square: - holeYPos += diameter; + yPos += diameter; break; case CalibrateExposureFinderShapes.Circle: - holeYPos += radius; + yPos += radius; break; } } } + xPos = featuresMarginX; + + // Print Zebra bars + if (bars.Length > 0) + { + yPos = featuresMarginY; + for (int i = 0; i < bars.Length; i++) + { + // Print positive bottom + CvInvoke.Rectangle(layers[1], new Rectangle(xPos, yPos, barLengthPx - 1, barSpacingPx - 1), + EmguExtensions.WhiteByte, -1, _enableAntiAliasing ? LineType.AntiAlias : LineType.EightConnected); + // Print positive top + yPos += barSpacingPx; + CvInvoke.Rectangle(layers[1], new Rectangle(xPos + barLengthPx + _barVerticalSplitter, yPos, barLengthPx - 1, bars[i] - 1), + EmguExtensions.WhiteByte, -1, _enableAntiAliasing ? LineType.AntiAlias : LineType.EightConnected); + yPos += bars[i]; + } + + // Left over + CvInvoke.Rectangle(layers[1], new Rectangle(xPos, yPos, barLengthPx - 1, barSpacingPx - 1), + EmguExtensions.WhiteByte, -1, _enableAntiAliasing ? LineType.AntiAlias : LineType.EightConnected); + + xPos += featuresMarginX; + } + + if (!textSize.IsEmpty) + { + CvInvoke.Rotate(layers[1], layers[1], RotateFlags.Rotate90CounterClockwise); + CvInvoke.PutText(layers[1], _text, new Point(featuresMarginX, layers[1].Height - barsPanelWidth - xPos), _textFont, _textScale, EmguExtensions.WhiteByte, _textThickness, _enableAntiAliasing ? LineType.AntiAlias : LineType.EightConnected); + CvInvoke.Rotate(layers[1], layers[1], RotateFlags.Rotate90Clockwise); + } - /*if (_mirrorOutput) + // Print a hardcoded spiral if have space + if (positiveSideWidth >= 250) { - Parallel.ForEach(layers, mat => CvInvoke.Flip(mat, mat, FlipType.Horizontal)); - }*/ + xPos = (int) ((layers[0].Width - holePanelWidth) / 1.8); + yPos = layers[0].Height - featuresMarginY - TextMarkingSpacing / 2; + byte circleThickness = 5; + byte radiusStep = 13; + int count = -1; + for (int radius = radiusStep; radius <= 100; radius += (radiusStep + count)) + { + count++; + CvInvoke.Circle(layers[1], new Point(xPos, yPos), radius, EmguExtensions.WhiteByte, circleThickness, _enableAntiAliasing ? LineType.AntiAlias : LineType.EightConnected); + } + CvInvoke.Circle(layers[1], new Point(xPos, yPos), 5, EmguExtensions.WhiteByte, -1, _enableAntiAliasing ? LineType.AntiAlias : LineType.EightConnected); + } return layers; } @@ -771,16 +977,17 @@ namespace UVtools.Core.Operations CvInvoke.Line(thumbnail, new Point(thumbnail.Width - xSpacing, 0), new Point(thumbnail.Width - xSpacing, ySpacing + 5), new MCvScalar(255, 27, 245), 3); CvInvoke.PutText(thumbnail, "Exposure Time Cal.", new Point(xSpacing, ySpacing * 2), fontFace, fontScale, new MCvScalar(0, 255, 255), fontThickness); CvInvoke.PutText(thumbnail, $"{Microns}um @ {BottomExposure}s/{NormalExposure}s", new Point(xSpacing, ySpacing * 3), fontFace, fontScale, EmguExtensions.White3Byte, fontThickness); - CvInvoke.PutText(thumbnail, $"Holes: {Holes.Length}", new Point(xSpacing, ySpacing * 4), fontFace, fontScale, EmguExtensions.White3Byte, fontThickness); + CvInvoke.PutText(thumbnail, $"Features: {Holes.Length+Bars.Length}", new Point(xSpacing, ySpacing * 4), fontFace, fontScale, EmguExtensions.White3Byte, fontThickness); return thumbnail; } protected override bool ExecuteInternally(OperationProgress progress) { + var layers = GetLayers(); + if (layers is null) return false; progress.ItemCount = 0; SanitizeExposureTable(); - var layers = GetLayers(); if (layers[0].Width > SlicerFile.ResolutionX || layers[0].Height > SlicerFile.ResolutionY) { return false; @@ -796,7 +1003,10 @@ namespace UVtools.Core.Operations uint layerIndex = 0; int currentX = sideMarginPx; int currentY = topBottomMarginPx; - int holeMarginY = (int)(Yppmm * _holeMargin); + int featuresMarginX = (int)(Xppmm * _featuresMargin); + int featuresMarginY = (int)(Yppmm * _featuresMargin); + + var holes = Holes; var anchor = new Point(-1, -1); using var kernel = CvInvoke.GetStructuringElement(ElementShape.Rectangle, new Size(3, 3), anchor); @@ -854,13 +1064,13 @@ namespace UVtools.Core.Operations CvInvoke.Erode(matRoi, matRoi, kernel, anchor, _chamferLayers - layerCountOnHeight, BorderType.Reflect101, default); } - var textHeightStart = matRoi.Height - holeMarginY - TextSpacing; - CvInvoke.PutText(matRoi, $"{microns}u", new Point(TextStartX, textHeightStart), FontFace, TextScale, EmguExtensions.WhiteByte, TextThickness, _enableAntiAliasing ? LineType.AntiAlias : LineType.EightConnected); - CvInvoke.PutText(matRoi, $"{bottomExposure}s", new Point(TextStartX, textHeightStart + TextLineBreak), FontFace, TextScale, EmguExtensions.WhiteByte, TextThickness, _enableAntiAliasing ? LineType.AntiAlias : LineType.EightConnected); - CvInvoke.PutText(matRoi, $"{normalExposure}s", new Point(TextStartX, textHeightStart + TextLineBreak * 2), FontFace, TextScale, EmguExtensions.WhiteByte, TextThickness, _enableAntiAliasing ? LineType.AntiAlias : LineType.EightConnected); - CvInvoke.PutText(matRoi, $"{microns}u", new Point(matRoi.Width / 2 + TextStartX, textHeightStart), FontFace, TextScale, EmguExtensions.BlackByte, TextThickness, _enableAntiAliasing ? LineType.AntiAlias : LineType.EightConnected); - CvInvoke.PutText(matRoi, $"{bottomExposure}s", new Point(matRoi.Width / 2 + TextStartX, textHeightStart + TextLineBreak), FontFace, TextScale, EmguExtensions.BlackByte, TextThickness, _enableAntiAliasing ? LineType.AntiAlias : LineType.EightConnected); - CvInvoke.PutText(matRoi, $"{normalExposure}s", new Point(matRoi.Width / 2 + TextStartX, textHeightStart + TextLineBreak * 2), FontFace, TextScale, EmguExtensions.BlackByte, TextThickness, _enableAntiAliasing ? LineType.AntiAlias : LineType.EightConnected); + var textHeightStart = matRoi.Height - featuresMarginY - TextMarkingSpacing; + CvInvoke.PutText(matRoi, $"{microns}u", new Point(TextMarkingStartX, textHeightStart), TextMarkingFontFace, TextMarkingScale, EmguExtensions.WhiteByte, TextMarkingThickness, _enableAntiAliasing ? LineType.AntiAlias : LineType.EightConnected); + CvInvoke.PutText(matRoi, $"{bottomExposure}s", new Point(TextMarkingStartX, textHeightStart + TextMarkingLineBreak), TextMarkingFontFace, TextMarkingScale, EmguExtensions.WhiteByte, TextMarkingThickness, _enableAntiAliasing ? LineType.AntiAlias : LineType.EightConnected); + CvInvoke.PutText(matRoi, $"{normalExposure}s", new Point(TextMarkingStartX, textHeightStart + TextMarkingLineBreak * 2), TextMarkingFontFace, TextMarkingScale, EmguExtensions.WhiteByte, TextMarkingThickness, _enableAntiAliasing ? LineType.AntiAlias : LineType.EightConnected); + CvInvoke.PutText(matRoi, $"{microns}u", new Point(matRoi.Width - featuresMarginX * 2 - holes[^1] + TextMarkingStartX, textHeightStart), TextMarkingFontFace, TextMarkingScale, EmguExtensions.BlackByte, TextMarkingThickness, _enableAntiAliasing ? LineType.AntiAlias : LineType.EightConnected); + CvInvoke.PutText(matRoi, $"{bottomExposure}s", new Point(matRoi.Width - featuresMarginX * 2 - holes[^1] + TextMarkingStartX, textHeightStart + TextMarkingLineBreak), TextMarkingFontFace, TextMarkingScale, EmguExtensions.BlackByte, TextMarkingThickness, _enableAntiAliasing ? LineType.AntiAlias : LineType.EightConnected); + CvInvoke.PutText(matRoi, $"{normalExposure}s", new Point(matRoi.Width - featuresMarginX * 2 - holes[^1] + TextMarkingStartX, textHeightStart + TextMarkingLineBreak * 2), TextMarkingFontFace, TextMarkingScale, EmguExtensions.BlackByte, TextMarkingThickness, _enableAntiAliasing ? LineType.AntiAlias : LineType.EightConnected); Layer layer = new(layerIndex++, mat, SlicerFile) { diff --git a/UVtools.Core/UVtools.Core.csproj b/UVtools.Core/UVtools.Core.csproj index 48168d9..c5c5511 100644 --- a/UVtools.Core/UVtools.Core.csproj +++ b/UVtools.Core/UVtools.Core.csproj @@ -10,7 +10,7 @@ <RepositoryUrl>https://github.com/sn4k3/UVtools</RepositoryUrl> <PackageProjectUrl>https://github.com/sn4k3/UVtools</PackageProjectUrl> <Description>MSLA/DLP, file analysis, calibration, repair, conversion and manipulation</Description> - <Version>2.4.2</Version> + <Version>2.4.3</Version> <Copyright>Copyright © 2020 PTRTECH</Copyright> <PackageIcon>UVtools.png</PackageIcon> <Platforms>AnyCPU;x64</Platforms> diff --git a/UVtools.WPF/Controls/Calibrators/CalibrateElephantFootControl.axaml b/UVtools.WPF/Controls/Calibrators/CalibrateElephantFootControl.axaml index 848c04f..c424156 100644 --- a/UVtools.WPF/Controls/Calibrators/CalibrateElephantFootControl.axaml +++ b/UVtools.WPF/Controls/Calibrators/CalibrateElephantFootControl.axaml @@ -36,7 +36,7 @@ VerticalAlignment="Center" Text="Bottom layers:"/> <NumericUpDown Grid.Row="2" Grid.Column="2" - ClipValueToMinMax="True" + Increment="1" Minimum="1" Maximum="1000" @@ -54,7 +54,7 @@ IsEnabled="{Binding !Operation.SyncLayers}" Text="Normal layers:"/> <NumericUpDown Grid.Row="2" Grid.Column="8" - ClipValueToMinMax="True" + IsEnabled="{Binding !Operation.SyncLayers}" Increment="1" Minimum="1" @@ -71,7 +71,7 @@ VerticalAlignment="Center" Text="Bottom exposure:"/> <NumericUpDown Grid.Row="4" Grid.Column="2" - ClipValueToMinMax="True" + Increment="0.5" Minimum="0.1" Maximum="200" @@ -84,7 +84,7 @@ VerticalAlignment="Center" Text="Normal exposure:"/> <NumericUpDown Grid.Row="4" Grid.Column="8" - ClipValueToMinMax="True" + Increment="0.5" Minimum="0.1" Maximum="200" @@ -97,7 +97,7 @@ VerticalAlignment="Center" Text="Part scale:"/> <NumericUpDown Grid.Row="6" Grid.Column="2" - ClipValueToMinMax="True" + Increment="0.1" Minimum="1" Maximum="10" @@ -110,7 +110,7 @@ VerticalAlignment="Center" Text="Margin:"/> <NumericUpDown Grid.Row="6" Grid.Column="8" - ClipValueToMinMax="True" + Increment="1" Minimum="0" Maximum="255" @@ -194,7 +194,7 @@ Text="Iterations range:"/> <NumericUpDown Grid.Row="2" Grid.Column="2" - ClipValueToMinMax="True" + IsEnabled="{Binding Operation.IsErodeEnabled}" Increment="1" Minimum="1" @@ -207,7 +207,7 @@ Text="-"/> <NumericUpDown Grid.Row="2" Grid.Column="6" - ClipValueToMinMax="True" + IsEnabled="{Binding Operation.IsErodeEnabled}" Increment="1" Minimum="1" @@ -223,7 +223,7 @@ Text="Step increment(s):"/> <NumericUpDown Grid.Row="2" Grid.Column="12" - ClipValueToMinMax="True" + IsEnabled="{Binding Operation.IsErodeEnabled}" Increment="1" Minimum="1" @@ -278,7 +278,7 @@ Text="Wall thickness:"/> <NumericUpDown Grid.Row="2" Grid.Column="2" - ClipValueToMinMax="True" + IsEnabled="{Binding Operation.IsDimmingEnabled}" Increment="1" Minimum="1" @@ -295,7 +295,7 @@ Text="Brightness range:"/> <NumericUpDown Grid.Row="4" Grid.Column="2" - ClipValueToMinMax="True" + IsEnabled="{Binding Operation.IsDimmingEnabled}" Increment="1" Minimum="1" @@ -309,7 +309,7 @@ Text="-"/> <NumericUpDown Grid.Row="4" Grid.Column="6" - ClipValueToMinMax="True" + IsEnabled="{Binding Operation.IsDimmingEnabled}" Increment="1" Minimum="2" @@ -321,7 +321,7 @@ Text="Step increment(s):"/> <NumericUpDown Grid.Row="4" Grid.Column="12" - ClipValueToMinMax="True" + IsEnabled="{Binding Operation.IsDimmingEnabled}" Increment="1" Minimum="2" diff --git a/UVtools.WPF/Controls/Calibrators/CalibrateExposureFinderControl.axaml b/UVtools.WPF/Controls/Calibrators/CalibrateExposureFinderControl.axaml index 5e7456b..c61c1f5 100644 --- a/UVtools.WPF/Controls/Calibrators/CalibrateExposureFinderControl.axaml +++ b/UVtools.WPF/Controls/Calibrators/CalibrateExposureFinderControl.axaml @@ -25,7 +25,7 @@ ToolTip.Tip="The printer display width. Required to calculate the pixels per mm." Text="Display width:"/> <NumericUpDown Grid.Row="0" Grid.Column="2" - ClipValueToMinMax="True" + Increment="0.1" Minimum="0" Maximum="10000" @@ -40,7 +40,7 @@ ToolTip.Tip="The printer display height. Required to calculate the pixels per mm." Text="Display height:"/> <NumericUpDown Grid.Row="0" Grid.Column="8" - ClipValueToMinMax="True" + Increment="0.1" Minimum="0" Maximum="10000" @@ -68,7 +68,7 @@ VerticalAlignment="Center" Text="Bottom layers:"/> <NumericUpDown Grid.Row="2" Grid.Column="8" - ClipValueToMinMax="True" + Increment="1" Minimum="1" Maximum="1000" @@ -81,7 +81,7 @@ VerticalAlignment="Center" Text="Bottom exposure:"/> <NumericUpDown Grid.Row="4" Grid.Column="2" - ClipValueToMinMax="True" + Increment="0.5" Minimum="0.1" Maximum="200" @@ -95,7 +95,7 @@ VerticalAlignment="Center" Text="Normal exposure:"/> <NumericUpDown Grid.Row="4" Grid.Column="8" - ClipValueToMinMax="True" + Increment="0.5" Minimum="0.1" Maximum="200" @@ -109,7 +109,7 @@ VerticalAlignment="Center" Text="Top/bottom margin:"/> <NumericUpDown Grid.Row="6" Grid.Column="2" - ClipValueToMinMax="True" + Increment="0.5" Minimum="0" Maximum="1000" @@ -122,7 +122,7 @@ VerticalAlignment="Center" Text="Left/right margin:"/> <NumericUpDown Grid.Row="6" Grid.Column="8" - ClipValueToMinMax="True" + Increment="0.5" Minimum="0" Maximum="1000" @@ -135,7 +135,7 @@ VerticalAlignment="Center" Text="Part margin:"/> <NumericUpDown Grid.Row="8" Grid.Column="2" - ClipValueToMinMax="True" + Increment="1" Minimum="0" Maximum="10000" @@ -149,7 +149,7 @@ ToolTip.Tip="Chamfer the bottom and top layers" Text="Chamfer layers:"/> <NumericUpDown Grid.Row="10" Grid.Column="2" - ClipValueToMinMax="True" + Increment="1" Minimum="0" Maximum="255" @@ -161,7 +161,7 @@ ToolTip.Tip="Erode bottom iterations to counter the elephant foot" Text="Erode bottom iter.:"/> <NumericUpDown Grid.Row="10" Grid.Column="8" - ClipValueToMinMax="True" + Increment="1" Minimum="0" Maximum="255" @@ -191,13 +191,13 @@ </Expander.Header> - <Grid RowDefinitions="Auto,10,Auto,10,Auto" + <Grid RowDefinitions="Auto,10,Auto,10,Auto,10,Auto,10,Auto,10,Auto,10,Auto,10,Auto,10,Auto,10,Auto" ColumnDefinitions="Auto,10,Auto,5,Auto,20,Auto,10,Auto,5,Auto,20,Auto,10,Auto,5,Auto"> <TextBlock Grid.Row="0" Grid.Column="0" Text="Base height:" VerticalAlignment="Center"/> <NumericUpDown Grid.Row="0" Grid.Column="2" - ClipValueToMinMax="True" + Increment="0.5" Minimum="0.3" Maximum="100" @@ -208,79 +208,210 @@ Text="mm"/> <TextBlock Grid.Row="0" Grid.Column="6" - Text="Hole height:" + Text="Features height:" VerticalAlignment="Center"/> <NumericUpDown Grid.Row="0" Grid.Column="8" - ClipValueToMinMax="True" + Increment="0.5" Minimum="1" Maximum="100" FormatString="F02" - Value="{Binding Operation.HoleHeight}"/> + Value="{Binding Operation.FeaturesHeight}"/> <TextBlock Grid.Row="0" Grid.Column="10" VerticalAlignment="Center" Text="mm"/> <TextBlock Grid.Row="0" Grid.Column="12" - Text="Hole margin:" + Text="Features margin:" VerticalAlignment="Center"/> <NumericUpDown Grid.Row="0" Grid.Column="14" - ClipValueToMinMax="True" + Increment="0.5" Minimum="1" Maximum="100" FormatString="F02" - Value="{Binding Operation.HoleMargin}"/> + Value="{Binding Operation.FeaturesMargin}"/> <TextBlock Grid.Row="0" Grid.Column="16" VerticalAlignment="Center" Text="mm"/> <TextBlock Grid.Row="2" Grid.Column="0" + Grid.ColumnSpan="17" + FontWeight="Bold" + Text="Pin (positive) / holes (negative):" + VerticalAlignment="Center"/> + + <TextBlock Grid.Row="4" Grid.Column="0" Text="Shape:" VerticalAlignment="Center"/> - <ComboBox Grid.Row="2" Grid.Column="2" + <ComboBox Grid.Row="4" Grid.Column="2" HorizontalAlignment="Stretch" Items="{Binding Operation.ShapesItems}" SelectedItem="{Binding Operation.HoleShape}"/> - <TextBlock Grid.Row="2" Grid.Column="6" + <TextBlock Grid.Row="4" Grid.Column="6" Text="Unit of measure:" VerticalAlignment="Center"/> - <ComboBox Grid.Row="2" Grid.Column="8" + <ComboBox Grid.Row="4" Grid.Column="8" HorizontalAlignment="Stretch" Items="{Binding Operation.MeasuresItems}" SelectedItem="{Binding Operation.UnitOfMeasure}"/> - - <TextBlock Grid.Row="4" Grid.Column="0" + <TextBlock Grid.Row="6" Grid.Column="0" Text="Diameters:" ToolTip.Tip="Diameters separated by a comma (,). 
Order doesn't matter. 
Values are pixel square, eg: 3 = 3x3 = 9 pixel hole" VerticalAlignment="Center"/> - <TextBox Grid.Row="4" Grid.Column="2" + <TextBox Grid.Row="6" Grid.Column="2" Grid.ColumnSpan="13" IsVisible="{Binding Operation.IsUnitOfMeasureMm}" Text="{Binding Operation.HoleDiametersMm}"/> - <TextBox Grid.Row="4" Grid.Column="2" + <TextBox Grid.Row="6" Grid.Column="2" Grid.ColumnSpan="13" IsVisible="{Binding !Operation.IsUnitOfMeasureMm}" Text="{Binding Operation.HoleDiametersPx}"/> - <TextBlock Grid.Row="4" Grid.Column="16" + <TextBlock Grid.Row="6" Grid.Column="16" IsVisible="{Binding Operation.IsUnitOfMeasureMm}" VerticalAlignment="Center" Text="mm"/> - <TextBlock Grid.Row="4" Grid.Column="16" + <TextBlock Grid.Row="6" Grid.Column="16" + IsVisible="{Binding !Operation.IsUnitOfMeasureMm}" + VerticalAlignment="Center" + Text="px"/> + + <TextBlock Grid.Row="8" Grid.Column="0" + Grid.ColumnSpan="17" + FontWeight="Bold" + Text="Zebra bars:" + VerticalAlignment="Center"/> + + + <TextBlock Grid.Row="10" Grid.Column="0" + Text="Bar spacing:" + VerticalAlignment="Center"/> + <NumericUpDown Grid.Row="10" Grid.Column="2" + + Increment="0.5" + Minimum="0.01" + Maximum="100" + FormatString="F02" + Value="{Binding Operation.BarSpacing}"/> + <TextBlock Grid.Row="10" Grid.Column="4" + VerticalAlignment="Center" + Text="mm"/> + + <TextBlock Grid.Row="10" Grid.Column="6" + Text="Bar length:" + HorizontalAlignment="Right" + VerticalAlignment="Center"/> + <NumericUpDown Grid.Row="10" Grid.Column="8" + + Increment="0.5" + Minimum="0.01" + Maximum="100" + FormatString="F02" + Value="{Binding Operation.BarLength}"/> + <TextBlock Grid.Row="10" Grid.Column="10" + VerticalAlignment="Center" + Text="mm"/> + + <TextBlock Grid.Row="10" Grid.Column="12" + Text="Vertical splitter:" + HorizontalAlignment="Right" + VerticalAlignment="Center"/> + <NumericUpDown Grid.Row="10" Grid.Column="14" + + Increment="1" + Minimum="0" + Maximum="255" + FormatString="F02" + Value="{Binding Operation.BarVerticalSplitter}"/> + <TextBlock Grid.Row="10" Grid.Column="16" + VerticalAlignment="Center" + Text="px"/> + + <TextBlock Grid.Row="12" Grid.Column="0" + Text="Thicknesses:" + VerticalAlignment="Center"/> + + <TextBox Grid.Row="12" Grid.Column="2" + Grid.ColumnSpan="13" + IsVisible="{Binding Operation.IsUnitOfMeasureMm}" + Text="{Binding Operation.BarThicknessesMm}"/> + + <TextBox Grid.Row="12" Grid.Column="2" + Grid.ColumnSpan="13" + IsVisible="{Binding !Operation.IsUnitOfMeasureMm}" + Text="{Binding Operation.BarThicknessesPx}"/> + <TextBlock Grid.Row="12" Grid.Column="16" + IsVisible="{Binding Operation.IsUnitOfMeasureMm}" + VerticalAlignment="Center" + Text="mm"/> + <TextBlock Grid.Row="12" Grid.Column="16" IsVisible="{Binding !Operation.IsUnitOfMeasureMm}" VerticalAlignment="Center" Text="px"/> + + <TextBlock Grid.Row="14" Grid.Column="0" + Grid.ColumnSpan="17" + FontWeight="Bold" + Text="Text:" + VerticalAlignment="Center"/> + + <TextBlock Grid.Row="16" Grid.Column="0" + Text="Font:" + VerticalAlignment="Center"/> + <ComboBox Grid.Row="16" Grid.Column="2" + Grid.ColumnSpan="2" + VerticalAlignment="Center" + HorizontalAlignment="Stretch" + Items="{Binding Operation.TextFonts}" + SelectedItem="{Binding Operation.TextFont}" + /> + + <TextBlock Grid.Row="16" Grid.Column="6" + Text="Text scale:" + HorizontalAlignment="Right" + VerticalAlignment="Center"/> + <NumericUpDown Grid.Row="16" Grid.Column="8" + Increment="0.5" + Minimum="0.1" + Maximum="100" + FormatString="F02" + Value="{Binding Operation.TextScale}"/> + <TextBlock Grid.Row="16" Grid.Column="10" + VerticalAlignment="Center" + Text="x"/> + + <TextBlock Grid.Row="16" Grid.Column="12" + Text="Text thickness:" + HorizontalAlignment="Right" + VerticalAlignment="Center"/> + <NumericUpDown Grid.Row="16" Grid.Column="14" + Increment="1" + Minimum="1" + Maximum="255" + Value="{Binding Operation.TextThickness}"/> + <TextBlock Grid.Row="16" Grid.Column="16" + VerticalAlignment="Center" + Text="px"/> + + <TextBlock Grid.Row="18" Grid.Column="0" + Text="Thicknesses:" + VerticalAlignment="Center"/> + + <TextBox Grid.Row="18" Grid.Column="2" + Grid.ColumnSpan="13" + Text="{Binding Operation.Text}"/> + </Grid> </Expander> diff --git a/UVtools.WPF/Controls/Calibrators/CalibrateGrayscaleControl.axaml b/UVtools.WPF/Controls/Calibrators/CalibrateGrayscaleControl.axaml index a3939ca..7087937 100644 --- a/UVtools.WPF/Controls/Calibrators/CalibrateGrayscaleControl.axaml +++ b/UVtools.WPF/Controls/Calibrators/CalibrateGrayscaleControl.axaml @@ -15,7 +15,7 @@ VerticalAlignment="Center" Text="Layer height:"/> <NumericUpDown Grid.Row="0" Grid.Column="2" - ClipValueToMinMax="True" + Increment="0.01" Minimum="0.01" Maximum="0.30" @@ -55,7 +55,7 @@ VerticalAlignment="Center" Text="Bottom layers:"/> <NumericUpDown Grid.Row="2" Grid.Column="2" - ClipValueToMinMax="True" + Increment="1" Minimum="1" Maximum="1000" @@ -70,7 +70,7 @@ ToolTip.Tip="Number of layers at normal exposure between bottom and normal layers" Text="Interface layers:"/> <NumericUpDown Grid.Row="2" Grid.Column="8" - ClipValueToMinMax="True" + Increment="1" Minimum="0" Maximum="1000" @@ -83,7 +83,7 @@ VerticalAlignment="Center" Text="Normal layers:"/> <NumericUpDown Grid.Row="4" Grid.Column="2" - ClipValueToMinMax="True" + Increment="1" Minimum="1" Maximum="1000" @@ -96,7 +96,7 @@ VerticalAlignment="Center" Text="Bottom exposure:"/> <NumericUpDown Grid.Row="6" Grid.Column="2" - ClipValueToMinMax="True" + Increment="0.5" Minimum="0.1" Maximum="200" @@ -110,7 +110,7 @@ VerticalAlignment="Center" Text="Normal exposure:"/> <NumericUpDown Grid.Row="6" Grid.Column="8" - ClipValueToMinMax="True" + Increment="0.5" Minimum="0.1" Maximum="200" @@ -125,7 +125,7 @@ VerticalAlignment="Center" Text="Outer margin:"/> <NumericUpDown Grid.Row="8" Grid.Column="2" - ClipValueToMinMax="True" + Increment="1" Minimum="0" Maximum="10000" @@ -138,7 +138,7 @@ VerticalAlignment="Center" Text="Inner margin:"/> <NumericUpDown Grid.Row="8" Grid.Column="8" - ClipValueToMinMax="True" + Increment="1" Minimum="0" Maximum="10000" @@ -181,7 +181,7 @@ Text="Brightness range:"/> <NumericUpDown Grid.Row="0" Grid.Column="2" - ClipValueToMinMax="True" + Increment="1" Minimum="1" Maximum="254" @@ -194,7 +194,7 @@ Text="-"/> <NumericUpDown Grid.Row="0" Grid.Column="6" - ClipValueToMinMax="True" + Increment="1" Minimum="2" Maximum="255" @@ -205,7 +205,7 @@ Text="Step increment(s):"/> <NumericUpDown Grid.Row="0" Grid.Column="12" - ClipValueToMinMax="True" + Increment="1" Minimum="2" Maximum="254" @@ -227,7 +227,7 @@ Text="Center hole diameter:"/> <NumericUpDown Grid.Row="4" Grid.Column="2" - ClipValueToMinMax="True" + Increment="1" Minimum="2" Maximum="10000" @@ -255,7 +255,7 @@ Text="Division thickness:"/> <NumericUpDown Grid.Row="8" Grid.Column="2" - ClipValueToMinMax="True" + Increment="1" Minimum="0" Maximum="255" @@ -275,7 +275,7 @@ <NumericUpDown Grid.Row="8" Grid.Column="9" Grid.ColumnSpan="2" - ClipValueToMinMax="True" + Increment="1" Minimum="0" Maximum="255" @@ -293,7 +293,7 @@ Text="X text offset:"/> <NumericUpDown Grid.Row="10" Grid.Column="2" - ClipValueToMinMax="True" + Increment="1" Minimum="-10000" Maximum="10000" diff --git a/UVtools.WPF/Controls/Calibrators/CalibrateStressTowerControl.axaml b/UVtools.WPF/Controls/Calibrators/CalibrateStressTowerControl.axaml index 4ea86a3..d2c6ec5 100644 --- a/UVtools.WPF/Controls/Calibrators/CalibrateStressTowerControl.axaml +++ b/UVtools.WPF/Controls/Calibrators/CalibrateStressTowerControl.axaml @@ -25,7 +25,7 @@ ToolTip.Tip="The printer display width. Required to calculate the pixels per mm." Text="Display width:"/> <NumericUpDown Grid.Row="0" Grid.Column="2" - ClipValueToMinMax="True" + Increment="0.1" Minimum="0" Maximum="10000" @@ -40,7 +40,7 @@ ToolTip.Tip="The printer display height. Required to calculate the pixels per mm." Text="Display height:"/> <NumericUpDown Grid.Row="0" Grid.Column="8" - ClipValueToMinMax="True" + Increment="0.1" Minimum="0" Maximum="10000" @@ -54,7 +54,7 @@ VerticalAlignment="Center" Text="Layer height:"/> <NumericUpDown Grid.Row="2" Grid.Column="2" - ClipValueToMinMax="True" + Increment="0.01" Minimum="0.01" Maximum="0.30" @@ -69,7 +69,7 @@ VerticalAlignment="Center" Text="Bottom layers:"/> <NumericUpDown Grid.Row="2" Grid.Column="8" - ClipValueToMinMax="True" + Increment="1" Minimum="1" Maximum="1000" @@ -82,7 +82,7 @@ VerticalAlignment="Center" Text="Bottom exposure:"/> <NumericUpDown Grid.Row="4" Grid.Column="2" - ClipValueToMinMax="True" + Increment="0.5" Minimum="0.1" Maximum="200" @@ -96,7 +96,7 @@ VerticalAlignment="Center" Text="Normal exposure:"/> <NumericUpDown Grid.Row="4" Grid.Column="8" - ClipValueToMinMax="True" + Increment="0.5" Minimum="0.1" Maximum="200" @@ -110,7 +110,7 @@ VerticalAlignment="Center" Text="Base height:"/> <NumericUpDown Grid.Row="6" Grid.Column="2" - ClipValueToMinMax="True" + Increment="1" Minimum="0" Maximum="100" @@ -124,7 +124,7 @@ VerticalAlignment="Center" Text="Base diameter:"/> <NumericUpDown Grid.Row="6" Grid.Column="8" - ClipValueToMinMax="True" + Increment="1" Minimum="1" Maximum="10000" @@ -138,7 +138,7 @@ VerticalAlignment="Center" Text="Ceil height:"/> <NumericUpDown Grid.Row="8" Grid.Column="2" - ClipValueToMinMax="True" + Increment="1" Minimum="0" Maximum="100" @@ -153,7 +153,7 @@ VerticalAlignment="Center" Text="Body height:"/> <NumericUpDown Grid.Row="8" Grid.Column="8" - ClipValueToMinMax="True" + Increment="1" Minimum="0" Maximum="10000" @@ -195,7 +195,7 @@ ToolTip.Tip="Chamfer the bottom layers" Text="Chamfer layers:"/> <NumericUpDown Grid.Row="10" Grid.Column="2" - ClipValueToMinMax="True" + Increment="1" Minimum="0" Maximum="255" @@ -234,7 +234,7 @@ Text="Number of spirals:" VerticalAlignment="Center"/> <NumericUpDown Grid.Row="0" Grid.Column="2" - ClipValueToMinMax="True" + Increment="1" Minimum="1" Maximum="10" @@ -255,7 +255,7 @@ Text="Spiral diameter:" VerticalAlignment="Center"/> <NumericUpDown Grid.Row="2" Grid.Column="2" - ClipValueToMinMax="True" + Increment="1" Minimum="0.1" Maximum="10000" @@ -270,7 +270,7 @@ ToolTip.Tip="Spirals will turn this angle per layer." VerticalAlignment="Center"/> <NumericUpDown Grid.Row="2" Grid.Column="8" - ClipValueToMinMax="True" + Increment="1" Minimum="0.01" Maximum="359.99" diff --git a/UVtools.WPF/Controls/Calibrators/CalibrateToleranceControl.axaml b/UVtools.WPF/Controls/Calibrators/CalibrateToleranceControl.axaml index 126bb72..67ce63a 100644 --- a/UVtools.WPF/Controls/Calibrators/CalibrateToleranceControl.axaml +++ b/UVtools.WPF/Controls/Calibrators/CalibrateToleranceControl.axaml @@ -25,7 +25,7 @@ ToolTip.Tip="The printer display width. Required to calculate the pixels per mm." Text="Display width:"/> <NumericUpDown Grid.Row="0" Grid.Column="2" - ClipValueToMinMax="True" + Increment="0.1" Minimum="0" Maximum="10000" @@ -40,7 +40,7 @@ ToolTip.Tip="The printer display height. Required to calculate the pixels per mm." Text="Display height:"/> <NumericUpDown Grid.Row="0" Grid.Column="8" - ClipValueToMinMax="True" + Increment="0.1" Minimum="0" Maximum="10000" @@ -54,7 +54,7 @@ VerticalAlignment="Center" Text="Layer height:"/> <NumericUpDown Grid.Row="2" Grid.Column="2" - ClipValueToMinMax="True" + Increment="0.01" Minimum="0.01" Maximum="0.30" @@ -69,7 +69,7 @@ VerticalAlignment="Center" Text="Bottom layers:"/> <NumericUpDown Grid.Row="2" Grid.Column="8" - ClipValueToMinMax="True" + Increment="1" Minimum="1" Maximum="1000" @@ -82,7 +82,7 @@ VerticalAlignment="Center" Text="Bottom exposure:"/> <NumericUpDown Grid.Row="4" Grid.Column="2" - ClipValueToMinMax="True" + Increment="0.5" Minimum="0.1" Maximum="200" @@ -96,7 +96,7 @@ VerticalAlignment="Center" Text="Normal exposure:"/> <NumericUpDown Grid.Row="4" Grid.Column="8" - ClipValueToMinMax="True" + Increment="0.5" Minimum="0.1" Maximum="200" @@ -110,7 +110,7 @@ VerticalAlignment="Center" Text="Z height:"/> <NumericUpDown Grid.Row="6" Grid.Column="2" - ClipValueToMinMax="True" + Increment="1" Minimum="5" Maximum="100" @@ -150,7 +150,7 @@ VerticalAlignment="Center" Text="Top/bottom margin:"/> <NumericUpDown Grid.Row="8" Grid.Column="2" - ClipValueToMinMax="True" + Increment="1" Minimum="0" Maximum="10000" @@ -163,7 +163,7 @@ VerticalAlignment="Center" Text="Left/right margin:"/> <NumericUpDown Grid.Row="8" Grid.Column="8" - ClipValueToMinMax="True" + Increment="1" Minimum="0" Maximum="10000" @@ -177,7 +177,7 @@ ToolTip.Tip="Chamfer the bottom and top layers" Text="Chamfer layers:"/> <NumericUpDown Grid.Row="10" Grid.Column="2" - ClipValueToMinMax="True" + Increment="1" Minimum="0" Maximum="255" @@ -189,7 +189,7 @@ ToolTip.Tip="Erode bottom iterations to counter the elephant foot" Text="Erode bottom iter.:"/> <NumericUpDown Grid.Row="10" Grid.Column="8" - ClipValueToMinMax="True" + Increment="1" Minimum="0" Maximum="255" @@ -206,7 +206,7 @@ VerticalAlignment="Center" Text="Part margin:"/> <NumericUpDown Grid.Row="12" Grid.Column="8" - ClipValueToMinMax="True" + Increment="1" Minimum="0" Maximum="10000" @@ -260,7 +260,7 @@ Text="Diameter:" VerticalAlignment="Center"/> <NumericUpDown Grid.Row="0" Grid.Column="2" - ClipValueToMinMax="True" + Increment="1.0" Minimum="2" Maximum="1000" @@ -274,7 +274,7 @@ Text="Hole diameter:" VerticalAlignment="Center"/> <NumericUpDown Grid.Row="0" Grid.Column="8" - ClipValueToMinMax="True" + Increment="1.0" Minimum="2" Maximum="1000" @@ -322,7 +322,7 @@ Text="Thinner models:" VerticalAlignment="Center"/> <NumericUpDown Grid.Row="0" Grid.Column="2" - ClipValueToMinMax="True" + Increment="1" Minimum="0" Maximum="1000" @@ -331,7 +331,7 @@ Text="-Offset:" VerticalAlignment="Center"/> <NumericUpDown Grid.Row="0" Grid.Column="8" - ClipValueToMinMax="True" + Increment="0.01" Minimum="-1000" Maximum="0" @@ -345,7 +345,7 @@ Text="-Step:" VerticalAlignment="Center"/> <NumericUpDown Grid.Row="0" Grid.Column="14" - ClipValueToMinMax="True" + Increment="0.01" Minimum="-1000" Maximum="-0.01" @@ -361,7 +361,7 @@ IsEnabled="{Binding !Operation.FuseParts}" VerticalAlignment="Center"/> <NumericUpDown Grid.Row="2" Grid.Column="2" - ClipValueToMinMax="True" + Increment="1" Minimum="0" Maximum="1000" @@ -372,7 +372,7 @@ IsEnabled="{Binding !Operation.FuseParts}" VerticalAlignment="Center"/> <NumericUpDown Grid.Row="2" Grid.Column="8" - ClipValueToMinMax="True" + Increment="0.01" Minimum="0" Maximum="1000" @@ -389,7 +389,7 @@ IsEnabled="{Binding !Operation.FuseParts}" VerticalAlignment="Center"/> <NumericUpDown Grid.Row="2" Grid.Column="14" - ClipValueToMinMax="True" + Increment="0.01" Minimum="0.01" Maximum="1000" @@ -423,7 +423,7 @@ <StackPanel Orientation="Horizontal" Spacing="5"> <TextBlock VerticalAlignment="Center" Text="X:"/> <NumericUpDown - ClipValueToMinMax="True" + Increment="1" Minimum="0" Maximum="100" @@ -435,7 +435,7 @@ <TextBlock VerticalAlignment="Center" Text="Y:" Margin="20,0,0,0"/> <NumericUpDown - ClipValueToMinMax="True" + Increment="1" Minimum="0" Maximum="100" @@ -447,7 +447,7 @@ <TextBlock VerticalAlignment="Center" Text="Z:" Margin="20,0,0,0"/> <NumericUpDown - ClipValueToMinMax="True" + Increment="1" Minimum="0" Maximum="100" diff --git a/UVtools.WPF/Controls/Calibrators/CalibrateXYZAccuracyControl.axaml b/UVtools.WPF/Controls/Calibrators/CalibrateXYZAccuracyControl.axaml index d7075f8..c6894f1 100644 --- a/UVtools.WPF/Controls/Calibrators/CalibrateXYZAccuracyControl.axaml +++ b/UVtools.WPF/Controls/Calibrators/CalibrateXYZAccuracyControl.axaml @@ -26,7 +26,7 @@ ToolTip.Tip="The printer display width. Required to calculate the pixels per mm." Text="Display width:"/> <NumericUpDown Grid.Row="0" Grid.Column="2" - ClipValueToMinMax="True" + Increment="0.1" Minimum="0" Maximum="10000" @@ -41,7 +41,7 @@ ToolTip.Tip="The printer display height. Required to calculate the pixels per mm." Text="Display height:"/> <NumericUpDown Grid.Row="0" Grid.Column="8" - ClipValueToMinMax="True" + Increment="0.1" Minimum="0" Maximum="10000" @@ -55,7 +55,7 @@ VerticalAlignment="Center" Text="Layer height:"/> <NumericUpDown Grid.Row="2" Grid.Column="2" - ClipValueToMinMax="True" + Increment="0.01" Minimum="0.01" Maximum="0.30" @@ -70,7 +70,7 @@ VerticalAlignment="Center" Text="Bottom layers:"/> <NumericUpDown Grid.Row="2" Grid.Column="8" - ClipValueToMinMax="True" + Increment="1" Minimum="1" Maximum="1000" @@ -83,7 +83,7 @@ VerticalAlignment="Center" Text="Bottom exposure:"/> <NumericUpDown Grid.Row="4" Grid.Column="2" - ClipValueToMinMax="True" + Increment="0.5" Minimum="0.1" Maximum="200" @@ -97,7 +97,7 @@ VerticalAlignment="Center" Text="Normal exposure:"/> <NumericUpDown Grid.Row="4" Grid.Column="8" - ClipValueToMinMax="True" + Increment="0.5" Minimum="0.1" Maximum="200" @@ -111,7 +111,7 @@ VerticalAlignment="Center" Text="X length:"/> <NumericUpDown Grid.Row="6" Grid.Column="2" - ClipValueToMinMax="True" + Increment="1" Minimum="5" Maximum="100" @@ -125,7 +125,7 @@ VerticalAlignment="Center" Text="Y length:"/> <NumericUpDown Grid.Row="6" Grid.Column="8" - ClipValueToMinMax="True" + Increment="1" Minimum="5" Maximum="100" @@ -139,7 +139,7 @@ VerticalAlignment="Center" Text="Z height:"/> <NumericUpDown Grid.Row="8" Grid.Column="2" - ClipValueToMinMax="True" + Increment="1" Minimum="5" Maximum="100" @@ -178,7 +178,7 @@ VerticalAlignment="Center" Text="Top/bottom margin:"/> <NumericUpDown Grid.Row="10" Grid.Column="2" - ClipValueToMinMax="True" + Increment="1" Minimum="0" Maximum="10000" @@ -191,7 +191,7 @@ VerticalAlignment="Center" Text="Left/right margin:"/> <NumericUpDown Grid.Row="10" Grid.Column="8" - ClipValueToMinMax="True" + Increment="1" Minimum="0" Maximum="10000" @@ -209,7 +209,7 @@ VerticalAlignment="Center" IsEnabled="{Binding Operation.HollowModel}"/> <NumericUpDown Grid.Row="12" Grid.Column="8" - ClipValueToMinMax="True" + Increment="0.5" Minimum="0" Maximum="100" @@ -357,7 +357,7 @@ <StackPanel Orientation="Horizontal" Spacing="5"> <TextBlock VerticalAlignment="Center" Text="X:"/> <NumericUpDown - ClipValueToMinMax="True" + Increment="1" Minimum="0" Maximum="100" @@ -369,7 +369,7 @@ <TextBlock VerticalAlignment="Center" Text="Y:" Margin="20,0,0,0"/> <NumericUpDown - ClipValueToMinMax="True" + Increment="1" Minimum="0" Maximum="100" @@ -381,7 +381,7 @@ <TextBlock VerticalAlignment="Center" Text="Z:" Margin="20,0,0,0"/> <NumericUpDown - ClipValueToMinMax="True" + Increment="1" Minimum="0" Maximum="100" diff --git a/UVtools.WPF/Controls/Tools/ToolCalculatorControl.axaml b/UVtools.WPF/Controls/Tools/ToolCalculatorControl.axaml index d71fd0f..2610afd 100644 --- a/UVtools.WPF/Controls/Tools/ToolCalculatorControl.axaml +++ b/UVtools.WPF/Controls/Tools/ToolCalculatorControl.axaml @@ -639,7 +639,7 @@ Maximum="0.20" Increment="0.01" FormatString="F02" - ClipValueToMinMax="True" + Value="{Binding Operation.CalcOptimalModelTilt.LayerHeight}" /> <TextBlock diff --git a/UVtools.WPF/Controls/Tools/ToolDynamicLayerHeightControl.axaml b/UVtools.WPF/Controls/Tools/ToolDynamicLayerHeightControl.axaml index 2ff77bf..383ac20 100644 --- a/UVtools.WPF/Controls/Tools/ToolDynamicLayerHeightControl.axaml +++ b/UVtools.WPF/Controls/Tools/ToolDynamicLayerHeightControl.axaml @@ -17,7 +17,7 @@ ToolTip.Tip="The printer display width. Required to calculate the XY pixel resolution." Text="Display width:"/> <NumericUpDown Grid.Row="0" Grid.Column="2" - ClipValueToMinMax="True" + Increment="0.1" Minimum="0" Maximum="10000" @@ -32,7 +32,7 @@ ToolTip.Tip="The printer display height. Required to calculate the XY pixel resolution." Text="Display height:"/> <NumericUpDown Grid.Row="0" Grid.Column="8" - ClipValueToMinMax="True" + Increment="0.1" Minimum="0" Maximum="10000" diff --git a/UVtools.WPF/Controls/Tools/ToolInfillControl.axaml b/UVtools.WPF/Controls/Tools/ToolInfillControl.axaml index 4fa2208..8e35495 100644 --- a/UVtools.WPF/Controls/Tools/ToolInfillControl.axaml +++ b/UVtools.WPF/Controls/Tools/ToolInfillControl.axaml @@ -36,7 +36,7 @@ Minimum="0" Maximum="65535" Increment="1" - ClipValueToMinMax="True" + Value="{Binding Operation.WallThickness}" /> @@ -61,7 +61,7 @@ Minimum="0" Maximum="255" Increment="1" - ClipValueToMinMax="True" + Value="{Binding Operation.InfillBrightness}" /> @@ -80,7 +80,7 @@ Minimum="0" Maximum="65535" Increment="1" - ClipValueToMinMax="True" + Value="{Binding Operation.InfillThickness}" /> @@ -105,7 +105,7 @@ Minimum="{Binding #InfillThickness.Value}" Maximum="65535" Increment="1" - ClipValueToMinMax="True" + Value="{Binding Operation.InfillSpacing}" /> diff --git a/UVtools.WPF/Controls/Tools/ToolLayerImportControl.axaml b/UVtools.WPF/Controls/Tools/ToolLayerImportControl.axaml index 9e40511..6862019 100644 --- a/UVtools.WPF/Controls/Tools/ToolLayerImportControl.axaml +++ b/UVtools.WPF/Controls/Tools/ToolLayerImportControl.axaml @@ -42,7 +42,7 @@ VerticalAlignment="Center" Text="Start at layer:"/> <NumericUpDown Grid.Row="2" Grid.Column="2" - ClipValueToMinMax="True" + Minimum="0" Maximum="{Binding MaximumLayer}" Value="{Binding Operation.StartLayerIndex}"/> @@ -61,7 +61,7 @@ IsVisible="{Binding Operation.IsImportStackType}" Text="Stack margin:"/> <NumericUpDown Grid.Row="6" Grid.Column="2" - ClipValueToMinMax="True" + IsVisible="{Binding Operation.IsImportStackType}" Minimum="0" Maximum="65535" diff --git a/UVtools.WPF/Controls/Tools/ToolRepairLayersControl.axaml b/UVtools.WPF/Controls/Tools/ToolRepairLayersControl.axaml index d20808e..4080dd5 100644 --- a/UVtools.WPF/Controls/Tools/ToolRepairLayersControl.axaml +++ b/UVtools.WPF/Controls/Tools/ToolRepairLayersControl.axaml @@ -51,7 +51,7 @@ Increment="1" Minimum="0" Maximum="65535" - ClipValueToMinMax="True" + ToolTip.Tip="The pixel area threshold above which islands will not be removed by this repair. 
Islands remaining after repair will require supports to be added manually." Value="{Binding Operation.RemoveIslandsBelowEqualPixelCount}" @@ -82,7 +82,7 @@ Increment="1" Minimum="0" Maximum="65535" - ClipValueToMinMax="True" + ToolTip.Tip="If the removal of an island in the current layer results in a new island being introduce in the layer above, the island in the layer above will also be automatically removed. 
This process will repeat for up to the number of layers specified. Set to 0 to repeat until there are no more valid islands to remove. 
 @@ -124,7 +124,7 @@ Increment="1" Minimum="0" Maximum="255" - ClipValueToMinMax="True" + ToolTip.Tip="Attempt to repair islands by attaching them to other nearby islands in safe increments. 
If enabled, gap closing is attempted before island removal is attempted. 
Set iterations to 0 to disable. @@ -151,7 +151,7 @@ Increment="1" Minimum="0" Maximum="255" - ClipValueToMinMax="True" + ToolTip.Tip="Remove individual or small clusters of pixels in iterations. 
This settings can remove noise from a layer, but will also remove fine details. 
Set iterations to 0 to disable. diff --git a/UVtools.WPF/MainWindow.axaml b/UVtools.WPF/MainWindow.axaml index 85de78b..53e000e 100644 --- a/UVtools.WPF/MainWindow.axaml +++ b/UVtools.WPF/MainWindow.axaml @@ -831,7 +831,7 @@ Grid.Column="2" Minimum="1" Maximum="255" - ClipValueToMinMax="True" + HorizontalAlignment="Stretch" Value="{Binding DrawingPixelDrawing.BrushSize}"/> <TextBlock @@ -850,7 +850,7 @@ Grid.Column="2" Minimum="-1" Maximum="255" - ClipValueToMinMax="True" + HorizontalAlignment="Stretch" Value="{Binding DrawingPixelDrawing.Thickness}"/> <TextBlock @@ -869,7 +869,7 @@ Grid.Column="2" Minimum="0" Maximum="255" - ClipValueToMinMax="True" + HorizontalAlignment="Stretch" Value="{Binding DrawingPixelDrawing.RemovePixelBrightness}"/> <TextBlock @@ -888,7 +888,7 @@ Grid.Column="2" Minimum="1" Maximum="255" - ClipValueToMinMax="True" + HorizontalAlignment="Stretch" Value="{Binding DrawingPixelDrawing.PixelBrightness}"/> <TextBlock @@ -907,7 +907,7 @@ Grid.Column="2" Grid.ColumnSpan="3" Minimum="0" - ClipValueToMinMax="True" + HorizontalAlignment="Stretch" Value="{Binding DrawingPixelDrawing.LayersBelow}"/> @@ -922,7 +922,7 @@ Grid.Column="2" Grid.ColumnSpan="3" Minimum="0" - ClipValueToMinMax="True" + HorizontalAlignment="Stretch" Value="{Binding DrawingPixelDrawing.LayersAbove}"/> @@ -992,7 +992,7 @@ Minimum="0.1" Maximum="255" Increment="0.1" - ClipValueToMinMax="True" + Value="{Binding DrawingPixelText.FontScale}"/> @@ -1007,7 +1007,7 @@ Grid.ColumnSpan="3" Minimum="1" Maximum="255" - ClipValueToMinMax="True" + Value="{Binding DrawingPixelText.Thickness}"/> <TextBlock @@ -1038,7 +1038,7 @@ Grid.Column="2" Minimum="0" Maximum="255" - ClipValueToMinMax="True" + Value="{Binding DrawingPixelText.RemovePixelBrightness}"/> <TextBlock Grid.Row="12" @@ -1056,7 +1056,7 @@ Grid.Column="2" Minimum="1" Maximum="255" - ClipValueToMinMax="True" + Value="{Binding DrawingPixelText.PixelBrightness}"/> <TextBlock Grid.Row="14" @@ -1075,7 +1075,7 @@ Grid.Column="2" Grid.ColumnSpan="3" Minimum="0" - ClipValueToMinMax="True" + Value="{Binding DrawingPixelText.LayersBelow}"/> @@ -1089,7 +1089,7 @@ Grid.Column="2" Grid.ColumnSpan="3" Minimum="0" - ClipValueToMinMax="True" + Value="{Binding DrawingPixelText.LayersAbove}"/> </Grid> @@ -1130,7 +1130,7 @@ Grid.Column="2" Minimum="0" Maximum="255" - ClipValueToMinMax="True" + Value="{Binding DrawingPixelEraser.PixelBrightness}"/> <TextBlock Grid.Row="0" @@ -1148,7 +1148,7 @@ Grid.Column="2" Grid.ColumnSpan="3" Minimum="0" - ClipValueToMinMax="True" + Value="{Binding DrawingPixelEraser.LayersBelow}"/> <TextBlock @@ -1161,7 +1161,7 @@ Grid.Column="2" Grid.ColumnSpan="3" Minimum="0" - ClipValueToMinMax="True" + Value="{Binding DrawingPixelEraser.LayersAbove}"/> @@ -1254,7 +1254,7 @@ Grid.Column="2" Minimum="0" Maximum="255" - ClipValueToMinMax="True" + Value="{Binding DrawingPixelSupport.PixelBrightness}"/> <TextBlock Grid.Row="6" diff --git a/UVtools.WPF/UVtools.WPF.csproj b/UVtools.WPF/UVtools.WPF.csproj index 3af71ff..9f8bed6 100644 --- a/UVtools.WPF/UVtools.WPF.csproj +++ b/UVtools.WPF/UVtools.WPF.csproj @@ -12,7 +12,7 @@ <PackageLicenseFile>LICENSE</PackageLicenseFile> <RepositoryUrl>https://github.com/sn4k3/UVtools</RepositoryUrl> <RepositoryType>Git</RepositoryType> - <Version>2.4.2</Version> + <Version>2.4.3</Version> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'"> diff --git a/UVtools.WPF/UserSettings.cs b/UVtools.WPF/UserSettings.cs index d8686dd..89dfea1 100644 --- a/UVtools.WPF/UserSettings.cs +++ b/UVtools.WPF/UserSettings.cs @@ -36,7 +36,7 @@ namespace UVtools.WPF private bool _loadDemoFileOnStartup = true; private bool _windowsTakeIntoAccountScreenScaling = true; private ushort _windowsHorizontalMargin = 200; - private ushort _windowsVerticalMargin = 250; + private ushort _windowsVerticalMargin = 400; private byte _defaultOpenFileExtensionIndex; private string _defaultDirectoryOpenFile; private string _defaultDirectorySaveFile; diff --git a/UVtools.WPF/Windows/SettingsWindow.axaml b/UVtools.WPF/Windows/SettingsWindow.axaml index 63be73b..4d27dee 100644 --- a/UVtools.WPF/Windows/SettingsWindow.axaml +++ b/UVtools.WPF/Windows/SettingsWindow.axaml @@ -52,7 +52,7 @@ <NumericUpDown Grid.Row="0" Grid.Column="2" VerticalAlignment="Center" ToolTip.Tip="Limits the windows and dialogs maximum width to the screen resolution less this margin" - ClipValueToMinMax="True" + Minimum="0" Maximum="1000" Increment="1" @@ -69,7 +69,7 @@ <NumericUpDown Grid.Row="2" Grid.Column="2" VerticalAlignment="Center" ToolTip.Tip="Limits windows and dialogs maximum height to the screen resolution less this margin" - ClipValueToMinMax="True" + Minimum="0" Maximum="1000" Increment="1" @@ -265,7 +265,7 @@ <NumericUpDown Grid.Row="2" Grid.Column="2" Margin="10,0,0,0" VerticalAlignment="Center" - ClipValueToMinMax="True" + Minimum="1" Maximum="50" Value="{Binding Settings.LayerPreview.VolumeBoundsOutlineThickness}" @@ -299,7 +299,7 @@ <NumericUpDown Grid.Row="4" Grid.Column="2" Margin="10,0,0,0" VerticalAlignment="Center" - ClipValueToMinMax="True" + Minimum="1" Maximum="50" Value="{Binding Settings.LayerPreview.LayerBoundsOutlineThickness}" @@ -334,7 +334,7 @@ <NumericUpDown Grid.Row="6" Grid.Column="2" Margin="10,0,0,0" VerticalAlignment="Center" - ClipValueToMinMax="True" + Minimum="1" Maximum="50" Value="{Binding Settings.LayerPreview.HollowOutlineLineThickness}" @@ -593,7 +593,7 @@ <NumericUpDown Grid.Row="0" Grid.Column="3" Margin="10,0,0,0" VerticalAlignment="Center" - ClipValueToMinMax="True" + Minimum="1" Maximum="1000000" Width="70" @@ -624,7 +624,7 @@ <NumericUpDown Grid.Row="2" Grid.Column="3" Margin="10,0,0,0" VerticalAlignment="Center" - ClipValueToMinMax="True" + Minimum="1" Maximum="255" Width="70" @@ -737,7 +737,7 @@ <StackPanel Orientation="Horizontal" Margin="10,0,10,10" Spacing="10"> <NumericUpDown Width="60" - ClipValueToMinMax="True" + Minimum="0" Maximum="254" Value="{Binding Settings.Issues.IslandBinaryThreshold}" @@ -753,7 +753,7 @@ <StackPanel Orientation="Horizontal" Margin="10,0,10,10" Spacing="10"> <NumericUpDown Width="60" - ClipValueToMinMax="True" + Minimum="1" Maximum="255" Value="{Binding Settings.Issues.IslandRequiredAreaToProcessCheck}" @@ -767,7 +767,7 @@ <StackPanel Orientation="Horizontal" Margin="10,0,10,10" Spacing="10"> <NumericUpDown Width="60" - ClipValueToMinMax="True" + Minimum="1" Maximum="255" Value="{Binding Settings.Issues.IslandRequiredPixelBrightnessToProcessCheck}" @@ -781,7 +781,7 @@ <StackPanel Orientation="Horizontal" Margin="10,0,10,10" Spacing="10"> <NumericUpDown Width="60" - ClipValueToMinMax="True" + Minimum="0.05" Maximum="0.95" Increment="0.05" @@ -798,7 +798,7 @@ <StackPanel Orientation="Horizontal" Margin="10,0,10,10" Spacing="10"> <NumericUpDown Width="60" - ClipValueToMinMax="True" + Minimum="50" Maximum="255" Value="{Binding Settings.Issues.IslandRequiredPixelBrightnessToSupport}" @@ -813,7 +813,7 @@ <!-- <StackPanel Orientation="Horizontal" Margin="10,0,10,10" Spacing="10"> <NumericUpDown Width="60" - ClipValueToMinMax="True" + Minimum="1" Maximum="255" Value="{Binding Settings.Issues.IslandRequiredPixelsToSupport}" @@ -829,7 +829,7 @@ <StackPanel Orientation="Horizontal" Margin="10,0,10,10" Spacing="10"> <NumericUpDown Width="60" - ClipValueToMinMax="True" + Minimum="50" Maximum="255" Value="{Binding Settings.Issues.IslandRequiredPixelBrightnessToSupport}" @@ -861,7 +861,7 @@ <StackPanel Orientation="Horizontal" Margin="10,0,10,10" Spacing="10"> <NumericUpDown Width="60" - ClipValueToMinMax="True" + Minimum="2" Maximum="255" Value="{Binding Settings.Issues.OverhangErodeIterations}" @@ -885,7 +885,7 @@ <StackPanel Orientation="Horizontal" Margin="10" Spacing="10"> <NumericUpDown Width="60" - ClipValueToMinMax="True" + Minimum="1" Maximum="254" Value="{Binding Settings.Issues.ResinTrapBinaryThreshold}" @@ -902,7 +902,7 @@ <StackPanel Orientation="Horizontal" Margin="10,0,10,10" Spacing="10"> <NumericUpDown Width="60" - ClipValueToMinMax="True" + Minimum="1" Maximum="255" Value="{Binding Settings.Issues.ResinTrapRequiredAreaToProcessCheck}" @@ -916,7 +916,7 @@ <StackPanel Orientation="Horizontal" Margin="10,0,10,10" Spacing="10"> <NumericUpDown Width="60" - ClipValueToMinMax="True" + Minimum="1" Maximum="255" Value="{Binding Settings.Issues.ResinTrapRequiredBlackPixelsToDrain}" @@ -930,7 +930,7 @@ <StackPanel Orientation="Horizontal" Margin="10,0,10,10" Spacing="10"> <NumericUpDown Width="60" - ClipValueToMinMax="True" + Minimum="1" Maximum="150" Value="{Binding Settings.Issues.ResinTrapMaximumPixelBrightnessToDrain}" @@ -953,7 +953,7 @@ <StackPanel Orientation="Horizontal" Margin="10" Spacing="10"> <NumericUpDown Width="60" - ClipValueToMinMax="True" + Minimum="1" Maximum="255" Value="{Binding Settings.Issues.TouchingBoundMinimumPixelBrightness}" @@ -1016,7 +1016,7 @@ Minimum="1" Maximum="255" Margin="0,0,5,0" - ClipValueToMinMax="True" + Value="{Binding Settings.Issues.TouchingBoundMarginLeft}" /> @@ -1034,7 +1034,7 @@ Minimum="1" Maximum="255" Margin="0,0,0,5" - ClipValueToMinMax="True" + Value="{Binding Settings.Issues.TouchingBoundMarginTop}" /> <TextBlock @@ -1050,7 +1050,7 @@ Minimum="1" Maximum="255" Margin="5,0,0,0" - ClipValueToMinMax="True" + Value="{Binding Settings.Issues.TouchingBoundMarginRight}" /> <TextBlock @@ -1067,7 +1067,7 @@ Minimum="1" Maximum="255" Margin="0,5,0,0" - ClipValueToMinMax="True" + Value="{Binding Settings.Issues.TouchingBoundMarginBottom}" /> <CheckBox @@ -1242,7 +1242,7 @@ <NumericUpDown Value="{Binding Settings.LayerRepair.RemoveIslandsBelowEqualPixels}" Width="70" - ClipValueToMinMax="True" + Minimum="0" Maximum="255"/> <TextBlock VerticalAlignment="Center" Text="Default maximum pixel area for Island removal (0 = disable)"/> @@ -1252,7 +1252,7 @@ <NumericUpDown Value="{Binding Settings.LayerRepair.RemoveIslandsRecursiveIterations}" Width="70" - ClipValueToMinMax="True" + Minimum="0" Maximum="65535"/> <TextBlock VerticalAlignment="Center" Text="Default maximum layers for recursive island removal (0 = All)"/> @@ -1262,7 +1262,7 @@ <NumericUpDown Value="{Binding Settings.LayerRepair.ClosingIterations}" Width="70" - ClipValueToMinMax="True" + Minimum="0" Maximum="255"/> <TextBlock VerticalAlignment="Center" Text="Default 'Gap Closing' iterations"/> @@ -1272,7 +1272,7 @@ <NumericUpDown Value="{Binding Settings.LayerRepair.OpeningIterations}" Width="70" - ClipValueToMinMax="True" + Minimum="0" Maximum="255"/> <TextBlock VerticalAlignment="Center" Text="Default 'Noise Removal' iterations"/> @@ -1345,7 +1345,7 @@ Text="Light-off delay:" /> <NumericUpDown Grid.Row="0" Grid.Column="2" - ClipValueToMinMax="True" + Minimum="0" Maximum="255" Increment="0.5" @@ -1362,7 +1362,7 @@ 
Use '0' to ignore this automation." Text="Bottom light-off delay:" /> <NumericUpDown Grid.Row="0" Grid.Column="8" - ClipValueToMinMax="True" + Minimum="0" Maximum="255" Increment="0.5" diff --git a/UVtools.WPF/Windows/ToolWindow.axaml.cs b/UVtools.WPF/Windows/ToolWindow.axaml.cs index 74f42cb..ef8d3d4 100644 --- a/UVtools.WPF/Windows/ToolWindow.axaml.cs +++ b/UVtools.WPF/Windows/ToolWindow.axaml.cs @@ -528,7 +528,6 @@ namespace UVtools.WPF.Windows } } - // Ensure the description don't stretch window DispatcherTimer.Run(() => |