Loading files
This file is pinned to the selected release. Download the original to open it in your design tool.
using GerberLibrary.Core.Primitives;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
namespace GerberLibrary
{
public class GerberNumberPair
{
public string Orig = "";
public double Number;
public string Command = "";
public void Parse(string running, GerberNumberFormat form, bool hasdecimalpoint = false)
{
if (Command == "G" || Command == "D" || Command == "M" || Command == "R")
{
Number = (double)Int32.Parse(running);
}
else
{
Number = form.Decode(running, hasdecimalpoint);
}
}
public override string ToString()
{
return $"{Command}{Number}";
}
}
public class GerberNumberPairList
{
public string Command = "";
public string Orig = "";
public List<GerberNumberPair> Numbers = new List<GerberNumberPair>();
public void Parse(string running, GerberNumberFormat form)
{
GerberNumberPair GNP = new GerberNumberPair();
GNP.Orig = Orig;
GNP.Command = Command;
GNP.Parse(running, form);
Numbers.Add(GNP);
}
}
public class GerberSplitter
{
GerberNumberPair GNP = new GerberNumberPair();
List<String> CommandsInOrder = new List<string>();
public Dictionary<string, GerberNumberPair> Pairs = new Dictionary<string, GerberNumberPair>();
public double Get(string n)
{
if (Pairs.ContainsKey(n)) return Pairs[n].Number;
return -1;
}
public bool Has(string n)
{
return Pairs.ContainsKey(n);
}
public void Split(string p, GerberNumberFormat form, bool finddecimalpoint = false)
{
// StandardConsoleLog L = new StandardConsoleLog();
// L.PushActivity("Split");
if (p.Length < 2) return;
try
{
if (p.Substring(0, 3) == "G04")
{
GNP.Command = "G";
GNP.Number = 4;
Pairs[GNP.Command] = GNP;
CommandsInOrder.Add(GNP.Command);
// line is a comment!
// Console.WriteLine("comment: {0}", p.Substring(3));
// L.PopActivity();
return;
}
bool wasnumber = false;
bool isnumber = false;
// bool hasdecimalpoint = false;
string running = "";
for (int i = 0; i < p.Length; i++)
{
char current = p[i];
// L.AddString(p[i].ToString());
if (char.IsNumber(current) || current == '+' || current == '-' || current == '.')
{
isnumber = true;
// L.AddString(p[i].ToString() +" is a number" );
}
else
{
isnumber = false;
// L.AddString(p[i].ToString() + " is not a number");
}
if (isnumber != wasnumber)
{
// L.AddString("number state change!");
if (isnumber)
{
// L.AddString("Setting up running command: " + running);
GNP.Command = running;
GNP.Orig = running;
}
else
{
// L.AddString("trying to parse" + running);
GNP.Orig += running;
GNP.Parse(running, form, finddecimalpoint);
Pairs[GNP.Command] = GNP;
CommandsInOrder.Add(GNP.Command);
GNP = new GerberNumberPair();
}
wasnumber = isnumber;
running = "";
}
if (current != '+') running += current;
}
if (GNP.Command.Length > 0)
{
GNP.Parse(running, form, finddecimalpoint);
Pairs[GNP.Command] = GNP;
CommandsInOrder.Add(GNP.Command);
}
}
catch (Exception)
{
Console.WriteLine("this line does not seem to contain gerber: {0}", p);
}
// L.PopActivity();
}
public void Set(string name, double val)
{
if (Has(name) == false)
{
Pairs[name] = new GerberNumberPair();
Pairs[name].Command = name;
CommandsInOrder.Add(name);
}
Pairs[name].Number = val;
}
public string Rebuild(GerberNumberFormat form)
{
string Res = "";
if ((Has("X") || Has("Y")) && Has("D"))
{
CommandsInOrder.Remove("X");
CommandsInOrder.Remove("Y");
CommandsInOrder.Remove("I");
CommandsInOrder.Remove("J");
CommandsInOrder.Remove("D");
if (Has("X")) CommandsInOrder.Add("X");
if (Has("Y")) CommandsInOrder.Add("Y");
if (Has("I")) CommandsInOrder.Add("I");
if (Has("J")) CommandsInOrder.Add("J");
CommandsInOrder.Add("D");
}
else
{
if (Has("D") && Get("D") < 10)
{
CommandsInOrder.Remove("D");
CommandsInOrder.Add("D");
}
}
foreach (var a in CommandsInOrder)
{
if (a == "D" || a == "G" || a == "M")
{
Res += a;
Res += ((int)Get(a)).ToString("D2");
}
else
{
bool Write = true;
if (a == "J" || a == "I")
{
string R = form.Format(Get(a));
int zerocount = 0;
for (int i = 0; i < R.Count(); i++) if (R[i] == '0') zerocount++;
if (zerocount == R.Count()) Write = false;
}
if (Write)
{
Res += a;
Res += form.Format(Get(a));
}
}
}
return Res + "*";
}
internal void ScaleToMM(GerberNumberFormat gerberNumberFormat)
{
foreach (var a in Pairs)
{
switch (a.Value.Command)
{
case "X":
case "Y":
case "I":
case "J":
a.Value.Number = gerberNumberFormat.ScaleFileToMM(a.Value.Number);
break;
}
}
}
internal void ScaleToFile(GerberNumberFormat GNF)
{
foreach (var a in Pairs)
{
switch (a.Value.Command)
{
case "X":
case "Y":
case "I":
case "J":
a.Value.Number = GNF._ScaleMMToFile(a.Value.Number);
break;
}
}
}
public double GetByLastChar(string p)
{
foreach (var a in Pairs)
{
if (a.Key.Last() == p.Last())
{
return a.Value.Number;
}
}
return -1;
}
void MirrorIfExist(string N)
{
if (Has(N))
{
Set(N, -Get(N));
}
}
internal void ApplyMirroring(GerberParserState state)
{
if (state.MirrorA)
{
switch (state.AAxis)
{
case GerberParserState.AxisName.X: MirrorIfExist("X"); break;
case GerberParserState.AxisName.Y: MirrorIfExist("Y"); break;
}
}
if (state.MirrorB)
{
switch (state.BAxis)
{
case GerberParserState.AxisName.X: MirrorIfExist("X"); break;
case GerberParserState.AxisName.Y: MirrorIfExist("Y") ; break;
}
}
}
}
public class GerberListSplitter
{
GerberNumberPair GNP = new GerberNumberPair();
List<String> CommandsInOrder = new List<string>();
Dictionary<string, GerberNumberPairList> Pairs = new Dictionary<string, GerberNumberPairList>();
public double Get(string n, int i = 0)
{
if (Pairs.ContainsKey(n)) return Pairs[n].Numbers[i].Number;
return -1;
}
public bool Has(string n)
{
return Pairs.ContainsKey(n);
}
internal void Split(string p, GerberNumberFormat form, bool hasdecimalpoint = false)
{
try
{
bool wasnumber = false;
bool isnumber = false;
string running = "";
for (int i = 0; i < p.Length; i++)
{
char current = p[i];
if (char.IsNumber(current) || current == '+' || current == '-' || (hasdecimalpoint && current == '.'))
{
isnumber = true;
}
else
{
isnumber = false;
}
if (isnumber != wasnumber)
{
if (isnumber)
{
GNP.Command = running;
GNP.Orig = running;
}
else
{
GNP.Orig += running;
GNP.Parse(running, form, hasdecimalpoint);
if (Pairs.ContainsKey(GNP.Command) == false)
{
GerberNumberPairList GNPL = new GerberNumberPairList();
GNPL.Command = GNP.Command;
GNPL.Orig = GNP.Orig;
Pairs[GNP.Command] = GNPL;
}
Pairs[GNP.Command].Numbers.Add(GNP);
CommandsInOrder.Add(GNP.Command);
GNP = new GerberNumberPair();
}
wasnumber = isnumber;
running = "";
}
if (current != '+') running += current;
}
if (GNP.Command.Length > 0)
{
GNP.Parse(running, form, hasdecimalpoint);
if (Pairs.ContainsKey(GNP.Command) == false)
{
GerberNumberPairList GNPL = new GerberNumberPairList();
GNPL.Command = GNP.Command;
GNPL.Orig = GNP.Orig;
Pairs[GNP.Command] = GNPL;
}
Pairs[GNP.Command].Numbers.Add(GNP);
CommandsInOrder.Add(GNP.Command);
}
}
catch (Exception)
{
Console.WriteLine("this line does not seem to contain gerber: {0}", p);
}
}
internal void Set(string name, double val)
{
if (Has(name) == false)
{
Pairs[name] = new GerberNumberPairList();
Pairs[name].Command = name;
}
Pairs[name].Numbers.Add(new GerberNumberPair() { Number = val, Command = name, Orig = name });
}
public string Rebuild(GerberNumberFormat form)
{
string Res = "";
if ((Has("X") || Has("Y")) && Has("D"))
{
CommandsInOrder.Remove("X");
CommandsInOrder.Remove("Y");
CommandsInOrder.Remove("I");
CommandsInOrder.Remove("J");
CommandsInOrder.Remove("D");
if (Has("X")) CommandsInOrder.Add("X");
if (Has("Y")) CommandsInOrder.Add("Y");
if (Has("I")) CommandsInOrder.Add("I");
if (Has("J")) CommandsInOrder.Add("J");
CommandsInOrder.Add("D");
}
foreach (var a in CommandsInOrder)
{
Res += a;
if (a == "D" || a == "G" || a == "M")
{
Res += ((int)Get(a)).ToString("D2");
}
else
{
Res += form.Format(Get(a));
}
}
return Res + "*";
}
internal void ScaleToMM(GerberNumberFormat gerberNumberFormat)
{
foreach (var a in Pairs)
{
switch (a.Value.Command)
{
case "X":
case "Y":
case "I":
case "J":
foreach (var p in a.Value.Numbers)
{
p.Number = gerberNumberFormat.ScaleFileToMM(p.Number);
}
break;
}
}
}
internal void ScaleToFile(GerberNumberFormat GNF)
{
foreach (var a in Pairs)
{
switch (a.Value.Command)
{
case "X":
case "Y":
case "I":
case "J":
foreach (var p in a.Value.Numbers)
{
p.Number = GNF._ScaleMMToFile(p.Number);
}
break;
}
}
}
public double GetByLastChar(string p)
{
foreach (var a in Pairs)
{
if (a.Key.Last() == p.Last())
{
return Get(a.Key);
}
}
return -1;
}
int GetCommandIndex(string p1)
{
for (int i = 0; i < CommandsInOrder.Count; i++)
{
if (CommandsInOrder[i] == p1) return i;
}
return -1;
}
internal double GetBefore(string p1, string p2)
{
if (HasBefore(p1, p2)) return Get(p2);//
return -1;
}
internal bool HasBefore(string p1, string p2)
{
int i2 = GetCommandIndex(p2);
if (i2 == -1) return false;
int i1 = GetCommandIndex(p1);
if (i1 == -1) return true;
if (i2 < i1) return true;
return false;
}
internal double GetAfter(string p1, string p2)
{
if (HasAfter(p1, p2) == false) return -1;
int i1 = GetCommandIndex(p1);
int index = 0;
for (int i = 0; i < CommandsInOrder.Count; i++)
{
if (CommandsInOrder[i] == p2)
{
if (i > i1) return Get(p2, index);
index++;
}
}
return -1;
}
internal bool HasAfter(string p1, string p2)
{
int i1 = GetCommandIndex(p1);
if (i1 == -1) return false;
for (int i = i1; i < CommandsInOrder.Count; i++)
{
if (CommandsInOrder[i] == p2)
{
return true;
}
}
return false;
}
}
}
5203ce801This file is pinned to the selected release. Download the original to open it in your design tool.