Files
CincyLib/CincyLib/Laser/MaterialLibReader.cs
2018-11-16 08:25:17 -05:00

185 lines
6.2 KiB
C#

using System;
using System.Diagnostics;
using System.IO;
using System.Text;
namespace CincyLib.Laser
{
internal sealed class MaterialLibReader
{
public readonly MaterialLib MaterialLib;
public MaterialLibReader()
{
MaterialLib = new MaterialLib();
}
public MaterialLibReader(MaterialLib materiallib)
{
MaterialLib = materiallib;
}
public void Read(string file)
{
using (var stream = File.OpenRead(file))
{
MaterialLib.Path = file;
Read(stream);
}
}
public void Read(Stream stream)
{
var reader = new BinaryReader(stream);
MaterialLib.Machine = reader.ReadString();
MaterialLib.PierceDwell = Math.Round(reader.ReadSingle(), 4);
reader.BaseStream.Seek(2, SeekOrigin.Current); // Unknown 2 bytes
MaterialLib.PiercePower = reader.ReadInt16();
MaterialLib.PierceFrequency = reader.ReadInt16();
MaterialLib.PierceDutyCycle = reader.ReadInt16();
var pierceType = reader.ReadByte();
switch (pierceType)
{
case 0:
MaterialLib.PierceType = PierceType.NoPierce;
break;
case 1:
MaterialLib.PierceType = PierceType.RampedPower;
break;
}
reader.BaseStream.Seek(1, SeekOrigin.Current); // Unknown 1 byte
MaterialLib.PierceNozzleStandoffRampFrom = Math.Round(reader.ReadSingle(), 4);
MaterialLib.RampedPierceCoolingTime = Math.Round(reader.ReadSingle(), 4);
MaterialLib.UsePartCoolantOnPierce = Convert.ToBoolean(reader.ReadInt16());
MaterialLib.PierceAssistGas = (AssistGasType)reader.ReadInt16();
MaterialLib.PierceAssistGasPressure = reader.ReadInt16();
MaterialLib.PreCutDwellSeconds = Math.Round(reader.ReadSingle(), 4);
reader.BaseStream.Seek(2, SeekOrigin.Current); // Unknown 2 bytes
MaterialLib.Power = reader.ReadInt16();
MaterialLib.Frequency = reader.ReadInt16();
MaterialLib.DutyCycle = reader.ReadInt16();
MaterialLib.DynamicPowerControl = Convert.ToBoolean(reader.ReadInt16());
MaterialLib.DPCFeedrate = reader.ReadInt16();
MaterialLib.DPCMinPower = reader.ReadInt16();
reader.BaseStream.Seek(4, SeekOrigin.Current); // Unknown 4 bytes
MaterialLib.NozzleStandoff1 = Math.Round(reader.ReadSingle(), 4);
MaterialLib.KerfWidth = Math.Round(reader.ReadSingle(), 4);
reader.BaseStream.Seek(2, SeekOrigin.Current); // Unknown 2 bytes
MaterialLib.AssistGas = (AssistGasType)reader.ReadInt16();
MaterialLib.AssistGasPressure1 = reader.ReadInt16();
MaterialLib.AssistGasPressure2 = reader.ReadInt16();
MaterialLib.DynamicAssistGas = Convert.ToBoolean(reader.ReadInt16());
reader.BaseStream.Seek(4, SeekOrigin.Current); // Unknown 4 bytes
var steps = reader.ReadInt16();
reader.BaseStream.Seek(4, SeekOrigin.Current); // Unknown 4 bytes
MaterialLib.RampedPierceStartPower = reader.ReadInt16();
MaterialLib.RampedPierceSteps = new RampedPierceStep[steps];
for (int i = 0; i < steps; ++i)
{
MaterialLib.RampedPierceSteps[i] = new RampedPierceStep();
MaterialLib.RampedPierceSteps[i].Time = Math.Round(reader.ReadSingle(), 4);
MaterialLib.RampedPierceSteps[i].Power = reader.ReadInt16();
}
const int MAX_STEPS = 20;
var remaining = MAX_STEPS - steps;
reader.BaseStream.Seek(6 * remaining, SeekOrigin.Current);
int length = reader.ReadByte();
if (length == 0xFF)
{
var second = reader.ReadByte();
var third = reader.ReadByte();
length = length * third + second + third;
}
MaterialLib.Notes = Encoding.ASCII.GetString(reader.ReadBytes(length));
reader.BaseStream.Seek(4, SeekOrigin.Current); // Unknown 4 bytes
MaterialLib.Feedrate = reader.ReadInt16();
reader.BaseStream.Seek(424, SeekOrigin.Current);
MaterialLib.NozzleStandoff2 = Math.Round(reader.ReadSingle(), 4);
MaterialLib.CutFocusNearField = Math.Round(reader.ReadSingle(), 4);
MaterialLib.CutFocusFarField = Math.Round(reader.ReadSingle(), 4);
MaterialLib.PierceFocusNearField = Math.Round(reader.ReadSingle(), 4);
MaterialLib.PierceFocusFarField = Math.Round(reader.ReadSingle(), 4);
// older files wont go this far...
const int seek = 76;
var hasExtendedInfo = reader.BaseStream.Length > reader.BaseStream.Position + seek;
if (hasExtendedInfo)
{
reader.BaseStream.Seek(seek, SeekOrigin.Current);
var lensType = reader.ReadByte();
switch (lensType)
{
case 0:
MaterialLib.Lens = "5\"";
break;
case 1:
MaterialLib.Lens = "7.5\"";
break;
case 2:
MaterialLib.Lens = "10\"";
break;
case 3:
MaterialLib.Lens = "Any";
break;
}
reader.BaseStream.Seek(1, SeekOrigin.Current);
MaterialLib.Nozzle = reader.ReadString();
reader.BaseStream.Seek(4, SeekOrigin.Current);
MaterialLib.PierceType = (PierceType)reader.ReadByte();
}
}
}
public enum LensType
{
/// <summary>
/// 5.0" Lens
/// </summary>
_050 = 0,
/// <summary>
/// 7.5" Lens
/// </summary>
_075 = 1,
/// <summary>
/// 10.0" Lens
/// </summary>
_100 = 2,
Any = 3
}
}