* **(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
This commit is contained in:
Tiago Conceição
2021-02-08 23:19:10 +00:00
parent c0b6c15f3e
commit 020d3659b2
19 changed files with 586 additions and 236 deletions
+10
View File
@@ -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:**
@@ -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;
}
}
}
/*if (_mirrorOutput)
xPos = featuresMarginX;
// Print Zebra bars
if (bars.Length > 0)
{
Parallel.ForEach(layers, mat => CvInvoke.Flip(mat, mat, FlipType.Horizontal));
}*/
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);
}
// Print a hardcoded spiral if have space
if (positiveSideWidth >= 250)
{
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)
{
+1 -1
View File
@@ -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>
@@ -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"
@@ -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 (,).
&#x0a;Order doesn't matter.
&#x0a;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>
@@ -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"
@@ -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"
@@ -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"
@@ -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"
@@ -639,7 +639,7 @@
Maximum="0.20"
Increment="0.01"
FormatString="F02"
ClipValueToMinMax="True"
Value="{Binding Operation.CalcOptimalModelTilt.LayerHeight}"
/>
<TextBlock
@@ -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"
@@ -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}"
/>
@@ -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"
@@ -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.
&#x0a;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.
&#x0a;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.
&#x0a;
@@ -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.
&#x0a;If enabled, gap closing is attempted before island removal is attempted.
&#x0a;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.
&#x0a;This settings can remove noise from a layer, but will also remove fine details.
&#x0a;Set iterations to 0 to disable.
+16 -16
View File
@@ -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"
+1 -1
View File
@@ -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'">
+1 -1
View File
@@ -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;
+30 -30
View File
@@ -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 @@
&#x0a;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"
-1
View File
@@ -528,7 +528,6 @@ namespace UVtools.WPF.Windows
}
}
// Ensure the description don't stretch window
DispatcherTimer.Run(() =>