134 lines
3.0 KiB
C#
134 lines
3.0 KiB
C#
using System;
|
||
using System.IO;
|
||
using PepLib.Codes;
|
||
|
||
namespace PepLib.IO
|
||
{
|
||
internal sealed class LoopReader
|
||
{
|
||
public Loop Loop { get; private set; }
|
||
|
||
public LoopReader()
|
||
{
|
||
Loop = new Loop();
|
||
}
|
||
|
||
public LoopReader(Loop loop)
|
||
{
|
||
Loop = loop;
|
||
}
|
||
|
||
public void Read(string name, Stream stream)
|
||
{
|
||
var pgm = Program.Load(stream);
|
||
|
||
Loop.Name = name;
|
||
Loop.AddRange(pgm);
|
||
LoadInfo();
|
||
}
|
||
|
||
private void LoadInfo()
|
||
{
|
||
for (int i = Loop.Count - 1; i >= 0; --i)
|
||
{
|
||
var code = Loop[i];
|
||
|
||
if (code.CodeType() != CodeType.Comment)
|
||
continue;
|
||
|
||
var comment = (Comment)code;
|
||
|
||
if (LoadInfo(comment.Value))
|
||
Loop.RemoveAt(i);
|
||
}
|
||
}
|
||
|
||
private bool LoadInfo(string value)
|
||
{
|
||
if (value.StartsWith("REF"))
|
||
{
|
||
ParseReferenceData(value);
|
||
return true;
|
||
}
|
||
|
||
if (value.StartsWith("DRAWING"))
|
||
{
|
||
ParseDrawingData(value);
|
||
return true;
|
||
}
|
||
|
||
if (value.StartsWith("DXF"))
|
||
{
|
||
ParseDxfData(value);
|
||
return true;
|
||
}
|
||
|
||
return false;
|
||
}
|
||
|
||
private void ParseReferenceData(string data)
|
||
{
|
||
var parts = data.Split(',');
|
||
|
||
if (parts.Length != 3)
|
||
return;
|
||
|
||
int xindex = parts[0].IndexOf('X');
|
||
parts[0] = parts[0].Remove(0, xindex);
|
||
|
||
double x = 0;
|
||
double y = 0;
|
||
|
||
var xsplit = parts[0].Split('=');
|
||
|
||
if (xsplit.Length == 2)
|
||
x = ReadDouble(xsplit[1]);
|
||
|
||
var ysplit = parts[1].Split('=');
|
||
|
||
if (ysplit.Length == 2)
|
||
y = ReadDouble(ysplit[1]);
|
||
|
||
var datesplit = parts[2].Split('=');
|
||
|
||
if (datesplit.Length == 2)
|
||
{
|
||
DateTime date;
|
||
DateTime.TryParse(datesplit[1], out date);
|
||
Loop.LastReferenceDate = date;
|
||
}
|
||
|
||
Loop.ReferencePoint = new Vector(x, y);
|
||
}
|
||
|
||
private void ParseDrawingData(string data)
|
||
{
|
||
var index = data.IndexOf('=');
|
||
|
||
if (index == -1)
|
||
Loop.DrawingName = string.Empty;
|
||
|
||
Loop.DrawingName = data.Remove(0, index + 1).Trim();
|
||
}
|
||
|
||
private void ParseDxfData(string data)
|
||
{
|
||
var index = data.IndexOf('=');
|
||
|
||
if (index == -1)
|
||
Loop.DxfPath = string.Empty;
|
||
|
||
Loop.DxfPath = data.Remove(0, index + 1).Trim();
|
||
}
|
||
|
||
private static double ReadDouble(string s, double defaultValue = 0.0)
|
||
{
|
||
double f;
|
||
|
||
if (!double.TryParse(s, out f))
|
||
return defaultValue;
|
||
|
||
return f;
|
||
}
|
||
}
|
||
} |