Exemple #1
0
        void OutputSlot(ExcellonCommand cmd, double tsize)
        {
            double x      = cmd.End.X - cmd.Start.X;
            double y      = cmd.End.Y - cmd.Start.Y;
            double dist   = Math.Sqrt(x * x + y * y);
            int    holes  = (int)Math.Round(dist / (tsize / 3d) + 0.5d, 0);
            double factor = dist / (holes - 1);

            x = x / dist * factor;
            y = y / dist * factor;

            job.AddBlock(string.Format("(Slot {0};{1} - {2};{3})", cmd.Start.X.ToInvariantString(), cmd.Start.Y.ToInvariantString(), cmd.End.X.ToInvariantString(), cmd.End.Y.ToInvariantString()));

            Point3D target = new Point3D(cmd.Start.X, cmd.Start.Y, settings.ZMin);

            OutputG81(target);

            while (--holes > 0)
            {
                target.X += x;
                target.Y += y;
                OutputG81(target);
            }

            lastPos = target;
        }
Exemple #2
0
        // M48 Start header
        // M71 metric
        // M72 Inch
        // G04Xn Dwell
        // INCH,LZ - LZ = LeadingZeros
        // M95 or % end header
        // G05 Drill Mode (modal)

        public bool LoadFile(CNC.Controls.GCode job, string filename)
        {
            bool ok = true, leadingZeros = false;

            JobParametersViewModel.Tool tool = new JobParametersViewModel.Tool {
                Id = 0, Diameter = 0d
            };

            this.job = job;

            settings.Profile = "Excellon";

            if (new JobParametersDialog(settings)
            {
                Owner = Application.Current.MainWindow
            }.ShowDialog() != true)
            {
                return(false);
            }

            FileInfo     file = new FileInfo(filename);
            StreamReader sr   = file.OpenText();

            string s = sr.ReadLine();

            while (s != null)
            {
                try
                {
                    s = s.Trim();

                    if (isHeader == null)
                    {
                        isHeader = s == "M48";
                    }

                    else if (isHeader == true)
                    {
                        switch (s)
                        {
                        case "METRIC":
                            isMetric     = true;
                            leadingZeros = false;
                            break;

                        case "METRIC,TZ":
                            isMetric     = true;
                            leadingZeros = true;
                            break;

                        case "INCH":
                            isMetric     = false;
                            leadingZeros = false;
                            break;

                        case "INCH,TZ":
                            isMetric     = false;
                            leadingZeros = true;
                            break;

                        case "%":
                        case "M95":
                            isHeader = false;
                            break;
                        }

                        if (s[0] == 'T')
                        {
                            int cpos = s.IndexOf('C');
                            tools.Add(new JobParametersViewModel.Tool {
                                Id = int.Parse(s.Substring(1, cpos - 1)), Diameter = dbl.Parse(s.Substring(cpos + 1))
                            });
                        }
                    }
                    else
                    {
                        switch (s[0])
                        {
                        case 'G':
                            switch (s)
                            {
                            case "G00":
                            case "G01":
                            case "G02":
                            case "G03":
                                isDrillMode = false;
                                break;

                            case "G05":
                                isDrillMode = true;
                                break;
                            }
                            break;

                        case 'X':
                            if (isDrillMode)
                            {
                                int    g85pos = s.IndexOf("G85");
                                string args   = g85pos >= 0 ? s.Substring(0, g85pos) : s;
                                int    ypos   = args.IndexOf('Y');
                                double factor = leadingZeros ? (ypos == 8 ? 1000d : 10000d) : 1.0;
                                var    cmd    = new ExcellonCommand();
                                cmd.Command = g85pos >= 0 ? "Slot" : "Drill";
                                cmd.tool    = tool.Id;
                                cmd.Start.X = dbl.Parse(args.Substring(1, ypos - 1)) / factor / (isMetric ? 1d : 25.4d);
                                cmd.Start.Y = dbl.Parse(args.Substring(ypos + 1)) / factor / (isMetric ? 1d : 25.4d);
                                if (g85pos >= 0)
                                {
                                    isDrillMode = false;
                                    args        = s.Substring(g85pos + 3);
                                    ypos        = args.IndexOf('Y');
                                    cmd.End.X   = dbl.Parse(args.Substring(1, ypos - 1)) / (isMetric ? 1d : 25.4d);
                                    cmd.End.Y   = dbl.Parse(args.Substring(ypos + 1)) / (isMetric ? 1d : 25.4d);
                                }
                                commands.Add(cmd);
                            }
                            break;

                        case 'T':
                            tool = tools.Where(x => x.Id == int.Parse(s.Substring(1))).FirstOrDefault();
                            break;
                        }
                    }
                }
                catch
                {
                }
                s = sr.ReadLine();
            }

            sr.Close();

            job.AddBlock(filename, CNC.Core.Action.New);
            job.AddBlock("(Translated by Excellon to GCode converter)");
            job.AddBlock("G90G17G21G50");

            if (settings.ScaleX != 1d || settings.ScaleY != 1d)
            {
                job.AddBlock(string.Format("G51X{0}Y{1}", settings.ScaleX.ToInvariantString(), settings.ScaleY.ToInvariantString()));
            }

            job.AddBlock("G0Z" + settings.ZRapids.ToInvariantString());
            job.AddBlock("X0Y0");

            var target = new Point3D(0d, 0d, settings.ZRapids);

            foreach (var t in tools)
            {
                job.AddBlock("M5");
                target.X = 0d;
                target.Y = 0d;
                target.Z = settings.ZHome;
                job.AddBlock("G0" + PosToParams(target));
                job.AddBlock(string.Format("M6 (MSG, {0} mm {1})", (t.Diameter < settings.ToolDiameter ? t.Diameter : settings.ToolDiameter).ToInvariantString(), t.Diameter < settings.ToolDiameter ? "drill" : "mill"));
                job.AddBlock("M3S" + settings.RPM.ToInvariantString());
                job.AddBlock("G4P1");
                target.Z = settings.ZRapids;
                job.AddBlock("G0" + PosToParams(target));
                job.AddBlock("F" + settings.PlungeRate.ToInvariantString());

                foreach (var cmd in commands)
                {
                    if (cmd.tool == t.Id)
                    {
                        switch (cmd.Command)
                        {
                        case "Drill":
                            if (t.Diameter > settings.ToolDiameter)
                            {
                                double r = (t.Diameter - settings.ToolDiameter) / 2d;
                                target.X = cmd.Start.X + r;
                                target.Y = cmd.Start.Y;
                                string p = PosToParams(target);
                                if (p.Length > 0)
                                {
                                    job.AddBlock("G0" + p);
                                }
                                target.Z = settings.ZMin;
                                job.AddBlock("G1" + PosToParams(target));
                                job.AddBlock(string.Format("G{0}X{1}I-{2}", "2", target.X.ToInvariantString(), r.ToInvariantString()));
                                target.Z = settings.ZRapids;
                                job.AddBlock("G0" + PosToParams(target));
                            }
                            else
                            {
                                OutputG81(new Point3D(cmd.Start.X, cmd.Start.Y, settings.ZMin));
                            }
                            break;

                        case "Slot":
                            OutputSlot(cmd, t.Diameter);
                            break;
                        }
                    }
                }
            }

            job.AddBlock("G0X0Y0Z" + settings.ZHome.ToInvariantString());
            job.AddBlock("M30", CNC.Core.Action.End);

            return(ok);
        }