338 lines
9.2 KiB
C#
338 lines
9.2 KiB
C#
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;
|
||
}
|
||
}
|
||
} |