void SetXY(int x, int y) { lastX = x; lastY = y; if (Document.Gerbers.Count == 0) { return; } // if (Cache == null) return; PolyLineSet.Bounds Bounds = new PolyLineSet.Bounds(); foreach (var a in Document.Gerbers.OrderBy(xx => xx.sortindex)) { Bounds.AddBox(a.File.BoundingBox); } Graphics G = Graphics.FromImage(new Bitmap(1, 1)); float S = GetScaleAndBuildTransform(G, Bounds); var M = G.Transform.Clone(); M.Invert(); PointF[] P = new PointF[1] { new PointF(x, y) }; M.TransformPoints(P); MainForm.SetMouseCoord(P[0].X, P[0].Y); }
private void apictureBox1_Paint(object sender, PaintEventArgs e) { var G2 = e.Graphics; PolyLineSet.Bounds Bounds = new PolyLineSet.Bounds(); foreach (var a in Document.Gerbers.OrderBy(x => x.sortindex)) { Bounds.AddBox(a.File.BoundingBox); } if (Cache == null) { Cache = new Bitmap(Width, Height); Graphics G = Graphics.FromImage(Cache); GerberImageCreator.ApplyAASettings(G); GraphicsGraphicsInterface GGI = new GraphicsGraphicsInterface(G); GGI.Clear(Document.Colors.BackgroundColor); // DrawGerbersToGraphicsInterface(Bounds, GGI); } G2.DrawImage(Cache, 0, 0); GerberImageCreator.ApplyAASettings(G2); { if (Document.CrossHairActive) { if (Document.Gerbers.Count > 0) { float S = GetScaleAndBuildTransform(G2, Bounds); Color DimensionColor = Color.FromArgb(255, 255, 200); Pen P = new Pen(DimensionColor, 1.0f / S); P.DashPattern = new float[2] { 2, 2 }; G2.DrawLine(P, (float)Bounds.TopLeft.X - 1000, Document.MouseY, (float)Bounds.BottomRight.X + 1000, Document.MouseY); G2.DrawLine(P, (float)Document.MouseX, (float)Bounds.TopLeft.Y - 1000, (float)Document.MouseX, (float)Bounds.BottomRight.Y + 1000); DrawLabel(G2, String.Format("{0:N2}", Document.MouseX - Bounds.TopLeft.X), S, 12, DimensionColor, 5, 0, (float)Document.MouseX, (float)Bounds.TopLeft.Y, DisplaySide == BoardSide.Bottom); DrawLabel(G2, String.Format("{0:N2}", Document.MouseY - Bounds.TopLeft.Y), S, 12, DimensionColor, 0, -14, (float)Bounds.TopLeft.X, (float)Document.MouseY, DisplaySide == BoardSide.Bottom); //DrawUpsideDown(G2, String.Format("{0:N2}", Document.MouseX), S, 12, Color.Yellow, 5 / S + (float)Document.MouseX, (float)Bounds.TopLeft.Y); } } } }
public static PolyLineSet.Bounds GetBoundingBox(List <string> generatedFiles) { PolyLineSet.Bounds A = new PolyLineSet.Bounds(); foreach (var a in generatedFiles) { ParsedGerber PLS = PolyLineSet.LoadGerberFile(a, State: new GerberParserState() { PreCombinePolygons = false }); A.AddBox(PLS.BoundingBox); } return(A); }
public PolyLineSet.Bounds GetOutlineBoundingBox() { PolyLineSet.Bounds B = new PolyLineSet.Bounds(); int i = 0; foreach (var a in PLSs) { if (a.Layer == BoardLayer.Mill || a.Layer == BoardLayer.Outline) { B.AddBox(a.BoundingBox); i++; } } if (i == 0) { return(BoundingBox); } return(B); }
public void CheckRelativeBoundingBoxes(ProgressLog Logger) { List <ParsedGerber> DrillFiles = new List <ParsedGerber>(); List <ParsedGerber> DrillFilesToReload = new List <ParsedGerber>(); PolyLineSet.Bounds BB = new PolyLineSet.Bounds(); foreach (var a in PLSs) { if (a.Layer == BoardLayer.Drill) { DrillFiles.Add(a); } else { BB.AddBox(a.BoundingBox); } } foreach (var a in DrillFiles) { if (a.BoundingBox.Intersects(BB) == false) { Errors.Add(String.Format("Drill file {0} does not seem to touch the main bounding box!", Path.GetFileName(a.Name))); if (Logger != null) { Logger.AddString(String.Format("Drill file {0} does not seem to touch the main bounding box!", Path.GetFileName(a.Name))); } PLSs.Remove(a); } } BoundingBox = new PolyLineSet.Bounds(); foreach (var a in PLSs) { // Console.WriteLine("Progress: Adding board {6} to box::{0:N2},{1:N2} - {2:N2},{3:N2} -> {4:N2},{5:N2}", a.BoundingBox.TopLeft.X, a.BoundingBox.TopLeft.Y, a.BoundingBox.BottomRight.X, a.BoundingBox.BottomRight.Y, a.BoundingBox.Width(), a.BoundingBox.Height(), Path.GetFileName(a.Name)); //Console.WriteLine("adding box for {0}:{1},{2}", a.Name, a.BoundingBox.Width(), a.BoundingBox.Height()); BoundingBox.AddBox(a.BoundingBox); } }
private void Glcontrol1_Paint(object sender, PaintEventArgs e) { if (!glLoaded) { return; } PolyLineSet.Bounds Bounds = new PolyLineSet.Bounds(); foreach (var a in Document.Gerbers.OrderBy(x => x.sortindex)) { Bounds.AddBox(a.File.BoundingBox); } if (VBOCacheDirty) { VBOCache.Reset(); DrawGerbersToGraphicsInterface(Bounds, VBOCache); // VBOCache.DrawLine(new Pen(Color.White, 1), Bounds.TopLeft.ToF(), Bounds.BottomRight.ToF()); VBOCache.BuildVBO(); VBOCacheDirty = false; } GLGraphicsInterface GI = new GLGraphicsInterface(0, 0, Width, Height); glcontrol1.MakeCurrent(); GL.MatrixMode(MatrixMode.Projection); GL.LoadIdentity(); GL.Disable(EnableCap.CullFace); GL.Ortho(0, glcontrol1.Width, glcontrol1.Height, 0, -100, 100); GL.LineWidth(1.0f); //GL.Scale(0.01, 0.01, 1); GL.MatrixMode(MatrixMode.Modelview); GL.LoadIdentity(); GL.Viewport(0, 0, glcontrol1.Width, glcontrol1.Height); Matrix4 View = Matrix4.CreateOrthographicOffCenter(0, glcontrol1.Width, glcontrol1.Height, 0, -100, 100); // GI.Clear(Color.Yellow); GI.Clear(Document.Colors.BackgroundColor); // GGI.Clear(Document.Colors.BackgroundColor); float S = GetScaleAndBuildTransform(GI, Bounds); MainShader.Bind(); var M = GI.GetGlMatrix(); GL.Uniform1(MainShader.Uniforms["linescale"].address, 1.0f / S); GL.UniformMatrix4(MainShader.Uniforms["trans"].address, false, ref M); GL.UniformMatrix4(MainShader.Uniforms["view"].address, false, ref View); GL.Enable(EnableCap.Blend); GL.BlendFunc(BlendingFactor.SrcAlpha, BlendingFactor.OneMinusSrcAlpha); VBOCache.RenderVBO(MainShader); MainShader.UnBind(); //DrawGerbersToGraphicsInterface(Bounds, GI); { if (Document.CrossHairActive) { if (Document.Gerbers.Count > 0) { float S2 = GetScaleAndBuildTransform(GI, Bounds); Color DimensionColor = Color.FromArgb(255, 255, 200); Pen P = new Pen(DimensionColor, 1.0f); P.DashPattern = new float[2] { 2, 2 }; GI.DrawLine(P, (float)Bounds.TopLeft.X - 1000, Document.MouseY, (float)Bounds.BottomRight.X + 1000, Document.MouseY); GI.DrawLine(P, (float)Document.MouseX, (float)Bounds.TopLeft.Y - 1000, (float)Document.MouseX, (float)Bounds.BottomRight.Y + 1000); //DrawLabel(G2, String.Format("{0:N2}", Document.MouseX - Bounds.TopLeft.X), S, 12, DimensionColor, 5, 0, (float)Document.MouseX, (float)Bounds.TopLeft.Y, DisplaySide == BoardSide.Bottom); //DrawLabel(G2, String.Format("{0:N2}", Document.MouseY - Bounds.TopLeft.Y), S, 12, DimensionColor, 0, -14, (float)Bounds.TopLeft.X, (float)Document.MouseY, DisplaySide == BoardSide.Bottom); //DrawUpsideDown(G2, String.Format("{0:N2}", Document.MouseX), S, 12, Color.Yellow, 5 / S + (float)Document.MouseX, (float)Bounds.TopLeft.Y); } } } glcontrol1.SwapBuffers(); }
public void FixEagleDrillExportIssues(ProgressLog Logger) { List <ParsedGerber> DrillFiles = new List <ParsedGerber>(); List <Tuple <double, ParsedGerber> > DrillFilesToReload = new List <Tuple <double, ParsedGerber> >(); PolyLineSet.Bounds BB = new PolyLineSet.Bounds(); foreach (var a in PLSs) { if (a.Layer == BoardLayer.Drill) { DrillFiles.Add(a); } else { BB.AddBox(a.BoundingBox); } } foreach (var a in DrillFiles) { var b = a.BoundingBox; if (b.Width() > BB.Width() * 1.5 || b.Height() > BB.Height() * 1.5) { var MaxRatio = Math.Max(b.Width() / BB.Width(), b.Height() / BB.Height()); if (Logger != null) { Logger.AddString(String.Format("Note: Really large drillfile found({0})-fix your export scripts!", a.Name)); } Console.WriteLine("Note: Really large drillfile found ({0})- fix your export scripts!", a.Name); DrillFilesToReload.Add(new Tuple <double, ParsedGerber>(MaxRatio, a)); } } foreach (var a in DrillFilesToReload) { PLSs.Remove(a.Item2); var scale = 1.0; if (Double.IsInfinity(a.Item1) || Double.IsNaN(a.Item1)) { Errors.Add("Drill file size reached infinity - ignoring it"); if (Logger != null) { Logger.AddString("Drill file size reached infinity - ignoring it"); } } else { var R = a.Item1; while (R >= 1.5) { R /= 10; scale /= 10; } AddFileToSet(a.Item2.Name, Logger, scale); } } BoundingBox = new PolyLineSet.Bounds(); foreach (var a in PLSs) { //Console.WriteLine("Progress: Adding board {6} to box::{0:N2},{1:N2} - {2:N2},{3:N2} -> {4:N2},{5:N2}", a.BoundingBox.TopLeft.X, a.BoundingBox.TopLeft.Y, a.BoundingBox.BottomRight.X, a.BoundingBox.BottomRight.Y, a.BoundingBox.Width(), a.BoundingBox.Height(), Path.GetFileName( a.Name)); //Console.WriteLine("adding box for {0}:{1},{2}", a.Name, a.BoundingBox.Width(), a.BoundingBox.Height()); BoundingBox.AddBox(a.BoundingBox); } }
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); }