Files
UVtools/UVtools.GUI/Forms/FrmToolPattern.cs
T
Tiago Conceição b2bd1c41f1 v0.6.2.0
* (Add) PrusaSlicer Printer: Elegoo Mars 2 Pro
* (Add) PrusaSlicer Printer: Creality LD-002H
* (Add) PrusaSlicer Printer: Voxelab Polaris
* (Add) File Format: UVJ (#8)
* (Add) Mutataor: Pixel Dimming
* (Add) Pixel Editor tab with new drawing functions
* (Add) Pixel Editor: Bursh area and shape
* (Add) Pixel Editor: Supports
* (Add) Pixel Editor: Drain holes
* (Add) Settings for pixel editor
* (Add) Setting: File open default directory
* (Add) Setting: File save default directory
* (Add) Setting: File extract default directory
* (Add) Setting: File convert default directory
* (Add) Setting: File save prompt for overwrite (#10)
* (Add) Setting: File save preffix and suffix name
* (Add) Setting: UVtools version to the title bar
* (Improvement) Force same directory as input file on dialogs
* (Improvement) Pattern: Better positioning when not using an anchor, now it's more center friendly
* (Change) Setting: Start maximized defaults to true
* (Fix) Pattern: Calculated volume was appending one margin width/height more
* (Fix) When cancel a file load, some shortcuts can crash the program as it assume file is loaded
* (Fix) pws: Encode using the same count-of-threshold method as CBDDLP (ezrec/uv3dp#79)
2020-07-14 02:55:37 +01:00

255 lines
8.2 KiB
C#

/*
* GNU AFFERO GENERAL PUBLIC LICENSE
* Version 3, 19 November 2007
* Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
* Everyone is permitted to copy and distribute verbatim copies
* of this license document, but changing it is not allowed.
*/
using System;
using System.Drawing;
using System.Windows.Forms;
using UVtools.Core;
using UVtools.Core.Operations;
namespace UVtools.GUI.Forms
{
public partial class FrmToolPattern : Form
{
#region Properties
public uint LayerRangeStart
{
get => (uint) nmLayerRangeStart.Value;
set => nmLayerRangeStart.Value = value;
}
public uint LayerRangeEnd
{
get => (uint)Math.Min(nmLayerRangeEnd.Value, Program.SlicerFile.LayerCount-1);
set => nmLayerRangeEnd.Value = value;
}
private readonly OperationPattern _operation;
public OperationPattern OperationPattern
{
get
{
byte i = 0;
foreach (var radioButton in new[]
{
rbAnchorTopLeft, rbAnchorTopCenter, rbAnchorTopRight,
rbAnchorMiddleLeft, rbAnchorMiddleCenter, rbAnchorMiddleRight,
rbAnchorBottomLeft, rbAnchorBottomCenter, rbAnchorBottomRight,
rbAnchorNone
})
{
if (radioButton.Checked)
{
_operation.Anchor = (Anchor)i;
break;
}
i++;
}
_operation.MarginCol = (ushort)nmMarginCol.Value;
_operation.MarginRow = (ushort)nmMarginRow.Value;
_operation.Cols = (ushort) nmCols.Value;
_operation.Rows = (ushort) nmRows.Value;
return _operation;
}
}
#endregion
#region Constructors
public FrmToolPattern(Rectangle srcRoi, uint imageWidth, uint imageHeight)
{
InitializeComponent();
_operation = new OperationPattern(srcRoi, imageWidth, imageHeight);
DialogResult = DialogResult.Cancel;
nmLayerRangeEnd.Value = Program.SlicerFile.LayerCount-1;
EventClick(btnResetDefaults, null);
//EventValueChanged(this, null);
nmCols.Maximum = _operation.MaxCols;
nmRows.Maximum = _operation.MaxRows;
}
#endregion
#region Overrides
protected override void OnKeyUp(KeyEventArgs e)
{
base.OnKeyUp(e);
if (e.KeyCode == Keys.Enter)
{
btnPattern.PerformClick();
e.Handled = true;
return;
}
if ((ModifierKeys & Keys.Shift) == Keys.Shift && (ModifierKeys & Keys.Control) == Keys.Control)
{
if (e.KeyCode == Keys.A)
{
btnLayerRangeAllLayers.PerformClick();
e.Handled = true;
return;
}
if (e.KeyCode == Keys.C)
{
btnLayerRangeCurrentLayer.PerformClick();
e.Handled = true;
return;
}
if (e.KeyCode == Keys.B)
{
btnLayerRangeBottomLayers.PerformClick();
e.Handled = true;
return;
}
if (e.KeyCode == Keys.N)
{
btnLayerRangeNormalLayers.PerformClick();
e.Handled = true;
return;
}
}
}
#endregion
#region Events
private void EventClick(object sender, EventArgs e)
{
if (ReferenceEquals(sender, btnLayerRangeAllLayers))
{
nmLayerRangeStart.Value = 0;
nmLayerRangeEnd.Value = Program.SlicerFile.LayerCount-1;
return;
}
if (ReferenceEquals(sender, btnLayerRangeCurrentLayer))
{
nmLayerRangeStart.Value = Program.FrmMain.ActualLayer;
nmLayerRangeEnd.Value = Program.FrmMain.ActualLayer;
return;
}
if (ReferenceEquals(sender, btnLayerRangeBottomLayers))
{
nmLayerRangeStart.Value = 0;
nmLayerRangeEnd.Value = Program.SlicerFile.InitialLayerCount-1;
return;
}
if (ReferenceEquals(sender, btnLayerRangeNormalLayers))
{
nmLayerRangeStart.Value = Program.SlicerFile.InitialLayerCount - 1;
nmLayerRangeEnd.Value = Program.SlicerFile.LayerCount - 1;
return;
}
if (ReferenceEquals(sender, btnAutoMarginCol))
{
nmMarginCol.Value = _operation.CalculateMarginCol((ushort) nmCols.Value);
return;
}
if (ReferenceEquals(sender, btnAutoMarginRow))
{
nmMarginRow.Value = _operation.CalculateMarginRow((ushort)nmRows.Value);
return;
}
if (ReferenceEquals(sender, btnResetDefaults))
{
nmMarginCol.Value = _operation.MaxMarginCol;
nmMarginRow.Value = _operation.MaxMarginRow;
nmCols.Value = _operation.MaxCols;
nmRows.Value = _operation.MaxRows;
_operation.Fill();
return;
}
if (ReferenceEquals(sender, btnPattern))
{
if (!btnPattern.Enabled) return;
if (LayerRangeStart > LayerRangeEnd)
{
MessageBox.Show("Layer range start can't be higher than layer end.\nPlease fix and try again.", Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
nmLayerRangeStart.Select();
return;
}
if (nmCols.Value == 1 && nmRows.Value == 1)
{
MessageBox.Show("Either columns or rows must be greater than 1 to be able to run this tool", Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
nmLayerRangeStart.Select();
return;
}
if (!ValidateBounds())
{
MessageBox.Show("Your parameters will put the object out of build plate, please adjust the margins", Text, MessageBoxButtons.OK,
MessageBoxIcon.Error);
return;
}
if (MessageBox.Show($"Are you sure you want to Pattern?", Text, MessageBoxButtons.YesNo,
MessageBoxIcon.Question) == DialogResult.Yes)
{
DialogResult = DialogResult.OK;
Close();
}
return;
}
if (ReferenceEquals(sender, btnCancel))
{
DialogResult = DialogResult.Cancel;
return;
}
}
private void EventValueChanged(object sender, EventArgs e)
{
var insideBounds = btnPattern.Enabled = ValidateBounds();
lbInsideBounds.Text = "Inside Bounds: " + (insideBounds ? "Yes" : "No");
lbVolumeWidth.Text = $"Volume/Pattern Width: {_operation.SrcRoi.Width} / {_operation.GetPatternVolume.Width} / {_operation.ImageWidth}";
lbVolumeHeight.Text = $"Volume/Pattern Height: {_operation.SrcRoi.Height} / {_operation.GetPatternVolume.Height} / {_operation.ImageHeight}";
lbCols.Text = $"Columns: {nmCols.Value} / {_operation.MaxCols}";
lbRows.Text = $"Rows: {nmRows.Value} / {_operation.MaxRows}";
}
#endregion
#region Methods
public bool ValidateBounds()
{
var volume = OperationPattern.GetPatternVolume;
if (volume.Width > _operation.ImageWidth) return false;
if (volume.Height > _operation.ImageHeight) return false;
return true;
}
#endregion
}
}