public static List <String> WriteProtoBoardFlowerStyle(double width, double height, double mountholediameter, double cornerrounding, double mountholeclearance, double edgeclearance = 1.26, bool WriteCombinedImage = true, bool WriteImages = false) { FontSet FS = FontSet.Load("Font.xml"); int polyid = 0; List <String> FilesGenerated = new List <string>(); double LabelHeight = 1.2; double PadWidth = 1.8; double DrillWidth = 1.0; string basename = String.Format("Generated_This_is_not_RocketScience_Flower_prototoboard_{0}x{1}cm", width / 10.0f, height / 10.0f); try { Directory.CreateDirectory(basename); } catch (Exception) { } basename = Path.Combine(basename, String.Format("proto_{0}x{1}cm", width / 10.0f, height / 10.0f)); string OutlineFile = basename + ".gko"; string SilkFileTop = basename + ".gto"; string SilkFileBottom = basename + ".gbo"; string SolderMaskBottom = basename + ".gbs"; string SolderMaskTop = basename + ".gts"; string CopperBottom = basename + ".gbl"; string CopperTop = basename + ".gtl"; string DrillFile = basename + ".txt"; int XE = (int)Math.Floor((width - Math.Max(edgeclearance, LabelHeight) * 2) / 2.54); int YE = (int)Math.Floor((height - Math.Max(edgeclearance, LabelHeight) * 2) / 2.54); PrepareGridSpace(XE, YE, true, true, 3, 2); string[][] Grid = new string[XE + 1][]; for (int x = 0; x <= XE; x++) { Grid[x] = new string[YE + 1]; for (int y = 0; y <= YE; y++) { Grid[x][y] = GridSpaceType(x, y); if (y == YE) { Grid[x][y] = "None"; } if (x == XE) { Grid[x][y] = "None"; } } } double XO = (width / 2) - (XE / 2.0) * 2.54; double YO = (height / 2) - (YE / 2.0) * 2.54; Console.WriteLine("{0} rows and {1} columns", YE, XE); ExcellonFile EF = new ExcellonFile(); PointD C1 = new PointD(0, 0); PointD C2 = new PointD(width, 0); PointD C3 = new PointD(width, height); PointD C4 = new PointD(0, height); if (mountholediameter > 0) { ExcellonTool MountHoleDrill = new ExcellonTool(); MountHoleDrill.Radius = mountholediameter / 2.0; C1 = new PointD(mountholeclearance, mountholeclearance); C2 = new PointD(width - mountholeclearance, mountholeclearance); C3 = new PointD(width - mountholeclearance, height - mountholeclearance); C4 = new PointD(mountholeclearance, height - mountholeclearance); MountHoleDrill.Drills.Add(C1); MountHoleDrill.Drills.Add(C2); MountHoleDrill.Drills.Add(C3); MountHoleDrill.Drills.Add(C4); EF.Tools[10] = MountHoleDrill; } ExcellonTool ProtoHoleDrill = new ExcellonTool(); ProtoHoleDrill.Radius = DrillWidth / 2.0; PolyLine PL = new PolyLine(polyid++); PL.Add(cornerrounding, 0); PL.Add(width - cornerrounding, 0); PL.ArcTo(new PointD(width, cornerrounding), new PointD(0, cornerrounding), InterpolationMode.CounterClockwise); PL.Add(width, height - cornerrounding); PL.ArcTo(new PointD(width - cornerrounding, height), new PointD(-cornerrounding, 0), InterpolationMode.CounterClockwise); PL.Add(cornerrounding, height); PL.ArcTo(new PointD(0, height - cornerrounding), new PointD(0, -cornerrounding), InterpolationMode.CounterClockwise); PL.Add(0, cornerrounding); PL.ArcTo(new PointD(cornerrounding, 0), new PointD(cornerrounding, 0), InterpolationMode.CounterClockwise); PL.Close(); GerberArtWriter GAW = new GerberArtWriter(); GAW.AddPolyLine(PL, 0); GAW.Write(OutlineFile); GerberArtWriter GAWTop = new GerberArtWriter(); GerberArtWriter GAWBottom = new GerberArtWriter(); GerberArtWriter MaskTop = new GerberArtWriter(); GerberArtWriter MaskBottom = new GerberArtWriter(); GerberArtWriter SilkTop = new GerberArtWriter(); GerberArtWriter SilkBottom = new GerberArtWriter(); for (int x = 0; x < XE; x++) { double xc = XO + x * 2.54 + 2.54 / 2; for (int y = 0; y < YE; y++) { double yc = YO + y * 2.54 + 2.54 / 2; PointD P = new PointD(xc, yc); if ((P - C1).Length() < edgeclearance + mountholediameter / 2 + 1.27) { Grid[x][y] = "None"; } if ((P - C2).Length() < edgeclearance + mountholediameter / 2 + 1.27) { Grid[x][y] = "None"; } if ((P - C3).Length() < edgeclearance + mountholediameter / 2 + 1.27) { Grid[x][y] = "None"; } if ((P - C4).Length() < edgeclearance + mountholediameter / 2 + 1.27) { Grid[x][y] = "None"; } if (Grid[x][y] != "None") { GAWTop.AddFlash(new PointD(xc, yc), DrillWidth * 1.3 / 2.0); GAWBottom.AddFlash(new PointD(xc, yc), DrillWidth * 1.3 / 2.0); MaskTop.AddFlash(new PointD(xc, yc), DrillWidth * 1.3 / 2.0); MaskBottom.AddFlash(new PointD(xc, yc), DrillWidth * 1.3 / 2.0); ProtoHoleDrill.Drills.Add(new PointD(xc, yc)); } } } // SilkTop.DrawString(new PointD(5, 0), FS, "O0O", 5, 0.05, StringAlign.BottomCenter); // SilkTop.DrawString(new PointD(20, 0), FS, "O0O", 5, 0.05, StringAlign.CenterCenter); // SilkTop.DrawString(new PointD(40, 0), FS, "OMO", 5, 0.05, StringAlign.TopCenter); for (int x = 0; x < XE; x++) { double xc = XO + x * 2.54 + 2.54 / 2; double yc = YO + (0) * 2.54; double yc1 = YO + (YE) * 2.54 + 2.54; char T = (char)('A' + (char)((x) % 26)); if (Grid[x][0] != "None") { SilkTop.DrawString(new PointD(xc, yc), FS, T.ToString(), LabelHeight, 0.05, StringAlign.CenterCenter); SilkBottom.DrawString(new PointD(xc, yc), FS, T.ToString(), LabelHeight, 0.05, StringAlign.CenterCenter, true); } if (Grid[x][YE - 1] != "None") { SilkTop.DrawString(new PointD(xc, yc1), FS, T.ToString(), LabelHeight, 0.05, StringAlign.CenterCenter); SilkBottom.DrawString(new PointD(xc, yc1), FS, T.ToString(), LabelHeight, 0.05, StringAlign.CenterCenter, true); } } for (int y = 0; y < YE; y++) { double xc = XO + (0) * 2.54 - 2.54 / 2; double xc1 = XO + (XE + 1) * 2.54 - 2.54 / 2; double yc = YO + (y) * 2.54 + 2.54; if (Grid[0][y] != "None") { SilkTop.DrawString(new PointD(xc, yc), FS, (YE - y).ToString(), LabelHeight, 0.05, StringAlign.CenterCenter); SilkBottom.DrawString(new PointD(xc, yc), FS, (YE - y).ToString(), LabelHeight, 0.05, StringAlign.CenterCenter, true); } if (Grid[XE - 1][y] != "None") { SilkTop.DrawString(new PointD(xc1, yc), FS, (YE - y).ToString(), LabelHeight, 0.05, StringAlign.CenterCenter); SilkBottom.DrawString(new PointD(xc1, yc), FS, (YE - y).ToString(), LabelHeight, 0.05, StringAlign.CenterCenter, true); } } PolyLine PL2 = new PolyLine(polyid++); double rad = 0.6; for (int i = 0; i < 20; i++) { double P = i * Math.PI / 19.0; PL2.Add(Math.Sin(P) * rad, Math.Cos(P) * rad); } PL2.Close(); PL2.Translate(-1.1, 0); for (int x = -1; x < XE + 1; x++) { for (int y = -1; y < YE + 1; y++) { string s1 = "None"; if (y >= 0 && y < YE && x < XE) { s1 = Grid[x + 1][y]; } string s2 = "None"; if (x >= 0 && x < XE && y < YE) { s2 = Grid[x][y + 1]; } string s3 = "None"; if (x >= 0 && x < XE && y >= 0 && y < YE) { s3 = Grid[x][y]; } double xc = XO + x * 2.54 + 2.54 / 2; double yc = YO + y * 2.54 + 2.54 / 2; double xc1 = XO + (x + 1) * 2.54 + 2.54 / 2; double yc1 = YO + (y + 1) * 2.54 + 2.54 / 2; if (s1 != "None" && s3 != "None") { PolyLine PLA = PL2.Copy(); PLA.Translate(xc1, yc); PolyLine PLC = PL2.Copy(); PLC.RotateDegrees(180); PLC.Translate(xc, yc); GAWTop.AddPolygon(PLA); MaskTop.AddPolygon(PLA); GAWTop.AddPolygon(PLC); MaskTop.AddPolygon(PLC); GAWBottom.AddPolygon(PLA); MaskBottom.AddPolygon(PLA); GAWBottom.AddPolygon(PLC); MaskBottom.AddPolygon(PLC); } if (s3 != "None" && s2 != "None") { PolyLine PLB = PL2.Copy(); PLB.RotateDegrees(90); PLB.Translate(xc, yc1); PolyLine PLD = PL2.Copy(); PLD.RotateDegrees(270); PLD.Translate(xc, yc); GAWTop.AddPolygon(PLB); MaskTop.AddPolygon(PLB); GAWTop.AddPolygon(PLD); MaskTop.AddPolygon(PLD); GAWBottom.AddPolygon(PLB); MaskBottom.AddPolygon(PLB); GAWBottom.AddPolygon(PLD); MaskBottom.AddPolygon(PLD); // GAWTop.AddPolygon(PLD); // MaskTop.AddPolygon(PLD); } } } GAWTop.Write(CopperTop); GAWBottom.Write(CopperBottom); SilkBottom.Write(SilkFileBottom); SilkTop.Write(SilkFileTop); MaskTop.Write(SolderMaskTop); MaskBottom.Write(SolderMaskBottom); EF.Tools[11] = ProtoHoleDrill; EF.Write(DrillFile, 0, 0, 0, 0); FilesGenerated.Add(CopperBottom); FilesGenerated.Add(CopperTop); FilesGenerated.Add(OutlineFile); FilesGenerated.Add(DrillFile); FilesGenerated.Add(SilkFileBottom); FilesGenerated.Add(SilkFileTop); FilesGenerated.Add(SolderMaskBottom); FilesGenerated.Add(SolderMaskTop); if (WriteCombinedImage) { GerberImageCreator GIC = new GerberImageCreator(); GIC.AddBoardsToSet(FilesGenerated); GIC.WriteImageFiles(basename + "_render", 200, false); } if (WriteImages) { Gerber.SaveGerberFileToImage(OutlineFile, OutlineFile + "_render.png", 1000, Color.Black, Color.White); Gerber.SaveGerberFileToImage(CopperBottom, CopperBottom + "_render.png", 1000, Color.Black, Color.White); Gerber.SaveGerberFileToImage(CopperTop, CopperTop + "_render.png", 1000, Color.Black, Color.White); Gerber.SaveGerberFileToImage(DrillFile, DrillFile + "_render.png", 1000, Color.Black, Color.White); Gerber.SaveGerberFileToImage(SilkFileTop, SilkFileTop + "_render.png", 1000, Color.Black, Color.White); Gerber.SaveGerberFileToImage(SilkFileBottom, SilkFileBottom + "_render.png", 1000, Color.Black, Color.White); } return(FilesGenerated); }
public static List <string> WriteSideEdgeFrame(PolyLine pl, FrameSettings FS, string basefile, BOM output = null) { List <string> Files = new List <string>(); try { int polyid = 0; string fname = System.IO.Path.GetFileName(basefile); string fnamenoext = System.IO.Path.GetFileNameWithoutExtension(basefile); string OutName = Path.Combine(System.IO.Path.GetDirectoryName(basefile), fnamenoext); Console.WriteLine("writing frame files to {0}", OutName); // Bounds B = new Bounds(); // B.AddPolyLine(pl); // FS.innerHeight = B.Height(); // FS.innerWidth = B.Width(); double W = (double)FS.innerWidth; double H = (double)FS.innerHeight; double TE = (double)FS.topEdge; double LE = (double)FS.leftEdge; double OuterWidth = W + LE * 2.0; double OuterHeight = H + TE * 2.0; double InnerWidth = W; double InnerHeight = H; PCBWriterSet PCB = new PCBWriterSet(); double mountholediameter = (double)FS.holeDiameter; // board outline PolyLine PL = new PolyLine(polyid++); PL.MakeRoundedRect(new PointD(0, 0), new PointD(OuterWidth, OuterHeight), (double)FS.roundedOuterCorners); PCB.AddOutline(PL); if (FS.InsideEdgeMode == FrameSettings.InsideMode.RegularEdge) { PolyLine PL2 = new PolyLine(polyid++); PL2.MakeRoundedRect(new PointD(LE, TE), new PointD(InnerWidth + LE, InnerHeight + TE), (double)FS.roundedInnerCorners); PCB.AddOutline(PL2); } if (FS.InsideEdgeMode == FrameSettings.InsideMode.FormFitting && pl != null) { PolyLine PP = pl.Copy(); PP.Translate(-FS.offset.X, -FS.offset.Y); List <PolyLine> PL2 = PP.Offset(FS.margin, polyid++); foreach (var l in PL2) { PCB.AddOutline(l); } polyid += PL2.Count; } #region fiducials List <PointD> Fiducials = new List <PointD>(); foreach (var P in FS.fiducialsListData) { PointD fiducialPoint = P.pos; PCB.Fiducial(fiducialPoint, P.CopperDiameter, P.MaskDiameter, P.Top ? BoardSide.Top : BoardSide.Bottom); } #endregion string FrameTitle = FS.FrameTitle; string FrameTopTitle = FrameTitle + " - Top"; string FrameBottomTitle = FrameTitle + " - Bottom"; double verticaltitleclearance = 0; double horizontaltitleclearance = 0; if (FrameTitle.Length > 0) { FontSet fnt = FontSet.Load("Font.xml"); horizontaltitleclearance = fnt.StringWidth(FrameBottomTitle, TE / 4) + mountholediameter * 2 + FS.topEdge; verticaltitleclearance = fnt.StringWidth(FrameBottomTitle, TE / 4) + mountholediameter * 2 + FS.topEdge; PCB.Label(fnt, new PointD(OuterWidth / 2.0, OuterHeight - TE / 4.0), FrameTopTitle, TE / 4, StringAlign.CenterCenter, 0.1, true, true, 0); PCB.Label(fnt, new PointD(OuterWidth - LE / 4, OuterHeight / 2), FrameTopTitle, TE / 4.0, StringAlign.CenterCenter, 0.1, true, true, -90); PCB.Label(fnt, new PointD(LE / 4, OuterHeight / 2), FrameTopTitle, TE / 4.0, StringAlign.CenterCenter, 0.1, true, true, 90); PCB.Label(fnt, new PointD(OuterWidth / 2.0, TE - TE / 4.0), FrameTopTitle, TE / 4.0, StringAlign.CenterCenter, 0.1, true, true, 0); PCB.Label(fnt, new PointD(OuterWidth / 2.0, OuterHeight - TE / 4.0), FrameBottomTitle, TE / 4, StringAlign.CenterCenter, 0.1, true, true, 0, true, true, true); PCB.Label(fnt, new PointD(OuterWidth - LE / 4, OuterHeight / 2), FrameBottomTitle, TE / 4.0, StringAlign.CenterCenter, 0.1, true, true, -90, true); PCB.Label(fnt, new PointD(LE / 4, OuterHeight / 2), FrameBottomTitle, TE / 4.0, StringAlign.CenterCenter, 0.1, true, true, 90, true); PCB.Label(fnt, new PointD(OuterWidth / 2.0, TE - TE / 4.0), FrameBottomTitle, TE / 4.0, StringAlign.CenterCenter, 0.1, true, true, 0, true); } if (FS.addHoles) { double side = LE / 2.0; double top = TE / 2.0; PCB.Drill(new PointD(side, top), mountholediameter, 1); PCB.Drill(new PointD(OuterWidth - side, top), mountholediameter, 1); PCB.Drill(new PointD(OuterWidth - side, OuterHeight - top), mountholediameter, 1); PCB.Drill(new PointD(side, OuterHeight - top), mountholediameter, 1); double dx = (OuterWidth - side) - side; double dy = (OuterHeight - top) - top; dx -= horizontaltitleclearance; dy -= verticaltitleclearance; dx /= 2; dy /= 2; int horiz = (int)Math.Ceiling((dx / 2) / FS.MaxMountHoleSpacingMM); int vert = (int)Math.Ceiling((dy / 2) / FS.MaxMountHoleSpacingMM); dx /= (float)horiz; dy /= (float)vert; if (dx < FS.MinMountHoleSpacingMM) { horiz = 0; } if (dy < FS.MinMountHoleSpacingMM) { vert = 0; } for (int i = 1; i <= horiz; i++) { PCB.Drill(new PointD(side + (dx) * i, top), mountholediameter, 1); PCB.Drill(new PointD((OuterWidth - side) - (dx) * i, top), mountholediameter, 1); PCB.Drill(new PointD(side + (dx) * i, OuterHeight - top), mountholediameter, 1); PCB.Drill(new PointD((OuterWidth - side) - (dx) * i, OuterHeight - top), mountholediameter, 1); } for (int i = 1; i <= vert; i++) { PCB.Drill(new PointD(side, top + (dy) * i), mountholediameter, 1); PCB.Drill(new PointD(side, (OuterHeight - top) - (dy) * i), mountholediameter, 1); PCB.Drill(new PointD((OuterWidth - side), top + (dy) * i), mountholediameter, 1); PCB.Drill(new PointD((OuterWidth - side), (OuterHeight - top) - (dy) * i), mountholediameter, 1); } } if (FS.DefaultFiducials) { double side = LE / 2.0; double top = TE / 2.0; PCB.Fiducial(new PointD(side + mountholediameter * 2, top), 1, 2, FS.FiducialSide, PCBWriterSet.FiducialStyle.Square); PCB.Fiducial(new PointD(side + mountholediameter * 3, top), 1, 2, FS.FiducialSide, PCBWriterSet.FiducialStyle.Round); PCB.Fiducial(new PointD(OuterWidth - (side + mountholediameter * 2), top), 1, 2, FS.FiducialSide, PCBWriterSet.FiducialStyle.Square); PCB.Fiducial(new PointD(OuterWidth - (side + mountholediameter * 3), top), 1, 2, FS.FiducialSide, PCBWriterSet.FiducialStyle.Round); PCB.Fiducial(new PointD(side + mountholediameter * 2, OuterHeight - top), 1, 2, FS.FiducialSide, PCBWriterSet.FiducialStyle.Round); PCB.Fiducial(new PointD(side + mountholediameter * 3, OuterHeight - top), 1, 2, FS.FiducialSide, PCBWriterSet.FiducialStyle.Square); } if (FS.RenderDirectionArrow) { double side = LE / 2.0; double top = TE / 2.0; double dy = (OuterHeight - top) - top; dy -= verticaltitleclearance; dy /= 2; int vert = (int)Math.Ceiling((dy / 2) / FS.MaxMountHoleSpacingMM); dy /= (float)vert; PCB.Arrow(new PointD(side, (OuterHeight - top) - (dy) * 1 + mountholediameter * 1.5), new PointD(side, (OuterHeight - top) - (dy) * 0 - mountholediameter * 1.5), FS.DirectionArrowSide); PCB.Arrow(new PointD(OuterWidth - side, (OuterHeight - top) - (dy) * 1 + mountholediameter * 1.5), new PointD(OuterWidth - side, (OuterHeight - top) - (dy) * 0 - mountholediameter * 1.5), FS.DirectionArrowSide); PCB.Arrow(new PointD(side, (top) + (dy) * 0 + mountholediameter * 1.5), new PointD(side, (top) + (dy) * 1 - mountholediameter * 1.5), FS.DirectionArrowSide); PCB.Arrow(new PointD(OuterWidth - side, (top) + (dy) * 0 + mountholediameter * 1.5), new PointD(OuterWidth - side, (top) + (dy) * 1 - mountholediameter * 1.5), FS.DirectionArrowSide); } PolyLine Left = new PolyLine(); PolyLine Right = new PolyLine(); PolyLine Top = new PolyLine(); PolyLine Bottom = new PolyLine(); Top.MakePRectangle(OuterWidth + 1, FS.topEdge + 1, -1, -1); Bottom.MakePRectangle(OuterWidth, FS.topEdge, 0, OuterHeight - FS.topEdge); Left.MakePRectangle(FS.leftEdge + 1, OuterHeight + 1, -1, -1); Right.MakePRectangle(FS.leftEdge, OuterHeight, OuterWidth - FS.leftEdge, 0); PCB.ArtInclusions.Add(Left); PCB.ArtInclusions.Add(Right); PCB.ArtInclusions.Add(Top); PCB.ArtInclusions.Add(Bottom); //PCB.CellularArt(); Files.AddRange(PCB.Write(Path.GetDirectoryName(basefile), Path.GetFileNameWithoutExtension(basefile), output, FS.offset));; if (FS.RenderSample) { GerberImageCreator GIC = new GerberImageCreator(); GIC.AddBoardsToSet(Files, new SilentLog()); GIC.WriteImageFiles(OutName, 200, true, false, true, null); } } catch (Exception e) { Console.Write(" Exception while making frames:{0}", e.Message); } foreach (var s in Files) { Console.WriteLine("Writen edge file {0} succesfully", s); } return(Files); }