feat: add material library resolution, assist gas support, and UI fixes
- Add MaterialLibraryResolver for Cincinnati post processor to resolve G89 library files from material/thickness/gas configuration - Add Nest.AssistGas property with serialization support in nest format - Add etch library support with separate gas configuration - Fix CutOff tests to match AwayFromOrigin default cut direction - Fix plate info label not updating after ResizePlateToFitParts - Add cutoff and remnants toolbar button icons Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -36,6 +36,8 @@ namespace OpenNest
|
|||||||
|
|
||||||
public string Notes { get; set; }
|
public string Notes { get; set; }
|
||||||
|
|
||||||
|
public string AssistGas { get; set; } = "";
|
||||||
|
|
||||||
public Units Units { get; set; }
|
public Units Units { get; set; }
|
||||||
|
|
||||||
public DateTime DateCreated { get; set; }
|
public DateTime DateCreated { get; set; }
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ namespace OpenNest.IO
|
|||||||
public string DateCreated { get; init; } = "";
|
public string DateCreated { get; init; } = "";
|
||||||
public string DateLastModified { get; init; } = "";
|
public string DateLastModified { get; init; } = "";
|
||||||
public string Notes { get; init; } = "";
|
public string Notes { get; init; } = "";
|
||||||
|
public string AssistGas { get; init; } = "";
|
||||||
public PlateDefaultsDto PlateDefaults { get; init; } = new();
|
public PlateDefaultsDto PlateDefaults { get; init; } = new();
|
||||||
public List<DrawingDto> Drawings { get; init; } = new();
|
public List<DrawingDto> Drawings { get; init; } = new();
|
||||||
public List<PlateDto> Plates { get; init; } = new();
|
public List<PlateDto> Plates { get; init; } = new();
|
||||||
|
|||||||
@@ -160,6 +160,7 @@ namespace OpenNest.IO
|
|||||||
nest.DateCreated = DateTime.Parse(dto.DateCreated);
|
nest.DateCreated = DateTime.Parse(dto.DateCreated);
|
||||||
nest.DateLastModified = DateTime.Parse(dto.DateLastModified);
|
nest.DateLastModified = DateTime.Parse(dto.DateLastModified);
|
||||||
nest.Notes = dto.Notes;
|
nest.Notes = dto.Notes;
|
||||||
|
nest.AssistGas = dto.AssistGas ?? "";
|
||||||
|
|
||||||
// Plate defaults
|
// Plate defaults
|
||||||
var pd = dto.PlateDefaults;
|
var pd = dto.PlateDefaults;
|
||||||
|
|||||||
@@ -77,6 +77,7 @@ namespace OpenNest.IO
|
|||||||
DateCreated = nest.DateCreated.ToString("o"),
|
DateCreated = nest.DateCreated.ToString("o"),
|
||||||
DateLastModified = nest.DateLastModified.ToString("o"),
|
DateLastModified = nest.DateLastModified.ToString("o"),
|
||||||
Notes = nest.Notes ?? "",
|
Notes = nest.Notes ?? "",
|
||||||
|
AssistGas = nest.AssistGas ?? "",
|
||||||
PlateDefaults = BuildPlateDefaultsDto(),
|
PlateDefaults = BuildPlateDefaultsDto(),
|
||||||
Drawings = BuildDrawingDtos(),
|
Drawings = BuildDrawingDtos(),
|
||||||
Plates = BuildPlateDtos()
|
Plates = BuildPlateDtos()
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
namespace OpenNest.Posts.Cincinnati
|
namespace OpenNest.Posts.Cincinnati
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -153,16 +155,29 @@ namespace OpenNest.Posts.Cincinnati
|
|||||||
public G89Mode ProcessParameterMode { get; set; } = G89Mode.LibraryFile;
|
public G89Mode ProcessParameterMode { get; set; } = G89Mode.LibraryFile;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the default G89 library file path.
|
/// Gets or sets the default assist gas when Nest.AssistGas is empty.
|
||||||
/// Default: empty string
|
/// Default: "O2"
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string DefaultLibraryFile { get; set; } = "";
|
public string DefaultAssistGas { get; set; } = "O2";
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets whether to repeat G89 before each feature.
|
/// Gets or sets the gas used for etch operations.
|
||||||
/// Default: true
|
/// Independent of the cutting assist gas — etch typically requires a specific gas.
|
||||||
|
/// Default: "N2"
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool RepeatG89BeforeEachFeature { get; set; } = true;
|
public string DefaultEtchGas { get; set; } = "N2";
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the material-to-library mapping for cut operations.
|
||||||
|
/// Each entry maps (material, thickness, gas) to a G89 library file.
|
||||||
|
/// </summary>
|
||||||
|
public List<MaterialLibraryEntry> MaterialLibraries { get; set; } = new();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the gas-to-library mapping for etch operations.
|
||||||
|
/// Each entry maps a gas type to a G89 etch library file.
|
||||||
|
/// </summary>
|
||||||
|
public List<EtchLibraryEntry> EtchLibraries { get; set; } = new();
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets whether to use exact stop mode (G61).
|
/// Gets or sets whether to use exact stop mode (G61).
|
||||||
@@ -272,4 +287,18 @@ namespace OpenNest.Posts.Cincinnati
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public int SheetLengthVariable { get; set; } = 111;
|
public int SheetLengthVariable { get; set; } = 111;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class MaterialLibraryEntry
|
||||||
|
{
|
||||||
|
public string Material { get; set; } = "";
|
||||||
|
public double Thickness { get; set; }
|
||||||
|
public string Gas { get; set; } = "";
|
||||||
|
public string Library { get; set; } = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
public class EtchLibraryEntry
|
||||||
|
{
|
||||||
|
public string Gas { get; set; } = "";
|
||||||
|
public string Library { get; set; } = "";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -68,7 +68,18 @@ namespace OpenNest.Posts.Cincinnati
|
|||||||
.Where(p => p.Parts.Count > 0)
|
.Where(p => p.Parts.Count > 0)
|
||||||
.ToList();
|
.ToList();
|
||||||
|
|
||||||
// 3. Build part sub-program registry (if enabled)
|
// 3. Resolve gas and library files
|
||||||
|
var resolver = new MaterialLibraryResolver(Config);
|
||||||
|
var gas = MaterialLibraryResolver.ResolveGas(nest, Config);
|
||||||
|
var etchLibrary = resolver.ResolveEtchLibrary(Config.DefaultEtchGas);
|
||||||
|
|
||||||
|
// Resolve cut library from first plate for preamble
|
||||||
|
var firstPlate = plates.FirstOrDefault();
|
||||||
|
var initialCutLibrary = firstPlate != null
|
||||||
|
? resolver.ResolveCutLibrary(firstPlate.Material?.Name ?? "", firstPlate.Thickness, gas)
|
||||||
|
: "";
|
||||||
|
|
||||||
|
// 4. Build part sub-program registry (if enabled)
|
||||||
Dictionary<(int, long), int> partSubprograms = null;
|
Dictionary<(int, long), int> partSubprograms = null;
|
||||||
List<(int subNum, string name, Program program)> subprogramEntries = null;
|
List<(int subNum, string name, Program program)> subprogramEntries = null;
|
||||||
|
|
||||||
@@ -100,21 +111,21 @@ namespace OpenNest.Posts.Cincinnati
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 4. Create writers
|
// 5. Create writers
|
||||||
var preamble = new CincinnatiPreambleWriter(Config);
|
var preamble = new CincinnatiPreambleWriter(Config);
|
||||||
var sheetWriter = new CincinnatiSheetWriter(Config, vars);
|
var sheetWriter = new CincinnatiSheetWriter(Config, vars);
|
||||||
|
|
||||||
// 5. Build material description from first plate
|
// 6. Build material description from first plate
|
||||||
var material = plates.FirstOrDefault()?.Material;
|
var material = firstPlate?.Material;
|
||||||
var materialDesc = material != null
|
var materialDesc = material != null
|
||||||
? $"{material.Name}{(string.IsNullOrEmpty(material.Grade) ? "" : $", {material.Grade}")}"
|
? $"{material.Name}{(string.IsNullOrEmpty(material.Grade) ? "" : $", {material.Grade}")}"
|
||||||
: "";
|
: "";
|
||||||
|
|
||||||
// 6. Write to stream
|
// 7. Write to stream
|
||||||
using var writer = new StreamWriter(outputStream, Encoding.UTF8, 1024, leaveOpen: true);
|
using var writer = new StreamWriter(outputStream, Encoding.UTF8, 1024, leaveOpen: true);
|
||||||
|
|
||||||
// Main program
|
// Main program
|
||||||
preamble.WriteMainProgram(writer, nest.Name ?? "NEST", materialDesc, plates.Count);
|
preamble.WriteMainProgram(writer, nest.Name ?? "NEST", materialDesc, plates.Count, initialCutLibrary);
|
||||||
|
|
||||||
// Variable declaration subprogram
|
// Variable declaration subprogram
|
||||||
preamble.WriteVariableDeclaration(writer, vars);
|
preamble.WriteVariableDeclaration(writer, vars);
|
||||||
@@ -122,17 +133,18 @@ namespace OpenNest.Posts.Cincinnati
|
|||||||
// Sheet subprograms
|
// Sheet subprograms
|
||||||
for (var i = 0; i < plates.Count; i++)
|
for (var i = 0; i < plates.Count; i++)
|
||||||
{
|
{
|
||||||
|
var plate = plates[i];
|
||||||
var sheetIndex = i + 1;
|
var sheetIndex = i + 1;
|
||||||
var subNumber = Config.SheetSubprogramStart + i;
|
var subNumber = Config.SheetSubprogramStart + i;
|
||||||
sheetWriter.Write(writer, plates[i], nest.Name ?? "NEST", sheetIndex, subNumber,
|
var cutLibrary = resolver.ResolveCutLibrary(plate.Material?.Name ?? "", plate.Thickness, gas);
|
||||||
partSubprograms);
|
sheetWriter.Write(writer, plate, nest.Name ?? "NEST", sheetIndex, subNumber,
|
||||||
|
cutLibrary, etchLibrary, partSubprograms);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Part sub-programs (if enabled)
|
// Part sub-programs (if enabled)
|
||||||
if (subprogramEntries != null)
|
if (subprogramEntries != null)
|
||||||
{
|
{
|
||||||
var partSubWriter = new CincinnatiPartSubprogramWriter(Config);
|
var partSubWriter = new CincinnatiPartSubprogramWriter(Config);
|
||||||
var firstPlate = plates.FirstOrDefault();
|
|
||||||
var sheetDiagonal = firstPlate != null
|
var sheetDiagonal = firstPlate != null
|
||||||
? System.Math.Sqrt(firstPlate.Size.Width * firstPlate.Size.Width
|
? System.Math.Sqrt(firstPlate.Size.Width * firstPlate.Size.Width
|
||||||
+ firstPlate.Size.Length * firstPlate.Size.Length)
|
+ firstPlate.Size.Length * firstPlate.Size.Length)
|
||||||
@@ -141,7 +153,7 @@ namespace OpenNest.Posts.Cincinnati
|
|||||||
foreach (var (subNum, name, pgm) in subprogramEntries)
|
foreach (var (subNum, name, pgm) in subprogramEntries)
|
||||||
{
|
{
|
||||||
partSubWriter.Write(writer, pgm, name, subNum,
|
partSubWriter.Write(writer, pgm, name, subNum,
|
||||||
Config.DefaultLibraryFile ?? "", sheetDiagonal);
|
initialCutLibrary, etchLibrary, sheetDiagonal);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,42 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
|
||||||
|
namespace OpenNest.Posts.Cincinnati;
|
||||||
|
|
||||||
|
public sealed class MaterialLibraryResolver
|
||||||
|
{
|
||||||
|
private const double ThicknessTolerance = 0.001;
|
||||||
|
|
||||||
|
private readonly List<MaterialLibraryEntry> _materialLibraries;
|
||||||
|
private readonly List<EtchLibraryEntry> _etchLibraries;
|
||||||
|
|
||||||
|
public MaterialLibraryResolver(CincinnatiPostConfig config)
|
||||||
|
{
|
||||||
|
_materialLibraries = config.MaterialLibraries ?? new List<MaterialLibraryEntry>();
|
||||||
|
_etchLibraries = config.EtchLibraries ?? new List<EtchLibraryEntry>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public string ResolveCutLibrary(string materialName, double thickness, string gas)
|
||||||
|
{
|
||||||
|
var entry = _materialLibraries.FirstOrDefault(e =>
|
||||||
|
string.Equals(e.Material, materialName, StringComparison.OrdinalIgnoreCase) &&
|
||||||
|
System.Math.Abs(e.Thickness - thickness) <= ThicknessTolerance &&
|
||||||
|
string.Equals(e.Gas, gas, StringComparison.OrdinalIgnoreCase));
|
||||||
|
|
||||||
|
return entry?.Library ?? "";
|
||||||
|
}
|
||||||
|
|
||||||
|
public string ResolveEtchLibrary(string gas)
|
||||||
|
{
|
||||||
|
var entry = _etchLibraries.FirstOrDefault(e =>
|
||||||
|
string.Equals(e.Gas, gas, StringComparison.OrdinalIgnoreCase));
|
||||||
|
|
||||||
|
return entry?.Library ?? "";
|
||||||
|
}
|
||||||
|
|
||||||
|
public static string ResolveGas(Nest nest, CincinnatiPostConfig config)
|
||||||
|
{
|
||||||
|
return !string.IsNullOrEmpty(nest.AssistGas) ? nest.AssistGas : config.DefaultAssistGas;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,160 @@
|
|||||||
|
using OpenNest.Posts.Cincinnati;
|
||||||
|
|
||||||
|
namespace OpenNest.Tests.Cincinnati;
|
||||||
|
|
||||||
|
public class MaterialLibraryResolverTests
|
||||||
|
{
|
||||||
|
private static CincinnatiPostConfig ConfigWithLibraries() => new()
|
||||||
|
{
|
||||||
|
DefaultAssistGas = "O2",
|
||||||
|
DefaultEtchGas = "N2",
|
||||||
|
MaterialLibraries = new()
|
||||||
|
{
|
||||||
|
new MaterialLibraryEntry { Material = "Mild Steel", Thickness = 0.250, Gas = "O2", Library = "MS250O2.lib" },
|
||||||
|
new MaterialLibraryEntry { Material = "Mild Steel", Thickness = 0.250, Gas = "N2", Library = "MS250N2.lib" },
|
||||||
|
new MaterialLibraryEntry { Material = "Aluminum", Thickness = 0.125, Gas = "N2", Library = "AL125N2.lib" },
|
||||||
|
new MaterialLibraryEntry { Material = "Stainless Steel", Thickness = 0.375, Gas = "AIR", Library = "SS375AIR.lib" }
|
||||||
|
},
|
||||||
|
EtchLibraries = new()
|
||||||
|
{
|
||||||
|
new EtchLibraryEntry { Gas = "N2", Library = "EtchN2.lib" },
|
||||||
|
new EtchLibraryEntry { Gas = "O2", Library = "EtchO2.lib" },
|
||||||
|
new EtchLibraryEntry { Gas = "AIR", Library = "EtchAIR.lib" }
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void ResolveCutLibrary_ExactMatch()
|
||||||
|
{
|
||||||
|
var resolver = new MaterialLibraryResolver(ConfigWithLibraries());
|
||||||
|
var result = resolver.ResolveCutLibrary("Mild Steel", 0.250, "O2");
|
||||||
|
Assert.Equal("MS250O2.lib", result);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void ResolveCutLibrary_CaseInsensitiveMaterial()
|
||||||
|
{
|
||||||
|
var resolver = new MaterialLibraryResolver(ConfigWithLibraries());
|
||||||
|
var result = resolver.ResolveCutLibrary("mild steel", 0.250, "O2");
|
||||||
|
Assert.Equal("MS250O2.lib", result);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void ResolveCutLibrary_CaseInsensitiveGas()
|
||||||
|
{
|
||||||
|
var resolver = new MaterialLibraryResolver(ConfigWithLibraries());
|
||||||
|
var result = resolver.ResolveCutLibrary("Mild Steel", 0.250, "o2");
|
||||||
|
Assert.Equal("MS250O2.lib", result);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void ResolveCutLibrary_ThicknessWithinTolerance()
|
||||||
|
{
|
||||||
|
var resolver = new MaterialLibraryResolver(ConfigWithLibraries());
|
||||||
|
var result = resolver.ResolveCutLibrary("Mild Steel", 0.2505, "O2");
|
||||||
|
Assert.Equal("MS250O2.lib", result);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void ResolveCutLibrary_ThicknessOutsideTolerance_ReturnsEmpty()
|
||||||
|
{
|
||||||
|
var resolver = new MaterialLibraryResolver(ConfigWithLibraries());
|
||||||
|
var result = resolver.ResolveCutLibrary("Mild Steel", 0.260, "O2");
|
||||||
|
Assert.Equal("", result);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void ResolveCutLibrary_NoMatch_ReturnsEmpty()
|
||||||
|
{
|
||||||
|
var resolver = new MaterialLibraryResolver(ConfigWithLibraries());
|
||||||
|
var result = resolver.ResolveCutLibrary("Titanium", 0.250, "O2");
|
||||||
|
Assert.Equal("", result);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void ResolveCutLibrary_WrongGas_ReturnsEmpty()
|
||||||
|
{
|
||||||
|
var resolver = new MaterialLibraryResolver(ConfigWithLibraries());
|
||||||
|
var result = resolver.ResolveCutLibrary("Mild Steel", 0.250, "AIR");
|
||||||
|
Assert.Equal("", result);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void ResolveCutLibrary_DifferentGasSameMaterial()
|
||||||
|
{
|
||||||
|
var resolver = new MaterialLibraryResolver(ConfigWithLibraries());
|
||||||
|
var o2 = resolver.ResolveCutLibrary("Mild Steel", 0.250, "O2");
|
||||||
|
var n2 = resolver.ResolveCutLibrary("Mild Steel", 0.250, "N2");
|
||||||
|
Assert.Equal("MS250O2.lib", o2);
|
||||||
|
Assert.Equal("MS250N2.lib", n2);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void ResolveCutLibrary_EmptyList_ReturnsEmpty()
|
||||||
|
{
|
||||||
|
var config = new CincinnatiPostConfig { MaterialLibraries = new() };
|
||||||
|
var resolver = new MaterialLibraryResolver(config);
|
||||||
|
var result = resolver.ResolveCutLibrary("Mild Steel", 0.250, "O2");
|
||||||
|
Assert.Equal("", result);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void ResolveEtchLibrary_ExactMatch()
|
||||||
|
{
|
||||||
|
var resolver = new MaterialLibraryResolver(ConfigWithLibraries());
|
||||||
|
var result = resolver.ResolveEtchLibrary("N2");
|
||||||
|
Assert.Equal("EtchN2.lib", result);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void ResolveEtchLibrary_CaseInsensitive()
|
||||||
|
{
|
||||||
|
var resolver = new MaterialLibraryResolver(ConfigWithLibraries());
|
||||||
|
var result = resolver.ResolveEtchLibrary("n2");
|
||||||
|
Assert.Equal("EtchN2.lib", result);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void ResolveEtchLibrary_NoMatch_ReturnsEmpty()
|
||||||
|
{
|
||||||
|
var resolver = new MaterialLibraryResolver(ConfigWithLibraries());
|
||||||
|
var result = resolver.ResolveEtchLibrary("Argon");
|
||||||
|
Assert.Equal("", result);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void ResolveEtchLibrary_EmptyList_ReturnsEmpty()
|
||||||
|
{
|
||||||
|
var config = new CincinnatiPostConfig { EtchLibraries = new() };
|
||||||
|
var resolver = new MaterialLibraryResolver(config);
|
||||||
|
var result = resolver.ResolveEtchLibrary("N2");
|
||||||
|
Assert.Equal("", result);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void ResolveGas_UsesNestAssistGas_WhenSet()
|
||||||
|
{
|
||||||
|
var nest = new Nest("Test") { AssistGas = "N2" };
|
||||||
|
var config = new CincinnatiPostConfig { DefaultAssistGas = "O2" };
|
||||||
|
var result = MaterialLibraryResolver.ResolveGas(nest, config);
|
||||||
|
Assert.Equal("N2", result);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void ResolveGas_FallsBackToConfig_WhenNestEmpty()
|
||||||
|
{
|
||||||
|
var nest = new Nest("Test") { AssistGas = "" };
|
||||||
|
var config = new CincinnatiPostConfig { DefaultAssistGas = "O2" };
|
||||||
|
var result = MaterialLibraryResolver.ResolveGas(nest, config);
|
||||||
|
Assert.Equal("O2", result);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void ResolveGas_FallsBackToConfig_WhenNestNull()
|
||||||
|
{
|
||||||
|
var nest = new Nest("Test");
|
||||||
|
var config = new CincinnatiPostConfig { DefaultAssistGas = "AIR" };
|
||||||
|
var result = MaterialLibraryResolver.ResolveGas(nest, config);
|
||||||
|
Assert.Equal("AIR", result);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -154,10 +154,10 @@ public class CutOffTests
|
|||||||
|
|
||||||
// Plate(100, 50) = Width=100, Length=50. Vertical cut runs along Y (Width axis).
|
// Plate(100, 50) = Width=100, Length=50. Vertical cut runs along Y (Width axis).
|
||||||
// BoundingBox Y extent = Size.Width = 100. With 2" overtravel = 102.
|
// BoundingBox Y extent = Size.Width = 100. With 2" overtravel = 102.
|
||||||
// Default TowardOrigin: RapidMove to far end (102), LinearMove to near end (0).
|
// Default AwayFromOrigin: RapidMove to near end (0), LinearMove to far end (102).
|
||||||
var rapidMoves = cutoff.Drawing.Program.Codes.OfType<RapidMove>().ToList();
|
var linearMoves = cutoff.Drawing.Program.Codes.OfType<LinearMove>().ToList();
|
||||||
Assert.Single(rapidMoves);
|
Assert.Single(linearMoves);
|
||||||
Assert.Equal(102.0, rapidMoves[0].EndPoint.Y, 5);
|
Assert.Equal(102.0, linearMoves[0].EndPoint.Y, 5);
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
@@ -171,11 +171,10 @@ public class CutOffTests
|
|||||||
};
|
};
|
||||||
cutoff.Regenerate(plate, settings);
|
cutoff.Regenerate(plate, settings);
|
||||||
|
|
||||||
|
// AwayFromOrigin: RapidMove to near end (StartLimit=20), LinearMove to far end (100).
|
||||||
var rapidMoves = cutoff.Drawing.Program.Codes.OfType<RapidMove>().ToList();
|
var rapidMoves = cutoff.Drawing.Program.Codes.OfType<RapidMove>().ToList();
|
||||||
Assert.Single(rapidMoves);
|
Assert.Single(rapidMoves);
|
||||||
var linearMoves = cutoff.Drawing.Program.Codes.OfType<LinearMove>().ToList();
|
Assert.Equal(20.0, rapidMoves[0].EndPoint.Y, 5);
|
||||||
Assert.Single(linearMoves);
|
|
||||||
Assert.Equal(20.0, linearMoves[0].EndPoint.Y, 5);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
@@ -189,9 +188,10 @@ public class CutOffTests
|
|||||||
};
|
};
|
||||||
cutoff.Regenerate(plate, settings);
|
cutoff.Regenerate(plate, settings);
|
||||||
|
|
||||||
var rapidMoves = cutoff.Drawing.Program.Codes.OfType<RapidMove>().ToList();
|
// AwayFromOrigin: RapidMove to near end (0), LinearMove to far end (EndLimit=80).
|
||||||
Assert.Single(rapidMoves);
|
var linearMoves = cutoff.Drawing.Program.Codes.OfType<LinearMove>().ToList();
|
||||||
Assert.Equal(80.0, rapidMoves[0].EndPoint.Y, 5);
|
Assert.Single(linearMoves);
|
||||||
|
Assert.Equal(80.0, linearMoves[0].EndPoint.Y, 5);
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
|
|||||||
@@ -458,6 +458,7 @@ namespace OpenNest.Forms
|
|||||||
PlateView.ZoomToPlate();
|
PlateView.ZoomToPlate();
|
||||||
PlateView.Refresh();
|
PlateView.Refresh();
|
||||||
UpdatePlateList();
|
UpdatePlateList();
|
||||||
|
UpdatePlateHeader();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SelectAllParts()
|
public void SelectAllParts()
|
||||||
|
|||||||
Generated
+26
-3
@@ -149,6 +149,8 @@
|
|||||||
engineComboBox = new System.Windows.Forms.ToolStripComboBox();
|
engineComboBox = new System.Windows.Forms.ToolStripComboBox();
|
||||||
btnAutoNest = new System.Windows.Forms.ToolStripButton();
|
btnAutoNest = new System.Windows.Forms.ToolStripButton();
|
||||||
btnShowRemnants = new System.Windows.Forms.ToolStripButton();
|
btnShowRemnants = new System.Windows.Forms.ToolStripButton();
|
||||||
|
toolStripSeparator5 = new System.Windows.Forms.ToolStripSeparator();
|
||||||
|
btnCutOff = new System.Windows.Forms.ToolStripButton();
|
||||||
pEPToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
pEPToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
openNestToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
openNestToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
menuStrip1.SuspendLayout();
|
menuStrip1.SuspendLayout();
|
||||||
@@ -917,7 +919,7 @@
|
|||||||
// toolStrip1
|
// toolStrip1
|
||||||
//
|
//
|
||||||
toolStrip1.AutoSize = false;
|
toolStrip1.AutoSize = false;
|
||||||
toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { btnNew, btnOpen, btnSave, btnSaveAs, toolStripSeparator1, btnZoomOut, btnZoomIn, btnZoomToFit, toolStripSeparator4, engineLabel, engineComboBox, btnAutoNest, btnShowRemnants });
|
toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { btnNew, btnOpen, btnSave, btnSaveAs, toolStripSeparator1, btnZoomOut, btnZoomIn, btnZoomToFit, toolStripSeparator4, engineLabel, engineComboBox, btnAutoNest, btnShowRemnants, toolStripSeparator5, btnCutOff });
|
||||||
toolStrip1.Location = new System.Drawing.Point(0, 24);
|
toolStrip1.Location = new System.Drawing.Point(0, 24);
|
||||||
toolStrip1.Name = "toolStrip1";
|
toolStrip1.Name = "toolStrip1";
|
||||||
toolStrip1.Size = new System.Drawing.Size(1281, 40);
|
toolStrip1.Size = new System.Drawing.Size(1281, 40);
|
||||||
@@ -1044,12 +1046,31 @@
|
|||||||
//
|
//
|
||||||
// btnShowRemnants
|
// btnShowRemnants
|
||||||
//
|
//
|
||||||
btnShowRemnants.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;
|
btnShowRemnants.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
|
||||||
|
btnShowRemnants.Image = Properties.Resources.remnants;
|
||||||
|
btnShowRemnants.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None;
|
||||||
btnShowRemnants.Name = "btnShowRemnants";
|
btnShowRemnants.Name = "btnShowRemnants";
|
||||||
btnShowRemnants.Size = new System.Drawing.Size(64, 37);
|
btnShowRemnants.Padding = new System.Windows.Forms.Padding(5, 0, 5, 0);
|
||||||
|
btnShowRemnants.Size = new System.Drawing.Size(38, 37);
|
||||||
btnShowRemnants.Text = "Remnants";
|
btnShowRemnants.Text = "Remnants";
|
||||||
btnShowRemnants.Click += ShowRemnants_Click;
|
btnShowRemnants.Click += ShowRemnants_Click;
|
||||||
//
|
//
|
||||||
|
// toolStripSeparator5
|
||||||
|
//
|
||||||
|
toolStripSeparator5.Name = "toolStripSeparator5";
|
||||||
|
toolStripSeparator5.Size = new System.Drawing.Size(6, 40);
|
||||||
|
//
|
||||||
|
// btnCutOff
|
||||||
|
//
|
||||||
|
btnCutOff.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
|
||||||
|
btnCutOff.Image = Properties.Resources.cutoff;
|
||||||
|
btnCutOff.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None;
|
||||||
|
btnCutOff.Name = "btnCutOff";
|
||||||
|
btnCutOff.Padding = new System.Windows.Forms.Padding(5, 0, 5, 0);
|
||||||
|
btnCutOff.Size = new System.Drawing.Size(38, 37);
|
||||||
|
btnCutOff.Text = "Sheet Cut-Off";
|
||||||
|
btnCutOff.Click += CutOff_Click;
|
||||||
|
//
|
||||||
// pEPToolStripMenuItem
|
// pEPToolStripMenuItem
|
||||||
//
|
//
|
||||||
pEPToolStripMenuItem.Name = "pEPToolStripMenuItem";
|
pEPToolStripMenuItem.Name = "pEPToolStripMenuItem";
|
||||||
@@ -1213,6 +1234,8 @@
|
|||||||
private System.Windows.Forms.ToolStripComboBox engineComboBox;
|
private System.Windows.Forms.ToolStripComboBox engineComboBox;
|
||||||
private System.Windows.Forms.ToolStripButton btnAutoNest;
|
private System.Windows.Forms.ToolStripButton btnAutoNest;
|
||||||
private System.Windows.Forms.ToolStripButton btnShowRemnants;
|
private System.Windows.Forms.ToolStripButton btnShowRemnants;
|
||||||
|
private System.Windows.Forms.ToolStripSeparator toolStripSeparator5;
|
||||||
|
private System.Windows.Forms.ToolStripButton btnCutOff;
|
||||||
private System.Windows.Forms.ToolStripMenuItem mnuPlateCutOff;
|
private System.Windows.Forms.ToolStripMenuItem mnuPlateCutOff;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+20
@@ -80,6 +80,16 @@ namespace OpenNest.Properties {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
||||||
|
/// </summary>
|
||||||
|
internal static System.Drawing.Bitmap cutoff {
|
||||||
|
get {
|
||||||
|
object obj = ResourceManager.GetObject("cutoff", resourceCulture);
|
||||||
|
return ((System.Drawing.Bitmap)(obj));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -160,6 +170,16 @@ namespace OpenNest.Properties {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
||||||
|
/// </summary>
|
||||||
|
internal static System.Drawing.Bitmap remnants {
|
||||||
|
get {
|
||||||
|
object obj = ResourceManager.GetObject("remnants", resourceCulture);
|
||||||
|
return ((System.Drawing.Bitmap)(obj));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -175,4 +175,10 @@
|
|||||||
<data name="zoom_out" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
<data name="zoom_out" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
<value>..\Resources\zoom_out.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
<value>..\Resources\zoom_out.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="cutoff" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
|
<value>..\Resources\cutoff.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
|
</data>
|
||||||
|
<data name="remnants" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
|
<value>..\Resources\remnants.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 994 B |
Binary file not shown.
|
After Width: | Height: | Size: 1.2 KiB |
Reference in New Issue
Block a user