Exemplo n.º 1
0
        public void CompactionPalette_Should_return_default_Evelvation_palette(DisplayMode displayMode)
        {
            var elevExtents = new ElevationStatisticsResult(
                new BoundingBox3DGrid(100.0, 100.0, 100.0, 100.0, 100.0, 100.0),
                100.0,
                100.0,
                1000.0);

            var palette = new CompactionSettingsManager().CompactionPalette(
                displayMode,
                elevExtents,
                null,
                new CompactionProjectSettingsColors());

            Assert.IsNotNull(palette);
            Assert.AreEqual(31, palette.Count);
        }
Exemplo n.º 2
0
        /// <summary>
        /// Creates an instance of the TileRequest class and populate it with data needed for a tile.
        /// </summary>
        /// <returns>An instance of the TileRequest class.</returns>
        public TileRequest CreateTileRequest(DisplayMode mode, ushort width, ushort height,
                                             BoundingBox2DLatLon bbox, ElevationStatisticsResult elevExtents, bool explicitFilters = false)
        {
            var liftSettings = SettingsManager.CompactionLiftBuildSettings(ProjectSettings);

            Filter?.Validate();//Why is this here? Should be done where filter set up???
            var palette        = SettingsManager.CompactionPalette(mode, elevExtents, ProjectSettings, ProjectSettingsColors);
            var computeVolType = (int)(volCalcType ?? VolumeCalcType.None);

            DesignDescriptor design  = DesignDescriptor;
            FilterResult     filter1 = Filter;
            FilterResult     filter2 = null;

            if (mode == DisplayMode.CutFill)
            {
                switch (volCalcType)
                {
                case VolumeCalcType.DesignToGround:
                case VolumeCalcType.GroundToDesign:
                    design  = volumeDesign;
                    filter1 = baseFilter ?? topFilter;
                    break;

                case VolumeCalcType.GroundToGround:
                    filter1 = baseFilter;
                    filter2 = topFilter;
                    break;
                }
            }

            TileRequest tileRequest = new TileRequest(
                ProjectId, ProjectUid, null, mode, palette, liftSettings, (VolumesType)computeVolType,
                0, design, filter1, 0, filter2, 0,
                Filter == null || !Filter.LayerType.HasValue ? FilterLayerMethod.None : Filter.LayerType.Value,
                bbox, null, width, height, 0, CMV_DETAILS_NUMBER_OF_COLORS, CMV_PERCENT_CHANGE_NUMBER_OF_COLORS, false, explicitFilters);

            return(tileRequest);
        }
Exemplo n.º 3
0
        public async Task <ElevationStatisticsResult> GetElevationRange(
            [FromQuery] Guid projectUid,
            [FromQuery] Guid?filterUid)
        {
            Log.LogInformation($"{nameof(GetElevationRange)}: {Request.QueryString}");

            try
            {
                var projectSettingsTask = GetProjectSettingsTargets(projectUid);

                var filterTask    = GetCompactionFilter(projectUid, filterUid);
                var projectIdTask = GetLegacyProjectId(projectUid);

                await Task.WhenAll(projectSettingsTask, filterTask, projectIdTask);

                var result = await elevProxy.GetElevationRange(projectIdTask.Result, projectUid, filterTask.Result, projectSettingsTask.Result, CustomHeaders, GetUserId());

                if (result == null)
                {
                    //Ideally want to return an error code and message only here
                    result = new ElevationStatisticsResult(null, 0, 0, 0);
                }

                Log.LogInformation($"{nameof(GetElevationRange)} result: {JsonConvert.SerializeObject(result)}");
                return(result);
            }
            catch (ServiceException se)
            {
                Log.LogError(se, $"{nameof(GetElevationRange)}: exception");
                throw;
            }
            finally
            {
                Log.LogInformation($"{nameof(GetElevationRange)} returned: {Response.StatusCode}");
            }
        }
Exemplo n.º 4
0
        /// <summary>
        /// Gets the requested tile from Raptor
        /// </summary>
        /// <param name="projectSettings">Project settings to use for Raptor</param>
        /// <param name="projectSettingsColors"></param>
        /// <param name="filter">Filter to use for Raptor</param>
        /// <param name="projectId">Legacy project ID</param>
        /// <param name="projectUid">Unique project identifier</param>
        /// <param name="mode">Display mode; type of data requested</param>
        /// <param name="width">Width of the tile</param>
        /// <param name="height">Height of the tile in pixels</param>
        /// <param name="bbox">Bounding box in radians</param>
        /// <param name="cutFillDesign">Design descriptor for cut-fill</param>
        /// <param name="baseFilter">Base filter for  summary volumes</param>
        /// <param name="topFilter">Top filter for  summary volumes</param>
        /// <param name="volumeDesign">Design descriptor for summary volumes design</param>
        /// <param name="volumeCalcType">Type of summary volumes calculation</param>
        /// <param name="customHeaders">Custom request headers</param>
        /// <returns>Tile result</returns>
        public async Task <TileResult> GetProductionDataTile(CompactionProjectSettings projectSettings, CompactionProjectSettingsColors projectSettingsColors, FilterResult filter, long projectId, Guid projectUid, DisplayMode mode, ushort width, ushort height, BoundingBox2DLatLon bbox, DesignDescriptor cutFillDesign, FilterResult baseFilter, FilterResult topFilter, DesignDescriptor volumeDesign, VolumeCalcType?volumeCalcType, IHeaderDictionary customHeaders, string userId, bool explicitFilters = false)
        {
            var getTile = true;
            ElevationStatisticsResult elevationExtents = null;
            TileRequest tileRequest = null;

            try
            {
                elevationExtents = await GetElevationExtents(projectSettings, filter, projectId, projectUid, mode, customHeaders, userId);
            }
            catch (ServiceException se)
            {
                getTile = mode != DisplayMode.Height;
                if (log.IsTraceEnabled())
                {
                    log.LogTrace(
                        $"Failed to get elevation extents for height request with error: {se.GetResult.Code}:{se.GetResult.Message} a transparent tile will be generated");
                }
            }

            if (getTile)
            {
                tileRequest = requestFactory.Create <TileRequestHelper>(r => r
                                                                        .ProjectUid(projectUid)
                                                                        .ProjectId(projectId)
                                                                        .Headers(customHeaders)
                                                                        .ProjectSettings(projectSettings)
                                                                        .ProjectSettingsColors(projectSettingsColors)
                                                                        .Filter(filter)
                                                                        .DesignDescriptor(cutFillDesign))
                              .SetVolumeCalcType(volumeCalcType)
                              .SetVolumeDesign(volumeDesign)
                              .SetBaseFilter(baseFilter)
                              .SetTopFilter(topFilter)
                              .CreateTileRequest(mode, width, height, bbox, elevationExtents, explicitFilters);

                //TileRequest is both v1 and v2 model so cannot change its validation directly.
                //However for v2 we want to return a transparent empty tile for cut-fill if no design specified.
                //So catch the validation exception for this case.
                try
                {
                    tileRequest.Validate();
                }
                catch (ServiceException se)
                {
                    if (tileRequest.Mode == DisplayMode.CutFill &&
                        se.Code == HttpStatusCode.BadRequest &&
                        se.GetResult.Code == ContractExecutionStatesEnum.ValidationError)
                    {
                        if (
                            se is MissingDesignDescriptorException ||
                            se is TwoFiltersRequiredException ||
                            se is SingleFilterRequiredException)
                        {
                            getTile = false;
                        }
                    }
                    //Rethrow any other exception
                    if (getTile)
                    {
                        throw;
                    }
                }
            }

            TileResult tileResult = null;

            if (getTile)
            {
                try
                {
                    tileResult = await RequestExecutorContainerFactory
                                 .Build <CompactionTileExecutor>(logger,
#if RAPTOR
                                                                 raptorClient,
#endif
                                                                 configStore : ConfigStore, trexCompactionDataProxy : TRexCompactionDataProxy, customHeaders : customHeaders,
                                                                 userId : userId, fileImportProxy : FileImportProxy)
                                 .ProcessAsync(tileRequest) as TileResult;
                }
                catch (Exception ex)
                {
                    log.LogWarning($"Exception: {ex.Message} {ex.StackTrace}");
                }
            }

            return(tileResult?.TileData != null
        ? tileResult
        : TileResult.EmptyTile(WebMercatorProjection.TILE_SIZE, WebMercatorProjection.TILE_SIZE));
        }
Exemplo n.º 5
0
        /// <summary>
        /// Gets the elevation statistics for the given filter from Raptor
        /// </summary>
        /// <param name="projectId">Legacy project ID</param>
        /// <param name="filter">Compaction filter</param>
        /// <param name="projectSettings">Project settings</param>
        /// <returns>Elevation statistics</returns>
        public async Task <ElevationStatisticsResult> GetElevationRange(long projectId, Guid projectUid, FilterResult filter,
                                                                        CompactionProjectSettings projectSettings, IHeaderDictionary customHeaders, string userId)
        {
            const double NO_ELEVATION = 10000000000.0;

            var cacheKey  = ElevationCacheKey(projectUid, filter);
            var strFilter = filter != null?JsonConvert.SerializeObject(filter) : "";

            var opts = new MemoryCacheEntryOptions().GetCacheOptions(elevationExtentsCacheLifeKey, configStore, log);

            // User Story: 88271 - when the UI makes calls requiring elevation, we can bombard Raptor with duplicate calls to retrieve elevation
            // This can cause raptor to take longer than expected to query the same data over and over again.
            // This only ever happens when there is no cached item here, as once the item is cached for a given filter the cached item is returned.
            // To fix this, we will lock per cache key here, so only one call can be made to raptor, blocking all other calls requesting the same info until the cache item is ready
            // Overall the call time should not change for any request, however the number of calls will be reduced to 1 for each unique projectid / filter.
            ElevationStatisticsResult resultElevationStatisticsResult = null;

            using (await memCacheLock.LockAsync(cacheKey))
            {
                resultElevationStatisticsResult = await elevationExtentsCache.GetOrCreate(cacheKey, async entry =>
                {
                    ElevationStatisticsResult result;
                    entry.SetOptions(opts);

                    var projectStatisticsResult = await ProjectStatisticsHelper.GetProjectStatisticsWithProjectSsExclusions(projectUid, projectId, userId, customHeaders);

                    if (projectStatisticsResult?.extents != null)
                    {
                        var extents = projectStatisticsResult.extents;

                        result = new ElevationStatisticsResult
                                 (
                            new BoundingBox3DGrid(extents.MinX, extents.MinY, extents.MinZ, extents.MaxX, extents.MaxY, extents.MaxZ),
                            extents.MinZ,
                            extents.MaxZ,
                            0.0
                                 );
                    }
                    else
                    {
                        result = new ElevationStatisticsResult(null, 0.0, 0.0, 0.0);
                    }

                    //Check for 'No elevation range' result
                    if (Math.Abs(result.MinElevation - NO_ELEVATION) < 0.001 &&
                        Math.Abs(result.MaxElevation + NO_ELEVATION) < 0.001)
                    {
                        result = null;
                    }

                    // We need to tag the result as this filter and project for cache invalidation
                    var identifiers = new List <string> {
                        projectUid.ToString()
                    };
                    if (filter?.Uid != null)
                    {
                        identifiers.Add(filter.Uid.Value.ToString());
                    }

                    log.LogDebug($"Done elevation request");
                    return(new CacheItem <ElevationStatisticsResult>(result, identifiers));
                });
            }

            return(resultElevationStatisticsResult);
        }
Exemplo n.º 6
0
        public List <ColorPalette> CompactionPalette(DisplayMode mode, ElevationStatisticsResult elevExtents,
                                                     CompactionProjectSettings projectSettings, CompactionProjectSettingsColors projectSettingsColors)
        {
            var palette = new List <ColorPalette>();

            bool useDefaultValue;
            uint underColor;
            uint onColor;
            uint overColor;

            switch (mode)
            {
            case DisplayMode.Design3D:
            case DisplayMode.Height:
            {
                if (elevExtents == null)
                {
                    palette = null;
                }
                else
                {
                    //Compaction elevation palette has 31 colors, original Raptor one had 30 colors
                    var colors = projectSettingsColors.useDefaultElevationColors.HasValue &&
                                 projectSettingsColors.useDefaultElevationColors.Value
                ? CompactionProjectSettingsColors.DefaultSettings.elevationColors
                : projectSettingsColors.elevationColors;
                    var step = (elevExtents.MaxElevation - elevExtents.MinElevation) / (colors.Count - 1);

                    for (var i = 0; i < colors.Count; i++)
                    {
                        palette.Add(new ColorPalette(colors[i], elevExtents.MinElevation + i * step));
                    }
                }

                break;
            }

            case DisplayMode.CCV:
            {
                var cmvDetailsSettings = CompactionCmvSettingsEx(projectSettings);
                var cmvColors          = projectSettingsColors.useDefaultCMVDetailsColors.HasValue &&
                                         projectSettingsColors.useDefaultCMVDetailsColors.Value
              ? CompactionProjectSettingsColors.DefaultSettings.cmvDetailsColors
              : projectSettingsColors.cmvDetailsColors;

                for (var i = 0; i < cmvDetailsSettings.CustomCMVDetailTargets.Length; i++)
                {
                    //The last color and value are for above...
                    palette.Add(new ColorPalette(cmvColors[i], cmvDetailsSettings.CustomCMVDetailTargets[i]));
                }
                break;
            }

            case DisplayMode.PassCount:
            {
                var passCountSettings     = CompactionPassCountSettings(projectSettings);
                var passCountDetailColors = projectSettingsColors.useDefaultPassCountDetailsColors.HasValue &&
                                            projectSettingsColors.useDefaultPassCountDetailsColors.Value
              ? CompactionProjectSettingsColors.DefaultSettings.passCountDetailsColors
              : projectSettingsColors.passCountDetailsColors;

                for (var i = 0; i < passCountSettings.passCounts.Length; i++)
                {
                    //The colors and values for 1-8
                    palette.Add(new ColorPalette(passCountDetailColors[i], passCountSettings.passCounts[i]));
                }
                //The 9th color and value (for above)
                palette.Add(new ColorPalette(passCountDetailColors[8], passCountSettings.passCounts[7] + 1));
                break;
            }

            case DisplayMode.PassCountSummary:
            {
                //Values don't matter here as no machine override for compaction
                useDefaultValue = projectSettingsColors.useDefaultPassCountSummaryColors.HasValue &&
                                  projectSettingsColors.useDefaultPassCountSummaryColors.Value;

                underColor = useDefaultValue
              ? CompactionProjectSettingsColors.DefaultSettings.passCountUnderTargetColor.Value
              : projectSettingsColors.passCountUnderTargetColor ??
                             CompactionProjectSettingsColors.DefaultSettings.passCountUnderTargetColor.Value;

                onColor = useDefaultValue
              ? CompactionProjectSettingsColors.DefaultSettings.passCountOnTargetColor.Value
              : projectSettingsColors.passCountOnTargetColor ??
                          CompactionProjectSettingsColors.DefaultSettings.passCountOnTargetColor.Value;

                overColor = useDefaultValue
              ? CompactionProjectSettingsColors.DefaultSettings.passCountOverTargetColor.Value
              : projectSettingsColors.passCountOverTargetColor ??
                            CompactionProjectSettingsColors.DefaultSettings.passCountOverTargetColor.Value;

                palette.Add(new ColorPalette(underColor, ColorSettings.Default.passCountMinimum.value));
                palette.Add(new ColorPalette(onColor, ColorSettings.Default.passCountTarget.value));
                palette.Add(new ColorPalette(overColor, ColorSettings.Default.passCountMaximum.value));
                break;
            }

            case DisplayMode.CutFill:
            {
                //Note: cut-fill also requires a design for tile requests
                var cutFillTolerances = CompactionCutFillSettings(projectSettings);
                var cutFillColors     = projectSettingsColors.useDefaultCutFillColors.HasValue &&
                                        projectSettingsColors.useDefaultCutFillColors.Value
              ? CompactionProjectSettingsColors.DefaultSettings.cutFillColors
              : projectSettingsColors.cutFillColors;

                for (var i = 0; i < cutFillColors.Count; i++)
                {
                    palette.Add(new ColorPalette(cutFillColors[i], cutFillTolerances[i]));
                }
                break;
            }

            case DisplayMode.TemperatureSummary:
            {
                useDefaultValue = projectSettingsColors.useDefaultTemperatureSummaryColors.HasValue &&
                                  projectSettingsColors.useDefaultTemperatureSummaryColors.Value;

                underColor = useDefaultValue
              ? CompactionProjectSettingsColors.DefaultSettings.temperatureUnderTargetColor.Value
              : projectSettingsColors.temperatureUnderTargetColor ??
                             CompactionProjectSettingsColors.DefaultSettings.temperatureUnderTargetColor.Value;

                onColor = useDefaultValue
              ? CompactionProjectSettingsColors.DefaultSettings.temperatureOnTargetColor.Value
              : projectSettingsColors.temperatureOnTargetColor ??
                          CompactionProjectSettingsColors.DefaultSettings.temperatureOnTargetColor.Value;

                overColor = useDefaultValue
              ? CompactionProjectSettingsColors.DefaultSettings.temperatureOverTargetColor.Value
              : projectSettingsColors.temperatureOverTargetColor ??
                            CompactionProjectSettingsColors.DefaultSettings.temperatureOverTargetColor.Value;

                palette.Add(new ColorPalette(underColor, 0));
                palette.Add(new ColorPalette(onColor, 1));
                palette.Add(new ColorPalette(overColor, 2));
                break;
            }

            case DisplayMode.CCVPercentSummary:
            {
                useDefaultValue = projectSettingsColors.useDefaultCMVSummaryColors.HasValue &&
                                  projectSettingsColors.useDefaultCMVSummaryColors.Value;

                underColor = useDefaultValue
              ? CompactionProjectSettingsColors.DefaultSettings.cmvUnderTargetColor.Value
              : projectSettingsColors.cmvUnderTargetColor ??
                             CompactionProjectSettingsColors.DefaultSettings.cmvUnderTargetColor.Value;

                onColor = useDefaultValue
              ? CompactionProjectSettingsColors.DefaultSettings.cmvOnTargetColor.Value
              : projectSettingsColors.cmvOnTargetColor ??
                          CompactionProjectSettingsColors.DefaultSettings.cmvOnTargetColor.Value;

                overColor = useDefaultValue
              ? CompactionProjectSettingsColors.DefaultSettings.cmvOverTargetColor.Value
              : projectSettingsColors.cmvOverTargetColor ??
                            CompactionProjectSettingsColors.DefaultSettings.cmvOverTargetColor.Value;

                palette.Add(new ColorPalette(onColor, 0));
                palette.Add(new ColorPalette(ColorSettings.Default.ccvSummaryWorkInProgressLayerColor, 1));
                palette.Add(new ColorPalette(underColor, 2));
                palette.Add(new ColorPalette(overColor, 3));
                palette.Add(new ColorPalette(ColorSettings.Default.ccvSummaryTooThickLayerColor, 4));
                palette.Add(new ColorPalette(ColorSettings.Default.ccvSummaryApprovedLayerColor, 5));
                break;
            }

            case DisplayMode.MDPPercentSummary:
            {
                useDefaultValue = projectSettingsColors.useDefaultMDPSummaryColors.HasValue &&
                                  projectSettingsColors.useDefaultMDPSummaryColors.Value;

                underColor = useDefaultValue
              ? CompactionProjectSettingsColors.DefaultSettings.mdpUnderTargetColor.Value
              : projectSettingsColors.mdpUnderTargetColor ??
                             CompactionProjectSettingsColors.DefaultSettings.mdpUnderTargetColor.Value;

                onColor = useDefaultValue
              ? CompactionProjectSettingsColors.DefaultSettings.mdpOnTargetColor.Value
              : projectSettingsColors.mdpOnTargetColor ??
                          CompactionProjectSettingsColors.DefaultSettings.mdpOnTargetColor.Value;

                overColor = useDefaultValue
              ? CompactionProjectSettingsColors.DefaultSettings.mdpOverTargetColor.Value
              : projectSettingsColors.mdpOverTargetColor ??
                            CompactionProjectSettingsColors.DefaultSettings.mdpOverTargetColor.Value;

                palette.Add(new ColorPalette(onColor, 0));
                palette.Add(new ColorPalette(ColorSettings.Default.mdpSummaryWorkInProgressLayerColor, 1));
                palette.Add(new ColorPalette(underColor, 2));
                palette.Add(new ColorPalette(overColor, 3));
                palette.Add(new ColorPalette(ColorSettings.Default.mdpSummaryTooThickLayerColor, 4));
                palette.Add(new ColorPalette(ColorSettings.Default.mdpSummaryApprovedLayerColor, 5));
                break;
            }

            case DisplayMode.TargetSpeedSummary:
            {
                useDefaultValue = projectSettingsColors.useDefaultSpeedSummaryColors.HasValue &&
                                  projectSettingsColors.useDefaultSpeedSummaryColors.Value;

                underColor = useDefaultValue
              ? CompactionProjectSettingsColors.DefaultSettings.speedUnderTargetColor.Value
              : projectSettingsColors.speedUnderTargetColor ??
                             CompactionProjectSettingsColors.DefaultSettings.speedUnderTargetColor.Value;

                onColor = useDefaultValue
              ? CompactionProjectSettingsColors.DefaultSettings.speedOnTargetColor.Value
              : projectSettingsColors.speedOnTargetColor ??
                          CompactionProjectSettingsColors.DefaultSettings.speedOnTargetColor.Value;

                overColor = useDefaultValue
              ? CompactionProjectSettingsColors.DefaultSettings.speedOverTargetColor.Value
              : projectSettingsColors.speedOverTargetColor ??
                            CompactionProjectSettingsColors.DefaultSettings.speedOverTargetColor.Value;

                palette.Add(new ColorPalette(underColor, 0));
                palette.Add(new ColorPalette(onColor, 1));
                palette.Add(new ColorPalette(overColor, 2));
                break;
            }

            case DisplayMode.CMVChange:
            {
                var cmvPercentChangeSettings = CompactionCmvPercentChangeSettings(projectSettings);
                var cmvPercentChangeColors   = projectSettingsColors.useDefaultCMVPercentColors.HasValue &&
                                               projectSettingsColors.useDefaultCMVPercentColors.Value
              ? CompactionProjectSettingsColors.DefaultSettings.cmvPercentColors
              : projectSettingsColors.cmvPercentColors;

                //The first color and value are for below...
                palette.Add(new ColorPalette(cmvPercentChangeColors[0], double.MinValue));

                for (var i = 0; i < cmvPercentChangeSettings.Length; i++)
                {
                    //The last color and value are for above...
                    palette.Add(new ColorPalette(cmvPercentChangeColors[i + 1], cmvPercentChangeSettings[i]));
                }

                break;
            }

            case DisplayMode.TemperatureDetail:
            {
                var temperatureDetailsSettings = CompactionTemperatureDetailsSettings(projectSettings);
                var temperatureColors          = projectSettingsColors.useDefaultTemperatureDetailsColors.HasValue &&
                                                 projectSettingsColors.useDefaultTemperatureDetailsColors.Value
              ? CompactionProjectSettingsColors.DefaultSettings.temperatureDetailsColors
              : projectSettingsColors.temperatureDetailsColors;

                for (var i = 0; i < temperatureDetailsSettings.Length; i++)
                {
                    palette.Add(new ColorPalette(temperatureColors[i], temperatureDetailsSettings[i]));
                }
                break;
            }
            }
            return(palette);
        }