public ParsedGerber AddBoardToSet(MemoryStream MS, string _originalfilename, bool forcezerowidth = false, bool precombinepolygons = false, double drillscaler = 1.0) { Streams[_originalfilename] = MS; try { // string[] filesplit = originalfilename.Split('.'); // string ext = filesplit[filesplit.Count() - 1].ToLower(); var FileType = Gerber.FindFileTypeFromStream(new StreamReader(MS), _originalfilename); MS.Seek(0, SeekOrigin.Begin); if (FileType == BoardFileType.Unsupported) { if (Gerber.ExtremelyVerbose) { Console.WriteLine("Warning: {1}: files with extension {0} are not supported!", Path.GetExtension(_originalfilename), Path.GetFileName(_originalfilename)); } return(null); } ParsedGerber PLS; GerberParserState State = new GerberParserState() { PreCombinePolygons = precombinepolygons }; if (FileType == BoardFileType.Drill) { if (Gerber.ExtremelyVerbose) { Console.WriteLine("Log: Drill file: {0}", _originalfilename); } PLS = PolyLineSet.LoadExcellonDrillFileFromStream(new StreamReader(MS), _originalfilename, false, drillscaler); MS.Seek(0, SeekOrigin.Begin); ExcellonFile EF = new ExcellonFile(); EF.Load(new StreamReader(MS), drillscaler); Excellons.Add(EF); } else { if (Gerber.ExtremelyVerbose) { Console.WriteLine("Log: Gerber file: {0}", _originalfilename); } BoardSide Side = BoardSide.Unknown; BoardLayer Layer = BoardLayer.Unknown; Gerber.DetermineBoardSideAndLayer(_originalfilename, out Side, out Layer); if (Layer == BoardLayer.Outline) { forcezerowidth = true; precombinepolygons = true; } State.PreCombinePolygons = precombinepolygons; PLS = PolyLineSet.LoadGerberFileFromStream(new StreamReader(MS), _originalfilename, forcezerowidth, false, State); MS.Seek(0, SeekOrigin.Begin); PLS.Side = State.Side; PLS.Layer = State.Layer; if (Layer == BoardLayer.Outline) { PLS.FixPolygonWindings(); } } PLS.CalcPathBounds(); BoundingBox.AddBox(PLS.BoundingBox); Console.WriteLine("Progress: Loaded {0}: {1:N1} x {2:N1} mm", Path.GetFileName(_originalfilename), PLS.BoundingBox.BottomRight.X - PLS.BoundingBox.TopLeft.X, PLS.BoundingBox.BottomRight.Y - PLS.BoundingBox.TopLeft.Y); PLSs.Add(PLS); // } // catch (Exception) // { // } return(PLS); } catch (Exception E) { while (E != null) { Console.WriteLine("Exception adding board: {0}", E.Message); E = E.InnerException; } } return(null); }
public void AddBoardsToSet(List <string> FileList, bool fixgroup = true, ProgressLog Logger = null) { foreach (var a in FileList) { BoardSide aSide = BoardSide.Unknown; BoardLayer aLayer = BoardLayer.Unknown; string ext = Path.GetExtension(a); if (ext == ".zip") { using (ZipFile zip1 = ZipFile.Read(a)) { foreach (ZipEntry e in zip1) { MemoryStream MS = new MemoryStream(); if (e.IsDirectory == false) { // e.Extract(MS); // MS.Seek(0, SeekOrigin.Begin); Gerber.DetermineBoardSideAndLayer(e.FileName, out aSide, out aLayer); if (aLayer == BoardLayer.Outline) { HasLoadedOutline = true; } // AddFileStream(MS, e.FileName, drillscaler); } } } } else { Gerber.DetermineBoardSideAndLayer(a, out aSide, out aLayer); } if (aLayer == BoardLayer.Outline) { HasLoadedOutline = true; } } foreach (var a in FileList) { if (Logger != null) { Logger.AddString(String.Format("Loading {0}", Path.GetFileName(a))); } string ext = Path.GetExtension(a); if (ext == ".zip") { using (ZipFile zip1 = ZipFile.Read(a)) { foreach (ZipEntry e in zip1) { MemoryStream MS = new MemoryStream(); if (e.IsDirectory == false) { if (Logger != null) { Logger.AddString(String.Format("Loading inside zip: {0}", Path.GetFileName(e.FileName))); } e.Extract(MS); MS.Seek(0, SeekOrigin.Begin); AddFileToSet(MS, e.FileName, Logger); } } } } else { MemoryStream MS2 = new MemoryStream(); FileStream FS = File.OpenRead(a); FS.CopyTo(MS2); MS2.Seek(0, SeekOrigin.Begin); AddFileToSet(MS2, a, Logger); } } if (fixgroup) { if (Logger != null) { Logger.AddString("Checking for common file format mistakes."); } FixEagleDrillExportIssues(Logger); CheckRelativeBoundingBoxes(Logger); CheckForOutlineFiles(Logger); CheckRelativeBoundingBoxes(Logger); } }
private void RenderLayerSets(bool after, Graphics G, float S, BoardSide side, BoardLayer layer, Color C, bool lines = true) { if (pnp.ActiveDoc == null) { return; } var D = pnp.ActiveDoc; List <ParsedGerber> s; if (after) { s = D.FixSet.PLSs; } else { s = D.Set.PLSs; } foreach (var l in s) { if (l.Side == side && l.Layer == layer) { RenderOutline(G, S, l, C, lines); } } }
public static void DetermineBoardSideAndLayer(string gerberfile, out BoardSide Side, out BoardLayer Layer) { Side = BoardSide.Unknown; Layer = BoardLayer.Unknown; string[] filesplit = Path.GetFileName(gerberfile).Split('.'); string ext = filesplit[filesplit.Count() - 1].ToLower(); switch (ext) { case "gbr": switch (Path.GetFileNameWithoutExtension(gerberfile).ToLower()) { case "profile": case "boardoutline": case "outline": case "board": Side = BoardSide.Both; Layer = BoardLayer.Outline; break; case "copper_bottom": case "bottom": Side = BoardSide.Bottom; Layer = BoardLayer.Copper; break; case "soldermask_bottom": case "bottommask": Side = BoardSide.Bottom; Layer = BoardLayer.SolderMask; break; case "solderpaste_bottom": case "bottompaste": Side = BoardSide.Bottom; Layer = BoardLayer.Paste; break; case "silkscreen_bottom": case "bottomsilk": Side = BoardSide.Bottom; Layer = BoardLayer.Silk; break; case "copper_top": case "top": Side = BoardSide.Top; Layer = BoardLayer.Copper; break; case "soldermask_top": case "topmask": Side = BoardSide.Top; Layer = BoardLayer.SolderMask; break; case "solderpaste_top": case "toppaste": Side = BoardSide.Top; Layer = BoardLayer.Paste; break; case "silkscreen_top": case "topsilk": Side = BoardSide.Top; Layer = BoardLayer.Silk; break; case "inner1": Side = BoardSide.Internal1; Layer = BoardLayer.Copper; break; case "inner2": Side = BoardSide.Internal2; Layer = BoardLayer.Copper; break; default: { string lcase = gerberfile.ToLower(); if (lcase.Contains("board outline")) { Side = BoardSide.Both; Layer = BoardLayer.Outline; } ; if (lcase.Contains("copper bottom")) { Side = BoardSide.Bottom; Layer = BoardLayer.Copper; } ; if (lcase.Contains("silkscreen bottom")) { Side = BoardSide.Bottom; Layer = BoardLayer.Silk; } ; if (lcase.Contains("copper top")) { Side = BoardSide.Top; Layer = BoardLayer.Copper; } ; if (lcase.Contains("silkscreen top")) { Side = BoardSide.Top; Layer = BoardLayer.Silk; } ; if (lcase.Contains("solder mask bottom")) { Side = BoardSide.Bottom; Layer = BoardLayer.SolderMask; } ; if (lcase.Contains("solder mask top")) { Side = BoardSide.Top; Layer = BoardLayer.SolderMask; } ; if (lcase.Contains("drill-copper top-copper bottom")) { Side = BoardSide.Both; Layer = BoardLayer.Drill; } ; if (lcase.Contains("outline")) { Side = BoardSide.Both; Layer = BoardLayer.Outline; } if (lcase.Contains("-edge_cuts")) { Side = BoardSide.Both; Layer = BoardLayer.Outline; } if (lcase.Contains("-b_cu")) { Side = BoardSide.Bottom; Layer = BoardLayer.Copper; } if (lcase.Contains("-f_cu")) { Side = BoardSide.Top; Layer = BoardLayer.Copper; } if (lcase.Contains("-b_silks")) { Side = BoardSide.Bottom; Layer = BoardLayer.Silk; } if (lcase.Contains("-f_silks")) { Side = BoardSide.Top; Layer = BoardLayer.Silk; } if (lcase.Contains("-b_mask")) { Side = BoardSide.Bottom; Layer = BoardLayer.SolderMask; } if (lcase.Contains("-f_mask")) { Side = BoardSide.Top; Layer = BoardLayer.SolderMask; } if (lcase.Contains("-b_paste")) { Side = BoardSide.Bottom; Layer = BoardLayer.Paste; } if (lcase.Contains("-f_paste")) { Side = BoardSide.Top; Layer = BoardLayer.Paste; } } break; } break; case "ger": { string l = gerberfile.ToLower(); List <boardset> bs = new List <boardset>(); bs.Add(new boardset() { name = ".topsoldermask", side = BoardSide.Top, layer = BoardLayer.SolderMask }); bs.Add(new boardset() { name = ".topsilkscreen", side = BoardSide.Top, layer = BoardLayer.Silk }); bs.Add(new boardset() { name = ".toplayer", side = BoardSide.Top, layer = BoardLayer.Copper }); bs.Add(new boardset() { name = ".tcream", side = BoardSide.Top, layer = BoardLayer.Paste }); bs.Add(new boardset() { name = ".boardoutline", side = BoardSide.Both, layer = BoardLayer.Outline }); bs.Add(new boardset() { name = ".bcream", side = BoardSide.Bottom, layer = BoardLayer.SolderMask }); bs.Add(new boardset() { name = ".bottomsoldermask", side = BoardSide.Bottom, layer = BoardLayer.SolderMask }); bs.Add(new boardset() { name = ".bottomsilkscreen", side = BoardSide.Bottom, layer = BoardLayer.Silk }); bs.Add(new boardset() { name = ".bottomlayer", side = BoardSide.Bottom, layer = BoardLayer.Copper }); bs.Add(new boardset() { name = ".bcream", side = BoardSide.Bottom, layer = BoardLayer.Paste }); bs.Add(new boardset() { name = ".internalplane1", side = BoardSide.Internal1, layer = BoardLayer.Copper }); bs.Add(new boardset() { name = ".internalplane2", side = BoardSide.Internal2, layer = BoardLayer.Copper }); foreach (var a in bs) { if (l.Contains(a.name)) { Side = a.side; Layer = a.layer; } } } break; case "gml": Side = BoardSide.Both; Layer = BoardLayer.Mill; break; case "fabrd": case "oln": case "gko": case "gm1": Side = BoardSide.Both; Layer = BoardLayer.Outline; break; case "l2": case "gl1": Side = BoardSide.Internal1; Layer = BoardLayer.Copper; break; case "adtop": Side = BoardSide.Top; Layer = BoardLayer.Assembly; break; case "adbottom": Side = BoardSide.Bottom; Layer = BoardLayer.Assembly; break; case "notes": Side = BoardSide.Both; Layer = BoardLayer.Notes; break; case "l3": case "gl2": Side = BoardSide.Internal2; Layer = BoardLayer.Copper; break; case "l4": case "gbl": case "l2m": Side = BoardSide.Bottom; Layer = BoardLayer.Copper; break; case "l1": case "l1m": case "gtl": Side = BoardSide.Top; Layer = BoardLayer.Copper; break; case "gbp": case "spbottom": Side = BoardSide.Bottom; Layer = BoardLayer.Paste; break; case "gtp": case "sptop": Side = BoardSide.Top; Layer = BoardLayer.Paste; break; case "gbo": case "ss2": case "ssbottom": Side = BoardSide.Bottom; Layer = BoardLayer.Silk; break; case "gto": case "ss1": case "sstop": Side = BoardSide.Top; Layer = BoardLayer.Silk; break; case "gbs": case "sm2": case "smbottom": Side = BoardSide.Bottom; Layer = BoardLayer.SolderMask; break; case "gts": case "sm1": case "smtop": Side = BoardSide.Top; Layer = BoardLayer.SolderMask; break; case "gb3": // oshstencils bottom outline Side = BoardSide.Both; Layer = BoardLayer.Outline; break; case "gt3": // oshstencils top outline Side = BoardSide.Both; Layer = BoardLayer.Outline; break; case "top": Side = BoardSide.Top; Layer = BoardLayer.Copper; break; case "bottom": case "bot": Side = BoardSide.Bottom; Layer = BoardLayer.Copper; break; case "smb": Side = BoardSide.Bottom; Layer = BoardLayer.SolderMask; break; case "smt": Side = BoardSide.Top; Layer = BoardLayer.SolderMask; break; case "slk": case "sst": Side = BoardSide.Top; Layer = BoardLayer.Silk; break; case "bsk": case "ssb": Side = BoardSide.Bottom; Layer = BoardLayer.Silk; break; case "spt": Side = BoardSide.Top; Layer = BoardLayer.Paste; break; case "spb": Side = BoardSide.Bottom; Layer = BoardLayer.Paste; break; case "drill_TOP_BOTTOM": case "drl": case "drill": case "drillnpt": Side = BoardSide.Both; Layer = BoardLayer.Drill; break; } }
public bool IsEmpty(BoardLayer layer, int cellX, int cellY) { return !GetLayer(layer).HasTile(new Vector3Int(cellX, cellY, 0)); }
internal void Load(string basefile) { Text = Path.GetFileNameWithoutExtension(basefile); string fn = Path.GetFileName(basefile); string basefolder = Path.GetDirectoryName(basefile); string name = fn.Split('_')[0]; string BOMFile = ""; string PnPFile = ""; string gerberFile = ""; var L = Directory.GetFiles(basefolder, name + "_*.*"); SolderFile = ""; foreach (var file in L) { if (file.EndsWith("_BOM.csv")) { BOMFile = file; } if (file.EndsWith("_gerbers.zip")) { gerberFile = file; } if (file.EndsWith("_PNP.csv")) { PnPFile = file; } if (file.EndsWith("_soldered.txt")) { SolderFile = file; } } LayerSets.Add(new LayerSet() { Side = BoardSide.Both, Layer = BoardLayer.Outline }); LayerSets.Add(new LayerSet() { Side = BoardSide.Top, Layer = BoardLayer.SolderMask }); LayerSets.Add(new LayerSet() { Side = BoardSide.Top, Layer = BoardLayer.Silk }); LayerSets.Add(new LayerSet() { Side = BoardSide.Bottom, Layer = BoardLayer.SolderMask }); LayerSets.Add(new LayerSet() { Side = BoardSide.Bottom, Layer = BoardLayer.Silk }); if (BOMFile.Length > 0 && PnPFile.Length > 0 && gerberFile.Length > 0) { BOM B = new BOM(); B.LoadJLC(BOMFile, PnPFile); TheBOM = B; if (SolderFile.Length > 0) { solderedlist = File.ReadAllLines(SolderFile).ToList(); foreach (var a in B.DeviceTree) { foreach (var v in a.Value.Values) { if (solderedlist.Contains(v.Combined())) { v.Soldered = true; } } } } else { SolderFile = Path.Combine(basefolder, name + "_soldered.txt"); SaveSolderedList(); } GerberLibrary.GerberImageCreator GIC = new GerberLibrary.GerberImageCreator(); List <string> res = new List <string>(); Dictionary <string, MemoryStream> Files = new Dictionary <string, MemoryStream>(); using (Ionic.Zip.ZipFile zip1 = Ionic.Zip.ZipFile.Read(gerberFile)) { foreach (ZipEntry e in zip1) { MemoryStream MS = new MemoryStream(); if (e.IsDirectory == false) { e.Extract(MS); MS.Seek(0, SeekOrigin.Begin); Files[e.FileName] = MS; } } } string[] FileNames = Files.Keys.ToArray(); List <string> outlinefiles = new List <string>(); List <string> topsilkfiles = new List <string>(); List <string> bottomsilkfiles = new List <string>(); foreach (var F in FileNames) { BoardSide BS = BoardSide.Unknown; BoardLayer BL = BoardLayer.Unknown; Files[F].Seek(0, SeekOrigin.Begin); if (Gerber.FindFileTypeFromStream(new StreamReader(Files[F]), F) == BoardFileType.Gerber) { Gerber.DetermineBoardSideAndLayer(F, out BS, out BL); foreach (var l in LayerSets) { if (l.Side == BS && l.Layer == BL) { l.Files.Add(F); Files[F].Seek(0, SeekOrigin.Begin); var pls = PolyLineSet.LoadGerberFileFromStream(new StreamReader(Files[F]), F, true, false, new GerberParserState() { PreCombinePolygons = false }); l.Gerbs.Add(pls); } } } } TheBox.Reset(); foreach (var a in LayerSets[0].Gerbs) { TheBox.AddBox(a.BoundingBox); } } }
//layerのmapにtileをセットする public bool SetCell(BoardLayer layer, TileBase cell, int destinationX, int destinationY) { if (!activeFlag) return false; //if (!IsEmpty(layer, destinationX, destinationY))return false; return ReDefineCell(GetLayer(layer), cell, destinationX, destinationY); }
//マスにミノがあるときtrue、ないときfalseを返す public bool IsEmpty(BoardLayer layer, Vector3Int cood) { return IsEmpty(layer, cood.x, cood.y); }
public Vector3Int MoveCellTo(BoardLayer layer, Vector3Int cell, int offsetX, int offsetY) { return MoveCellTo(layer, cell.x, cell.y, offsetX, offsetY); }
public Vector3Int MoveCellTo(BoardLayer layer, Vector3Int cell, Vector3Int destination) { return MoveCellTo(layer, cell.x, cell.y, destination.x, destination.y); }
public Vector3Int MoveCell(BoardLayer layer, int cellX, int cellY, int offsetX, int offsetY) { return MoveCellTo(layer, cellX, cellY, cellX + offsetX, cellY + offsetY); }
public Vector3Int MoveCell(BoardLayer layer, Vector3Int cell, Vector3Int offset) { return MoveCell (layer,cell.x, cell.y, offset.x, offset.y); }
//layerの座標cellにあるセルのレイヤーを変える public void SwitchCellLayer(BoardLayer baselayer, BoardLayer destlayer, Vector3Int cell) { SwitchCellLayerTo(baselayer, destlayer, cell, Vector3Int.zero); }