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;
        }
示例#14
0
        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;
 }
示例#16
0
        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);
        }
示例#17
0
        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);
            }
        }
示例#18
0
        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);
        }