public DoDeltaCalibration ( int numFactors, IList |
||
numFactors | int | |
zBedProbePoints | IList |
|
normalise | bool | |
return | double>.Tuple |
private void UpdateOutput() { lock (updateLock) { try { var list = new List<PointError>(); foreach (Match match in ParsingRegex.Matches(inputTextBox.Text)) { list.Add(new PointError(double.Parse(match.Groups["x"].Value), double.Parse(match.Groups["y"].Value), SignMultiplier * double.Parse(match.Groups["z"].Value))); } double center; if (list.Any(_ => _.X == 0 && _.Y == 0)) { center = list.First(_ => _.X == 0 && _.Y == 0).ZError; } else { var nearest = ( from l in list let dist = Math.Sqrt(Math.Pow(l.X, 2) + Math.Pow(l.Y, 2)) orderby dist select new { l, dist } ) .Take(4); var totalDist = nearest.Sum(_ => _.dist); center = nearest.Sum(_ => _.l.ZError * (_.dist / totalDist)); } if (radioZCorrection.Checked) { var sb = new StringBuilder(); var cleanList = list.Select(_ => new PointError(_.X, _.Y, _.ZError - center)).ToList(); var lines = from item in cleanList select String.Format(@"G33 X{0:0.00} Y{1:0.00} Z{2:0.000}", item.X, item.Y, item.ZError); sb.AppendLine("G33 R0"); outputTextBox.Text = "G33 R0\r\n" + String.Join("\r\n", lines); } else { outputTextBox.Text = String.Empty; } double stepsPerMm = double.Parse(txtStepsPerMmInput.Text); if (stepsPerMm == 0) throw new Exception("Invalid steps per mm"); var delta = new Delta( diagonal: double.Parse(txtArmLengthInput.Text), radius: double.Parse(txtRadiusInput.Text), height: double.Parse(txtHeightInput.Text), xstop: double.Parse(txtXEndstopInput.Text) / stepsPerMm, ystop: double.Parse(txtYEndstopInput.Text) / stepsPerMm, zstop: double.Parse(txtZEndstopInput.Text) / stepsPerMm, xadj: double.Parse(txtXadjustInput.Text), yadj: double.Parse(txtYAdjustInput.Text), zadj: double.Parse(txtZAdjustInput.Text) ); double bedRadius = double.Parse(txtBedRadiusInput.Text); double bedRadiusSquared = bedRadius * bedRadius; //var invertSigns = // cleanList // .Select(_ => new PointError(_.X, _.Y, -1 * _.ZError)) // .ToList(); //var result = delta.DoDeltaCalibration(7, invertSigns.ToList(), true); var result = delta.DoDeltaCalibration(7, list.ToList(), true); txtInitialError.Text = String.Format("{0:0.00}", result.Item1); txtAdjustedError.Text = String.Format("{0:0.00}", result.Item2); txtArmLengthOutput.Text = String.Format("{0:0.00}", delta.diagonal); txtHeightOutput.Text = String.Format("{0:0.00}", delta.homedHeight); txtRadiusOutput.Text = String.Format("{0:0.00}", delta.radius); txtXadjustOutput.Text = String.Format("{0:0.00}", delta.xadj); txtYAdjustOutput.Text = String.Format("{0:0.00}", delta.yadj); txtZAdjustOutput.Text = String.Format("{0:0.00}", delta.zadj); txtXEndstopOutput.Text = String.Format("{0:0.00}", delta.xstop * stepsPerMm); txtYEndstopOutput.Text = String.Format("{0:0.00}", delta.ystop * stepsPerMm); txtZEndstopOutput.Text = String.Format("{0:0.00}", delta.zstop * stepsPerMm); } catch (Exception) { txtArmLengthOutput.Text = txtHeightOutput.Text = txtRadiusOutput.Text = txtXadjustOutput.Text = txtYAdjustOutput.Text = txtZAdjustOutput.Text = txtXEndstopOutput.Text = txtYEndstopOutput.Text = txtZEndstopOutput.Text = String.Empty; } } }
private void UpdateOutput() { lock (updateLock) { try { var list = new List <PointError>(); foreach (Match match in ParsingRegex.Matches(inputTextBox.Text)) { list.Add(new PointError(double.Parse(match.Groups["x"].Value), double.Parse(match.Groups["y"].Value), SignMultiplier * double.Parse(match.Groups["z"].Value))); } double center; if (list.Any(_ => _.X == 0 && _.Y == 0)) { center = list.First(_ => _.X == 0 && _.Y == 0).ZError; } else { var nearest = ( from l in list let dist = Math.Sqrt(Math.Pow(l.X, 2) + Math.Pow(l.Y, 2)) orderby dist select new { l, dist } ) .Take(4); var totalDist = nearest.Sum(_ => _.dist); center = nearest.Sum(_ => _.l.ZError * (_.dist / totalDist)); } if (radioZCorrection.Checked) { var sb = new StringBuilder(); var cleanList = list.Select(_ => new PointError(_.X, _.Y, _.ZError - center)).ToList(); var lines = from item in cleanList select String.Format(@"G33 X{0:0.00} Y{1:0.00} Z{2:0.000}", item.X, item.Y, item.ZError); sb.AppendLine("G33 R0"); outputTextBox.Text = "G33 R0\r\n" + String.Join("\r\n", lines); } else { outputTextBox.Text = String.Empty; } double stepsPerMm = double.Parse(txtStepsPerMmInput.Text); if (stepsPerMm == 0) { throw new Exception("Invalid steps per mm"); } var delta = new Delta( diagonal: double.Parse(txtArmLengthInput.Text), radius: double.Parse(txtRadiusInput.Text), height: double.Parse(txtHeightInput.Text), xstop: double.Parse(txtXEndstopInput.Text) / stepsPerMm, ystop: double.Parse(txtYEndstopInput.Text) / stepsPerMm, zstop: double.Parse(txtZEndstopInput.Text) / stepsPerMm, xadj: double.Parse(txtXadjustInput.Text), yadj: double.Parse(txtYAdjustInput.Text), zadj: double.Parse(txtZAdjustInput.Text) ); double bedRadius = double.Parse(txtBedRadiusInput.Text); double bedRadiusSquared = bedRadius * bedRadius; //var invertSigns = // cleanList // .Select(_ => new PointError(_.X, _.Y, -1 * _.ZError)) // .ToList(); //var result = delta.DoDeltaCalibration(7, invertSigns.ToList(), true); var result = delta.DoDeltaCalibration(7, list.ToList(), true); txtInitialError.Text = String.Format("{0:0.00}", result.Item1); txtAdjustedError.Text = String.Format("{0:0.00}", result.Item2); txtArmLengthOutput.Text = String.Format("{0:0.00}", delta.diagonal); txtHeightOutput.Text = String.Format("{0:0.00}", delta.homedHeight); txtRadiusOutput.Text = String.Format("{0:0.00}", delta.radius); txtXadjustOutput.Text = String.Format("{0:0.00}", delta.xadj); txtYAdjustOutput.Text = String.Format("{0:0.00}", delta.yadj); txtZAdjustOutput.Text = String.Format("{0:0.00}", delta.zadj); txtXEndstopOutput.Text = String.Format("{0:0.00}", delta.xstop * stepsPerMm); txtYEndstopOutput.Text = String.Format("{0:0.00}", delta.ystop * stepsPerMm); txtZEndstopOutput.Text = String.Format("{0:0.00}", delta.zstop * stepsPerMm); } catch (Exception) { txtArmLengthOutput.Text = txtHeightOutput.Text = txtRadiusOutput.Text = txtXadjustOutput.Text = txtYAdjustOutput.Text = txtZAdjustOutput.Text = txtXEndstopOutput.Text = txtYEndstopOutput.Text = txtZEndstopOutput.Text = String.Empty; } } }