DoDeltaCalibration() public method

public DoDeltaCalibration ( int numFactors, IList zBedProbePoints, bool normalise ) : double>.Tuple
numFactors int
zBedProbePoints IList
normalise bool
return double>.Tuple
Beispiel #1
0
        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;
                }
            }
        }
Beispiel #2
0
        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;
                }
            }
        }