mirror of
https://github.com/ajisaacs/OpenNest.git
synced 2026-10-21 16:01:36 -04:00
A BOM row with a file name and a matching drawing but a blank thickness was reported "No DXF" and locked, so its thickness could not be entered and the part was dropped: BomAnalyzer skips such items before looking for a drawing, and the form only knew drawings the analyzer matched. A row with a blank material read "Matched" but was silently left out of every group. Rows now resolve their drawing through a DrawingFileIndex shared with BomAnalyzer (whose behavior and tests are unchanged), and a row's status is computed from its values: Ready | Needs material | Needs thickness | No drawing found | No file name Rows with a drawing stay editable, and an edit updates the status cell. Groups take only Ready rows (a zero, negative or non-finite thickness is not Ready). The summary line counts ready rows and each problem. Build_RowWithoutThickness_StillFindsItsDrawing failed at its DxfPath assertion against the previous commit. Mutation reds: removing the material check, accepting zero or non-finite thickness, skipping the drawing for rows without thickness, and grouping without the status each fail the Bom tests. Project Memory: b8e3a978-2cfe-4fe7-b2a5-eb01c6c54679
62 lines
1.9 KiB
C#
62 lines
1.9 KiB
C#
using System.Collections.Generic;
|
|
using System.Linq;
|
|
|
|
namespace OpenNest.IO.Bom;
|
|
|
|
/// <summary>
|
|
/// The rows of one material and thickness; each group becomes one nest.
|
|
/// </summary>
|
|
public sealed class BomImportGroup
|
|
{
|
|
public BomImportGroup(string material, double thickness, IReadOnlyList<BomPartRow> parts)
|
|
{
|
|
Material = material;
|
|
Thickness = thickness;
|
|
Parts = parts;
|
|
}
|
|
|
|
/// <summary>The material as the group's first row spells it.</summary>
|
|
public string Material { get; }
|
|
|
|
public double Thickness { get; }
|
|
|
|
public IReadOnlyList<BomPartRow> Parts { get; }
|
|
|
|
/// <summary>Sum of the rows' quantities; a blank quantity counts as 0.</summary>
|
|
public int TotalQty => Parts.Sum(p => p.Qty ?? 0);
|
|
|
|
public string Key => BomImportGroups.Key(Material, Thickness);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Groups importable rows by material and thickness. The Groups tab and
|
|
/// Create Nests both use this, so they always agree.
|
|
/// </summary>
|
|
public static class BomImportGroups
|
|
{
|
|
/// <summary>
|
|
/// Returns the groups of <see cref="BomRowStatus.Ready"/> rows. Material
|
|
/// is compared case-insensitively. Groups are ordered by material, then
|
|
/// thickness.
|
|
/// </summary>
|
|
public static List<BomImportGroup> Build(IEnumerable<BomPartRow> rows)
|
|
{
|
|
return rows.Where(p => p.Status == BomRowStatus.Ready)
|
|
.GroupBy(p => new
|
|
{
|
|
Material = p.Material.ToUpperInvariant(),
|
|
Thickness = p.Thickness.Value,
|
|
})
|
|
.OrderBy(g => g.First().Material)
|
|
.ThenBy(g => g.Key.Thickness)
|
|
.Select(g => new BomImportGroup(g.First().Material, g.Key.Thickness, g.ToList()))
|
|
.ToList();
|
|
}
|
|
|
|
/// <summary>
|
|
/// The key that identifies a group's plate settings across regrouping.
|
|
/// </summary>
|
|
public static string Key(string material, double thickness) =>
|
|
$"{material?.ToUpperInvariant()}|{thickness}";
|
|
}
|