Files
PepApi.Core/PepLib.Core/IO/PlateReader.cs
2025-10-27 18:48:23 -04:00

338 lines
9.2 KiB
C#
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System.IO;
using PepLib.Codes;
namespace PepLib.IO
{
internal sealed class PlateReader
{
public Plate Plate { get; private set; }
public PlateReader()
{
Plate = new Plate();
Plate.Duplicates = 1;
}
public PlateReader(Plate plate)
{
Plate = plate;
}
public void Read(string name, Stream stream, Nest nest)
{
var pos = new Vector(0, 0);
var pgm = Program.Load(stream);
Plate.Name = name;
for (int i = 0; i < pgm.Count; i++)
{
var block = pgm[i];
switch (block.CodeType())
{
case CodeType.CircularMove:
{
var arc = (CircularMove)block;
pos = arc.EndPoint;
break;
}
case CodeType.LinearMove:
{
var line = (LinearMove)block;
pos = line.EndPoint;
break;
}
case CodeType.RapidMove:
{
var rapid = (RapidMove)block;
pos = rapid.EndPoint;
break;
}
case CodeType.Comment:
{
var comment = (Comment)block;
LoadInfo(comment.Value);
break;
}
case CodeType.SubProgramCall:
{
var subpgm = (SubProgramCall)block;
var loop = nest.GetLoop(subpgm.LoopId);
var part = Part.Create(loop, pos, AngleConverter.ToRadians(subpgm.Rotation));
var nextBlock = pgm[i + 1];
if (nextBlock.CodeType() == CodeType.Comment)
{
var comment = nextBlock as Comment;
if (comment.Value == "DISPLAY ONLY")
{
part.IsDisplayOnly = true;
i++;
}
}
Plate.Parts.Add(part);
break;
}
}
}
}
private void LoadInfo(string value)
{
if (value.StartsWith("POSTED FILES"))
ParsePostedFiles(value);
else if (value.StartsWith("HEAT LOT"))
ParseHeatLot(value);
else if (value.StartsWith("SPACING"))
ParseSpacing(value);
else if (value.StartsWith("CUT A TOTAL OF "))
ParseNumberOfDuplicates(value);
else if (value.StartsWith("EDGES,"))
ParseEdgeSpacing(value);
else if (value.StartsWith("PLATE SCALING"))
ParsePlateSize(value);
else if (value.StartsWith("MACHINE"))
ParseMachine(value);
else if (value.StartsWith("MATERIAL"))
ParseMaterial(value);
else if (value.StartsWith("GRADE"))
ParseGrade(value);
else if (value.StartsWith("DESCRIPTION"))
ParseDescription(value);
else if (value.StartsWith("PLATE THICKNESS"))
ParseThickness(value);
else if (value.StartsWith("DENSITY"))
ParseDensity(value);
else if (value.StartsWith("TORCHES"))
ParseTorchCount(value);
}
private void ParseNumberOfDuplicates(string data)
{
var parts = data.Split(' ');
if (parts.Length != 7)
return;
int dup;
int.TryParse(parts[4], out dup);
Plate.Duplicates = dup;
}
private void ParsePostedFiles(string data)
{
if (data.Length < 14)
return;
Plate.PostedFiles = data.Remove(0, 14).Trim();
}
private void ParseHeatLot(string data)
{
if (data.Length < 9)
return;
Plate.HeatLot = data.Remove(0, 9).Trim();
}
private void ParseSpacing(string data)
{
var parts = data.Split('=');
if (parts.Length != 2)
return;
double spacing;
double.TryParse(parts[1], out spacing);
Plate.PartSpacing = spacing;
}
private void ParseEdgeSpacing(string data)
{
var parts = data.Split(',');
if (parts.Length != 5)
return;
var leftSplit = parts[1].Split('=');
if (leftSplit.Length == 2)
{
double x;
double.TryParse(leftSplit[1], out x);
Plate.EdgeSpacing.Left = x;
}
var bottomSplit = parts[2].Split('=');
if (bottomSplit.Length == 2)
{
double x;
double.TryParse(bottomSplit[1], out x);
Plate.EdgeSpacing.Bottom = x;
}
var rightSplit = parts[3].Split('=');
if (rightSplit.Length == 2)
{
double x;
double.TryParse(rightSplit[1], out x);
Plate.EdgeSpacing.Right = x;
}
var topSplit = parts[4].Split('=');
if (topSplit.Length == 2)
{
double x;
double.TryParse(topSplit[1], out x);
Plate.EdgeSpacing.Top = x;
}
}
private void ParsePlateSize(string data)
{
var quadrantIndex = data.IndexOf("QUADRANT");
if (quadrantIndex != -1)
{
var plateData = data.Remove(quadrantIndex);
var plateDataSplit = plateData.Split('=');
if (plateDataSplit.Length == 2)
{
Size plateSize;
Size.TryParse(plateDataSplit[1], out plateSize);
Plate.Size = plateSize;
}
var quadrantData = data.Remove(0, quadrantIndex);
var quadrantDataSplit = quadrantData.Split('=');
if (quadrantDataSplit.Length == 2)
{
int quadrant;
int.TryParse(quadrantDataSplit[1], out quadrant);
Plate.Quadrant = quadrant;
}
}
else
{
var plateDataSplit = data.Split('=');
if (plateDataSplit.Length == 2)
{
Size plateSize;
Size.TryParse(plateDataSplit[1], out plateSize);
Plate.Size = plateSize;
}
}
}
private void ParseMachine(string data)
{
var parts = data.Split(',');
if (parts.Length != 2)
return;
var machineSplit = parts[0].Split('=');
if (machineSplit.Length == 2)
{
int num;
int.TryParse(machineSplit[1], out num);
Plate.Machine.Id = num;
}
Plate.Machine.Name = parts[1].Trim();
}
private void ParseMaterial(string data)
{
var parts = data.Split('=');
if (parts.Length != 2)
return;
int material;
int.TryParse(parts[1], out material);
Plate.Material.Id = material;
}
private void ParseGrade(string data)
{
var parts = data.Split('=');
if (parts.Length != 2)
return;
Plate.Material.Grade = parts[1].Trim();
}
private void ParseDescription(string data)
{
var parts = data.Split('=');
if (parts.Length != 2)
return;
Plate.Description = parts[1].Trim();
}
private void ParseThickness(string data)
{
var parts = data.Split('=');
if (parts.Length != 2)
return;
double thickness;
double.TryParse(parts[1], out thickness);
Plate.Thickness = thickness;
}
private void ParseDensity(string data)
{
var parts = data.Split('=');
if (parts.Length != 2)
return;
double density;
double.TryParse(parts[1], out density);
Plate.Material.Density = density;
}
private void ParseTorchCount(string data)
{
var parts = data.Split('=');
if (parts.Length != 2)
return;
int torchCount;
int.TryParse(parts[1], out torchCount);
Plate.TorchCount = torchCount;
}
}
}