public override void OnRender(Graphics g)
{
Pen MyPen = new Pen(new SolidBrush(LabelAttributes.TargetColor), LabelAttributes.TargetSize);
MyPen.DashStyle = LabelAttributes.TargetStyle;
// Draw AC Symbol
g.DrawRectangle(MyPen, LocalPosition.X - 5, LocalPosition.Y - 5, 10, 10);
AC_SYMB_START_X = LocalPosition.X - 5;
AC_SYMB_START_Y = LocalPosition.Y - 5;
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Here handle drawing of Range/Bearing & SEP tool
if (TargetToMonitor != -1)
{
Point StartPosition = new Point(LocalPosition.X, LocalPosition.Y);
Point EndPosition = DynamicDisplayBuilder.GetTargetPositionByIndex(TargetToMonitor);
g.DrawLine(new Pen(Brushes.Yellow, 1), StartPosition, EndPosition);
// select a reference elllipsoid
Ellipsoid reference = Ellipsoid.WGS84;
// instantiate the calculator
GeodeticCalculator geoCalc = new GeodeticCalculator();
GlobalPosition Start = new GlobalPosition(new GlobalCoordinates(this.Position.Lat, this.Position.Lng));
PointLatLng End_LatLng = FormMain.FromLocalToLatLng(EndPosition.X, EndPosition.Y);
GlobalPosition End = new GlobalPosition(new GlobalCoordinates(End_LatLng.Lat, End_LatLng.Lng));
GeodeticMeasurement GM = geoCalc.CalculateGeodeticMeasurement(reference, End, Start);
////////////////////////////////////////////////////////////////////////////////////////////
// Handle SEP Tool
double TRK1_SPD = 0.0, TRK2_SPD = 0.0;
double TRK1_AZ = 0.0, TRK2_AZ = 0.0;
bool Sep_Data_Is_Valid = true;
if (!double.TryParse(CALC_GSPD_STRING, out TRK1_SPD))
{
if (!double.TryParse(DAP_GSPD, out TRK1_SPD))
{
Sep_Data_Is_Valid = false;
}
}
if (!double.TryParse(DynamicDisplayBuilder.GetTarget_CALC_GSPD_ByIndex(TargetToMonitor), out TRK2_SPD))
{
if (!double.TryParse(DynamicDisplayBuilder.GetTarget_DAP_GSPD_ByIndex(TargetToMonitor), out TRK2_SPD))
{
Sep_Data_Is_Valid = false;
}
}
if (!double.TryParse(CALC_HDG_STRING, out TRK1_AZ))
{
if (!double.TryParse(TRK, out TRK1_AZ))
{
if (!double.TryParse(DAP_HDG, out TRK1_AZ))
{
Sep_Data_Is_Valid = false;
}
}
}
if (!double.TryParse(DynamicDisplayBuilder.GetTarget_CALC_HDG_ByIndex(TargetToMonitor), out TRK2_AZ))
{
if (!double.TryParse(DynamicDisplayBuilder.GetTargetTRKByIndex(TargetToMonitor), out TRK2_AZ))
{
if (!double.TryParse(DynamicDisplayBuilder.GetTargetM_HDGByIndex(TargetToMonitor), out TRK2_AZ))
{
Sep_Data_Is_Valid = false;
}
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// If all the necessary data is avilable
// then pass it on to the SEP tool calculator
// and then draw the result
string SepToolActive = "N/A";
if (Sep_Data_Is_Valid)
{
SEP_Tool_Calculator SepTool = new SEP_Tool_Calculator(Start, End, TRK1_SPD, TRK2_SPD, TRK1_AZ, TRK2_AZ, 20);
SEP_Tool_Calculator.OutData Sep_Tool_Data = SepTool.GetResult();
if (Sep_Tool_Data.Is_Converging)
{
g.DrawRectangle(new Pen(Brushes.Yellow, LabelAttributes.TargetSize), Sep_Tool_Data.Track_1_Pos_Min.X - 5, Sep_Tool_Data.Track_1_Pos_Min.Y - 5, 10, 10);
g.DrawRectangle(new Pen(Brushes.Yellow, LabelAttributes.TargetSize), Sep_Tool_Data.Track_2_Pos_Min.X - 5, Sep_Tool_Data.Track_2_Pos_Min.Y - 5, 10, 10);
g.DrawLine(new Pen(Brushes.Yellow, LabelAttributes.TargetSize), new Point(Sep_Tool_Data.Track_1_Pos_Min.X, Sep_Tool_Data.Track_1_Pos_Min.Y), new Point(StartPosition.X, StartPosition.Y));
g.DrawLine(new Pen(Brushes.Yellow, LabelAttributes.TargetSize), new Point(Sep_Tool_Data.Track_2_Pos_Min.X, Sep_Tool_Data.Track_2_Pos_Min.Y), new Point(EndPosition.X, EndPosition.Y));
TimeSpan T = TimeSpan.FromSeconds(Sep_Tool_Data.SecondsToMinimum);
SepToolActive = "min d:" + Math.Round(Sep_Tool_Data.MinDistance, 1).ToString() + "/" + T.Minutes.ToString() + ":" + T.Seconds.ToString();
}
}
// Now compute position half way between two points.
double distance = GM.PointToPointDistance / 2.0;
if (distance > 0.0)
{
GlobalCoordinates GC = geoCalc.CalculateEndingGlobalCoordinates(reference, new GlobalCoordinates(End_LatLng.Lat, End_LatLng.Lng), GM.Azimuth, distance);
GPoint GP = FormMain.FromLatLngToLocal(new PointLatLng(GC.Latitude.Degrees, GC.Longitude.Degrees));
double Distane_NM = 0.00053996 * GM.PointToPointDistance;
g.DrawString(Math.Round(GM.Azimuth.Degrees).ToString() + "°/" + Math.Round(Distane_NM, 1).ToString() + "nm", new Font(FontFamily.GenericSansSerif, 9), Brushes.Yellow, new PointF(GP.X, GP.Y));
if (Sep_Data_Is_Valid && SepToolActive != "N/A")
{
g.DrawString(SepToolActive, new Font(FontFamily.GenericSansSerif, 9), Brushes.Yellow, new PointF(GP.X, GP.Y + 15));
}
}
}
// Here handle history points
// First draw all previous history points
int Number_of_Points_Drawn = 0;
for (int Index = HistoryPoints.Count - 2; Index >= 0; Index--)
{
if (Number_of_Points_Drawn < Properties.Settings.Default.HistoryPoints)
{
HistoryPointsType I = HistoryPoints.ElementAt(Index);
GPoint MarkerPositionLocal = FormMain.gMapControl.FromLatLngToLocal(new PointLatLng(I.LatLong.Lat, I.LatLong.Lng));
g.DrawEllipse(MyPen, MarkerPositionLocal.X, MarkerPositionLocal.Y, 3, 3);
Number_of_Points_Drawn++;
}
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Here draw speed vector
// // Find out what data should be used for speed vector? IAS, TAS, GSPD, MACH?
if ((DataItemValidator(CALC_HDG_STRING) || DataItemValidator(DAP_HDG) || DataItemValidator(TRK)) && (DataItemValidator(DAP_GSPD) || DataItemValidator(CALC_GSPD_STRING)))
{
double Azimuth = 0.0;
double Range = 0.0;
if (DataItemValidator(CALC_GSPD_STRING))
{
Range = double.Parse(CALC_GSPD_STRING);
}
else
{
Range = double.Parse(DAP_GSPD);
}
if (DataItemValidator(CALC_HDG_STRING))
{
Azimuth = double.Parse(CALC_HDG_STRING);
}
else if (DataItemValidator(TRK))
{
Azimuth = double.Parse(TRK);
}
else
{
Azimuth = double.Parse(DAP_HDG);
}
Range = (Range / 60) * (double)Properties.Settings.Default.SpeedVector;
GeoCordSystemDegMinSecUtilities.LatLongClass ResultPosition =
GeoCordSystemDegMinSecUtilities.CalculateNewPosition(new GeoCordSystemDegMinSecUtilities.LatLongClass(Position.Lat, Position.Lng), (double)Range, (double)Azimuth);
GPoint MarkerPositionLocal = FormMain.gMapControl.FromLatLngToLocal(new PointLatLng(ResultPosition.GetLatLongDecimal().LatitudeDecimal, ResultPosition.GetLatLongDecimal().LongitudeDecimal));
g.DrawLine(MyPen, new Point(LocalPosition.X, LocalPosition.Y), new Point(MarkerPositionLocal.X, MarkerPositionLocal.Y));
}
else
{
int T = 9;
int r = T;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
MyPen = new Pen(new SolidBrush(LabelAttributes.LineColor), LabelAttributes.LineWidth);
MyPen.DashStyle = LabelAttributes.LineStyle;
// Draw leader line
g.DrawLine(MyPen, new Point(LocalPosition.X, LocalPosition.Y), new Point(LocalPosition.X - LabelOffset.X, LocalPosition.Y - LabelOffset.Y));
// Draw label box
Point LabelStartPosition = GetLabelStartingPoint();
// Recalculate Label Width each cycle to adjust for the possible changes in the number of lines
// and changes in the text size
LabelHeight = 0;
// Draw ModeA and coast indicator
g.DrawString(ModeA_CI_STRING, ModeA_CI_FONT, ModeA_CI_BRUSH, LabelStartPosition.X + ModeA_CI_OFFSET.X, LabelStartPosition.Y + SpacingIndex);
LabelHeight = LabelHeight + (int)ModeA_CI_FONT.Size + SpacingIndex * 2;
if (CALLSIGN_STRING != "--------")
{
// Draw CALLSIGN
g.DrawString(CALLSIGN_STRING, CALLSIGN_FONT, CALLSIGN_BRUSH, LabelStartPosition.X + CALLSIGN_OFFSET.X, LabelStartPosition.Y + LabelHeight);
LabelHeight = LabelHeight + (int)CALLSIGN_FONT.Size + SpacingIndex * 2;
}
// Draw ModeC
g.DrawString(ModeC_STRING, ModeC_FONT, ModeC_BRUSH, LabelStartPosition.X + ModeC_OFFSET.X, LabelStartPosition.Y + LabelHeight);
// Draw CFL on the same line
if (ModeC_STRING == null)
{
ModeC_STRING = "---";
}
CFL_OFFSET.X = ModeC_STRING.Length * (int)ModeC_FONT.Size;
CFL_OFFSET.Y = LabelStartPosition.Y + LabelHeight;
g.DrawString(CFL_STRING, CFL_FONT, CFL_BRUSH, LabelStartPosition.X + CFL_OFFSET.X, CFL_OFFSET.Y);
CFL_START_X = LabelStartPosition.X + CFL_OFFSET.X;
CFL_START_Y = CFL_OFFSET.Y;
// Draw GSPD on the same line
GSPD_OFFSET.X = (ModeC_STRING.Length * (int)ModeC_FONT.Size) + (CFL_STRING.Length * (int)CFL_FONT.Size);
GSPD_OFFSET.Y = LabelStartPosition.Y + LabelHeight;
if (CALC_GSPD_STRING != " ---")
{
g.DrawString(CALC_GSPD_STRING, GSPD_FONT, GSPD_BRUSH, LabelStartPosition.X + GSPD_OFFSET.X, GSPD_OFFSET.Y);
}
else if (DAP_GSPD != "N/A")
{
g.DrawString(DAP_GSPD, GSPD_FONT, GSPD_BRUSH, LabelStartPosition.X + GSPD_OFFSET.X, GSPD_OFFSET.Y);
}
else
{
g.DrawString(" ---", GSPD_FONT, GSPD_BRUSH, LabelStartPosition.X + GSPD_OFFSET.X, GSPD_OFFSET.Y);
}
GSPD_START_X = LabelStartPosition.X + GSPD_OFFSET.X;
GSPD_START_Y = GSPD_OFFSET.Y;
LabelHeight = LabelHeight + (int)GSPD_FONT.Size + SpacingIndex * 2;
if (ShowLabelBox == true)
{
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// DRAW Assigned HDG, SPD and ROC
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// HDG
g.DrawString(A_HDG_STRING, A_HDG_FONT, A_HDG_BRUSH, LabelStartPosition.X + A_HDG_OFFSET.X, LabelStartPosition.Y + LabelHeight);
HDG_START_X = LabelStartPosition.X + A_HDG_OFFSET.X;
HDG_START_Y = LabelStartPosition.Y + LabelHeight;
// SPD
A_SPD_OFFSET.X = A_HDG_STRING.Length * (int)A_HDG_FONT.Size;
A_SPD_OFFSET.Y = LabelStartPosition.Y + LabelHeight;
g.DrawString(A_SPD_STRING, A_SPD_FONT, A_SPD_BRUSH, LabelStartPosition.X + A_SPD_OFFSET.X, A_SPD_OFFSET.Y);
SPD_START_X = LabelStartPosition.X + A_SPD_OFFSET.X;
SPD_START_Y = A_SPD_OFFSET.Y;
// ROC
//A_ROC_OFFSET.X = A_SPD_OFFSET.X + A_SPD_OFFSET.X + A_SPD_STRING.Length * (int)A_SPD_FONT.Size;
//A_ROC_OFFSET.Y = LabelStartPosition.Y + LabelHeight;
// g.DrawString(A_ROC_STRING, A_ROC_FONT, A_ROC_BRUSH, LabelStartPosition.X + A_ROC_OFFSET.X, A_ROC_OFFSET.Y);
LabelHeight = LabelHeight + (int)A_SPD_FONT.Size + SpacingIndex * 2;
// Add the final spacing index and draw the box
LabelHeight = LabelHeight + SpacingIndex * 2;
g.DrawRectangle(MyPen, LabelStartPosition.X, LabelStartPosition.Y, LabelWidth, LabelHeight);
}
}