private static void PerformFlash(GerberLayer gl, PointF currentPos, string currentPenString) { // Flash at current position // This could also be a rectangular shape if (gl._apertures[currentPenString].GetApertureType() == ApertureData.ApertureType.Rectangular) { var ad = (ApertureDataRect)gl._apertures[currentPenString]; var rect = new PcbRect { Left = currentPos.X - ad.Width / 2.0f, Top = currentPos.Y - ad.Height / 2.0f, Width = ad.Width, Height = ad.Height }; gl.PcbShapes.Add(rect); } else if (gl._apertures[currentPenString].GetApertureType() == ApertureData.ApertureType.Circle) { var ad = (ApertureDataCircle)gl._apertures[currentPenString]; var circle = new PcbEllipse { Left = currentPos.X - ad.Diameter / 2.0f, Top = currentPos.Y - ad.Diameter / 2.0f, Width = ad.Diameter, Height = ad.Diameter }; gl.PcbShapes.Add(circle); } else if (gl._apertures[currentPenString].GetApertureType() == ApertureData.ApertureType.Oval) { var ad = (ApertureDataOval)gl._apertures[currentPenString]; var oval = new PcbEllipse { Left = currentPos.X - ad.Width / 2.0f, Top = currentPos.Y - ad.Height / 2.0f, Width = ad.Width, Height = ad.Height }; gl.PcbShapes.Add(oval); } }
public void LoadLayerDataFromFile(string filename) { // Read from file string[] fileContent = File.ReadAllLines(filename); // Use the . as decimal separator (in german culture this would be ,) var nfi = new NumberFormatInfo { NumberDecimalSeparator = "." }; // This holds the current position var currentPos = new PointF(); // "" means "default, non given" string currentPenString = ""; // Set the default aperture _apertures.Add("", new ApertureDataCircle(0.1f)); #region decoding lines); foreach (string line in fileContent) { if (line.StartsWith("D89")) { // Not needed continue; } Match m = Regex.Match(line, @"M02*"); if (m.Success) { continue; } m = Regex.Match(line, @"^D03*"); if (m.Success) { PerformFlash(this, currentPos, currentPenString); continue; } m = Regex.Match(line, @"^%ADD(?<number>[0-9]*)C,(?<valuec>[-+]?[0-9]*\.?[0-9]+)\*"); if (m.Success) { ApertureData ad = new ApertureDataCircle(float.Parse(m.Groups["valuec"].Captures[0].Value, nfi)); _apertures.Add(m.Groups["number"].Captures[0].Value, ad); continue; } m = Regex.Match(line, @"^%ADD(?<number>[0-9]*)R,(?<valuex>[-+]?[0-9]*\.?[0-9]+)X(?<valuey>[-+]?[0-9]*\.?[0-9]+)\*"); if (m.Success) { ApertureData ad = new ApertureDataRect(float.Parse(m.Groups["valuex"].Captures[0].Value, nfi), float.Parse(m.Groups["valuey"].Captures[0].Value, nfi)); _apertures.Add(m.Groups["number"].Captures[0].Value, ad); continue; } m = Regex.Match(line, @"^%ADD(?<number>[0-9]*)O,(?<valuex>[-+]?[0-9]*\.?[0-9]+)X(?<valuey>[-+]?[0-9]*\.?[0-9]+)\*"); if (m.Success) { ApertureData ad = new ApertureDataOval(float.Parse(m.Groups["valuex"].Captures[0].Value, nfi), float.Parse(m.Groups["valuey"].Captures[0].Value, nfi)); _apertures.Add(m.Groups["number"].Captures[0].Value, ad); continue; } // there are two commands which select a drawing tool: G54Dxx* or Dxx* bool bSelectNewAperture = false; m = Regex.Match(line, @"^D(?<number>[0-9]*)\*"); if (m.Success) { bSelectNewAperture = true; } else { m = Regex.Match(line, @"^G54D(?<number>[0-9]*)\*"); if (m.Success) { bSelectNewAperture = true; } } if (bSelectNewAperture) { string number = m.Groups["number"].Captures[0].Value; if (_apertures.ContainsKey(number)) { switch (_apertures[number].GetApertureType()) { case ApertureData.ApertureType.Circle: currentPenString = number; break; case ApertureData.ApertureType.Rectangular: currentPenString = number; break; case ApertureData.ApertureType.Oval: currentPenString = number; break; default: currentPenString = ""; break; } } else { // Revert to default, this should be rather seldom currentPenString = ""; } continue; } m = Regex.Match(line, @"^D01\*"); if (m.Success) { continue; } m = Regex.Match(line, @"^X(?<valuex>[-+]?[0-9]*\.?[0-9]+)Y(?<valuey>[-+]?[0-9]*\.?[0-9]+)I(?<valuei>[-+]?[0-9]*\.?[0-9]+)J(?<valuej>[-+]?[0-9]*\.?[0-9]+)D01*"); if (m.Success) { float x = float.Parse(m.Groups["valuex"].Captures[0].Value) / 1000.0f; float y = float.Parse(m.Groups["valuey"].Captures[0].Value) / 1000.0f; double width = currentPos.X - x; double height = currentPos.Y - y; // The following if limits to pure circles (no arcs are currently supported) if (width < 0.001 && height < 0.001) { // Add a circle var ellipse = new PcbEllipse { Left = currentPos.X - 0.2f, Top = currentPos.Y - 0.2f, Width = 0.4f, Height = 0.4f }; PcbShapes.Add(ellipse); } currentPos.X = x; currentPos.Y = y; continue; } m = Regex.Match(line, @"^X(?<valuex>[-+]?[0-9]*\.?[0-9]+)Y(?<valuey>[-+]?[0-9]*\.?[0-9]+)\*"); if (m.Success) { float x = float.Parse(m.Groups["valuex"].Captures[0].Value) / 1000.0f; float y = float.Parse(m.Groups["valuey"].Captures[0].Value) / 1000.0f; AddSimpleLine(this, currentPos.X, currentPos.Y, x, y, GetCurrentDiameter(this, currentPenString)); currentPos.X = x; currentPos.Y = y; continue; } m = Regex.Match(line, @"^X(?<valuex>[-+]?[0-9]*\.?[0-9]+)Y(?<valuey>[-+]?[0-9]*\.?[0-9]+)D01\*"); if (m.Success) { float x = float.Parse(m.Groups["valuex"].Captures[0].Value) / 1000.0f; float y = float.Parse(m.Groups["valuey"].Captures[0].Value) / 1000.0f; AddSimpleLine(this, currentPos.X, currentPos.Y, x, y, GetCurrentDiameter(this, currentPenString)); currentPos.X = x; currentPos.Y = y; continue; } m = Regex.Match(line, @"^X(?<valuex>[-+]?[0-9]*\.?[0-9]+)Y(?<valuey>[-+]?[0-9]*\.?[0-9]+)D02\*"); if (m.Success) { currentPos.X = float.Parse(m.Groups["valuex"].Captures[0].Value) / 1000.0f; currentPos.Y = float.Parse(m.Groups["valuey"].Captures[0].Value) / 1000.0f; continue; } m = Regex.Match(line, @"^X(?<valuex>[-+]?[0-9]*\.?[0-9]+)Y(?<valuey>[-+]?[0-9]*\.?[0-9]+)D03\*"); if (m.Success) { float x = float.Parse(m.Groups["valuex"].Captures[0].Value) / 1000.0f; float y = float.Parse(m.Groups["valuey"].Captures[0].Value) / 1000.0f; currentPos.X = x; currentPos.Y = y; PerformFlash(this, currentPos, currentPenString); continue; } m = Regex.Match(line, @"^X(?<valuex>[-+]?[0-9]*\.?[0-9]+)\*"); if (m.Success) { float x = float.Parse(m.Groups["valuex"].Captures[0].Value) / 1000.0f; AddSimpleLine(this, currentPos.X, currentPos.Y, x, currentPos.Y, GetCurrentDiameter(this, currentPenString)); currentPos.X = x; continue; } m = Regex.Match(line, @"^X(?<valuex>[-+]?[0-9]*\.?[0-9]+)D01\*"); if (m.Success) { float x = float.Parse(m.Groups["valuex"].Captures[0].Value) / 1000.0f; AddSimpleLine(this, currentPos.X, currentPos.Y, x, currentPos.Y, GetCurrentDiameter(this, currentPenString)); currentPos.X = x; continue; } m = Regex.Match(line, @"^X(?<valuex>[-+]?[0-9]*\.?[0-9]+)D02\*"); if (m.Success) { float x = float.Parse(m.Groups["valuex"].Captures[0].Value) / 1000.0f; currentPos.X = x; continue; } m = Regex.Match(line, @"^X(?<valuex>[-+]?[0-9]*\.?[0-9]+)D03\*"); if (m.Success) { float x = float.Parse(m.Groups["valuex"].Captures[0].Value) / 1000.0f; currentPos.X = x; PerformFlash(this, currentPos, currentPenString); continue; } m = Regex.Match(line, @"^Y(?<valuey>[-+]?[0-9]*\.?[0-9]+)\*"); if (m.Success) { float y = float.Parse(m.Groups["valuey"].Captures[0].Value) / 1000.0f; AddSimpleLine(this, currentPos.X, currentPos.Y, currentPos.X, y, GetCurrentDiameter(this, currentPenString)); currentPos.Y = y; continue; } m = Regex.Match(line, @"^Y(?<valuey>[-+]?[0-9]*\.?[0-9]+)D01\*"); if (m.Success) { float y = float.Parse(m.Groups["valuey"].Captures[0].Value) / 1000.0f; AddSimpleLine(this, currentPos.X, currentPos.Y, currentPos.X, y, GetCurrentDiameter(this, currentPenString)); currentPos.Y = y; continue; } m = Regex.Match(line, @"^Y(?<valuey>[-+]?[0-9]*\.?[0-9]+)D02\*"); if (m.Success) { float y = float.Parse(m.Groups["valuey"].Captures[0].Value) / 1000.0f; currentPos.Y = y; continue; } m = Regex.Match(line, @"^Y(?<valuey>[-+]?[0-9]*\.?[0-9]+)D03\*"); if (m.Success) { float y = float.Parse(m.Groups["valuey"].Captures[0].Value) / 1000.0f; currentPos.Y = y; PerformFlash(this, currentPos, currentPenString); continue; } Logger.Debug("Ignoring line: " + line); } #endregion }