Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/sn4k3/UVtools.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTiago Conceição <Tiago_caza@hotmail.com>2021-02-09 02:19:10 +0300
committerTiago Conceição <Tiago_caza@hotmail.com>2021-02-09 02:19:10 +0300
commit020d3659b2d94fe6679295da85dc84ef9ce5bc6d (patch)
treed15d92c5b74c8d17c81a94293f5d1953f3bf9ff9
parentc0b6c15f3e8e038acb61d2a769fb7978e6fa7de8 (diff)
v2.4.3v2.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
-rw-r--r--CHANGELOG.md10
-rw-r--r--UVtools.Core/Operations/OperationCalibrateExposureFinder.cs340
-rw-r--r--UVtools.Core/UVtools.Core.csproj2
-rw-r--r--UVtools.WPF/Controls/Calibrators/CalibrateElephantFootControl.axaml26
-rw-r--r--UVtools.WPF/Controls/Calibrators/CalibrateExposureFinderControl.axaml185
-rw-r--r--UVtools.WPF/Controls/Calibrators/CalibrateGrayscaleControl.axaml30
-rw-r--r--UVtools.WPF/Controls/Calibrators/CalibrateStressTowerControl.axaml28
-rw-r--r--UVtools.WPF/Controls/Calibrators/CalibrateToleranceControl.axaml46
-rw-r--r--UVtools.WPF/Controls/Calibrators/CalibrateXYZAccuracyControl.axaml30
-rw-r--r--UVtools.WPF/Controls/Tools/ToolCalculatorControl.axaml2
-rw-r--r--UVtools.WPF/Controls/Tools/ToolDynamicLayerHeightControl.axaml4
-rw-r--r--UVtools.WPF/Controls/Tools/ToolInfillControl.axaml8
-rw-r--r--UVtools.WPF/Controls/Tools/ToolLayerImportControl.axaml4
-rw-r--r--UVtools.WPF/Controls/Tools/ToolRepairLayersControl.axaml8
-rw-r--r--UVtools.WPF/MainWindow.axaml32
-rw-r--r--UVtools.WPF/UVtools.WPF.csproj2
-rw-r--r--UVtools.WPF/UserSettings.cs2
-rw-r--r--UVtools.WPF/Windows/SettingsWindow.axaml60
-rw-r--r--UVtools.WPF/Windows/ToolWindow.axaml.cs1
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 (,).
&#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>
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.
&#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.
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 @@
&#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"
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(() =>