private void updateList(QualificationRoundSet c) { dataGridView1.Rows.Clear(); List <FlightSet> flights = new List <FlightSet>(c.FlightSet); //foreach (Flight fl in flights.OrderBy(x => x.TimeTakeOff)) foreach (FlightSet fl in flights.OrderBy(x => x.StartID)) { DataGridViewRow dgvr = new DataGridViewRow(); dgvr.CreateCells(dataGridView1); dgvr.SetValues( fl.StartID.ToString(), fl.TeamSet.CNumber, fl.TeamSet.AC, getTeamDsc(fl.TeamSet), new DateTime(fl.TimeTakeOff).ToString(C_TimeFormat, DateTimeFormatInfo.InvariantInfo), new DateTime(fl.TimeStartLine).ToString(C_TimeFormat, DateTimeFormatInfo.InvariantInfo), new DateTime(fl.TimeEndLine).ToString(C_TimeFormat, DateTimeFormatInfo.InvariantInfo), getRouteText(fl.Route), new DateTime(fl.TimeTakeOff).ToShortDateString()); fl.QualificationRoundSet = listViewQualificationRound.SelectedItems[0].Tag as QualificationRoundSet; dgvr.Tag = fl; dataGridView1.Rows.Add(dgvr); } // dataGridView1.Sort(dataGridView1.Columns["Crew"],ListSortDirection.Ascending); }
private void listViewQualificationRound_SelectedIndexChanged(object sender, EventArgs e) { if (listViewQualificationRound.SelectedItems.Count == 1) { ListViewItem lvi = listViewQualificationRound.SelectedItems[0]; QualificationRoundSet c = lvi.Tag as QualificationRoundSet; if (c == null) { return; } //qR = c; qrIdx = lvi.Index; textName.Tag = c; textName.Text = c.Name; ComboParcourExtension cp = null; foreach (Object o in comboBoxParcour.Items) { if ((o as ComboParcourExtension).p == c.ParcourSet) { cp = o as ComboParcourExtension; break; } } comboBoxParcour.SelectedItem = cp; takeOffLeftLongitude.Text = c.TakeOffLine.A.longitude.ToString(); takeOffLeftLatitude.Text = c.TakeOffLine.A.latitude.ToString(); takeOffRightLatitude.Text = c.TakeOffLine.B.latitude.ToString(); takeOffRightLongitude.Text = c.TakeOffLine.B.longitude.ToString(); updateList(c); UpdateEnablement(); SetTimeParameters(c); } }
private void btnNewQualificationRound_Click(object sender, EventArgs e) { Reset(); LoadParcours(); textName.Text = String.Empty; QualificationRoundSet qualificationRound = new QualificationRoundSet(); qualificationRound.CompetitionSet = Client.SelectedCompetition; textName.Tag = qualificationRound; qrIdx = -1; comboBoxParcour.SelectedIndex = -1; textName.SelectAll(); textName.Focus(); }
private int calculateMaxStartId() { int _maxStartId = 0; QualificationRoundSet c = textName.Tag as QualificationRoundSet; if (c != null && c.FlightSet.Count > 0) { foreach (FlightSet ct in c.FlightSet) { _maxStartId = Math.Max(_maxStartId, ct.StartID); } } _maxStartId++; return(_maxStartId); }
private void comboBoxQualificRound_SelectedIndexChanged(object sender, EventArgs e) { qualificRound = null; if (comboBoxQualificRound.SelectedItem != null) { ComboQRExtension cce = comboBoxQualificRound.SelectedItem as ComboQRExtension; if (cce != null) { qualificRound = cce.q; dataGridView2.Rows.Clear(); long min = long.MaxValue; long max = long.MinValue; List <FlightSet> CompetitionTeamList = qualificRound.FlightSet.ToList(); CompetitionTeamList.Sort((p, q) => p.StartID.CompareTo(q.StartID)); List <Point> points = new List <Point>(); foreach (FlightSet ct in qualificRound.FlightSet) { min = Math.Min(ct.TimeTakeOff, min); max = Math.Max(ct.TimeEndLine, max); DataGridViewRow dgvr = new DataGridViewRow(); dgvr.CreateCells(dataGridView2); dgvr.SetValues(new string[] { ct.StartID.ToString(), "0", getTeamDsc(ct), new DateTime(ct.TimeTakeOff).ToShortTimeString(), new DateTime(ct.TimeStartLine).ToShortTimeString(), new DateTime(ct.TimeEndLine).ToShortTimeString(), getRouteText(ct.Route) }); dataGridView2.Rows.Add(dgvr); dgvr.Tag = ct; } parcour = cce.q.ParcourSet; MapSet map = parcour.MapSet; MemoryStream ms = new MemoryStream(map.PictureSet.Data); visualisationPictureBox1.Image = System.Drawing.Image.FromStream(ms); visualisationPictureBox1.SetConverter(new Converter(map)); visualisationPictureBox1.SetParcour(parcour); visualisationPictureBox1.Invalidate(); visualisationPictureBox1.Refresh(); this.BeginInvoke(new MethodInvoker(updatePoints)); dataGridView2_SelectionChanged(sender, e); } else { dataGridView2.Rows.Clear(); } } else { dataGridView2.Rows.Clear(); } }
private void btnExportToPDF_Click(object sender, EventArgs e) { QualificationRoundSet c = textName.Tag as QualificationRoundSet; if (c != null) { String dirPath = System.Environment.GetFolderPath(Environment.SpecialFolder.CommonDocuments) + @"\AirNavigationRace\"; DirectoryInfo di = Directory.CreateDirectory(dirPath); if (!di.Exists) { di.Create(); } PDFCreator.CreateStartListPDF(c, Client, dirPath + @"\StartList_" + c.Id + "_" + c.Name + "_" + DateTime.UtcNow.ToString("yyyyMMddhhmmss") + ".pdf"); } }
private void btnSaveQualificationRound_Click(object sender, EventArgs e) { UpdateEnablement(); QualificationRoundSet c = textName.Tag as QualificationRoundSet; if (c == null) { c = new QualificationRoundSet(); c.CompetitionSet = Client.SelectedCompetition; } c.ParcourSet = (comboBoxParcour.SelectedItem as ComboParcourExtension).p; c.Name = textName.Text; Vector start = new Vector(double.Parse(takeOffLeftLongitude.Text), double.Parse(takeOffLeftLatitude.Text), 0); Vector end = new Vector(double.Parse(takeOffRightLongitude.Text), double.Parse(takeOffRightLatitude.Text), 0); Vector o = Vector.Middle(start, end) - Vector.Orthogonal(end - start); Line line = new Line(); if (c.TakeOffLine != null) { // update the existing TKOF line line = c.TakeOffLine; } line.Type = (int)LineType.TKOF; line.ParcourLine_Line_Id = c.ParcourSet.Id; line.A = Factory.newGPSPoint(start.X, start.Y, start.Z); line.B = Factory.newGPSPoint(end.X, end.Y, end.Z); line.O = Factory.newGPSPoint(o.X, o.Y, o.Z); c.TakeOffLine = line; //List<Flight> toDelete = new List<Flight>(); //toDelete.AddRange(c.Flight); //Client.DBContext.FlightSet.RemoveRange(toDelete); if (c.Id == 0) { Client.DBContext.QualificationRoundSet.Add(c); qrIdx = listViewQualificationRound.Items.Count; } Client.DBContext.SaveChanges(); Reset(); LoadQualificationRounds(); UpdateEnablement(); errorProviderQualification.Clear(); listViewQualificationRound.Items[qrIdx].Selected = true; }
private void autoFillStartList() { // recalculate the startList // use the first entry as base //Flight f = new Flight(); long tkof0 = 0; QualificationRoundSet qRnd = null; long intervTKOF = timeTakeOffInterval.Value.Minute * 60 + timeTakeOffInterval.Value.Second; // timeTakeOffIntervall.Value.Ticks; long intervStartL = timeStartBlockInterval.Value.Minute * 60 + timeStartBlockInterval.Value.Second; long tkofToStart = timeTakeOffToStartgateDuration.Value.Minute * 60 + timeTakeOffToStartgateDuration.Value.Second; long parcourLenght = timeParcourDuration.Value.Minute * 60 + timeParcourDuration.Value.Second; int NrOfRoutes = (int)numericUpDownRoutes.Value; FlightSet f = null; if (dataGridView1.Rows.Count > 1) { f = dataGridView1.Rows[0].Tag as FlightSet; tkof0 = f.TimeTakeOff; qRnd = f.QualificationRoundSet; } else { ListViewItem lvi = listViewQualificationRound.SelectedItems[0]; qRnd = lvi.Tag as QualificationRoundSet; tkof0 = DateTime.UtcNow.Ticks; // actual datetime (in UTC) } List <TeamSet> lstTeam = Client.SelectedCompetition.TeamSet.ToList(); for (int i = 0; i < lstTeam.Count; i++) { FlightSet flt = new FlightSet(); flt.TimeTakeOff = new DateTime(tkof0).AddSeconds(i * intervTKOF).AddSeconds((i / NrOfRoutes) * (intervStartL - intervTKOF)).Ticks; flt.TimeStartLine = new DateTime(tkof0).AddSeconds(tkofToStart).AddSeconds(i * intervTKOF).AddSeconds((i / NrOfRoutes) * (intervStartL + intervTKOF)).Ticks; flt.TimeEndLine = new DateTime(tkof0).AddSeconds(tkofToStart + parcourLenght).AddSeconds(i * intervTKOF).AddSeconds((i / NrOfRoutes) * (intervStartL + intervTKOF)).Ticks; flt.Route = i % NrOfRoutes + 1; flt.TeamSet = lstTeam[i]; flt.StartID = i + 1; flt.QualificationRoundSet = qRnd; Client.DBContext.FlightSet.Add(flt); } Client.DBContext.SaveChanges(); updateList(qRnd); }
private void SetTimeParameters(QualificationRoundSet c) { List <FlightSet> flights = new List <FlightSet>(c.FlightSet); if (flights.Count > 0) { FlightSet first = flights.OrderBy(x => x.TimeTakeOff).First(); // use absolute difference - for inverted routes timeParcourDuration.Value = new DateTime(Math.Abs(first.TimeEndLine - first.TimeStartLine)).AddYears(2000); timeTakeOffToStartgateDuration.Value = new DateTime(Math.Abs(first.TimeStartLine - first.TimeTakeOff)).AddYears(2000); numericUpDownRoutes.Value = flights.Select(x => x.Route).Distinct().Count(); if (flights.Count > 1) { FlightSet secon = flights.OrderBy(x => x.TimeTakeOff).Skip(1).First(); timeTakeOffInterval.Value = new DateTime(secon.TimeTakeOff - first.TimeTakeOff).AddYears(2000); // timeTakeOffBlocksIntervall.Value will not be set } } }
//private class QualiComboBoxItem //{ // public QualificationRoundSet q; // public QualiComboBoxItem(QualificationRoundSet q) // { // this.q = q; // } // public override string ToString() // { // return q.Name; // } //} private void btnExportGpx_Click(object sender, EventArgs e) { { SaveFileDialog fbd = new SaveFileDialog(); fbd.Filter = "all files (*.*)| *.*"; fbd.InitialDirectory = Path.GetDirectoryName(Environment.SpecialFolder.Recent.ToString()); fbd.FileName = "File.gpx"; fbd.DefaultExt = ".gpx"; fbd.OverwritePrompt = true; fbd.RestoreDirectory = true; fbd.Title = "Export Flights"; ComboQRExtension item = comboBoxQualificationRound.SelectedItem as ComboQRExtension; QualificationRoundSet q = item.q; if (fbd.ShowDialog() == DialogResult.OK) { // Invoke the SaveAsGPX method on a new thread. Action <string, QualificationRoundSet> invoker = new Action <string, QualificationRoundSet>(SaveAsGPX); invoker.BeginInvoke(Path.GetDirectoryName(fbd.FileName), q, OnSaveAsGPXCompleted, invoker); } } }
private void btnDeleteQualificationRound_Click(object sender, EventArgs e) { if (listViewQualificationRound.SelectedItems.Count == 1) { QualificationRoundSet c = listViewQualificationRound.SelectedItems[0].Tag as QualificationRoundSet; if (MessageBox.Show(string.Format("Delete the selected Qualification Round:\n {0} ?", c.Name), "Delete Qualification", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button2) == DialogResult.Yes) { Client.DBContext.QualificationRoundSet.Remove(c); Client.DBContext.SaveChanges(); LoadQualificationRounds(); errorProviderQualification.Clear(); if (listViewQualificationRound.Items.Count > 0) { listViewQualificationRound.Items[0].Selected = true; } else { Reset(); } } } }
private void SaveAsGPX(string fileDir, QualificationRoundSet q) { // for a selected Qualification Round, save flight data as *.gpx CultureInfo ci = CultureInfo.InvariantCulture; string _cName = Client.SelectedCompetition.Name; foreach (TeamSet t in Client.SelectedCompetition.TeamSet.OrderBy(p => int.Parse(p.CNumber))) { foreach (FlightSet flt in t.FlightSet.Where(x => x.QualificationRoundSet == q)) { string _nameQr = _cName + "_" + flt.QualificationRoundSet.Name; string _nameNav = flt.TeamSet.Navigator != null ? flt.TeamSet.Navigator.LastName : ""; string _name2 = _nameQr + " " + flt.Id + " " + flt.TeamSet.Pilot.LastName + "_" + _nameNav; string _nameShort = "Crew " + flt.TeamSet.CNumber; var pts = flt.Point; StringBuilder sb = new StringBuilder(); sb.Append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); sb.Append("<gpx xmlns='http://www.topografix.com/GPX/1/1' version='1.1'>"); //sb.Append("<metadata><link href='" + "http://www.fai.org" + "'><text>"+ _name2 +" </text></link></metadata>"); sb.Append("<trk>"); sb.Append("<name>" + _nameShort + "</name>"); sb.Append("<trkseg>"); foreach (var data in pts) { sb.Append("<trkpt lat=\"" + data.latitude.ToString(ci) + "\" lon =\"" + data.longitude.ToString(ci) + "\">"); sb.Append("<ele>" + data.altitude.ToString(ci) + "</ele>"); sb.Append("<time>" + new DateTime(data.Timestamp).ToString("yyyy-MM-ddTHH:mm:ssZ", DateTimeFormatInfo.InvariantInfo) + "</time>"); sb.Append("<desc>" + String.Format("<![CDATA[lat.={0}, lon.={1}, Alt.={2}m. Speed={3}m/h.]]>", data.latitude.ToString(ci), data.longitude.ToString(ci), data.altitude.ToString(ci), "0.0") + "</desc>"); sb.Append("</trkpt>"); } sb.Append("</trkseg></trk>"); sb.Append("</gpx>"); System.IO.File.WriteAllText(System.IO.Path.Combine(fileDir, _name2 + "_" + DateTime.Now.ToString("yyyyMMdd_HHmmss") + ".gpx"), sb.ToString()); } } //MessageBox.Show("Download of *.gpx files completed", "Download", MessageBoxButtons.OK, MessageBoxIcon.Information); }
private void recalculateStartList() { // recalculate the startList // use the first entry as base //Flight f = new Flight(); long tkof0 = 0; QualificationRoundSet qRnd = null; long intervTKOF = timeTakeOffInterval.Value.Minute * 60 + timeTakeOffInterval.Value.Second;// timeTakeOffIntervall.Value.Ticks; long intervStartL = timeStartBlockInterval.Value.Minute * 60 + timeStartBlockInterval.Value.Second; long tkofToStart = timeTakeOffToStartgateDuration.Value.Minute * 60 + timeTakeOffToStartgateDuration.Value.Second; long parcourLength = timeParcourDuration.Value.Minute * 60 + timeParcourDuration.Value.Second; int NrOfRoutes = (int)numericUpDownRoutes.Value; FlightSet f = null; int idx = 0; if (dataGridView1.Rows.Count <= 1) { // we only have a new line row but no data return; } if (dataGridView1.Rows.Count > 1) { if (dataGridView1.SelectedRows.Count > 0) { // index of selected row idx = dataGridView1.SelectedRows[0].Index; } f = dataGridView1.Rows[idx].Tag as FlightSet; tkof0 = f.TimeTakeOff; qRnd = f.QualificationRoundSet; } // re-calculate from selected index upwards for (int i = idx; i < dataGridView1.Rows.Count; i++) { f = dataGridView1.Rows[i].Tag as FlightSet; if (f == null) { continue; } if (i == idx) // the reference { tkof0 = f.TimeTakeOff; } if (i > idx) // re-calculate { f.TimeTakeOff = new DateTime(tkof0).AddSeconds(((i - idx) % NrOfRoutes) * intervTKOF).AddSeconds(((i - idx) / NrOfRoutes) * intervStartL).Ticks; } // calculate times based on 0-value f.TimeStartLine = new DateTime(tkof0).AddSeconds(tkofToStart).AddSeconds(((i - idx) / NrOfRoutes) * intervStartL).Ticks; f.TimeEndLine = new DateTime(tkof0).AddSeconds(tkofToStart + parcourLength).AddSeconds(((i - idx) / NrOfRoutes) * intervStartL).Ticks; f.Route = (i - idx) % NrOfRoutes + 1; } Client.DBContext.SaveChanges(); updateList(qRnd); dataGridView1.Rows[0].Selected = false; dataGridView1.Rows[idx].Selected = true; }
public static List <PenaltySet> CalculatePenaltyPoints(FlightSet flight, out List <IntersectionPoint> lstIntersectionPoints) { bool useProhZoneCalculation = false; Point last = null; List <PenaltySet> result = new List <PenaltySet>(); List <LineP> PenaltyZoneLines = new List <LineP>(); // intersectionPoints will contain the intersection poinst of the flight path with SP, FP, PROH areas List <IntersectionPoint> intersectionPoints = new List <IntersectionPoint>(); QualificationRoundSet qr = flight.QualificationRoundSet; ParcourSet parcour = flight.QualificationRoundSet.ParcourSet; useProhZoneCalculation = (parcour.PenaltyCalcType != (int)ParcourType.CHANNELS); List <LineP> ChannelZoneLines = getAssignedChannelLineP(parcour, (Route)flight.Route); foreach (Line nl in parcour.Line.Where(p => p.Type == (int)LineType.PENALTYZONE)) { PenaltyZoneLines.Add(getLine(nl)); } // add also all channel-specific prohibited zones assigned channel PenaltyZoneLines.AddRange(getAssignedProhZonelLines(parcour, (Route)flight.Route)); List <LineP> dataLines = new List <LineP>(); foreach (Point g in flight.Point) { if (last != null) { LineP l = new LineP(); l.end = new Vector(g.longitude, g.latitude, 0); l.TimestamEnd = g.Timestamp; l.start = new Vector(last.longitude, last.latitude, 0); l.TimestamStart = last.Timestamp; dataLines.Add(l); } last = g; } LineP startLine = getStartLine(parcour, (Route)flight.Route); LineP endLine = getEndLine(parcour, (Route)flight.Route); if (startLine == null || endLine == null) { lstIntersectionPoints = intersectionPoints; return(result); } LineP takeOffLine = new LineP(); takeOffLine.start = new Vector(qr.TakeOffLine.A.longitude, qr.TakeOffLine.A.latitude, 0); takeOffLine.end = new Vector(qr.TakeOffLine.B.longitude, qr.TakeOffLine.B.latitude, 0); takeOffLine.orientation = Vector.Orthogonal(takeOffLine.end - takeOffLine.start); long maxTimestamp = 0; maxTimestamp = flight.Point.Max(x => x.Timestamp); // For TakeOff-, Start- and End Line, we obviously(?) assume that these lines should have been passed two minutes before the end of recording // below values are used in case they are not passed bool shouldHaveCrossedTakeOff = (maxTimestamp - 2 * tickOfMinute) > flight.TimeTakeOff; bool shouldHaveCrossedStart = (maxTimestamp - 2 * tickOfMinute) > flight.TimeStartLine; bool shouldHaveCrossedEnd = (maxTimestamp - 2 * tickOfMinute) > flight.TimeEndLine; bool haveCrossedTakeOff = false; bool haveCrossedStart = false; bool haveCrossedEnd = false; bool insidePenalty = false; long timeSinceInsidePenalty = 0; bool outsideOwnChannel = true; long timeSinceOutsideOwnChannel = 0; bool isFirstTimeIntoChannel = true; IntersectionPoint ipTakeOff = new IntersectionPoint(); IntersectionPoint ipStart = new IntersectionPoint(); IntersectionPoint ipEnd = new IntersectionPoint(); foreach (LineP l in dataLines) { double intersectionTakeOff = getIntersection(l, takeOffLine); double intersectionStart = getIntersection(l, startLine); double intersectionEnd = getIntersection(l, endLine); IntersectionPoint ip = new IntersectionPoint(); #region crossing takeOff line if (getIntersection(l, takeOffLine, out ip) && !haveCrossedTakeOff) { haveCrossedTakeOff = true; intersectionPoints.Add(ip); long crossTime = ip.Timestamp; crossTime = ((crossTime + (tickOfSecond / 2) + 1) / tickOfSecond) * tickOfSecond; // round ipTakeOff = ip; long diff = crossTime - flight.TimeTakeOff; PenaltySet penalty = new PenaltySet(); penalty.Points = (diff > C_TKOF_TimeUpper * tickOfSecond || diff < C_TKOF_TimeLower * tickOfSecond) ? C_TKOF_MaxPenalty : 0; penalty.Reason = string.Format("Take-off Line planned: {1}, actual: {0}", new DateTime((Int64)crossTime).ToString(C_TimeFormat, DateTimeFormatInfo.InvariantInfo), new DateTime((Int64)flight.TimeTakeOff).ToString(C_TimeFormat, DateTimeFormatInfo.InvariantInfo)); result.Add(penalty); } #endregion #region crossing start line if (getIntersection(l, startLine, out ip) & !haveCrossedStart) { haveCrossedStart = true; intersectionPoints.Add(ip); long crossTime = ip.Timestamp; ipStart = ip; long diff = Math.Abs(crossTime - flight.TimeStartLine); crossTime = ((crossTime + (tickOfSecond / 2) + 1) / tickOfSecond) * tickOfSecond; // round int sec = (int)((diff + (tickOfSecond / 2) + 1) / tickOfSecond); PenaltySet penalty = new PenaltySet(); penalty.Points = (diff > C_SPFP_TimeTolerance * tickOfSecond) ? Math.Min((sec - C_SPFP_TimeTolerance) * C_PointsPerSec, C_SPFP_MaxPenalty) : 0; penalty.Reason = string.Format("SP Line planned: {1}, actual: {0}", new DateTime((Int64)crossTime).ToString(C_TimeFormat, DateTimeFormatInfo.InvariantInfo), new DateTime((Int64)flight.TimeStartLine).ToString(C_TimeFormat, DateTimeFormatInfo.InvariantInfo)); result.Add(penalty); } #endregion if (useProhZoneCalculation || ChannelZoneLines.Count == 0) { #region entering or leaving prohibited zone bool stateChanged = false; //IntersectionPoint ip = new IntersectionPoint(); if (intersectsProhAreaPoint(PenaltyZoneLines, l, out stateChanged, out ip)) { if (stateChanged) { intersectionPoints.Add(ip); if (!insidePenalty) { insidePenalty = true; timeSinceInsidePenalty = ip.Timestamp; } else { insidePenalty = false; long diff = ip.Timestamp - timeSinceInsidePenalty; if (diff > tickOfSecond * C_PROH_TimeTolerance) { PenaltySet penalty = new PenaltySet(); // round times for entering/leaving penalty zone to nearest full second long pstart = ((timeSinceInsidePenalty + (tickOfSecond / 2) + 1) / tickOfSecond) * tickOfSecond; // rounded long pend = ((ip.Timestamp + (tickOfSecond / 2) + 1) / tickOfSecond) * tickOfSecond; // rounded int sec = (int)((pend - pstart) / tickOfSecond); penalty.Points = (sec - C_PROH_TimeTolerance) * C_PointsPerSec; // Max penalty inside PROH zone: ======>> NOTE: acc FAI rules disabled after NOV 2017; zero means no maximum per event penalty.Points = C_MaxPenaltyPerEvent > 0 ? Math.Min((sec - C_PROH_TimeTolerance) * C_PointsPerSec, C_MaxPenaltyPerEvent) : penalty.Points; //penalty.Points = C_MaxPenaltyPerEvent > 0 ? Math.Min((sec - 5) * 3, C_MaxPenaltyPerEvent) : penalty.Points; penalty.Reason = string.Format("Penalty zone for {0} sec, [{1} - {2}]", sec, new DateTime(pstart).ToString(C_TimeFormat, DateTimeFormatInfo.InvariantInfo), new DateTime(pend).ToString(C_TimeFormat, DateTimeFormatInfo.InvariantInfo)); result.Add(penalty); } } } } #endregion } else { #region entering or leaving channel bool stateChanged = false; if (intersectsOwnChannel(ChannelZoneLines, l, out stateChanged, out ip)) { if (stateChanged) { intersectionPoints.Add(ip); if (!outsideOwnChannel) { outsideOwnChannel = true; timeSinceOutsideOwnChannel = ip.Timestamp; } else { if (isFirstTimeIntoChannel) { isFirstTimeIntoChannel = false; if (haveCrossedStart) { timeSinceOutsideOwnChannel = ipStart.Timestamp; } else { timeSinceOutsideOwnChannel = flight.TimeStartLine; } } outsideOwnChannel = false; long diff = ip.Timestamp - timeSinceOutsideOwnChannel; if (diff > tickOfSecond * C_PROH_TimeTolerance) { PenaltySet penalty = new PenaltySet(); // round times for entering/leaving penalty zone to nearest full second long pstart = ((timeSinceOutsideOwnChannel + (tickOfSecond / 2) + 1) / tickOfSecond) * tickOfSecond; // rounded long pend = ((ip.Timestamp + (tickOfSecond / 2) + 1) / tickOfSecond) * tickOfSecond; // rounded int sec = (int)((pend - pstart) / tickOfSecond); penalty.Points = (sec - C_PROH_TimeTolerance) * C_PointsPerSec; penalty.Points = C_MaxPenaltyPerEvent > 0 ? Math.Min((sec - C_PROH_TimeTolerance) * C_PointsPerSec, C_MaxPenaltyPerEvent) : penalty.Points; //penalty.Points = C_MaxPenaltyPerEvent > 0 ? Math.Min((sec - 5) * 3, C_MaxPenaltyPerEvent) : penalty.Points; penalty.Reason = string.Format("outside channel for {0} sec, [{1} - {2}]", sec, new DateTime(pstart).ToString(C_TimeFormat, DateTimeFormatInfo.InvariantInfo), new DateTime(pend).ToString(C_TimeFormat, DateTimeFormatInfo.InvariantInfo)); result.Add(penalty); } } } } else { // check if end line is passed now but outside the cannel. if yes, set outSideOwnChannel = false if (getIntersection(l, endLine, out ip)) { outsideOwnChannel = false; long diff = ip.Timestamp - timeSinceOutsideOwnChannel; if (diff > tickOfSecond * C_PROH_TimeTolerance) { PenaltySet penalty = new PenaltySet(); // round times for entering/leaving penalty zone to nearest full second long pstart = ((timeSinceOutsideOwnChannel + (tickOfSecond / 2) + 1) / tickOfSecond) * tickOfSecond; // rounded long pend = ((ip.Timestamp + (tickOfSecond / 2) + 1) / tickOfSecond) * tickOfSecond; // rounded int sec = (int)((pend - pstart) / tickOfSecond); penalty.Points = (sec - C_PROH_TimeTolerance) * C_PointsPerSec; // Max penalty outside channel; zero value means no Max penalty penalty.Points = C_MaxPenaltyPerEvent > 0 ? Math.Min((sec - C_PROH_TimeTolerance) * C_PointsPerSec, C_MaxPenaltyPerEvent) : penalty.Points; //penalty.Points = C_MaxPenaltyPerEvent > 0 ? Math.Min((sec - 5) * 3, C_MaxPenaltyPerEvent) : penalty.Points; penalty.Reason = string.Format("outside channel for {0} sec, [{1} - {2}]", sec, new DateTime(pstart).ToString(C_TimeFormat, DateTimeFormatInfo.InvariantInfo), new DateTime(pend).ToString(C_TimeFormat, DateTimeFormatInfo.InvariantInfo)); result.Add(penalty); } } } #endregion } #region crossing end line if (getIntersection(l, endLine, out ip) & !haveCrossedEnd) { haveCrossedEnd = true; intersectionPoints.Add(ip); long crossTime = ip.Timestamp; ipEnd = ip; long diff = Math.Abs(crossTime - flight.TimeEndLine); crossTime = ((crossTime + (tickOfSecond / 2) + 1) / tickOfSecond) * tickOfSecond; // round int sec = (int)((diff + (tickOfSecond / 2) + 1) / tickOfSecond); PenaltySet penalty = new PenaltySet(); penalty.Points = (diff > C_SPFP_TimeTolerance * tickOfSecond) ? Math.Min((sec - C_SPFP_TimeTolerance) * C_PointsPerSec, C_SPFP_MaxPenalty) : 0; penalty.Reason = string.Format("FP Line planned: {1}, actual: {0}", new DateTime((Int64)crossTime).ToString(C_TimeFormat, DateTimeFormatInfo.InvariantInfo), new DateTime((Int64)flight.TimeEndLine).ToString(C_TimeFormat, DateTimeFormatInfo.InvariantInfo)); result.Add(penalty); } #endregion } #region handling cases where Takeoff-, Start- or End line are not observed/never crossed if (shouldHaveCrossedStart && !haveCrossedStart) { PenaltySet penalty = new PenaltySet(); penalty.Points = C_SPFP_MaxPenalty; penalty.Reason = "SP Line not passed"; result.Insert(0, penalty); // add to begin of list } ; if (shouldHaveCrossedTakeOff && !haveCrossedTakeOff) { PenaltySet penalty = new PenaltySet(); penalty.Points = C_TKOF_MaxPenalty; penalty.Reason = "Takeoff Line not passed"; result.Insert(0, penalty); // add to begin of list } ; if (shouldHaveCrossedEnd && !haveCrossedEnd) { PenaltySet penalty = new PenaltySet(); // TODO: handle the case where we have channel calculation but no FP line if (!(useProhZoneCalculation || ChannelZoneLines.Count == 0) && outsideOwnChannel) { outsideOwnChannel = false; long crossTime = flight.TimeEndLine; long diff = Math.Abs(crossTime - timeSinceOutsideOwnChannel); if (diff > C_SPFP_TimeTolerance * tickOfSecond) { crossTime = ((crossTime + (tickOfSecond / 2) + 1) / tickOfSecond) * tickOfSecond; // round int sec = (int)((diff + (tickOfSecond / 2) + 1) / tickOfSecond); penalty.Points = Math.Min((sec - C_SPFP_TimeTolerance) * C_PointsPerSec, C_SPFP_MaxPenalty); penalty.Reason = string.Format("outside channel for {0} sec, [{1} - {2}]", sec, new DateTime(timeSinceOutsideOwnChannel).ToString(C_TimeFormat, DateTimeFormatInfo.InvariantInfo), new DateTime(crossTime).ToString(C_TimeFormat, DateTimeFormatInfo.InvariantInfo)); result.Add(penalty); } } penalty = new PenaltySet(); penalty.Points = C_SPFP_MaxPenalty; penalty.Reason = "FP Line not passed"; result.Add(penalty); } ; #endregion lstIntersectionPoints = intersectionPoints; return(result); }
public ComboQRExtension(QualificationRoundSet q) { this.q = q; }
public static void CreateRankingListPDF(Client.DataAccess c, QualificationRoundSet qRnd, List <ComboBoxFlights> qRndFlights, String pathToPDF) { List <Toplist> toplist = new List <Toplist>(); foreach (ComboBoxFlights cbct in qRndFlights) { int sum = 0; foreach (PenaltySet penalty in cbct.flight.PenaltySet) { sum += penalty.Points; } toplist.Add(new Toplist(cbct.flight, sum)); } toplist.Sort(); Document doc = new Document(); doc.Info.Author = "*****@*****.**"; doc.Info.Comment = "Generated from ANRL Client on " + DateTime.Now.ToString(); doc.Info.Keywords = "ANRL Toplist"; doc.Info.Subject = "Toplist"; doc.Info.Title = "Toplist"; doc.UseCmykColor = true; doc.DefaultPageSetup.PageFormat = PageFormat.A4; doc.DefaultPageSetup.Orientation = Orientation.Landscape; doc.DefaultPageSetup.BottomMargin = Unit.FromCentimeter(1); doc.DefaultPageSetup.TopMargin = Unit.FromCentimeter(1); doc.DefaultPageSetup.LeftMargin = Unit.FromCentimeter(1.5); doc.DefaultPageSetup.RightMargin = Unit.FromCentimeter(1); Section sec = doc.AddSection(); AddCompetitionAndLogo(c, sec); sec.AddParagraph(""); sec.AddParagraph("Ranking List: " + qRnd.Name); sec.AddParagraph(""); Table table = sec.AddTable(); table.Borders.Visible = true; table.AddColumn(Unit.FromCentimeter(2)); table.AddColumn(Unit.FromCentimeter(2)); table.AddColumn(Unit.FromCentimeter(2.5)); table.AddColumn(Unit.FromCentimeter(4)); table.AddColumn(Unit.FromCentimeter(4)); table.AddColumn(Unit.FromCentimeter(4)); table.AddColumn(Unit.FromCentimeter(4)); Row row = table.AddRow(); row.Shading.Color = Colors.Gray; row.Cells[0].AddParagraph("Rank"); row.Cells[1].AddParagraph("Points"); row.Cells[2].AddParagraph("Nationality"); row.Cells[3].AddParagraph("Pilot Lastname"); row.Cells[4].AddParagraph("Pilot Firstname"); row.Cells[5].AddParagraph("Navigator Lastname"); row.Cells[6].AddParagraph("Navigator Firstname"); int oldsum = -1; int prevRank = 0; int rank = 0; foreach (Toplist top in toplist) { rank++; TeamSet t = top.ct.TeamSet; Row r = table.AddRow(); if (rank > 1 && oldsum == top.sum) // we have a shared rank { r.Cells[0].AddParagraph(prevRank + ""); } else // the normal case { prevRank = rank; r.Cells[0].AddParagraph(rank + ""); } r.Cells[1].AddParagraph(top.sum.ToString()); r.Cells[2].AddParagraph(t.Nationality); SubscriberSet pilot = t.Pilot; r.Cells[3].AddParagraph(pilot.LastName); r.Cells[4].AddParagraph(pilot.FirstName); if (t.Navigator != null) { SubscriberSet navigator = t.Navigator; r.Cells[5].AddParagraph(navigator.LastName); r.Cells[6].AddParagraph(navigator.FirstName); } oldsum = top.sum; } PdfDocumentRenderer renderer = new PdfDocumentRenderer(true, PdfSharp.Pdf.PdfFontEmbedding.Always); renderer.Document = doc; renderer.RenderDocument(); renderer.PdfDocument.Save(pathToPDF); Process.Start(pathToPDF); }
public static void CreateResultPDF(PictureBoxExt picBox, Client.DataAccess c, QualificationRoundSet qRnd, List <ComboBoxFlights> qRndFlights, String pathToPDF) { int counter = 0; List <FlightSet> tempList = new List <FlightSet>(); foreach (ComboBoxFlights cbct in qRndFlights) { GC.Collect(); PdfDocument doc = new PdfDocument(); doc.Info.Author = "*****@*****.**"; doc.Info.Keywords = "ANRL Results Printout"; doc.Info.Subject = "Results Printout generated from ANRL Client on " + DateTime.Now.ToString(); doc.Info.Title = "Results Printout"; doc.Options.ColorMode = PdfColorMode.Cmyk; doc.Language = "EN"; doc.PageLayout = PdfPageLayout.SinglePage; tempList.Clear(); tempList.Add(cbct.flight); picBox.SetData(tempList); PdfPage page = doc.AddPage(); page.Orientation = PdfSharp.PageOrientation.Landscape; page.Size = PdfSharp.PageSize.A4; double scaleFactor = 2.0; XGraphics gfx = XGraphics.FromPdfPage(page); XTextFormatter tf = new XTextFormatter(gfx); XRect rect = new XRect(); AddLogo(gfx, page); XImage image = XImage.FromGdiPlusImage(picBox.PrintOutImage.VaryQualityLevel()); double distX = picBox.GetXDistanceKM() / scaleFactor; //1:200 000 in cm double distY = picBox.GetYDistanceKM() / scaleFactor; //1:200 000 in cm gfx.DrawImage(image, XUnit.FromCentimeter(2).Point, XUnit.FromCentimeter(3).Point, page.Width.Point * (distX / page.Width.Centimeter), page.Height.Point * (distY / page.Height.Centimeter)); #region Header data (Competition, Qualification round, Crew) gfx.DrawString("Competition: " + c.SelectedCompetition.Name, verdana13Bold, XBrushes.Black, new XPoint(XUnit.FromCentimeter(2), XUnit.FromCentimeter(1.5))); gfx.DrawString("Q-Round: " + qRnd.Name, verdana11Bold, XBrushes.Black, new XPoint(XUnit.FromCentimeter(2), XUnit.FromCentimeter(2.1))); gfx.DrawString("Crew: " + getTeamDsc(c, cbct.flight), verdana11Bold, XBrushes.Black, new XPoint(XUnit.FromCentimeter(2), XUnit.FromCentimeter(2.7))); #endregion #region Write table with Penalty points int sum = 0; int line = 0; int offsetLine = 20; gfx.DrawString("Points ", verdana11Bold, XBrushes.Black, new XPoint(XUnit.FromCentimeter(offsetLine), XUnit.FromCentimeter(3))); gfx.DrawString("Reason ", verdana11Bold, XBrushes.Black, new XPoint(XUnit.FromCentimeter(offsetLine + 2), XUnit.FromCentimeter(3))); line++; foreach (PenaltySet penalty in cbct.flight.PenaltySet) { sum += penalty.Points; // Penalty points, aligned right rect = new XRect( new XPoint(XUnit.FromCentimeter(offsetLine), XUnit.FromCentimeter(3 + line * 0.4)), new XPoint(XUnit.FromCentimeter(offsetLine + 1.3), XUnit.FromCentimeter(3.0 + line * 0.4 + 0.4))); //gfx.DrawRectangle(XBrushes.Yellow, rect); tf.Alignment = XParagraphAlignment.Right; tf.DrawString(penalty.Points.ToString(), verdana9Reg, XBrushes.Black, rect, XStringFormats.TopLeft); //gfx.DrawString(penalty.Points.ToString(), verdana9Reg, XBrushes.Black, new XPoint(XUnit.FromCentimeter(offsetLine), XUnit.FromCentimeter(3 + line * 0.4))); // Penalty explanation, aligned left //List<String> reason = getWrapped(penalty.Reason); List <string> reason = penalty.Reason.SplitOn(40); foreach (String s in reason) { rect = new XRect( new XPoint(XUnit.FromCentimeter(offsetLine + 2), XUnit.FromCentimeter(3.0 + line * 0.4)), new XPoint(XUnit.FromCentimeter(offsetLine + 9), XUnit.FromCentimeter(3.0 + line * 0.4 + 0.4))); tf.Alignment = XParagraphAlignment.Left; //gfx.DrawRectangle(XBrushes.Yellow, rect); tf.DrawString(s, verdana9Reg, XBrushes.Black, rect, XStringFormats.TopLeft); //gfx.DrawString(s, verdana9Reg, XBrushes.Black, new XPoint(XUnit.FromCentimeter(offsetLine + 2), XUnit.FromCentimeter(3 + line * 0.4))); line++; } } line++; // Penalty total points, aligned right rect = new XRect( new XPoint(XUnit.FromCentimeter(offsetLine), XUnit.FromCentimeter(3 + line * 0.4)), new XPoint(XUnit.FromCentimeter(offsetLine + 1.3), XUnit.FromCentimeter(3.0 + line * 0.4 + 0.4))); tf.Alignment = XParagraphAlignment.Right; tf.DrawString(sum.ToString(), verdana9Bold, XBrushes.Black, rect, XStringFormats.TopLeft); // gfx.DrawString(sum.ToString(), verdana10Bold, XBrushes.Black, new XPoint(XUnit.FromCentimeter(offsetLine), XUnit.FromCentimeter(3 + line * 0.4))); // Penalty text, aligned left rect = new XRect( new XPoint(XUnit.FromCentimeter(offsetLine + 2), XUnit.FromCentimeter(3.0 + line * 0.4)), new XPoint(XUnit.FromCentimeter(offsetLine + 9), XUnit.FromCentimeter(3.0 + line * 0.4 + 0.4))); tf.Alignment = XParagraphAlignment.Left; tf.DrawString("Total Points", verdana9Bold, XBrushes.Black, rect, XStringFormats.TopLeft); //gfx.DrawString("Total Points", verdana10Bold, XBrushes.Black, new XPoint(XUnit.FromCentimeter(offsetLine + 2), XUnit.FromCentimeter(3 + line * 0.4))); #endregion String path = pathToPDF.Replace(".pdf", (counter++ + "_" + getTeamDsc(c, cbct.flight) + ".pdf")); doc.Save(path); doc.Close(); Process.Start(path); } }
internal static void CreateStartListPDF(QualificationRoundSet qRnd, Client.DataAccess Client, string pathToPDF) { Document doc = new Document(); doc.Info.Author = "*****@*****.**"; doc.Info.Comment = "Generated from ANRL Client on " + DateTime.Now.ToString(); doc.Info.Keywords = "ANRL Start List"; doc.Info.Subject = "Start List"; doc.Info.Title = "Start List"; doc.UseCmykColor = true; doc.DefaultPageSetup.PageFormat = PageFormat.A4; doc.DefaultPageSetup.Orientation = Orientation.Landscape; Section sec = doc.AddSection(); AddCompetitionAndLogo(Client, sec); sec.AddParagraph("Qualification Round: " + qRnd.Name); sec.AddParagraph("Starting List"); sec.AddParagraph("Printed (UTC): " + System.DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ssZ", DateTimeFormatInfo.InvariantInfo)); sec.AddParagraph(""); Table table = sec.AddTable(); table.Borders.Visible = true; table.AddColumn(Unit.FromCentimeter(1)); table.AddColumn(Unit.FromCentimeter(1)); table.AddColumn(Unit.FromCentimeter(2)); table.AddColumn(Unit.FromCentimeter(9)); table.AddColumn(Unit.FromCentimeter(2.1)); table.AddColumn(Unit.FromCentimeter(2.1)); table.AddColumn(Unit.FromCentimeter(2.1)); table.AddColumn(Unit.FromCentimeter(2.1)); table.AddColumn(Unit.FromCentimeter(2.1)); table.AddColumn(Unit.FromCentimeter(1.3)); Row row = table.AddRow(); row.Shading.Color = Colors.Gray; row.Cells[0].AddParagraph("Start ID"); row.Cells[1].AddParagraph("Crew ID"); row.Cells[2].AddParagraph("AC"); row.Cells[3].AddParagraph("Pilot - Navigator"); row.Cells[4].AddParagraph("Start Planning [UTC]"); row.Cells[5].AddParagraph("End Planning [UTC]"); row.Cells[6].AddParagraph("Take-Off [UTC]"); row.Cells[7].AddParagraph("SP Gate [UTC]"); row.Cells[8].AddParagraph("FP Gate [UTC]"); row.Cells[9].AddParagraph("Route"); foreach (FlightSet ct in qRnd.FlightSet.OrderBy(x => x.TimeTakeOff).ThenBy(x => x.Route)) { Row r = table.AddRow(); if ((table.Rows.Count - 1) % 2 == 0) { r.Shading.Color = Colors.LightGray; } r.Cells[0].AddParagraph(ct.StartID.ToString()); TeamSet teams = ct.TeamSet; r.Cells[1].AddParagraph(teams.CNumber); r.Cells[2].AddParagraph(teams.AC); SubscriberSet pilot = teams.Pilot; if (teams.Navigator != null) { SubscriberSet navigator = teams.Navigator; r.Cells[3].AddParagraph(pilot.LastName + " " + pilot.FirstName + " - " + navigator.LastName + " " + navigator.FirstName); } else { r.Cells[3].AddParagraph(pilot.LastName + " " + pilot.FirstName); } DateTime dt = new DateTime(ct.TimeTakeOff); r.Cells[4].AddParagraph(dt.AddMinutes(-C_Timespan_StartPlanningToTKOF).ToString(C_TimeFormat, DateTimeFormatInfo.InvariantInfo)); r.Cells[5].AddParagraph(dt.AddMinutes(-C_Timespan_EndPlanningToTKOF).ToString(C_TimeFormat, DateTimeFormatInfo.InvariantInfo)); // r.Cells[6].Shading.Color = Colors.LightGray; r.Cells[6].AddParagraph(dt.ToString(C_TimeFormat, DateTimeFormatInfo.InvariantInfo)); r.Cells[7].AddParagraph(new DateTime(ct.TimeStartLine).ToString(C_TimeFormat, DateTimeFormatInfo.InvariantInfo)); r.Cells[8].AddParagraph(new DateTime(ct.TimeEndLine).ToString(C_TimeFormat, DateTimeFormatInfo.InvariantInfo)); r.Cells[9].AddParagraph(Enum.GetName(Route.A.GetType(), ct.Route)); r.Cells[9].Format.Alignment = ParagraphAlignment.Center; } PdfDocumentRenderer renderer = new PdfDocumentRenderer(true, PdfSharp.Pdf.PdfFontEmbedding.Always); renderer.Document = doc; renderer.RenderDocument(); renderer.PdfDocument.Save(pathToPDF); Process.Start(pathToPDF); }