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