feat(ui): defaults.json-backed new nests; retire .nstdot templates
New nests now load plate defaults from %APPDATA%/OpenNest/defaults.json instead of a .nstdot nest template: - Tools > Nest Defaults... edits the file directly (new dialog). - Tools > Save Current Plate as Defaults captures the active plate with no dialog (visible when a nest is open). - New_Click no longer unzips a template; a corrupt defaults file warns once per session and falls back to built-in values. - First run converts an existing NestTemplatePath .nstdot to defaults.json and clears the legacy setting (kept readable on a failed conversion); the setting itself stays, marked legacy. - Save As no longer offers the .nstdot filter; SaveTemplate removed. - BomImportForm and OptionsForm template plumbing removed in favor of the shared NestDefaults store.
This commit is contained in:
@@ -4,6 +4,19 @@ using OpenNest.Geometry;
|
||||
|
||||
namespace OpenNest.Data;
|
||||
|
||||
/// <summary>Outcome of <see cref="NestDefaults.Load(string, out NestDefaultsStatus)"/>.</summary>
|
||||
public enum NestDefaultsStatus
|
||||
{
|
||||
/// <summary>Defaults were read from the file (invalid fields still fall back individually).</summary>
|
||||
Ok,
|
||||
|
||||
/// <summary>No file exists at the path; built-in fallback values were used.</summary>
|
||||
Missing,
|
||||
|
||||
/// <summary>The file exists but could not be read or parsed; fallback values were used.</summary>
|
||||
Invalid,
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Plate/nest defaults persisted to a single JSON file
|
||||
/// (by default %APPDATA%\OpenNest\defaults.json), replacing the
|
||||
@@ -56,18 +69,18 @@ public sealed class NestDefaults
|
||||
public static NestDefaults Load(string path) => Load(path, out _);
|
||||
|
||||
/// <summary>
|
||||
/// Loads defaults; <paramref name="fileExisted"/> is true when the file
|
||||
/// was present (even if it failed to parse), so callers can surface a
|
||||
/// warning when a present file did not load cleanly.
|
||||
/// Loads defaults and reports whether the file was missing, loaded, or
|
||||
/// present but unreadable/invalid, so callers can warn about a corrupt
|
||||
/// file while still returning usable values.
|
||||
/// </summary>
|
||||
public static NestDefaults Load(string path, out bool fileExisted)
|
||||
public static NestDefaults Load(string path, out NestDefaultsStatus status)
|
||||
{
|
||||
fileExisted = false;
|
||||
var defaults = Fallback;
|
||||
if (string.IsNullOrWhiteSpace(path) || !File.Exists(path))
|
||||
{
|
||||
status = NestDefaultsStatus.Missing;
|
||||
return defaults;
|
||||
|
||||
fileExisted = true;
|
||||
}
|
||||
|
||||
NestDefaultsDto? dto;
|
||||
try
|
||||
@@ -77,15 +90,22 @@ public sealed class NestDefaults
|
||||
}
|
||||
catch (JsonException)
|
||||
{
|
||||
status = NestDefaultsStatus.Invalid;
|
||||
return defaults;
|
||||
}
|
||||
catch (IOException)
|
||||
{
|
||||
status = NestDefaultsStatus.Invalid;
|
||||
return defaults;
|
||||
}
|
||||
|
||||
if (dto is null)
|
||||
{
|
||||
status = NestDefaultsStatus.Invalid;
|
||||
return defaults;
|
||||
}
|
||||
|
||||
status = NestDefaultsStatus.Ok;
|
||||
|
||||
if (
|
||||
dto.Units is not null
|
||||
@@ -138,6 +158,23 @@ public sealed class NestDefaults
|
||||
};
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Captures defaults from an existing plate (a copy of its size,
|
||||
/// quadrant, and spacing), e.g. the active plate in the desktop app.
|
||||
/// </summary>
|
||||
public static NestDefaults FromPlate(Units units, Plate plate)
|
||||
{
|
||||
ArgumentNullException.ThrowIfNull(plate);
|
||||
return new NestDefaults
|
||||
{
|
||||
Units = units,
|
||||
Size = plate.Size,
|
||||
Quadrant = plate.Quadrant,
|
||||
PartSpacing = plate.PartSpacing,
|
||||
EdgeSpacing = plate.EdgeSpacing,
|
||||
};
|
||||
}
|
||||
|
||||
public void ApplyTo(Nest nest)
|
||||
{
|
||||
ArgumentNullException.ThrowIfNull(nest);
|
||||
|
||||
@@ -34,9 +34,9 @@ public class NestDefaultsTests : IDisposable
|
||||
};
|
||||
|
||||
original.Save(_path);
|
||||
var loaded = NestDefaults.Load(_path, out var loadedFromDisk);
|
||||
var loaded = NestDefaults.Load(_path, out var status);
|
||||
|
||||
Assert.True(loadedFromDisk);
|
||||
Assert.Equal(NestDefaultsStatus.Ok, status);
|
||||
Assert.Equal(Units.Millimeters, loaded.Units);
|
||||
Assert.Equal(original.Size, loaded.Size);
|
||||
Assert.Equal(3, loaded.Quadrant);
|
||||
@@ -58,20 +58,20 @@ public class NestDefaultsTests : IDisposable
|
||||
[Fact]
|
||||
public void Load_MissingFile_ReturnsFallback()
|
||||
{
|
||||
var loaded = NestDefaults.Load(_path, out var loadedFromDisk);
|
||||
var loaded = NestDefaults.Load(_path, out var status);
|
||||
|
||||
Assert.False(loadedFromDisk);
|
||||
Assert.Equal(NestDefaultsStatus.Missing, status);
|
||||
AssertFallback(loaded);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Load_CorruptJson_ReturnsFallbackButReportsFile()
|
||||
public void Load_CorruptJson_ReturnsFallbackButReportsInvalid()
|
||||
{
|
||||
File.WriteAllText(_path, "{ this is not json");
|
||||
|
||||
var loaded = NestDefaults.Load(_path, out var loadedFromDisk);
|
||||
var loaded = NestDefaults.Load(_path, out var status);
|
||||
|
||||
Assert.True(loadedFromDisk);
|
||||
Assert.Equal(NestDefaultsStatus.Invalid, status);
|
||||
AssertFallback(loaded);
|
||||
}
|
||||
|
||||
@@ -80,9 +80,9 @@ public class NestDefaultsTests : IDisposable
|
||||
{
|
||||
File.WriteAllText(_path, """{ "units": "millimeters", "partSpacing": 4 }""");
|
||||
|
||||
var loaded = NestDefaults.Load(_path, out var loadedFromDisk);
|
||||
var loaded = NestDefaults.Load(_path, out var status);
|
||||
|
||||
Assert.True(loadedFromDisk);
|
||||
Assert.Equal(NestDefaultsStatus.Ok, status);
|
||||
Assert.Equal(Units.Millimeters, loaded.Units);
|
||||
Assert.Equal(4, loaded.PartSpacing);
|
||||
// Untouched fields keep fallback values.
|
||||
@@ -107,9 +107,10 @@ public class NestDefaultsTests : IDisposable
|
||||
"""
|
||||
);
|
||||
|
||||
var loaded = NestDefaults.Load(_path, out var loadedFromDisk);
|
||||
var loaded = NestDefaults.Load(_path, out var status);
|
||||
|
||||
Assert.True(loadedFromDisk);
|
||||
// The file parses; only the invalid values fall back, so no warning.
|
||||
Assert.Equal(NestDefaultsStatus.Ok, status);
|
||||
Assert.Equal(Units.Inches, loaded.Units);
|
||||
Assert.Equal(new Size(100, 100), loaded.Size);
|
||||
Assert.Equal(1, loaded.Quadrant);
|
||||
@@ -144,9 +145,9 @@ public class NestDefaultsTests : IDisposable
|
||||
"""
|
||||
);
|
||||
|
||||
var loaded = NestDefaults.Load(_path, out var loadedFromDisk);
|
||||
var loaded = NestDefaults.Load(_path, out var status);
|
||||
|
||||
Assert.True(loadedFromDisk);
|
||||
Assert.Equal(NestDefaultsStatus.Ok, status);
|
||||
Assert.Equal(2, loaded.PartSpacing);
|
||||
}
|
||||
|
||||
|
||||
@@ -5,6 +5,7 @@ using System.Drawing;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Windows.Forms;
|
||||
using OpenNest.Data;
|
||||
using OpenNest.Geometry;
|
||||
using OpenNest.IO;
|
||||
using OpenNest.IO.Bom;
|
||||
@@ -16,7 +17,7 @@ namespace OpenNest.Forms
|
||||
private List<BomPartRow> _parts;
|
||||
private Dictionary<string, GroupSettings> _groupSettings;
|
||||
private bool _suppressRegroup;
|
||||
private Nest.PlateSettings _templateDefaults;
|
||||
private NestDefaults _defaults;
|
||||
|
||||
public Form MdiParentForm { get; set; }
|
||||
|
||||
@@ -25,37 +26,14 @@ namespace OpenNest.Forms
|
||||
InitializeComponent();
|
||||
_parts = new List<BomPartRow>();
|
||||
_groupSettings = new Dictionary<string, GroupSettings>();
|
||||
_templateDefaults = LoadTemplateDefaults();
|
||||
ApplyTemplateDefaults();
|
||||
_defaults = NestDefaults.Load(NestDefaults.DefaultPath);
|
||||
ApplyDefaults();
|
||||
}
|
||||
|
||||
private Nest.PlateSettings LoadTemplateDefaults()
|
||||
private void ApplyDefaults()
|
||||
{
|
||||
var templatePath = Properties.Settings.Default.NestTemplatePath;
|
||||
if (File.Exists(templatePath))
|
||||
{
|
||||
try
|
||||
{
|
||||
var nest = new NestReader(templatePath).Read();
|
||||
return nest.PlateDefaults;
|
||||
}
|
||||
catch { }
|
||||
}
|
||||
|
||||
// Fallback defaults matching CreateDefaultNest
|
||||
return new Nest.PlateSettings
|
||||
{
|
||||
Size = new Geometry.Size(100, 100),
|
||||
Quadrant = 1,
|
||||
PartSpacing = 1,
|
||||
EdgeSpacing = new Spacing(1, 1, 1, 1),
|
||||
};
|
||||
}
|
||||
|
||||
private void ApplyTemplateDefaults()
|
||||
{
|
||||
txtPlateWidth.Text = _templateDefaults.Size.Width.ToString("0.####");
|
||||
txtPlateLength.Text = _templateDefaults.Size.Length.ToString("0.####");
|
||||
txtPlateWidth.Text = _defaults.Size.Width.ToString("0.####");
|
||||
txtPlateLength.Text = _defaults.Size.Length.ToString("0.####");
|
||||
}
|
||||
|
||||
#region File Browsing
|
||||
@@ -147,9 +125,9 @@ namespace OpenNest.Forms
|
||||
var matchedPaths = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
|
||||
|
||||
foreach (var group in analysis.Groups)
|
||||
foreach (var part in group.Parts)
|
||||
if (part.DxfPath != null)
|
||||
matchedPaths[part.Item.FileName ?? ""] = part.DxfPath;
|
||||
foreach (var part in group.Parts)
|
||||
if (part.DxfPath != null)
|
||||
matchedPaths[part.Item.FileName ?? ""] = part.DxfPath;
|
||||
|
||||
_parts = new List<BomPartRow>();
|
||||
|
||||
@@ -290,10 +268,10 @@ namespace OpenNest.Forms
|
||||
|
||||
var defaultWidth = double.TryParse(txtPlateWidth.Text, out var w)
|
||||
? w
|
||||
: _templateDefaults.Size.Width;
|
||||
: _defaults.Size.Width;
|
||||
var defaultLength = double.TryParse(txtPlateLength.Text, out var l)
|
||||
? l
|
||||
: _templateDefaults.Size.Length;
|
||||
: _defaults.Size.Length;
|
||||
|
||||
var groups = _parts
|
||||
.Where(p =>
|
||||
@@ -336,11 +314,11 @@ namespace OpenNest.Forms
|
||||
group.Sum(p => p.Qty ?? 0),
|
||||
existing ? gs.PlateWidth : defaultWidth,
|
||||
existing ? gs.PlateLength : defaultLength,
|
||||
existing ? gs.PartSpacing : _templateDefaults.PartSpacing,
|
||||
existing ? gs.EdgeLeft : _templateDefaults.EdgeSpacing.Left,
|
||||
existing ? gs.EdgeBottom : _templateDefaults.EdgeSpacing.Bottom,
|
||||
existing ? gs.EdgeRight : _templateDefaults.EdgeSpacing.Right,
|
||||
existing ? gs.EdgeTop : _templateDefaults.EdgeSpacing.Top
|
||||
existing ? gs.PartSpacing : _defaults.PartSpacing,
|
||||
existing ? gs.EdgeLeft : _defaults.EdgeSpacing.Left,
|
||||
existing ? gs.EdgeBottom : _defaults.EdgeSpacing.Bottom,
|
||||
existing ? gs.EdgeRight : _defaults.EdgeSpacing.Right,
|
||||
existing ? gs.EdgeTop : _defaults.EdgeSpacing.Top
|
||||
);
|
||||
}
|
||||
|
||||
@@ -374,23 +352,23 @@ namespace OpenNest.Forms
|
||||
{
|
||||
PlateWidth = row["Plate Width"] is double pw
|
||||
? pw
|
||||
: _templateDefaults.Size.Width,
|
||||
: _defaults.Size.Width,
|
||||
PlateLength = row["Plate Length"] is double pl
|
||||
? pl
|
||||
: _templateDefaults.Size.Length,
|
||||
: _defaults.Size.Length,
|
||||
PartSpacing = row["Part Spacing"] is double ps
|
||||
? ps
|
||||
: _templateDefaults.PartSpacing,
|
||||
: _defaults.PartSpacing,
|
||||
EdgeLeft = row["Edge Left"] is double el
|
||||
? el
|
||||
: _templateDefaults.EdgeSpacing.Left,
|
||||
: _defaults.EdgeSpacing.Left,
|
||||
EdgeBottom = row["Edge Bottom"] is double eb
|
||||
? eb
|
||||
: _templateDefaults.EdgeSpacing.Bottom,
|
||||
: _defaults.EdgeSpacing.Bottom,
|
||||
EdgeRight = row["Edge Right"] is double er
|
||||
? er
|
||||
: _templateDefaults.EdgeSpacing.Right,
|
||||
EdgeTop = row["Edge Top"] is double et ? et : _templateDefaults.EdgeSpacing.Top,
|
||||
: _defaults.EdgeSpacing.Right,
|
||||
EdgeTop = row["Edge Top"] is double et ? et : _defaults.EdgeSpacing.Top,
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -434,10 +412,10 @@ namespace OpenNest.Forms
|
||||
|
||||
var defaultWidth = double.TryParse(txtPlateWidth.Text, out var dw)
|
||||
? dw
|
||||
: _templateDefaults.Size.Width;
|
||||
: _defaults.Size.Width;
|
||||
var defaultLength = double.TryParse(txtPlateLength.Text, out var dl)
|
||||
? dl
|
||||
: _templateDefaults.Size.Length;
|
||||
: _defaults.Size.Length;
|
||||
|
||||
var groups = _parts
|
||||
.Where(p =>
|
||||
@@ -477,11 +455,11 @@ namespace OpenNest.Forms
|
||||
var hasSettings = _groupSettings.TryGetValue(key, out var gs);
|
||||
var plateWidth = hasSettings ? gs.PlateWidth : defaultWidth;
|
||||
var plateLength = hasSettings ? gs.PlateLength : defaultLength;
|
||||
var partSpacing = hasSettings ? gs.PartSpacing : _templateDefaults.PartSpacing;
|
||||
var edgeLeft = hasSettings ? gs.EdgeLeft : _templateDefaults.EdgeSpacing.Left;
|
||||
var edgeBottom = hasSettings ? gs.EdgeBottom : _templateDefaults.EdgeSpacing.Bottom;
|
||||
var edgeRight = hasSettings ? gs.EdgeRight : _templateDefaults.EdgeSpacing.Right;
|
||||
var edgeTop = hasSettings ? gs.EdgeTop : _templateDefaults.EdgeSpacing.Top;
|
||||
var partSpacing = hasSettings ? gs.PartSpacing : _defaults.PartSpacing;
|
||||
var edgeLeft = hasSettings ? gs.EdgeLeft : _defaults.EdgeSpacing.Left;
|
||||
var edgeBottom = hasSettings ? gs.EdgeBottom : _defaults.EdgeSpacing.Bottom;
|
||||
var edgeRight = hasSettings ? gs.EdgeRight : _defaults.EdgeSpacing.Right;
|
||||
var edgeTop = hasSettings ? gs.EdgeTop : _defaults.EdgeSpacing.Top;
|
||||
|
||||
var nestName = $"{jobName} - {thickness:0.###} {material}";
|
||||
var nest = new Nest(nestName);
|
||||
@@ -490,7 +468,7 @@ namespace OpenNest.Forms
|
||||
nest.PlateDefaults.Size = new Geometry.Size(plateWidth, plateLength);
|
||||
nest.Thickness = thickness;
|
||||
nest.Material = new Material(material);
|
||||
nest.PlateDefaults.Quadrant = _templateDefaults.Quadrant;
|
||||
nest.PlateDefaults.Quadrant = _defaults.Quadrant;
|
||||
nest.PlateDefaults.PartSpacing = partSpacing;
|
||||
nest.PlateDefaults.EdgeSpacing = new Spacing(
|
||||
edgeLeft,
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
using System;
|
||||
using System;
|
||||
using System.ComponentModel;
|
||||
using System.Diagnostics;
|
||||
using System.Drawing;
|
||||
@@ -301,16 +301,11 @@ namespace OpenNest.Forms
|
||||
public void SaveAs()
|
||||
{
|
||||
var dlg = new SaveFileDialog();
|
||||
dlg.Filter = $"{NestFormat.FileFilter}|Template File|*.nstdot";
|
||||
dlg.Filter = NestFormat.FileFilter;
|
||||
dlg.FileName = Nest.Name;
|
||||
|
||||
if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK)
|
||||
{
|
||||
if (dlg.FilterIndex == 2)
|
||||
SaveTemplate(dlg.FileName);
|
||||
else
|
||||
SaveAs(dlg.FileName);
|
||||
}
|
||||
SaveAs(dlg.FileName);
|
||||
}
|
||||
|
||||
public void SaveAs(string path)
|
||||
@@ -319,17 +314,6 @@ namespace OpenNest.Forms
|
||||
Text = Document.Name;
|
||||
}
|
||||
|
||||
public void SaveTemplate(string path)
|
||||
{
|
||||
var nst = new Nest();
|
||||
nst.Name = Path.GetFileNameWithoutExtension(path);
|
||||
nst.PlateDefaults = Nest.PlateDefaults;
|
||||
nst.Units = Nest.Units;
|
||||
|
||||
var writer = new NestWriter(nst);
|
||||
writer.Write(path);
|
||||
}
|
||||
|
||||
public void Import()
|
||||
{
|
||||
var dlg = new OpenFileDialog();
|
||||
@@ -943,9 +927,9 @@ namespace OpenNest.Forms
|
||||
|
||||
// Refresh all parts to use the updated programs
|
||||
foreach (var plate in Nest.Plates)
|
||||
foreach (var part in plate.Parts)
|
||||
if (!part.BaseDrawing.IsCutOff)
|
||||
part.Update();
|
||||
foreach (var part in plate.Parts)
|
||||
if (!part.BaseDrawing.IsCutOff)
|
||||
part.Update();
|
||||
|
||||
UpdateDrawingList();
|
||||
PlateView.Invalidate();
|
||||
|
||||
Generated
+19
-1
@@ -82,6 +82,8 @@
|
||||
mnuSetRotationIncrement = new System.Windows.Forms.ToolStripMenuItem();
|
||||
toolStripMenuItem15 = new System.Windows.Forms.ToolStripSeparator();
|
||||
mnuToolsMachineConfig = new System.Windows.Forms.ToolStripMenuItem();
|
||||
mnuToolsNestDefaults = new System.Windows.Forms.ToolStripMenuItem();
|
||||
mnuToolsSaveCurrentAsDefaults = new System.Windows.Forms.ToolStripMenuItem();
|
||||
mnuToolsOptions = new System.Windows.Forms.ToolStripMenuItem();
|
||||
mnuNest = new System.Windows.Forms.ToolStripMenuItem();
|
||||
mnuNestEdit = new System.Windows.Forms.ToolStripMenuItem();
|
||||
@@ -420,7 +422,7 @@
|
||||
//
|
||||
// mnuTools
|
||||
//
|
||||
mnuTools.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { mnuToolsMeasureArea, mnuToolsBestFitViewer, mnuToolsPatternTile, mnuToolsExpandSpacing, mnuToolsAlign, toolStripMenuItem14, mnuSetOffsetIncrement, mnuSetRotationIncrement, toolStripMenuItem15, mnuToolsMachineConfig, mnuToolsOptions });
|
||||
mnuTools.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { mnuToolsMeasureArea, mnuToolsBestFitViewer, mnuToolsPatternTile, mnuToolsExpandSpacing, mnuToolsAlign, toolStripMenuItem14, mnuSetOffsetIncrement, mnuSetRotationIncrement, toolStripMenuItem15, mnuToolsMachineConfig, mnuToolsNestDefaults, mnuToolsSaveCurrentAsDefaults, mnuToolsOptions });
|
||||
mnuTools.Name = "mnuTools";
|
||||
mnuTools.Size = new System.Drawing.Size(47, 20);
|
||||
mnuTools.Text = "&Tools";
|
||||
@@ -559,6 +561,20 @@
|
||||
mnuToolsMachineConfig.Text = "Machine Configuration...";
|
||||
mnuToolsMachineConfig.Click += MachineConfig_Click;
|
||||
//
|
||||
// mnuToolsNestDefaults
|
||||
//
|
||||
mnuToolsNestDefaults.Name = "mnuToolsNestDefaults";
|
||||
mnuToolsNestDefaults.Size = new System.Drawing.Size(214, 22);
|
||||
mnuToolsNestDefaults.Text = "Nest Defaults...";
|
||||
mnuToolsNestDefaults.Click += NestDefaults_Click;
|
||||
//
|
||||
// mnuToolsSaveCurrentAsDefaults
|
||||
//
|
||||
mnuToolsSaveCurrentAsDefaults.Name = "mnuToolsSaveCurrentAsDefaults";
|
||||
mnuToolsSaveCurrentAsDefaults.Size = new System.Drawing.Size(214, 22);
|
||||
mnuToolsSaveCurrentAsDefaults.Text = "Save Current Plate as Defaults";
|
||||
mnuToolsSaveCurrentAsDefaults.Click += SaveCurrentAsDefaults_Click;
|
||||
//
|
||||
// mnuToolsOptions
|
||||
//
|
||||
mnuToolsOptions.Name = "mnuToolsOptions";
|
||||
@@ -1225,6 +1241,8 @@
|
||||
private System.Windows.Forms.ToolStripSeparator toolStripMenuItem5;
|
||||
private System.Windows.Forms.ToolStripMenuItem mnuTools;
|
||||
private System.Windows.Forms.ToolStripMenuItem mnuToolsMachineConfig;
|
||||
private System.Windows.Forms.ToolStripMenuItem mnuToolsNestDefaults;
|
||||
private System.Windows.Forms.ToolStripMenuItem mnuToolsSaveCurrentAsDefaults;
|
||||
private System.Windows.Forms.ToolStripMenuItem mnuToolsOptions;
|
||||
private System.Windows.Forms.ToolStripMenuItem mnuNest;
|
||||
private System.Windows.Forms.ToolStripMenuItem mnuNestEdit;
|
||||
|
||||
+92
-29
@@ -90,14 +90,38 @@ namespace OpenNest.Forms
|
||||
private Nest CreateDefaultNest()
|
||||
{
|
||||
var nest = new Nest();
|
||||
nest.Units = Properties.Settings.Default.DefaultUnit;
|
||||
nest.PlateDefaults.EdgeSpacing = new Spacing(1, 1, 1, 1);
|
||||
nest.PlateDefaults.PartSpacing = 1;
|
||||
nest.PlateDefaults.Size = new OpenNest.Geometry.Size(100, 100);
|
||||
nest.PlateDefaults.Quadrant = 1;
|
||||
LoadNestDefaults().ApplyTo(nest);
|
||||
return nest;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Loads the persisted nest defaults. When no usable file exists,
|
||||
/// units come from the legacy DefaultUnit setting; a corrupt file
|
||||
/// warns once per session.
|
||||
/// </summary>
|
||||
private NestDefaults LoadNestDefaults()
|
||||
{
|
||||
var defaults = NestDefaults.Load(NestDefaults.DefaultPath, out var status);
|
||||
if (status == NestDefaultsStatus.Ok)
|
||||
return defaults;
|
||||
|
||||
defaults.Units = Properties.Settings.Default.DefaultUnit;
|
||||
|
||||
if (status == NestDefaultsStatus.Invalid && !defaultsWarned)
|
||||
{
|
||||
defaultsWarned = true;
|
||||
MessageBox.Show(
|
||||
$"The nest defaults file could not be read:\n{NestDefaults.DefaultPath}\n\nBuilt-in defaults will be used. Re-save your defaults from Tools > Nest Defaults.",
|
||||
"Nest Defaults",
|
||||
MessageBoxButtons.OK,
|
||||
MessageBoxIcon.Warning
|
||||
);
|
||||
}
|
||||
return defaults;
|
||||
}
|
||||
|
||||
private bool defaultsWarned;
|
||||
|
||||
private string GetNestName(DateTime date, int id)
|
||||
{
|
||||
var year = (date.Year % 100).ToString("D2");
|
||||
@@ -185,6 +209,7 @@ namespace OpenNest.Forms
|
||||
mnuToolsAlign.Visible = hasValue;
|
||||
mnuToolsMeasureArea.Visible = hasValue;
|
||||
mnuToolsExpandSpacing.Visible = hasValue;
|
||||
mnuToolsSaveCurrentAsDefaults.Visible = hasValue;
|
||||
|
||||
toolStripMenuItem14.Visible = hasValue;
|
||||
mnuSetOffsetIncrement.Visible = hasValue;
|
||||
@@ -454,10 +479,52 @@ namespace OpenNest.Forms
|
||||
{
|
||||
base.OnLoad(e);
|
||||
|
||||
MigrateNestTemplate();
|
||||
|
||||
if (Settings.Default.CreateNewNestOnOpen)
|
||||
New_Click(this, new EventArgs());
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// One-time upgrade: converts a legacy .nstdot nest template
|
||||
/// (NestTemplatePath setting) into defaults.json, then clears the
|
||||
/// setting so the template mechanism is never consulted again.
|
||||
/// </summary>
|
||||
private void MigrateNestTemplate()
|
||||
{
|
||||
var templatePath = Settings.Default.NestTemplatePath;
|
||||
if (string.IsNullOrWhiteSpace(templatePath))
|
||||
return;
|
||||
|
||||
// A failed conversion keeps the setting populated so the user
|
||||
// can still find their template file.
|
||||
var converted = true;
|
||||
if (File.Exists(templatePath) && !File.Exists(NestDefaults.DefaultPath))
|
||||
{
|
||||
try
|
||||
{
|
||||
var nest = new NestReader(templatePath).Read();
|
||||
NestDefaults.FromNest(nest).Save(NestDefaults.DefaultPath);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
converted = false;
|
||||
MessageBox.Show(
|
||||
$"The nest template could not be converted to the new defaults file:\n{templatePath}\n\n{ex.Message}\n\nIt will no longer be loaded automatically. Set defaults under Tools > Nest Defaults.",
|
||||
"Nest Template",
|
||||
MessageBoxButtons.OK,
|
||||
MessageBoxIcon.Warning
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
if (!converted)
|
||||
return;
|
||||
|
||||
Settings.Default.NestTemplatePath = "";
|
||||
Settings.Default.Save();
|
||||
}
|
||||
|
||||
protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
|
||||
{
|
||||
base.OnClosing(e);
|
||||
@@ -473,30 +540,7 @@ namespace OpenNest.Forms
|
||||
var windowState =
|
||||
ActiveMdiChild != null ? ActiveMdiChild.WindowState : FormWindowState.Maximized;
|
||||
|
||||
Nest nest;
|
||||
|
||||
if (File.Exists(Properties.Settings.Default.NestTemplatePath))
|
||||
{
|
||||
try
|
||||
{
|
||||
var reader = new NestReader(Properties.Settings.Default.NestTemplatePath);
|
||||
nest = reader.Read();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
MessageBox.Show(
|
||||
$"Failed to load nest template:\n{ex.Message}\n\nA default nest will be created instead.",
|
||||
"Template Error",
|
||||
MessageBoxButtons.OK,
|
||||
MessageBoxIcon.Warning
|
||||
);
|
||||
nest = CreateDefaultNest();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
nest = CreateDefaultNest();
|
||||
}
|
||||
var nest = CreateDefaultNest();
|
||||
|
||||
nest.DateCreated = DateTime.Now;
|
||||
nest.DateLastModified = DateTime.Now;
|
||||
@@ -834,6 +878,25 @@ namespace OpenNest.Forms
|
||||
form.ShowDialog();
|
||||
}
|
||||
|
||||
private void NestDefaults_Click(object sender, EventArgs e)
|
||||
{
|
||||
using (var form = new NestDefaultsForm(NestDefaults.Load(NestDefaults.DefaultPath)))
|
||||
{
|
||||
if (form.ShowDialog(this) == DialogResult.OK)
|
||||
form.GetDefaults().Save(NestDefaults.DefaultPath);
|
||||
}
|
||||
}
|
||||
|
||||
private void SaveCurrentAsDefaults_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (activeForm == null)
|
||||
return;
|
||||
|
||||
NestDefaults
|
||||
.FromPlate(activeForm.Nest.Units, activeForm.PlateView.Plate)
|
||||
.Save(NestDefaults.DefaultPath);
|
||||
}
|
||||
|
||||
private void MachineConfig_Click(object sender, EventArgs e)
|
||||
{
|
||||
var appDataPath = Path.Combine(
|
||||
|
||||
+364
@@ -0,0 +1,364 @@
|
||||
namespace OpenNest.Forms
|
||||
{
|
||||
partial class NestDefaultsForm
|
||||
{
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && (components != null))
|
||||
{
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Windows Form Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
|
||||
this.unitsLabel = new System.Windows.Forms.Label();
|
||||
this.unitsCombo = new System.Windows.Forms.ComboBox();
|
||||
this.widthLabel = new System.Windows.Forms.Label();
|
||||
this.widthBox = new OpenNest.Controls.NumericUpDown();
|
||||
this.lengthLabel = new System.Windows.Forms.Label();
|
||||
this.lengthBox = new OpenNest.Controls.NumericUpDown();
|
||||
this.partSpacingLabel = new System.Windows.Forms.Label();
|
||||
this.partSpacingBox = new OpenNest.Controls.NumericUpDown();
|
||||
this.edgeLeftLabel = new System.Windows.Forms.Label();
|
||||
this.edgeLeftBox = new OpenNest.Controls.NumericUpDown();
|
||||
this.edgeBottomLabel = new System.Windows.Forms.Label();
|
||||
this.edgeBottomBox = new OpenNest.Controls.NumericUpDown();
|
||||
this.edgeRightLabel = new System.Windows.Forms.Label();
|
||||
this.edgeRightBox = new OpenNest.Controls.NumericUpDown();
|
||||
this.edgeTopLabel = new System.Windows.Forms.Label();
|
||||
this.edgeTopBox = new OpenNest.Controls.NumericUpDown();
|
||||
this.quadrantLabel = new System.Windows.Forms.Label();
|
||||
this.quadrantSelect1 = new OpenNest.Controls.QuadrantSelect();
|
||||
this.saveButton = new System.Windows.Forms.Button();
|
||||
this.cancelButton = new System.Windows.Forms.Button();
|
||||
((System.ComponentModel.ISupportInitialize)(this.widthBox)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.lengthBox)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.partSpacingBox)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.edgeLeftBox)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.edgeBottomBox)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.edgeRightBox)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.edgeTopBox)).BeginInit();
|
||||
this.tableLayoutPanel1.SuspendLayout();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// tableLayoutPanel1
|
||||
//
|
||||
this.tableLayoutPanel1.ColumnCount = 2;
|
||||
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
|
||||
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
|
||||
this.tableLayoutPanel1.Controls.Add(this.unitsLabel, 0, 0);
|
||||
this.tableLayoutPanel1.Controls.Add(this.unitsCombo, 1, 0);
|
||||
this.tableLayoutPanel1.Controls.Add(this.widthLabel, 0, 1);
|
||||
this.tableLayoutPanel1.Controls.Add(this.widthBox, 1, 1);
|
||||
this.tableLayoutPanel1.Controls.Add(this.lengthLabel, 0, 2);
|
||||
this.tableLayoutPanel1.Controls.Add(this.lengthBox, 1, 2);
|
||||
this.tableLayoutPanel1.Controls.Add(this.partSpacingLabel, 0, 3);
|
||||
this.tableLayoutPanel1.Controls.Add(this.partSpacingBox, 1, 3);
|
||||
this.tableLayoutPanel1.Controls.Add(this.edgeLeftLabel, 0, 4);
|
||||
this.tableLayoutPanel1.Controls.Add(this.edgeLeftBox, 1, 4);
|
||||
this.tableLayoutPanel1.Controls.Add(this.edgeBottomLabel, 0, 5);
|
||||
this.tableLayoutPanel1.Controls.Add(this.edgeBottomBox, 1, 5);
|
||||
this.tableLayoutPanel1.Controls.Add(this.edgeRightLabel, 0, 6);
|
||||
this.tableLayoutPanel1.Controls.Add(this.edgeRightBox, 1, 6);
|
||||
this.tableLayoutPanel1.Controls.Add(this.edgeTopLabel, 0, 7);
|
||||
this.tableLayoutPanel1.Controls.Add(this.edgeTopBox, 1, 7);
|
||||
this.tableLayoutPanel1.Controls.Add(this.quadrantLabel, 0, 8);
|
||||
this.tableLayoutPanel1.Controls.Add(this.quadrantSelect1, 1, 8);
|
||||
this.tableLayoutPanel1.Location = new System.Drawing.Point(12, 12);
|
||||
this.tableLayoutPanel1.Name = "tableLayoutPanel1";
|
||||
this.tableLayoutPanel1.RowCount = 9;
|
||||
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 11.11111F));
|
||||
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 11.11111F));
|
||||
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 11.11111F));
|
||||
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 11.11111F));
|
||||
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 11.11111F));
|
||||
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 11.11111F));
|
||||
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 11.11111F));
|
||||
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 11.11111F));
|
||||
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 11.11111F));
|
||||
this.tableLayoutPanel1.Size = new System.Drawing.Size(410, 260);
|
||||
this.tableLayoutPanel1.TabIndex = 0;
|
||||
//
|
||||
// unitsLabel
|
||||
//
|
||||
this.unitsLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.unitsLabel.AutoSize = true;
|
||||
this.unitsLabel.Location = new System.Drawing.Point(3, 9);
|
||||
this.unitsLabel.Name = "unitsLabel";
|
||||
this.unitsLabel.Size = new System.Drawing.Size(100, 16);
|
||||
this.unitsLabel.TabIndex = 0;
|
||||
this.unitsLabel.Text = "Units:";
|
||||
//
|
||||
// unitsCombo
|
||||
//
|
||||
this.unitsCombo.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.unitsCombo.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
|
||||
this.unitsCombo.Items.AddRange(new object[] { "Inches", "Millimeters" });
|
||||
this.unitsCombo.Location = new System.Drawing.Point(109, 5);
|
||||
this.unitsCombo.Name = "unitsCombo";
|
||||
this.unitsCombo.Size = new System.Drawing.Size(298, 24);
|
||||
this.unitsCombo.TabIndex = 1;
|
||||
//
|
||||
// widthLabel
|
||||
//
|
||||
this.widthLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.widthLabel.AutoSize = true;
|
||||
this.widthLabel.Location = new System.Drawing.Point(3, 37);
|
||||
this.widthLabel.Name = "widthLabel";
|
||||
this.widthLabel.Size = new System.Drawing.Size(100, 16);
|
||||
this.widthLabel.TabIndex = 2;
|
||||
this.widthLabel.Text = "Plate width:";
|
||||
//
|
||||
// widthBox
|
||||
//
|
||||
this.widthBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.widthBox.DecimalPlaces = 4;
|
||||
this.widthBox.Location = new System.Drawing.Point(109, 33);
|
||||
this.widthBox.Maximum = new decimal(new int[] { 1000000, 0, 0, 0 });
|
||||
this.widthBox.Minimum = new decimal(new int[] { 1, 0, 0, 196608 });
|
||||
this.widthBox.Name = "widthBox";
|
||||
this.widthBox.Size = new System.Drawing.Size(298, 22);
|
||||
this.widthBox.Suffix = "";
|
||||
this.widthBox.TabIndex = 3;
|
||||
//
|
||||
// lengthLabel
|
||||
//
|
||||
this.lengthLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.lengthLabel.AutoSize = true;
|
||||
this.lengthLabel.Location = new System.Drawing.Point(3, 65);
|
||||
this.lengthLabel.Name = "lengthLabel";
|
||||
this.lengthLabel.Size = new System.Drawing.Size(100, 16);
|
||||
this.lengthLabel.TabIndex = 4;
|
||||
this.lengthLabel.Text = "Plate length:";
|
||||
//
|
||||
// lengthBox
|
||||
//
|
||||
this.lengthBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.lengthBox.DecimalPlaces = 4;
|
||||
this.lengthBox.Location = new System.Drawing.Point(109, 61);
|
||||
this.lengthBox.Maximum = new decimal(new int[] { 1000000, 0, 0, 0 });
|
||||
this.lengthBox.Minimum = new decimal(new int[] { 1, 0, 0, 196608 });
|
||||
this.lengthBox.Name = "lengthBox";
|
||||
this.lengthBox.Size = new System.Drawing.Size(298, 22);
|
||||
this.lengthBox.Suffix = "";
|
||||
this.lengthBox.TabIndex = 5;
|
||||
//
|
||||
// partSpacingLabel
|
||||
//
|
||||
this.partSpacingLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.partSpacingLabel.AutoSize = true;
|
||||
this.partSpacingLabel.Location = new System.Drawing.Point(3, 93);
|
||||
this.partSpacingLabel.Name = "partSpacingLabel";
|
||||
this.partSpacingLabel.Size = new System.Drawing.Size(100, 16);
|
||||
this.partSpacingLabel.TabIndex = 6;
|
||||
this.partSpacingLabel.Text = "Part spacing:";
|
||||
//
|
||||
// partSpacingBox
|
||||
//
|
||||
this.partSpacingBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.partSpacingBox.DecimalPlaces = 4;
|
||||
this.partSpacingBox.Location = new System.Drawing.Point(109, 89);
|
||||
this.partSpacingBox.Maximum = new decimal(new int[] { 1000000, 0, 0, 0 });
|
||||
this.partSpacingBox.Name = "partSpacingBox";
|
||||
this.partSpacingBox.Size = new System.Drawing.Size(298, 22);
|
||||
this.partSpacingBox.Suffix = "";
|
||||
this.partSpacingBox.TabIndex = 7;
|
||||
//
|
||||
// edgeLeftLabel
|
||||
//
|
||||
this.edgeLeftLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.edgeLeftLabel.AutoSize = true;
|
||||
this.edgeLeftLabel.Location = new System.Drawing.Point(3, 121);
|
||||
this.edgeLeftLabel.Name = "edgeLeftLabel";
|
||||
this.edgeLeftLabel.Size = new System.Drawing.Size(100, 16);
|
||||
this.edgeLeftLabel.TabIndex = 8;
|
||||
this.edgeLeftLabel.Text = "Edge left:";
|
||||
//
|
||||
// edgeLeftBox
|
||||
//
|
||||
this.edgeLeftBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.edgeLeftBox.DecimalPlaces = 4;
|
||||
this.edgeLeftBox.Location = new System.Drawing.Point(109, 117);
|
||||
this.edgeLeftBox.Maximum = new decimal(new int[] { 1000000, 0, 0, 0 });
|
||||
this.edgeLeftBox.Name = "edgeLeftBox";
|
||||
this.edgeLeftBox.Size = new System.Drawing.Size(298, 22);
|
||||
this.edgeLeftBox.Suffix = "";
|
||||
this.edgeLeftBox.TabIndex = 9;
|
||||
//
|
||||
// edgeBottomLabel
|
||||
//
|
||||
this.edgeBottomLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.edgeBottomLabel.AutoSize = true;
|
||||
this.edgeBottomLabel.Location = new System.Drawing.Point(3, 149);
|
||||
this.edgeBottomLabel.Name = "edgeBottomLabel";
|
||||
this.edgeBottomLabel.Size = new System.Drawing.Size(100, 16);
|
||||
this.edgeBottomLabel.TabIndex = 10;
|
||||
this.edgeBottomLabel.Text = "Edge bottom:";
|
||||
//
|
||||
// edgeBottomBox
|
||||
//
|
||||
this.edgeBottomBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.edgeBottomBox.DecimalPlaces = 4;
|
||||
this.edgeBottomBox.Location = new System.Drawing.Point(109, 145);
|
||||
this.edgeBottomBox.Maximum = new decimal(new int[] { 1000000, 0, 0, 0 });
|
||||
this.edgeBottomBox.Name = "edgeBottomBox";
|
||||
this.edgeBottomBox.Size = new System.Drawing.Size(298, 22);
|
||||
this.edgeBottomBox.Suffix = "";
|
||||
this.edgeBottomBox.TabIndex = 11;
|
||||
//
|
||||
// edgeRightLabel
|
||||
//
|
||||
this.edgeRightLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.edgeRightLabel.AutoSize = true;
|
||||
this.edgeRightLabel.Location = new System.Drawing.Point(3, 177);
|
||||
this.edgeRightLabel.Name = "edgeRightLabel";
|
||||
this.edgeRightLabel.Size = new System.Drawing.Size(100, 16);
|
||||
this.edgeRightLabel.TabIndex = 12;
|
||||
this.edgeRightLabel.Text = "Edge right:";
|
||||
//
|
||||
// edgeRightBox
|
||||
//
|
||||
this.edgeRightBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.edgeRightBox.DecimalPlaces = 4;
|
||||
this.edgeRightBox.Location = new System.Drawing.Point(109, 173);
|
||||
this.edgeRightBox.Maximum = new decimal(new int[] { 1000000, 0, 0, 0 });
|
||||
this.edgeRightBox.Name = "edgeRightBox";
|
||||
this.edgeRightBox.Size = new System.Drawing.Size(298, 22);
|
||||
this.edgeRightBox.Suffix = "";
|
||||
this.edgeRightBox.TabIndex = 13;
|
||||
//
|
||||
// edgeTopLabel
|
||||
//
|
||||
this.edgeTopLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.edgeTopLabel.AutoSize = true;
|
||||
this.edgeTopLabel.Location = new System.Drawing.Point(3, 205);
|
||||
this.edgeTopLabel.Name = "edgeTopLabel";
|
||||
this.edgeTopLabel.Size = new System.Drawing.Size(100, 16);
|
||||
this.edgeTopLabel.TabIndex = 14;
|
||||
this.edgeTopLabel.Text = "Edge top:";
|
||||
//
|
||||
// edgeTopBox
|
||||
//
|
||||
this.edgeTopBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.edgeTopBox.DecimalPlaces = 4;
|
||||
this.edgeTopBox.Location = new System.Drawing.Point(109, 201);
|
||||
this.edgeTopBox.Maximum = new decimal(new int[] { 1000000, 0, 0, 0 });
|
||||
this.edgeTopBox.Name = "edgeTopBox";
|
||||
this.edgeTopBox.Size = new System.Drawing.Size(298, 22);
|
||||
this.edgeTopBox.Suffix = "";
|
||||
this.edgeTopBox.TabIndex = 15;
|
||||
//
|
||||
// quadrantLabel
|
||||
//
|
||||
this.quadrantLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.quadrantLabel.AutoSize = true;
|
||||
this.quadrantLabel.Location = new System.Drawing.Point(3, 233);
|
||||
this.quadrantLabel.Name = "quadrantLabel";
|
||||
this.quadrantLabel.Size = new System.Drawing.Size(100, 16);
|
||||
this.quadrantLabel.TabIndex = 16;
|
||||
this.quadrantLabel.Text = "Quadrant:";
|
||||
//
|
||||
// quadrantSelect1
|
||||
//
|
||||
this.quadrantSelect1.Anchor = System.Windows.Forms.AnchorStyles.None;
|
||||
this.quadrantSelect1.BackColor = System.Drawing.Color.White;
|
||||
this.quadrantSelect1.Location = new System.Drawing.Point(198, 225);
|
||||
this.quadrantSelect1.Name = "quadrantSelect1";
|
||||
this.quadrantSelect1.Quadrant = 1;
|
||||
this.quadrantSelect1.Size = new System.Drawing.Size(120, 28);
|
||||
this.quadrantSelect1.TabIndex = 17;
|
||||
//
|
||||
// saveButton
|
||||
//
|
||||
this.saveButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.saveButton.DialogResult = System.Windows.Forms.DialogResult.OK;
|
||||
this.saveButton.Location = new System.Drawing.Point(243, 285);
|
||||
this.saveButton.Name = "saveButton";
|
||||
this.saveButton.Size = new System.Drawing.Size(90, 28);
|
||||
this.saveButton.TabIndex = 1;
|
||||
this.saveButton.Text = "Save";
|
||||
this.saveButton.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// cancelButton
|
||||
//
|
||||
this.cancelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
|
||||
this.cancelButton.Location = new System.Drawing.Point(339, 285);
|
||||
this.cancelButton.Name = "cancelButton";
|
||||
this.cancelButton.Size = new System.Drawing.Size(90, 28);
|
||||
this.cancelButton.TabIndex = 2;
|
||||
this.cancelButton.Text = "Cancel";
|
||||
this.cancelButton.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// NestDefaultsForm
|
||||
//
|
||||
this.AcceptButton = this.saveButton;
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;
|
||||
this.CancelButton = this.cancelButton;
|
||||
this.ClientSize = new System.Drawing.Size(434, 322);
|
||||
this.Controls.Add(this.tableLayoutPanel1);
|
||||
this.Controls.Add(this.saveButton);
|
||||
this.Controls.Add(this.cancelButton);
|
||||
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
|
||||
this.MaximizeBox = false;
|
||||
this.MinimizeBox = false;
|
||||
this.Name = "NestDefaultsForm";
|
||||
this.ShowIcon = false;
|
||||
this.ShowInTaskbar = false;
|
||||
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
|
||||
this.Text = "Nest Defaults";
|
||||
((System.ComponentModel.ISupportInitialize)(this.widthBox)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.lengthBox)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.partSpacingBox)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.edgeLeftBox)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.edgeBottomBox)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.edgeRightBox)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.edgeTopBox)).EndInit();
|
||||
this.tableLayoutPanel1.ResumeLayout(false);
|
||||
this.tableLayoutPanel1.PerformLayout();
|
||||
this.ResumeLayout(false);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;
|
||||
private System.Windows.Forms.Label unitsLabel;
|
||||
private System.Windows.Forms.ComboBox unitsCombo;
|
||||
private System.Windows.Forms.Label widthLabel;
|
||||
private OpenNest.Controls.NumericUpDown widthBox;
|
||||
private System.Windows.Forms.Label lengthLabel;
|
||||
private OpenNest.Controls.NumericUpDown lengthBox;
|
||||
private System.Windows.Forms.Label partSpacingLabel;
|
||||
private OpenNest.Controls.NumericUpDown partSpacingBox;
|
||||
private System.Windows.Forms.Label edgeLeftLabel;
|
||||
private OpenNest.Controls.NumericUpDown edgeLeftBox;
|
||||
private System.Windows.Forms.Label edgeBottomLabel;
|
||||
private OpenNest.Controls.NumericUpDown edgeBottomBox;
|
||||
private System.Windows.Forms.Label edgeRightLabel;
|
||||
private OpenNest.Controls.NumericUpDown edgeRightBox;
|
||||
private System.Windows.Forms.Label edgeTopLabel;
|
||||
private OpenNest.Controls.NumericUpDown edgeTopBox;
|
||||
private System.Windows.Forms.Label quadrantLabel;
|
||||
private OpenNest.Controls.QuadrantSelect quadrantSelect1;
|
||||
private System.Windows.Forms.Button saveButton;
|
||||
private System.Windows.Forms.Button cancelButton;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,62 @@
|
||||
using System;
|
||||
using System.Windows.Forms;
|
||||
using OpenNest.Data;
|
||||
using OpenNest.Geometry;
|
||||
|
||||
namespace OpenNest.Forms
|
||||
{
|
||||
/// <summary>
|
||||
/// Edits the persisted nest defaults (Tools > Nest Defaults), written
|
||||
/// to the JSON file used when creating a new nest.
|
||||
/// </summary>
|
||||
public partial class NestDefaultsForm : Form
|
||||
{
|
||||
public NestDefaultsForm(NestDefaults defaults)
|
||||
{
|
||||
InitializeComponent();
|
||||
|
||||
unitsCombo.SelectedIndex = defaults.Units == Units.Millimeters ? 1 : 0;
|
||||
widthBox.Value = Clamp(widthBox, defaults.Size.Width);
|
||||
lengthBox.Value = Clamp(lengthBox, defaults.Size.Length);
|
||||
partSpacingBox.Value = Clamp(partSpacingBox, defaults.PartSpacing);
|
||||
edgeLeftBox.Value = Clamp(edgeLeftBox, defaults.EdgeSpacing.Left);
|
||||
edgeBottomBox.Value = Clamp(edgeBottomBox, defaults.EdgeSpacing.Bottom);
|
||||
edgeRightBox.Value = Clamp(edgeRightBox, defaults.EdgeSpacing.Right);
|
||||
edgeTopBox.Value = Clamp(edgeTopBox, defaults.EdgeSpacing.Top);
|
||||
quadrantSelect1.Quadrant = defaults.Quadrant;
|
||||
}
|
||||
|
||||
public Units Units => unitsCombo.SelectedIndex == 1 ? Units.Millimeters : Units.Inches;
|
||||
|
||||
public NestDefaults GetDefaults()
|
||||
{
|
||||
return new NestDefaults
|
||||
{
|
||||
Units = Units,
|
||||
Size = new Size((double)widthBox.Value, (double)lengthBox.Value),
|
||||
Quadrant = quadrantSelect1.Quadrant,
|
||||
PartSpacing = (double)partSpacingBox.Value,
|
||||
EdgeSpacing = new Spacing(
|
||||
(double)edgeLeftBox.Value,
|
||||
(double)edgeBottomBox.Value,
|
||||
(double)edgeRightBox.Value,
|
||||
(double)edgeTopBox.Value
|
||||
),
|
||||
};
|
||||
}
|
||||
|
||||
private static decimal Clamp(NumericUpDown box, double value)
|
||||
{
|
||||
if (double.IsNaN(value) || double.IsInfinity(value))
|
||||
return box.Minimum;
|
||||
|
||||
if (value < (double)box.Minimum)
|
||||
return box.Minimum;
|
||||
|
||||
if (value > (double)box.Maximum)
|
||||
return box.Maximum;
|
||||
|
||||
return (decimal)value;
|
||||
}
|
||||
}
|
||||
}
|
||||
Generated
+9
-50
@@ -34,9 +34,6 @@
|
||||
this.toolTip1 = new System.Windows.Forms.ToolTip(this.components);
|
||||
this.numericUpDown1 = new OpenNest.Controls.NumericUpDown();
|
||||
this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
|
||||
this.textBox1 = new System.Windows.Forms.TextBox();
|
||||
this.label3 = new System.Windows.Forms.Label();
|
||||
this.button1 = new System.Windows.Forms.Button();
|
||||
this.saveButton = new System.Windows.Forms.Button();
|
||||
this.cancelButton = new System.Windows.Forms.Button();
|
||||
this.bottomPanel1 = new OpenNest.Controls.BottomPanel();
|
||||
@@ -94,55 +91,20 @@
|
||||
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
|
||||
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 297F));
|
||||
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 100F));
|
||||
this.tableLayoutPanel1.Controls.Add(this.label1, 0, 1);
|
||||
this.tableLayoutPanel1.Controls.Add(this.textBox1, 1, 0);
|
||||
this.tableLayoutPanel1.Controls.Add(this.label3, 0, 0);
|
||||
this.tableLayoutPanel1.Controls.Add(this.colorSchemeLabel, 0, 2);
|
||||
this.tableLayoutPanel1.Controls.Add(this.colorSchemeCombo, 1, 2);
|
||||
this.tableLayoutPanel1.Controls.Add(this.checkBox1, 0, 3);
|
||||
this.tableLayoutPanel1.Controls.Add(this.numericUpDown1, 1, 1);
|
||||
this.tableLayoutPanel1.Controls.Add(this.button1, 3, 0);
|
||||
this.tableLayoutPanel1.Controls.Add(this.label1, 0, 0);
|
||||
this.tableLayoutPanel1.Controls.Add(this.colorSchemeLabel, 0, 1);
|
||||
this.tableLayoutPanel1.Controls.Add(this.colorSchemeCombo, 1, 1);
|
||||
this.tableLayoutPanel1.Controls.Add(this.checkBox1, 0, 2);
|
||||
this.tableLayoutPanel1.Controls.Add(this.numericUpDown1, 1, 0);
|
||||
this.tableLayoutPanel1.Location = new System.Drawing.Point(12, 12);
|
||||
this.tableLayoutPanel1.Name = "tableLayoutPanel1";
|
||||
this.tableLayoutPanel1.RowCount = 4;
|
||||
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 25F));
|
||||
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 25F));
|
||||
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 25F));
|
||||
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 25F));
|
||||
this.tableLayoutPanel1.RowCount = 3;
|
||||
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 33.33333F));
|
||||
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 33.33333F));
|
||||
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 33.33333F));
|
||||
this.tableLayoutPanel1.Size = new System.Drawing.Size(684, 160);
|
||||
this.tableLayoutPanel1.TabIndex = 0;
|
||||
//
|
||||
// textBox1
|
||||
//
|
||||
this.textBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.tableLayoutPanel1.SetColumnSpan(this.textBox1, 2);
|
||||
this.textBox1.Location = new System.Drawing.Point(154, 9);
|
||||
this.textBox1.Name = "textBox1";
|
||||
this.textBox1.Size = new System.Drawing.Size(427, 22);
|
||||
this.textBox1.TabIndex = 1;
|
||||
//
|
||||
// label3
|
||||
//
|
||||
this.label3.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.label3.AutoSize = true;
|
||||
this.label3.Location = new System.Drawing.Point(3, 12);
|
||||
this.label3.Name = "label3";
|
||||
this.label3.Size = new System.Drawing.Size(145, 16);
|
||||
this.label3.TabIndex = 0;
|
||||
this.label3.Text = "Nest Template Path:";
|
||||
//
|
||||
// button1
|
||||
//
|
||||
this.button1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.button1.Location = new System.Drawing.Point(588, 6);
|
||||
this.button1.Margin = new System.Windows.Forms.Padding(4);
|
||||
this.button1.Name = "button1";
|
||||
this.button1.Size = new System.Drawing.Size(92, 28);
|
||||
this.button1.TabIndex = 2;
|
||||
this.button1.Text = "Browse...";
|
||||
this.button1.UseVisualStyleBackColor = true;
|
||||
this.button1.Click += new System.EventHandler(this.BrowseNestTemplatePath_Click);
|
||||
//
|
||||
// saveButton
|
||||
//
|
||||
this.saveButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
|
||||
@@ -258,9 +220,6 @@
|
||||
private System.Windows.Forms.ToolTip toolTip1;
|
||||
private Controls.BottomPanel bottomPanel1;
|
||||
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;
|
||||
private System.Windows.Forms.TextBox textBox1;
|
||||
private System.Windows.Forms.Label label3;
|
||||
private System.Windows.Forms.Button button1;
|
||||
private System.Windows.Forms.DataGridView strategyGrid;
|
||||
private System.Windows.Forms.GroupBox strategyGroupBox;
|
||||
private System.Windows.Forms.Label colorSchemeLabel;
|
||||
|
||||
@@ -72,7 +72,6 @@ namespace OpenNest.Forms
|
||||
|
||||
private void LoadSettings()
|
||||
{
|
||||
textBox1.Text = Settings.Default.NestTemplatePath;
|
||||
checkBox1.Checked = Settings.Default.CreateNewNestOnOpen;
|
||||
numericUpDown1.Value = (decimal)Settings.Default.AutoSizePlateFactor;
|
||||
|
||||
@@ -92,7 +91,6 @@ namespace OpenNest.Forms
|
||||
|
||||
private void SaveSettings()
|
||||
{
|
||||
Settings.Default.NestTemplatePath = textBox1.Text;
|
||||
Settings.Default.CreateNewNestOnOpen = checkBox1.Checked;
|
||||
Settings.Default.AutoSizePlateFactor = (double)numericUpDown1.Value;
|
||||
Settings.Default.ActiveColorScheme =
|
||||
@@ -144,14 +142,5 @@ namespace OpenNest.Forms
|
||||
{
|
||||
SaveSettings();
|
||||
}
|
||||
|
||||
private void BrowseNestTemplatePath_Click(object sender, EventArgs e)
|
||||
{
|
||||
var dlg = new OpenFileDialog();
|
||||
dlg.Filter = "Template File|*.nstdot";
|
||||
|
||||
if (dlg.ShowDialog() == DialogResult.OK)
|
||||
textBox1.Text = dlg.FileName;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Generated
+2
@@ -158,6 +158,8 @@ namespace OpenNest.Properties {
|
||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("")]
|
||||
// Legacy .nstdot nest-template path. No longer read by the app
|
||||
// except by the one-time migration to defaults.json in MainForm.
|
||||
public string NestTemplatePath {
|
||||
get {
|
||||
return ((string)(this["NestTemplatePath"]));
|
||||
|
||||
Reference in New Issue
Block a user