public ApertureMacroParam(string format, int lastboundin, GerberNumberFormat GNF, out int lastboundout)
            {
                lastboundout = lastboundin;
                string[] parts = format.Split('X');
                for (int i = 0; i < parts.Length; i++)
                {
                    if (parts[i].Contains("$"))
                    {
                        ExpressionSource = format;

                        boundparam   = lastboundin + 1;
                        lastboundout = lastboundin + 1;
                    }
                    else
                    {
                        double R;
                        if (Gerber.TryParseDouble(parts[i], out R))
                        {
                            value       = R;
                            scaledvalue = GNF.ScaleFileToMM(R);
                        }
                        else
                        {
                            Console.WriteLine("failed to parse {0}", format);
                        }
                    }
                }
            }
예제 #2
0
        public void DecodeOutline(string line, GerberNumberFormat GNF)
        {
            OutlineVertices = new List <PointD>();
            string[] v = line.Split(',');

            //  if (Gerber.Verbose) Console.WriteLine("decoding {0}", lines[currentline]);
            int vertices = Int32.Parse(v[2]) + 1;

            if (Gerber.ShowProgress)
            {
                Console.WriteLine("{0} vertices", vertices);
            }
            int idx = 2;
            int i   = 0;

            if ((v.Length - 3 - vertices * 2) < 0)
            {
                vertices--;
            }
            while (i < vertices && v[idx + 1].Contains("*") == false)
            //            for (int i = 0; i < vertices; i++)
            {
                idx++;
                //  if (Gerber.Verbose) Console.Write("{1}| reading X from {0}: ", idx, i);
                double X = Gerber.ParseDouble(v[idx]);
                //  if (Gerber.Verbose) Console.WriteLine(" {0} ", X);
                idx++;
                // if (Gerber.Verbose) Console.Write("{1}| reading Y from {0}: ", idx,i);

                double Y = Gerber.ParseDouble(v[idx]);
                //if (Gerber.Verbose) Console.WriteLine(" {0} ", Y);

                X = GNF.ScaleFileToMM(X);
                Y = GNF.ScaleFileToMM(Y);
                OutlineVertices.Add(new PointD(X, Y));
                i++;
            }

            //       throw new NotImplementedException();
        }
        public void DecodeOutline(string line, GerberNumberFormat GNF)
        {
            OutlineVertices = new List <OutlineParameterPoint>();
            string[] v = line.Split(',');

            //  if (Gerber.Verbose) Console.WriteLine("decoding {0}", lines[currentline]);
            int vertices = Int32.Parse(v[2]) + 1;

            if (Gerber.ShowProgress)
            {
                Console.WriteLine("{0} vertices", vertices);
            }
            int idx = 2;
            int i   = 0;

            if ((v.Length - 3 - vertices * 2) < 0)
            {
                vertices--;
            }
            double X = 0;
            double Y = 0;

            while (i < vertices && v[idx + 1].Contains("*") == false)
            //            for (int i = 0; i < vertices; i++)
            {
                bool xparambound = false;
                bool yparambound = false;
                //                int xid = -1;
                //int yid = -1;
                string xexpr = "";
                string yexpr = "";

                idx++;
                //  if (Gerber.Verbose) Console.Write("{1}| reading X from {0}: ", idx, i);
                if (v[idx].Contains("$"))
                {
                    Console.WriteLine("{0}", v[idx]);
                    xparambound = true;
                    int neg = 0;
                    if (v[idx][0] == '-')
                    {
                        neg = 1;
                    }
                    xexpr = v[idx];
                }
                else
                {
                    X = Gerber.ParseDouble(v[idx]);
                }
                //  if (Gerber.Verbose) Console.WriteLine(" {0} ", X);
                idx++;
                // if (Gerber.Verbose) Console.Write("{1}| reading Y from {0}: ", idx,i);
                if (v[idx].Contains("$"))
                {
                    Console.WriteLine("{0}", v[idx]);
                    yparambound = true;
                    int neg = 0;
                    if (v[idx][0] == '-')
                    {
                        neg = 1;
                    }
                    yexpr = v[idx];
                }
                else
                {
                    Y = Gerber.ParseDouble(v[idx]);
                }
                //if (Gerber.Verbose) Console.WriteLine(" {0} ", Y);

                X = GNF.ScaleFileToMM(X);
                Y = GNF.ScaleFileToMM(Y);
                OutlineVertices.Add(new OutlineParameterPoint()
                {
                    Point = new PointD(X, Y), xParamBound = xparambound, yexpr = yexpr, xexpr = xexpr, yParamBound = yparambound
                });
                i++;
            }

            //       throw new NotImplementedException();
        }
        public GerberApertureType BuildAperture(List <double> paramlist, GerberNumberFormat GNF)
        {
            //List<double> paramlist = _paramlist.ToList();
            GerberApertureType AT = new GerberApertureType();

            AT.MacroParamList = paramlist.ToList();
            AT.Shape.Vertices.Clear();

            switch (Type)
            {
            case ApertureMacroTypes.Equation:

                int T = int.Parse(EquationTarget.Substring(1));
                while (paramlist.Count() < T)
                {
                    paramlist.Add(0);
                }
                {
                    string srccopy = EquationSource.Replace("$1", "V1");
                    for (int i = 2; i <= paramlist.Count(); i++)
                    {
                        srccopy = srccopy.Replace("$" + i.ToString(), "V" + i.ToString());
                    }
                    srccopy = srccopy.Replace("X", "*");
                    MacroExpressionEvaluator E = new MacroExpressionEvaluator();
                    for (int i = 0; i < paramlist.Count(); i++)
                    {
                        E.Set("V" + (i + 1).ToString(), paramlist[i]);
                    }
                    while (paramlist.Count() < T)
                    {
                        paramlist.Add(0);
                    }

                    paramlist[T - 1] = E.Evaluate(srccopy);;
                    if (Gerber.ShowProgress)
                    {
                        Console.Write("equation {0}={1} -> {2}. Paramlist: ", EquationTarget, EquationSource, paramlist[T - 1]);
                        int c = 1;
                        foreach (var a in paramlist)
                        {
                            Console.Write(" {0}:{1},", c, a);
                            c++;
                        }
                        Console.WriteLine();
                    }
                    AT.MacroParamList = paramlist.ToList();
                }

                break;

            case ApertureMacroTypes.Polygon:
            {
                if (Gerber.ShowProgress)
                {
                    Console.WriteLine("Making an aperture for polygon. {0} params. {1} in paramlist", Params.Count, paramlist.Count());
                }

                Sides = (int)Params[2].BuildValue(paramlist);
                var diamvalue = Params[5].BuildValue(paramlist);
                Diameter = GNF.ScaleFileToMM(diamvalue);
                Rotation = Params[6].BuildValue(paramlist);
                Xoff     = GNF.ScaleFileToMM(Params[3].BuildValue(paramlist));
                Yoff     = GNF.ScaleFileToMM(Params[4].BuildValue(paramlist));
                AT.NGon(Sides, Diameter / 2, Xoff, Yoff, Rotation);
            }
            break;

            case ApertureMacroTypes.Outline:
                if (Gerber.ShowProgress)
                {
                    Console.WriteLine("Making an aperture for outline. {0} params. {1} in paramlist", Params.Count, paramlist.Count());
                }
                OutlineVerticesPostProc = new List <PointD>();
                foreach (var a in OutlineVertices)
                {
                    OutlineVerticesPostProc.Add(a.Get(paramlist));
                }
                AT.SetCustom(OutlineVerticesPostProc);
                break;

            case ApertureMacroTypes.Circle:
                if (Gerber.ShowProgress)
                {
                    Console.WriteLine("Making an aperture for circle. {0} params. {1} in paramlist", Params.Count, paramlist.Count());
                }
                Diameter = GNF.ScaleFileToMM(Params[2].BuildValue(paramlist));
                Xoff     = GNF.ScaleFileToMM(Params[3].BuildValue(paramlist));
                Yoff     = GNF.ScaleFileToMM(Params[4].BuildValue(paramlist));
                Rotation = GNF.ScaleFileToMM(Params[5].BuildValue(paramlist));
                AT.SetCircle(Diameter / 2, Xoff, Yoff, Rotation);

                break;

            case ApertureMacroTypes.CenterLine:
            {
                if (Gerber.ShowProgress)
                {
                    Console.WriteLine("Making an aperture for centerline. {0} params. {1} in paramlist", Params.Count, paramlist.Count());
                }
                {
                    //1 Exposure off/on (0/1))
                    //2 Rectangle width, a decimal ≥ 0.
                    //3 Rectangle height, a decimal ≥ 0.
                    //4 A decimal defining the X coordinate of center point.
                    //5 A decimal defining the Y coordinate of center point.
                    //6 A decimal defining the rotation angle around the origin (rotation is notaround the center of the object)
                }
                Width    = GNF.ScaleFileToMM(Params[2].BuildValue(paramlist));
                Height   = GNF.ScaleFileToMM(Params[3].BuildValue(paramlist));
                Xoff     = GNF.ScaleFileToMM(Params[4].BuildValue(paramlist));
                Yoff     = GNF.ScaleFileToMM(Params[5].BuildValue(paramlist));
                Rotation = Params[6].BuildValue(paramlist);
                AT.SetRotatedRectangle(Width, Height, Rotation, Xoff, Yoff);
                //AT.ShapeType = GerberApertureShape.CenterLine;
            }
            break;

            case ApertureMacroTypes.LowerLeftLine:
            {
                if (Gerber.ShowProgress)
                {
                    Console.WriteLine("Making an aperture for lowerleftline. {0} params. {1} in paramlist", Params.Count, paramlist.Count());
                }
                {
                    // 1 Exposure off/on (0/1))
                    // 2 Rectangle width, a decimal ≥ 0.
                    // 3 Rectangle height, a decimal ≥ 0.
                    // 4 A decimal defining the X coordinate of lower left point.
                    // 5 A decimal defining the Y coordinate of lower left point.
                    // 6 A decimal defining the rotation angle around the origin (rotation is not around the center of the object)
                }

                Width    = GNF.ScaleFileToMM(Params[2].BuildValue(paramlist));
                Height   = GNF.ScaleFileToMM(Params[3].BuildValue(paramlist));
                Xoff     = GNF.ScaleFileToMM(Params[4].BuildValue(paramlist));
                Yoff     = GNF.ScaleFileToMM(Params[5].BuildValue(paramlist));
                Rotation = Params[6].BuildValue(paramlist);
                AT.SetRotatedRectangle(Width, Height, Rotation, Xoff + Width / 2, Yoff + Height / 2);
            }
            break;

            case ApertureMacroTypes.Thermal:
                if (Gerber.ShowProgress)
                {
                    Console.WriteLine("Making an aperture for moire. {0} params. {1} in paramlist", Params.Count, paramlist.Count());
                }

                Xoff          = GNF.ScaleFileToMM(Params[1].BuildValue(paramlist));
                Yoff          = GNF.ScaleFileToMM(Params[2].BuildValue(paramlist));
                OuterDiameter = GNF.ScaleFileToMM(Params[3].BuildValue(paramlist));
                InnerDiameter = GNF.ScaleFileToMM(Params[4].BuildValue(paramlist));
                GapWidth      = GNF.ScaleFileToMM(Params[5].BuildValue(paramlist));
                Rotation      = Params[6].BuildValue(paramlist);

                AT.SetThermal(Xoff, Yoff, OuterDiameter, InnerDiameter, GapWidth, Rotation);

                //1 A decimal defining the X coordinate of center point
                //2 A decimal defining the Y coordinate of center point
                //3 Outer diameter, must be a decimal and > inner diameter
                //4 Inner diameter, must be a decimal and ≥ 0
                //5 Gap thickness, must be a decimal < (outer diameter)/√2
                //6 A decimal defining the rotation angle around the origin. Rotation is
                //only allowed if the center point is on the origin. If the rotation angle is
                //zero the gaps are on the X and Y axes through the center.



                break;

            case ApertureMacroTypes.Moire:

                if (Gerber.ShowProgress)
                {
                    Console.WriteLine("Making an aperture for moire. {0} params. {1} in paramlist", Params.Count, paramlist.Count());
                }

                Xoff               = GNF.ScaleFileToMM(Params[1].BuildValue(paramlist));
                Yoff               = GNF.ScaleFileToMM(Params[2].BuildValue(paramlist));
                OuterDiameter      = GNF.ScaleFileToMM(Params[3].BuildValue(paramlist));
                Width              = GNF.ScaleFileToMM(Params[4].BuildValue(paramlist));
                RingGap            = GNF.ScaleFileToMM(Params[5].BuildValue(paramlist));
                MaxRings           = (int)Params[6].BuildValue(paramlist);
                CrossHairThickness = GNF.ScaleFileToMM(Params[7].BuildValue(paramlist));
                CrossHairLength    = GNF.ScaleFileToMM(Params[8].BuildValue(paramlist));
                Rotation           = GNF.ScaleFileToMM(Params[9].BuildValue(paramlist));

                AT.SetMoire(Xoff, Yoff, OuterDiameter, Width, RingGap, MaxRings, CrossHairThickness, CrossHairLength, Rotation);
                //1 A decimal defining the X coordinate of center point.
                //2 A decimal defining the Y coordinate of center point.
                //3 A decimal defining the outer diameter of outer concentric ring
                //4 A decimal defining the ring thickness
                //5 A decimal defining the gap between rings
                //6 Maximum number of rings
                //7 A decimal defining the cross hair thickness
                //8 A decimal defining the cross hair length
                //9 A decimal defining the rotation angle around the origin. Rotation is only allowed if the center point is on the origin.

                break;


            case ApertureMacroTypes.Line_2:
            case ApertureMacroTypes.Line:
            {
                if (Gerber.ShowProgress)
                {
                    Console.WriteLine("Making an aperture for line. {0} params. {1} in paramlist", Params.Count, paramlist.Count());
                }
                {
                    //1 Exposure off/on (0/1)
                    //2 Line width, a decimal ≥ 0.
                    //3 A decimal defining the X coordinate of start point.
                    //4 A decimal defining the Y coordinate of start point.
                    //5 A decimal defining the X coordinate of end point.
                    //6 A decimal defining the Y coordinate of end point.
                    //7 A decimal defining the rotation angle around the origin (rotation is not around the center of the object)
                }
                Width    = GNF.ScaleFileToMM(Params[2].BuildValue(paramlist));
                Xoff     = GNF.ScaleFileToMM(Params[3].BuildValue(paramlist));
                Yoff     = GNF.ScaleFileToMM(Params[4].BuildValue(paramlist));
                Xend     = GNF.ScaleFileToMM(Params[5].BuildValue(paramlist));
                Yend     = GNF.ScaleFileToMM(Params[6].BuildValue(paramlist));
                Rotation = Params[7].BuildValue(paramlist);



                AT.SetLineSegment(new PointD(Xoff, Yoff), new PointD(Xend, Yend), Width, Rotation);
            }
            break;

            default:
                Console.WriteLine("I don't know how to make an aperture for macro type {0}!", Type);
                break;
            }

            AT.ShapeType = GerberApertureShape.Macro;
            AT.MacroName = Name;

            return(AT);
        }
예제 #5
0
        public void DecodeOutline(string line, GerberNumberFormat GNF)
        {
            Decode(line, GNF);
            //xqetqwet
            OutlineVertices = new List <OutlineParameterPoint>();
            string[] v = line.Split(',');

            //  if (Gerber.Verbose) Console.WriteLine("decoding {0}", lines[currentline]);
            int vertices = SaneIntParse(v[2]) + 1;

            if (Gerber.ShowProgress)
            {
                Console.WriteLine("{0} vertices", vertices);
            }
            int idx = 2;
            int i   = 0;

            if ((v.Length - 3 - vertices * 2) < 0)
            {
                vertices--;
            }
            double X = 0;
            double Y = 0;

            while (i < vertices && v[idx + 1].Contains("*") == false)
            {
                bool xparambound = false;
                bool yparambound = false;

                string xexpr = "";
                string yexpr = "";
                idx++;

                //  if (Gerber.Verbose) Console.Write("{1} Line [{0}] ", v[idx], idx);
                //  if (Gerber.Verbose) Console.Write("{1}| reading X from {0}: ", idx, i);
                if (v[idx].Contains("$"))
                {
                    Console.WriteLine("{0}", v[idx]);
                    xparambound = true;
                    int neg = 0;
                    if (v[idx][0] == '-')
                    {
                        neg = 1;
                    }
                    xexpr = v[idx];
                }
                else
                {
                    X = Gerber.ParseDouble(v[idx]);
                }
                idx++;
                // if (Gerber.Verbose)  Console.Write(" X {0} ", X);
                // if (Gerber.Verbose) Console.Write("{1}| reading Y from {0}: ", idx,i);
                if (v[idx].Contains("$"))
                {
                    Console.WriteLine("{0}", v[idx]);
                    yparambound = true;
                    int neg = 0;
                    if (v[idx][0] == '-')
                    {
                        neg = 1;
                    }
                    yexpr = v[idx];
                }
                else
                {
                    Y = Gerber.ParseDouble(v[idx]);
                }
                //if (Gerber.Verbose)  Console.WriteLine(" Y {0} ", Y);

                X = GNF.ScaleFileToMM(X);
                Y = GNF.ScaleFileToMM(Y);
                OutlineVertices.Add(new OutlineParameterPoint()
                {
                    Point = new PointD(X, Y), xParamBound = xparambound, yexpr = yexpr, xexpr = xexpr, yParamBound = yparambound
                });
                i++;
            }
            if (v.Length >= (vertices - 1) * 2 + 5)
            {
                int rotationidx = v.Length - 1;
                if (v[rotationidx].Contains("$"))
                {
                    Console.WriteLine("{0}", v[rotationidx]);
                    OutlineRotationExprEnabled = true;
                    int neg = 0;
                    if (v[rotationidx][0] == '-')
                    {
                        neg = 1;
                    }
                    OutlineRotationExpr = v[rotationidx];
                }
                else
                {
                    OutlineRotation = Gerber.ParseDouble(v[rotationidx]);
                    foreach (var ov in OutlineVertices)
                    {
                        ov.Point = ov.Point.Rotate(OutlineRotation);
                    }
                }

                //     OutlineRotation = (Gerber.ParseDouble(v[v.Length-1]));



                // rotate!
            }

            //       throw new NotImplementedException();
        }