List <ApertureMacroParam> RotateParams(ApertureMacroParam A, ApertureMacroParam B, double rotation)
        {
            List <ApertureMacroParam> Res = new List <ApertureMacroParam>();

            ApertureMacroParam X = new ApertureMacroParam(true)
            {
                boundparam = A.boundparam, scaledvalue = A.scaledvalue, value = A.value
            };
            ApertureMacroParam Y = new ApertureMacroParam(true)
            {
                boundparam = B.boundparam, scaledvalue = B.scaledvalue, value = B.value
            };

            PolyLine R = new PolyLine(PolyLine.PolyIDs.Temp);

            R.Add(X.value, Y.value);
            R.Add(X.scaledvalue, Y.scaledvalue);
            R.RotateDegrees(rotation);

            X.value       = R.Vertices[0].X;
            Y.value       = R.Vertices[0].Y;
            X.scaledvalue = R.Vertices[1].X;
            Y.scaledvalue = R.Vertices[1].Y;

            Res.Add(X);
            Res.Add(Y);
            return(Res);
        }
            internal PointD Get(List <double> thefloats)
            {
                if (xParamBound == false && yParamBound == false)
                {
                    return(Point);
                }
                PointD R = new PointD(Point.X, Point.Y);

                if (xParamBound)
                {
                    R.X = ApertureMacroParam.BuildValueFromExpressionAndParams(xexpr, thefloats);
                }
                if (yParamBound)
                {
                    R.Y = ApertureMacroParam.BuildValueFromExpressionAndParams(yexpr, thefloats);
                }
                return(R);
            }
Ejemplo n.º 3
0
        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", "*");
                    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:
            {
                try
                {
                    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.Count > 6? Params[6].BuildValue(paramlist):0;
                    Xoff     = GNF.ScaleFileToMM(Params[3].BuildValue(paramlist));
                    Yoff     = GNF.ScaleFileToMM(Params[4].BuildValue(paramlist));
                    AT.NGon(Sides, Diameter / 2, Xoff, Yoff, Rotation);
                }
                catch (Exception E)
                {
                    Console.WriteLine("Exception while making Polygon macro: {0}", E);
                }
            }
            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>();
                double ParamRotation = 0;
                if (OutlineRotationExprEnabled)
                {
                    int par = -1;
                    var Amp = new ApertureMacroParam(OutlineRotationExpr, -1, GNF, out par);
                    ParamRotation = Amp.BuildValue(paramlist);
                }

                foreach (var a in OutlineVertices)
                {
                    if (OutlineRotationExprEnabled)
                    {
                        OutlineVerticesPostProc.Add(a.Get(paramlist).Rotate(ParamRotation));


                        //       ApertureMacroParam OExpr = new ()
                    }
                    else
                    {
                        OutlineVerticesPostProc.Add(a.Get(paramlist));
                    }
                }
                AT.SetCustom(OutlineVerticesPostProc);
                break;

            case ApertureMacroTypes.Circle:
                try
                {
                    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.Count > 3 ? Params[3].BuildValue(paramlist):0);
                    Yoff     = GNF.ScaleFileToMM(Params.Count > 4 ? Params[4].BuildValue(paramlist):0);
                    Rotation = GNF.ScaleFileToMM(Params.Count > 5 ? Params[5].BuildValue(paramlist):0);
                }
                catch (Exception E)
                {
                    Console.WriteLine("Exception while making circle macro: {0}", E);
                }
                AT.SetCircle(Diameter / 2, Xoff, Yoff, Rotation);

                break;

            case ApertureMacroTypes.CenterLine:
            {
                try
                {
                    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.Count > 4 ? Params[4].BuildValue(paramlist):0);
                    Yoff     = GNF.ScaleFileToMM(Params.Count > 5 ? Params[5].BuildValue(paramlist):0);
                    Rotation = Params.Count > 6 ? Params[6].BuildValue(paramlist):0;
                    AT.SetRotatedRectangle(Width, Height, Rotation, Xoff, Yoff);
                    //AT.ShapeType = GerberApertureShape.CenterLine;
                }
                catch (Exception E)
                {
                    Console.WriteLine("Exception while making CenterLine macro: {0}", E);
                }
            }
            break;

            case ApertureMacroTypes.LowerLeftLine:
            {
                try
                {
                    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.Count > 4 ? Params[4].BuildValue(paramlist):0);
                    Yoff     = GNF.ScaleFileToMM(Params.Count > 5 ? Params[5].BuildValue(paramlist):0);
                    Rotation = Params.Count > 6 ? Params[6].BuildValue(paramlist):0;
                }
                catch (Exception E)
                {
                    Console.WriteLine("Exception while making LowerLeftLine macro: {0}", E);
                }
                AT.SetRotatedRectangle(Width, Height, Rotation, Xoff + Width / 2, Yoff + Height / 2);
            }
            break;

            case ApertureMacroTypes.Thermal:
                try
                {
                    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.Count > 6 ? Params[6].BuildValue(paramlist):0;
                }
                catch (Exception E)
                {
                    Console.WriteLine("Exception while making Thermal macro: {0}", E);
                }

                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:
                try
                {
                    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.Count > 9 ? Params[9].BuildValue(paramlist):0);
                }
                catch (Exception E)
                {
                    Console.WriteLine("Exception while making Moire macro: {0}", E);
                }

                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:
            {
                try
                {
                    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.Count > 7 ? Params[7].BuildValue(paramlist):0;
                }
                catch (Exception E)
                {
                    Console.WriteLine("Exception while making Line_2 or Line macro: {0}", E);
                }


                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);
        }