예제 #1
0
 internal void SetRotatedRectangle(double Width, double Height, double Rotation, double Xoff, double Yoff)
 {
     Shape.Vertices.Clear();
     Shape.MakeRectangle(Width, Height);
     Shape.Translate(Xoff, Yoff);
     Shape.RotateDegrees(Rotation);
 }
예제 #2
0
        public static PolyLine Stroke(double x1, double y1, double x2, double y2, double w)
        {
            PolyLine PL = new PolyLine(PolyIDs.GFXTemp);
            PointD   A  = new PointD(x1, y1);
            PointD   B  = new PointD(x2, y2);
            var      C  = B - A;

            PL.MakeRectangle(w, C.Length() + w);
            PL.Translate(0, C.Length() / 2);
            PL.RotateDegrees(Math.Atan2(C.Y, C.X) * 360 / (Math.PI * 2) - 90);
            PL.Translate(x1, y1);

            return(PL);
        }
예제 #3
0
        public string BuildGerber(GerberNumberFormat format, string MacroNameSuffix = "", double RotationAngle = 0)
        {
            string res       = String.Format("%ADD{0}", ID.ToString("D2"));
            int    parmcount = 0;

            switch (ShapeType)
            {
            case GerberApertureShape.Macro:

                res += MacroName + MacroNameSuffix;
                if (MacroParamList.Count > 0)
                {
                    res += ",";
                }
                foreach (var a in MacroParamList)
                {
                    parmcount++;
                    if (parmcount >= 2)
                    {
                        res += "X";
                    }
                    res += Gerber.ToFloatingPointString(format._ScaleMMToFile(a)).Replace(',', '.');
                }
                break;

            case GerberApertureShape.Circle:
            {
                if (CircleRadius > 3)
                {
                    //Console.WriteLine("test");
                }
                res += "C," + Gerber.ToFloatingPointString(format._ScaleMMToFile(CircleRadius * 2)).Replace(',', '.');
            }
            break;

            case GerberApertureShape.Rectangle:
                if (RotationAngle == 0 || (int)RotationAngle == 180)
                {
                    res += "R," + Gerber.ToFloatingPointString(format._ScaleMMToFile(RectWidth)).Replace(',', '.') + "X" + Gerber.ToFloatingPointString(format._ScaleMMToFile(RectHeight)).Replace(',', '.');
                }
                else
                {
                    if ((int)RotationAngle == 90 || (int)RotationAngle == (-90) || (int)RotationAngle == (270))
                    {
                        res += "R," + Gerber.ToFloatingPointString(format._ScaleMMToFile(RectHeight)).Replace(',', '.') + "X" + Gerber.ToFloatingPointString(format._ScaleMMToFile(RectWidth)).Replace(',', '.');
                    }
                    else
                    {
                        string macroname = "REC" + (MacroPostFix++).ToString();

                        PolyLine Rect = new PolyLine(PolyLine.PolyIDs.Temp);
                        Rect.MakeRectangle(RectWidth, RectHeight);
                        Rect.RotateDegrees(RotationAngle);
                        res = Gerber.BuildOutlineApertureMacro(macroname, Rect.Vertices, format) + res;

                        res += macroname;
                        if (Gerber.ShowProgress)
                        {
                            Console.WriteLine("generated rotated rect: ");
                        }
                        if (Gerber.ShowProgress)
                        {
                            Console.WriteLine(res);
                        }
                    }
                }
                break;

            case GerberApertureShape.Polygon:
                if (RotationAngle == 0)
                {
                    res += "P," + Gerber.ToFloatingPointString(format._ScaleMMToFile(NGonRadius * 2)).Replace(',', '.') + "X" + NGonSides.ToString() + "X" + Gerber.ToFloatingPointString(NGonRotation).Replace(',', '.');
                }
                else
                {
                    double newangle = NGonRotation + RotationAngle;
                    while (newangle < 0)
                    {
                        newangle += 360;
                    }
                    while (newangle > 360)
                    {
                        newangle -= 360;
                    }
                    res += "P," + Gerber.ToFloatingPointString(format._ScaleMMToFile(NGonRadius * 2)).Replace(',', '.') + "X" + NGonSides.ToString() + "X" + Gerber.ToFloatingPointString(newangle).Replace(',', '.');
                    if (Gerber.ShowProgress)
                    {
                        Console.WriteLine("generated rotated NGon: ");
                    }
                    if (Gerber.ShowProgress)
                    {
                        Console.WriteLine(res);
                    }
                }
                break;

            case GerberApertureShape.OBround:
                if (RotationAngle == 0 || Math.Abs(Math.Abs(RotationAngle) - 180) < 0.01)
                {
                    res += "O," + Gerber.ToFloatingPointString(format._ScaleMMToFile(RectWidth)).Replace(',', '.') + "X" + Gerber.ToFloatingPointString(format._ScaleMMToFile(RectHeight)).Replace(',', '.');
                }
                else
                {
                    if (Math.Abs(Math.Abs(RotationAngle) - 90) < 0.01)
                    {
                        res += "O," + Gerber.ToFloatingPointString(format._ScaleMMToFile(RectHeight)).Replace(',', '.') + "X" + Gerber.ToFloatingPointString(format._ScaleMMToFile(RectWidth)).Replace(',', '.');
                    }
                    else
                    {
                        string macroname = "OBR" + (MacroPostFix++).ToString();


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

                        Obround.SetObround(RectWidth, RectHeight);
                        Obround.RotateDegrees(RotationAngle);

                        res  = Gerber.BuildOutlineApertureMacro(macroname, Obround.Vertices, format) + res;
                        res += macroname;


                        if (Gerber.ShowProgress)
                        {
                            Console.WriteLine("generated rotated obround: ");
                        }
                        if (Gerber.ShowProgress)
                        {
                            Console.WriteLine(res);
                        }
                    }
                }
                break;

            case GerberApertureShape.Compound:
            {
                string macroname = "COMP" + (MacroPostFix++).ToString() + MacroNameSuffix;
                string macrores  = Gerber.WriteMacroStart(macroname);
                foreach (var P in Parts)
                {
                    PolyLine Comp = new PolyLine(PolyLine.PolyIDs.Temp);

                    foreach (var a in P.Shape.Vertices)

                    {
                        Comp.Add(a.X, a.Y);
                    }
                    Comp.Close();
                    Comp.RotateDegrees(RotationAngle);

                    macrores += Gerber.WriteMacroPartVertices(Comp.Vertices, format);
                }

                macrores += Gerber.WriteMacroEnd();
                res       = macrores + res;
                res      += macroname;


                if (Parts.Count > 1)
                {
                    Console.WriteLine("Number of parts: {0} but only 1 written", Parts.Count);
                    Console.WriteLine(res);
                }

                // res += MacroName;
                if (MacroParamList.Count > 0)
                {
                    res += ",";
                }
                foreach (var a in MacroParamList)
                {
                    parmcount++;
                    if (parmcount >= 2)
                    {
                        res += "X";
                    }
                    res += Gerber.ToFloatingPointString(a).Replace(',', '.');
                }


                if (Gerber.ShowProgress)
                {
                    Console.WriteLine("generated rotated compound macro shape: ");
                }
                if (Gerber.ShowProgress)
                {
                    Console.WriteLine(res);
                }
            }
            break;

            default:
                Console.WriteLine("I don't know how to generate the source for this aperture yet.");
                break;
            }

            res += "*%";

            return(res);
        }