Esempio n. 1
0
        public async Task <bool> CreateReportAsync()
        {
            var activeSeg    = Source.ActiveSeg;
            var activeSegPts = activeSeg?.Pts;

            Results.Clear();
            Totals.Recalculate();

            if (Source.AreHeightmapsMissing)
            {
                Source.RegisterError(Resources.TrackReportVm_CreateReportAsync_ErrNoHeightmap);
                return(false);
            }

            if (activeSegPts == null)
            {
                Source.RegisterError(Resources.TrackReportVm_CreateReportAsync_ErrNoTrack);
                return(false);
            }

            if (activeSegPts.Count < 2)
            {
                Source.RegisterError(Resources.TrackReportVm_CreateReportAsync_ErrNoPointsInTrack);
                return(false);
            }

            var points = FilterSlicepts();

            if (points.Count < 2)
            {
                Source.RegisterError(Resources.TrackReportVm_CreateReportAsync_ErrNotEnoughPoints);
                return(false);
            }

            // everything is ok, can calculate [17/12/2009 LysakA]
            _slicesCalc = new List <TrackSeg.Slice>();

            _loggingService.Log(Resources.TrackReportVm_CreateReportAsync_SplittingTrack);

            foreach (var pt in points)
            {
                var slice = Geo.SliceTrackSegmentWithPoint(pt, activeSegPts, _configuration.ReportGeneratorOptions.SliceptKickOutRadiusMeters);

                if (null != slice)
                {
                    _slicesCalc.Add(slice);
                }
            }

            // order by slice connection point [17/12/2009 LysakA]
            _slicesCalc.Sort((slc1, slc2) => slc1.NPoint - slc2.NPoint);

            // delete blind slices [17/12/2009 LysakA]
            for (var c = 0; c < _slicesCalc.Count - 1; ++c)
            {
                if (_slicesCalc[c].NPoint == _slicesCalc[c + 1].NPoint)
                {
                    _slicesCalc.Remove(_slicesCalc[c]);
                    c = 0;
                }
            }

            if (!_slicesCalc.Any())
            {
                _loggingService.LogError(Resources.TrackReportVm_CreateReportAsync_ErrSplitEmptyCantContinue);
                return(false);
            }

            _loggingService.Log(Resources.TrackReportVm_CreateReportAsync_RefiningSplit);
            // shift start & end to track start & end [18/12/2009 LysakA]
            if (Geo.DistanceExactMeters(_slicesCalc.First().SlicePoint, activeSegPts.First()) <
                StartEndCapDistance)
            {
                _slicesCalc.First().NPoint = 0;
            }
            if (Geo.DistanceExactMeters(_slicesCalc.Last().SlicePoint, activeSegPts.Last()) <
                StartEndCapDistance)
            {
                _slicesCalc.Last().NPoint = activeSegPts.Count - 1;
            }

            if (_slicesCalc.First().NPoint != 0) //Cap start
            {
                _slicesCalc.Insert(0, new TrackSeg.Slice {
                    NPoint = 0
                });                                                  //Start -- 0
            }
            if (_slicesCalc.Last().NPoint != activeSegPts.Count - 1) //Cap end
            {
                _slicesCalc.Add(new TrackSeg.Slice
                {
                    NPoint = activeSegPts.Count - 1
                }); //Last -- Finish
            }
            _loggingService.Log(Resources.TrackReportVm_CreateReportAsync_DeltaCalculation);

            for (var npoint = 0; npoint != _slicesCalc.Count - 1; ++npoint)
            {
                var reportItem = _reportItemGenerator(Source);

                reportItem.CalculateGeoProperties(npoint, activeSegPts, _slicesCalc);

                Results.Add(reportItem);
            }

            GenBackpackWeightColumn();

            GenGraphData(activeSegPts);

            // check for bad heights; [22/12/2009 LysakA]
            foreach (var s in _srtmRepository.LoadedSrtms)
            {
                if (s.HasVoids)
                {
                    _loggingService.LogError(
                        string.Format(Resources.TrackReportVm_CreateReportAsync_ErrHeightmapInvalid, s.OriginalFilename, s.OriginalFilename));
                }
            }

            Totals.Recalculate();

            return(true);
        }