public override void Process() { base.Process(); // parse and resolve pilot dependent values // the static values are already defined // syntax is already checked if (A.Point == null) { Result = Task.NewNoResult(A.GetFirstNoteText()); } else if (B.Point == null) { Result = Task.NewNoResult(B.GetFirstNoteText()); Result.UsedPoints.Add(A.Point); } else { switch (Definition.ObjectType) { case "D2D": //D2D: distance in 2D //D2D(<pointNameA>, <pointNameB> [,<bestPerformance>]) { var distance = Physics.Distance2D(A.Point, B.Point); if (distance < bestPerformance) { AddNote(string.Format("forcing performance ({0:0.00}) to be MMA max ({1})", distance, bestPerformance), true); distance = bestPerformance; } Result = Task.NewResult(Math.Round(distance, 0)); Result.UsedPoints.Add(A.Point); Result.UsedPoints.Add(B.Point); } break; case "D3D": //D3D: distance in 3D //D3D(<pointNameA>, <pointNameB> [,<bestPerformance>]) { var distance = Physics.Distance3D(A.Point, B.Point); if (distance < bestPerformance) { AddNote(string.Format("forcing performance ({0:0.00}) to be MMA max ({1})", distance, bestPerformance), true); distance = bestPerformance; } Result = Task.NewResult(Math.Round(distance, 0)); Result.UsedPoints.Add(A.Point); Result.UsedPoints.Add(B.Point); } break; case "DRAD": //DRAD: relative altitude dependent distance //DRAD(<pointNameA>, <pointNameB>, <threshold> [,<bestPerformance>]) { var distance = 0.0; var vDist = Math.Abs(A.Point.Altitude - B.Point.Altitude); if (vDist <= altitudeThreshold) { distance = Physics.Distance2D(A.Point, B.Point); AddNote("measuring 2D distance", true); } else { distance = Physics.Distance3D(A.Point, B.Point); AddNote("measuring 3D distance", true); } if (distance < bestPerformance) { AddNote(string.Format("forcing performance ({0:0.00}) to be MMA max ({1})", distance, bestPerformance), true); distance = bestPerformance; } Result = Task.NewResult(Math.Round(distance, 0)); Result.UsedPoints.Add(A.Point); Result.UsedPoints.Add(B.Point); } break; case "DRAD10": //DRAD10: relative altitude dependent distance rounded down to decameter //DRAD10(<pointNameA>, <pointNameB>, <threshold> [,<bestPerformance>]) { var distance = 0.0; var vDist = Math.Abs(A.Point.Altitude - B.Point.Altitude); if (vDist <= altitudeThreshold) { distance = Physics.Distance2D(A.Point, B.Point); AddNote("measuring 2D distance", true); } else { distance = Physics.Distance3D(A.Point, B.Point); AddNote("using 3D distance", true); } if (distance < bestPerformance) { AddNote(string.Format("forcing performance ({0:0.00}) to be MMA max ({1})", distance, bestPerformance), true); distance = bestPerformance; } Result = Task.NewResult(Math.Floor(distance / 10) * 10); Result.UsedPoints.Add(A.Point); Result.UsedPoints.Add(B.Point); } break; case "DACC": //DACC: accumulated distance //DACC(<pointNameA>, <pointNameB>) { var track = Engine.TaskValidTrack.Filter(p => p.Time >= A.Point.Time && p.Time <= B.Point.Time); Result = Task.NewResult(Math.Round(track.Distance2D(), 0)); Result.UsedTrack = track; } break; case "TSEC": //TSEC: time in seconds //TSEC(<pointNameA>, <pointNameB>) Result = Task.NewResult(Math.Abs(Math.Round((B.Point.Time - A.Point.Time).TotalSeconds, 0))); Result.UsedPoints.Add(A.Point); Result.UsedPoints.Add(B.Point); break; case "TMIN": //TMIN: time in minutes //TMIN(<pointNameA>, <pointNameB>) Result = Task.NewResult(Math.Round((B.Point.Time - A.Point.Time).TotalMinutes, 2)); Result.UsedPoints.Add(A.Point); Result.UsedPoints.Add(B.Point); break; case "ATRI": //ATRI: area of triangle //ATRI(<pointNameA>, <pointNameB>, <pointNameC>) if (C.Point == null) { Result = Task.NewNoResult(C.GetFirstNoteText()); Result.UsedPoints.Add(A.Point); Result.UsedPoints.Add(B.Point); } else { Result = Task.NewResult(Math.Round(Physics.Area(A.Point, B.Point, C.Point) / 1e6, 2)); Result.UsedPoints.Add(A.Point); Result.UsedPoints.Add(B.Point); Result.UsedPoints.Add(C.Point); } break; case "ANG3P": //ANG3P: angle between 3 points //ANG3P(<pointNameA>, <pointNameB>, <pointNameC>) if (C.Point == null) { Result = Task.NewNoResult(C.GetFirstNoteText()); Result.UsedPoints.Add(A.Point); Result.UsedPoints.Add(B.Point); } else { var nab = Physics.Direction2D(A.Point, B.Point); //north-A-B var nbc = Physics.Direction2D(B.Point, C.Point); //north-B-C var ang = Physics.Substract(nab, nbc); Result = Task.NewResult(Math.Round(Math.Abs(ang), 2)); Result.UsedPoints.Add(A.Point); Result.UsedPoints.Add(B.Point); Result.UsedPoints.Add(C.Point); } break; case "ANGN": //ANGN: angle to the north //ANGN(<pointNameA>, <pointNameB>) { var ang = Physics.Substract(Physics.Direction2D(A.Point, B.Point), 0); Result = Task.NewResult(Math.Round(Math.Abs(ang), 2)); Result.UsedPoints.Add(A.Point); Result.UsedPoints.Add(B.Point); } break; case "ANGSD": //ANGSD: angle to a set direction //ANGSD(<pointNameA>, <pointNameB>, <setDirection>) { var ang = Physics.Substract(Physics.Direction2D(A.Point, B.Point), setDirection); Result = Task.NewResult(Math.Round(Math.Abs(ang), 2)); Result.UsedPoints.Add(A.Point); Result.UsedPoints.Add(B.Point); } break; } } if (Result == null) { Result = Task.NewNoResult("this should never happen"); } AddNote("result is " + Result.ToString()); }