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