public ItemPath(Point tmp)
            {
                isReversed = false;
                distance   = 0;
                pathLength = 0;
                path       = new List <GCodeMotion>();
                dimension  = new Dimensions();
                GCodeMotion motion = new GCodeLine(tmp);

                dimension.setDimensionXY(tmp.X, tmp.Y);
                path.Add(motion);
                start = end = tmp;
            }
예제 #2
0
        private static bool ConvertCSV(string[] csvCode, string filePath)
        {
            Graphic.Init(Graphic.SourceTypes.CSV, filePath, backgroundWorker, backgroundEvent);
            Logger.Info(" convertCSV {0}", filePath);
            dimension = new Dimensions();
            int    size = csvCode.Length;
            double csvX = 0, csvY = 0, csvZ = 0;

            string[] splitSample = new string[] { };
            conversionInfo = string.Format("CSV Import: Lines:{0} ", size);

            tryAutomatic = Properties.Settings.Default.importCSVAutomatic;
            if (tryAutomatic)
            {                   // get probe from middle of data range
                int    sampleLine = size / 2;
                string sample     = csvCode[sampleLine].Trim();
                int    columns    = 0;
                columnX  = 0;
                columnY  = 1;
                processZ = false;
                if (sample.Length >= 3)                         // min. expected length: 2 numbers, 1 delimeter
                {
                    for (int i = 0; i < deliSelect.Length; i++)
                    {
                        if (sample.Contains(deliSelect[i]))
                        {
                            delimeter = deliSelect[i];
                            break;
                        }
                    }
                    splitSample = sample.Split(delimeter);
                    columns     = splitSample.Length;
                }
                Logger.Info(" Automatic, found '{0}', columns:{1} in sample '{2}', line {3}", delimeter, columns, sample, sampleLine);

                if (columns <= 1)
                {
                    string errorTxt = string.Format("(Automatic CSV import failed!)\r\n(Delimeter '{0}' in sample '{1}' from line {2})", delimeter, sample, sampleLine);
                    return(false);// errorTxt;
                }
                columnY = columns - 1;
                columnX = columns - 2;

                Graphic.SetHeaderInfo(string.Format(" Automatic: delimeter:'{0}', index-X:{1} , index-X:{2} ", delimeter, columnX, columnY));
                Graphic.SetHeaderInfo(string.Format(" Sample Line:{0} {1} ", (sampleLine + 1), sample));

                for (int i = 0; i < sampleLine; i++)      // find first CSV line
                {
                    splitSample = csvCode[i].Trim().Split(delimeter);
                    if (splitSample.Length == columns)
                    {
                        if (double.TryParse(splitSample[columnX], out csvX) && double.TryParse(splitSample[columnY], out csvY))
                        {   // seems to be regualr data
                            startAtLine = i;
                            break;
                        }
                        else
                        {
                            Graphic.SetHeaderInfo(string.Format(" CSV Line:{0} {1} ", (i + 1), csvCode[i]));
                        }
                    }
                    else if (csvCode[i].Length > 1)
                    {
                        Graphic.SetHeaderInfo(string.Format(" CSV Line:{0} {1} ", (i + 1), csvCode[i]));
                    }
                }
                conversionInfo += string.Format("Automatic: delimeter:'{0}', column-X:{1}, -Y:{2}, 1st data line:{3}.  ", delimeter, columnX, columnY, startAtLine);
            }
            else                // get defaults
            {
                delimeter     = Properties.Settings.Default.importCSVDelimeter[0];
                startAtLine   = (int)Properties.Settings.Default.importCSVStartLine;
                columnX       = (int)Properties.Settings.Default.importCSVColumnX;
                columnY       = (int)Properties.Settings.Default.importCSVColumnY;
                columnZ       = (int)Properties.Settings.Default.importCSVColumnZ;
                scaleX        = (double)Properties.Settings.Default.importCSVScaleX;
                scaleY        = (double)Properties.Settings.Default.importCSVScaleY;
                scaleZ        = (double)Properties.Settings.Default.importCSVScaleZ;
                processZ      = Properties.Settings.Default.importCSVProzessZ;
                processAsLine = Properties.Settings.Default.importCSVProzessAsLine;
                continuousX   = false;
            }

            int maxCol = Math.Max(columnX, columnY);

            if (processZ)
            {
                maxCol = Math.Max(maxCol, columnZ);
            }

            bool lastOk     = false;
            bool xOk        = true;
            bool zOk        = true;
            int  blockCount = 0;
            int  indexX     = 0;

            Logger.Info(" Amount Lines:{0}", size);
            if (backgroundWorker != null)
            {
                backgroundWorker.ReportProgress(0, new MyUserState {
                    Value = 10, Content = "Read CSV data of " + size.ToString() + " lines"
                });
            }

            for (int i = startAtLine; i < size; i++)
            {
                if (backgroundWorker != null)
                {
                    backgroundWorker.ReportProgress(i * 100 / size);
                    if (backgroundWorker.CancellationPending)
                    {
                        backgroundEvent.Cancel = true;
                        break;
                    }
                }

                splitSample = csvCode[i].Trim().Split(delimeter);
                if (splitSample.Length > maxCol)
                {
                    if (!continuousX)
                    {
                        xOk = double.TryParse(splitSample[columnX], NumberStyles.Float, NumberFormatInfo.InvariantInfo, out csvX);
                    }
                    else
                    {
                        csvX = indexX++;
                    }

                    if (processZ)
                    {
                        zOk = double.TryParse(splitSample[columnZ], NumberStyles.Float, NumberFormatInfo.InvariantInfo, out csvZ);
                    }

                    if (zOk && xOk && double.TryParse(splitSample[columnY], NumberStyles.Float, NumberFormatInfo.InvariantInfo, out csvY))
                    {
                        csvX = csvX * scaleX;
                        csvY = csvY * scaleY;
                        csvZ = csvZ * scaleZ;
                        dimension.setDimensionXY(csvX, csvY);

                        if (!lastOk)
                        {
                            Graphic.StopPath();
                            Graphic.SetLayer(blockCount.ToString());
                            if (processAsLine)
                            {
                                Graphic.SetGeometry("Line");
                                Graphic.StartPath(new Point(csvX, csvY));
                            }
                            else
                            {
                                Graphic.SetGeometry("Point");
                                if (processZ)
                                {
                                    Graphic.AddDotWithZ(csvX, csvY, csvZ);
                                }
                                else
                                {
                                    Graphic.AddDot(csvX, csvY);
                                }
                            }
                        }
                        else
                        {
                            if (processAsLine)
                            {   //Graphic.SetGeometry("Line");
                                Graphic.AddLine(new Point(csvX, csvY));
                            }
                            else
                            {   //Graphic.SetGeometry("Point");
                                if (processZ)
                                {
                                    Graphic.AddDotWithZ(csvX, csvY, csvZ);
                                }
                                else
                                {
                                    Graphic.AddDot(csvX, csvY);
                                }
                            }
                        }
                        lastOk = true;
                    }
                    else
                    {
                        lastOk = false;
                    }
                }
                else
                {
                    lastOk = false;
                }
            }
            Graphic.StopPath();
            if (tryAutomatic)
            {
                double sx = 1, sy = 1;
                if (dimension.dimx < 3)
                {
                    sx = 100;
                }
                if (dimension.dimy < 3)
                {
                    sy = 100;
                }
                conversionInfo += string.Format("Apply scale-X:{0}, -Y:{1}", sx, sy);
                Logger.Info(" Automatic scale dimX:{0} scaleX:{1}, dimY:{2}, scaleY:{3}", dimension.dimx, sx, dimension.dimy, sy);
                Graphic.ScaleXY(sx, sy);
            }
            return(Graphic.CreateGCode());
        }