public static bool SaveGerberFileToImage(string GerberFilename, string BitmapFilename, float dpi, Color Foreground, Color Background) { try { ParsedGerber PLS; GerberParserState State = new GerberParserState() { PreCombinePolygons = false }; var FileType = Gerber.FindFileType(GerberFilename); Gerber.DetermineBoardSideAndLayer(GerberFilename, out State.Side, out State.Layer); bool forcezero = false; if (State.Layer == BoardLayer.Outline) { // PLS.PreCombinePolygons = true; // forcezero = true; } if (FileType == BoardFileType.Drill) { PLS = PolyLineSet.LoadExcellonDrillFile(GerberFilename); } else { PLS = PolyLineSet.LoadGerberFile(GerberFilename, forcezero, Gerber.WriteSanitized, State); } double WidthInMM = PLS.BoundingBox.BottomRight.X - PLS.BoundingBox.TopLeft.X; double HeightInMM = PLS.BoundingBox.BottomRight.Y - PLS.BoundingBox.TopLeft.Y; int Width = (int)(Math.Ceiling((WidthInMM) * (dpi / 25.4))); int Height = (int)(Math.Ceiling((HeightInMM) * (dpi / 25.4))); Console.WriteLine("Progress: Exporting {0} ({2},{3}mm) to {1} ({4},{5})", GerberFilename, BitmapFilename, WidthInMM, HeightInMM, Width, Height); GerberImageCreator GIC = new GerberImageCreator(); GIC.scale = dpi / 25.4f; // dpi GIC.BoundingBox.AddBox(PLS.BoundingBox); var Tr = GIC.BuildMatrix(Width, Height); Bitmap B2 = GIC.RenderToBitmap(Width, Height, Tr, Foreground, Background, PLS, true); if (B2 == null) { return(false); } B2.Save(BitmapFilename); return(true); } catch (Exception E) { Console.WriteLine("Error: Errors while writing bitmap {0} for gerberfile {1} at dpi {2}:", BitmapFilename, GerberFilename, dpi); while (E != null) { Console.WriteLine("Error: \t{0}", E.Message); E = E.InnerException; } return(false); } }
public static void MergeFrameIntoGerberSet(string FrameFolder, string OutlineFolder, string OutputFolder, FrameSettings FS, ProgressLog log, string basename) { log.PushActivity("MergeFrame"); GerberPanel PNL = new GerberPanel(); PNL.AddGerberFolder(log, FrameFolder); PNL.AddGerberFolder(log, OutlineFolder); PNL.TheSet.ClipToOutlines = false; var FrameInstance = PNL.AddInstance(FrameFolder, new PointD(0, 0)); var OutlineInstance = PNL.AddInstance(OutlineFolder, new PointD(0, 0)); PNL.UpdateShape(log); var BB = OutlineInstance.BoundingBox; foreach (var s in OutlineInstance.TransformedOutlines) { bool ClockWise = s.ClockWise(); if (s.Vertices.Count >= 2) { for (int i = 0; i < s.Vertices.Count; i++) { PointD p1 = s.Vertices[i]; PointD p2 = s.Vertices[(i + 1) % s.Vertices.Count]; var D = p2 - p1; if (Math.Abs(D.X) < 0.5 && Math.Abs(D.Y) >= FS.mmbetweentabs) { // perfect vertical! log.AddString(String.Format("vertical found: {0} -> {1}", p1, p2)); double dy = p2.Y - p1.Y; double x = 0; double rad = 0; bool rightside = (dy > 0); if (ClockWise) { rightside = !rightside; } if (rightside) { x = (p1.X + (BB.BottomRight.X + FS.margin)) / 2; rad = Math.Abs((p1.X - (BB.BottomRight.X + FS.margin))) / 2.0 + FS.margin; } else { x = (p1.X + (BB.TopLeft.X - FS.margin)) / 2; rad = Math.Abs((p1.X - (BB.TopLeft.X - FS.margin))) / 2.0 + FS.margin; } int tabs = (int)Math.Floor(Math.Abs(dy) / FS.mmbetweentabs); for (int j = 0; j < tabs; j++) { double y = p1.Y + (dy / (float)tabs) * (j + 0.5); var BR = PNL.AddTab(new PointD(x, y)); log.AddString(String.Format("tab at {0} - radius {1}", BR.Center, rad)); BR.Radius = (float)rad; } } } } } PNL.UpdateShape(log); Directory.CreateDirectory(OutputFolder); PNL.SaveGerbersToFolder("MergedFrame", OutputFolder, log, true, false, true, basename); log.PopActivity(); // PNL.SaveOutlineTo(OutputFolder, "mergedframeblended"); return; var FrameFiles = Directory.GetFiles(FrameFolder); var OutlineFiles = Directory.GetFiles(OutlineFolder); List <String> AllFiles = new List <string>(); AllFiles.AddRange(FrameFiles); foreach (var a in OutlineFiles) { BoardLayer layer; BoardSide Side; Gerber.DetermineBoardSideAndLayer(a, out Side, out layer); if (layer != BoardLayer.Outline) { AllFiles.Add(a); } } // AllFiles.AddRange(OutlineFiles); GerberMerger.MergeAllByFileType(AllFiles, OutputFolder, "MergedFrame", log); }
public static bool SaveDebugImage(string GerberFilename, string BitmapFilename, float dpi, Color Foreground, Color Background) { ParsedGerber PLS; GerberParserState State = new GerberParserState() { PreCombinePolygons = false }; var FileType = Gerber.FindFileType(GerberFilename); Gerber.DetermineBoardSideAndLayer(GerberFilename, out State.Side, out State.Layer); bool forcezero = false; if (State.Layer == BoardLayer.Outline) { // PLS.PreCombinePolygons = true; // forcezero = true; } if (FileType == BoardFileType.Drill) { PLS = PolyLineSet.LoadExcellonDrillFile(GerberFilename); } else { PLS = PolyLineSet.LoadGerberFile(GerberFilename, forcezero, Gerber.WriteSanitized, State); } double WidthInMM = PLS.BoundingBox.BottomRight.X - PLS.BoundingBox.TopLeft.X; double HeightInMM = PLS.BoundingBox.BottomRight.Y - PLS.BoundingBox.TopLeft.Y; int Width = (int)(Math.Ceiling((WidthInMM) * (dpi / 25.4))); int Height = (int)(Math.Ceiling((HeightInMM) * (dpi / 25.4))); Console.WriteLine("Progress: Exporting {0} ({2},{3}mm) to {1} ({4},{5})", GerberFilename, BitmapFilename, WidthInMM, HeightInMM, Width, Height); GerberImageCreator GIC = new GerberImageCreator(); GIC.scale = dpi / 25.4f; // dpi GIC.BoundingBox.AddBox(PLS.BoundingBox); var Tr = GIC.BuildMatrix(Width, Height); Bitmap B2 = GIC.RenderToBitmap(Width, Height, Tr, Foreground, Background, PLS, true); if (B2 == null) { return(false); } var GerberLines = PolyLineSet.SanitizeInputLines(System.IO.File.ReadAllLines(GerberFilename).ToList()); double LastX = 0; double LastY = 0; Graphics G2 = Graphics.FromImage(B2); GerberImageCreator.ApplyAASettings(G2); //G2.Clear(Background); G2.Transform = Tr.Clone(); foreach (var L in GerberLines) { if (L[0] != '%') { GerberSplitter GS = new GerberSplitter(); GS.Split(L, PLS.State.CoordinateFormat); if (GS.Has("G") && (int)GS.Get("G") == 3) { double X = PLS.State.CoordinateFormat.ScaleFileToMM(GS.Get("X")); double Y = PLS.State.CoordinateFormat.ScaleFileToMM(GS.Get("Y")); double I = PLS.State.CoordinateFormat.ScaleFileToMM(GS.Get("I")); double J = PLS.State.CoordinateFormat.ScaleFileToMM(GS.Get("J")); //Console.WriteLine("Counterclockwise Curve {0},{1} -> {2},{3}", LastX, LastY, X, Y); DrawCross(G2, X, Y, Color.Blue); DrawCross(G2, LastX, LastY, Color.Red); DrawCross(G2, LastX + I, LastY - J, Color.Yellow); DrawCross(G2, LastX + I, LastY + J, Color.Purple); DrawCross(G2, LastX - I, LastY - J, Color.Green); DrawCross(G2, LastX - I, LastY + J, Color.Orange); } if (GS.Has("X")) { LastX = PLS.State.CoordinateFormat.ScaleFileToMM(GS.Get("X")); } if (GS.Has("Y")) { LastY = PLS.State.CoordinateFormat.ScaleFileToMM(GS.Get("Y")); } } } B2.Save(BitmapFilename); return(true); }
public static void MergeFrameIntoGerberSet(string FrameFolder, string OutlineFolder, string OutputFolder, FrameSettings FS, ProgressLog log, string basename) { log.PushActivity("MergeFrame"); // log.AddString("....."); if (Directory.Exists(FrameFolder) == false) { log.AddString(String.Format("Framefolder {0} does not exist?", FrameFolder)); } if (Directory.Exists(OutlineFolder) == false) { log.AddString(String.Format("OutlineFolder {0} does not exist?", OutlineFolder)); } if (Directory.Exists(OutputFolder) == false) { log.AddString(String.Format("OutputFolder {0} does not exist?", OutputFolder)); } GerberPanel PNL = new GerberPanel(); PNL.AddGerberFolder(log, FrameFolder); PNL.AddGerberFolder(log, OutlineFolder); PNL.TheSet.ClipToOutlines = false; var FrameInstance = PNL.AddInstance(FrameFolder, new PointD(0, 0)); var OutlineInstance = PNL.AddInstance(OutlineFolder, new PointD(0, 0)); PNL.UpdateShape(log); var BB = OutlineInstance.BoundingBox; foreach (var s in OutlineInstance.TransformedOutlines) { bool ClockWise = s.ClockWise(); if (s.Vertices.Count >= 2) { for (int i = 0; i < s.Vertices.Count; i++) { PointD p1 = s.Vertices[i]; PointD p2 = s.Vertices[(i + 1) % s.Vertices.Count]; var D = p2 - p1; if (Math.Abs(D.X) < 0.5 && Math.Abs(D.Y) >= FS.mmbetweentabs && FS.VerticalTabs) { // perfect vertical! log.AddString(String.Format("vertical found: {0} -> {1}", p1, p2)); double dy = p2.Y - p1.Y; double x = 0; double rad = 0; bool rightside = (dy > 0); if (ClockWise) { rightside = !rightside; } if (FS.InsideEdgeMode == FrameSettings.InsideMode.RegularEdge) { if (rightside) { x = (p1.X + (BB.BottomRight.X + FS.margin)) / 2; rad = Math.Abs((p1.X - (BB.BottomRight.X + FS.margin))) / 2.0 + FS.margin; } else { x = (p1.X + (BB.TopLeft.X - FS.margin)) / 2; rad = Math.Abs((p1.X - (BB.TopLeft.X - FS.margin))) / 2.0 + FS.margin; } } if (FS.InsideEdgeMode == FrameSettings.InsideMode.FormFitting) { if (rightside) { x = p1.X + (FS.margin / 2); rad = FS.margin; } else { x = p1.X - (FS.margin / 2); rad = FS.margin; } } int tabs = (int)Math.Floor(Math.Abs(dy) / FS.mmbetweentabs); for (int j = 0; j < tabs; j++) { double y = p1.Y + (dy / (float)tabs) * (j + 0.5); var BR = PNL.AddTab(new PointD(x, y)); log.AddString(String.Format("tab at {0} - radius {1}", BR.Center, rad)); BR.Radius = (float)rad; } } if (Math.Abs(D.Y) < 0.5 && Math.Abs(D.X) >= FS.mmbetweentabs && FS.HorizontalTabs) { // perfect vertical! log.AddString(String.Format("horizontal found: {0} -> {1}", p1, p2)); double dx = p2.X - p1.X; double y = 0; double rad = 0; bool rightside = (dx < 0); if (ClockWise) { rightside = !rightside; } if (FS.InsideEdgeMode == FrameSettings.InsideMode.RegularEdge) { if (rightside) { y = (p1.Y + (BB.BottomRight.Y + FS.margin)) / 2; rad = Math.Abs((p1.Y - (BB.BottomRight.Y + FS.margin))) / 2.0 + FS.margin; } else { y = (p1.Y + (BB.TopLeft.Y - FS.margin)) / 2; rad = Math.Abs((p1.Y - (BB.TopLeft.Y - FS.margin))) / 2.0 + FS.margin; } } if (FS.InsideEdgeMode == FrameSettings.InsideMode.FormFitting) { if (rightside) { y = p1.Y + (FS.margin / 2); rad = FS.margin; } else { y = p1.Y - (FS.margin / 2); rad = FS.margin; } } int tabs = (int)Math.Floor(Math.Abs(dx) / FS.mmbetweentabs); for (int j = 0; j < tabs; j++) { double x = p1.X + (dx / (float)tabs) * (j + 0.5); var BR = PNL.AddTab(new PointD(x, y)); log.AddString(String.Format("tab at {0} - radius {1}", BR.Center, rad)); BR.Radius = (float)rad; } } } } } PNL.UpdateShape(log); log.AddString("postupdateshape"); try { Directory.CreateDirectory(OutputFolder); var PNLFiles = PNL.SaveGerbersToFolder("MergedFrame", OutputFolder, log, true, false, true, basename); } catch (Exception E) { log.AddString("save gerbers to folder Exceptions: " + E.ToString()); } try { if (FS.RenderSample) { GerberImageCreator GIC = new GerberImageCreator(); GIC.AddBoardsToSet(Directory.GetFiles(OutputFolder).ToList(), new SilentLog()); GIC.WriteImageFiles(basename, 200, true, false, true, null); } } catch (Exception E) { log.AddString("GIC Exceptions: " + E.ToString()); } log.PopActivity(); // PNL.SaveOutlineTo(OutputFolder, "mergedframeblended"); return; var FrameFiles = Directory.GetFiles(FrameFolder); var OutlineFiles = Directory.GetFiles(OutlineFolder); List <String> AllFiles = new List <string>(); AllFiles.AddRange(FrameFiles); foreach (var a in OutlineFiles) { BoardLayer layer; BoardSide Side; Gerber.DetermineBoardSideAndLayer(a, out Side, out layer); if (layer != BoardLayer.Outline) { AllFiles.Add(a); } } // AllFiles.AddRange(OutlineFiles); GerberMerger.MergeAllByFileType(AllFiles, OutputFolder, "MergedFrame", log); }