Example #1
0
        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);
        }
Example #2
0
        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);
            }
        }
Example #3
0
        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);
                }
            }
        }
Example #4
0
        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)); }
Example #6
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); }
Example #10
0
 public Vector3Int MoveCellTo(BoardLayer layer, Vector3Int cell, Vector3Int destination)      { return MoveCellTo(layer, cell.x, cell.y, destination.x, destination.y); }
Example #11
0
 public Vector3Int MoveCell(BoardLayer layer, int cellX, int cellY, int offsetX, int offsetY) { return MoveCellTo(layer, cellX, cellY, cellX + offsetX, cellY + offsetY); }
Example #12
0
 public Vector3Int MoveCell(BoardLayer layer, Vector3Int cell, Vector3Int offset)             { return MoveCell  (layer,cell.x, cell.y, offset.x, offset.y); }
Example #13
0
 //layerの座標cellにあるセルのレイヤーを変える
 public void SwitchCellLayer(BoardLayer baselayer, BoardLayer destlayer, Vector3Int cell)
 {
     SwitchCellLayerTo(baselayer, destlayer, cell, Vector3Int.zero);
 }