public void ValidateUpdatingCmvDetailsColorsTest() { CompactionProjectSettingsColors colors = new CompactionProjectSettingsColors(useDefaultCMVDetailsColors: false, cmvDetailsColors: new List <uint> { 0x01579B, // 87963 0x2473AE, // 2388910 0x488FC1, // 4755393 0x6BACD5, // 7056597 0x8FC8E8, // 9423080 0xB3E5FC, // 11789820 0xDBECC8, // 14413000 0x99CB65, // 10079077 0x649E38, // 6594104 0x2D681D, // 2975773 0xFFCCD2, // 16764114 0xF6A3A8, // 16163752 0xEE7A7E, // 15628926 0xE55154, // 15028564 0xDD282A, // 14493738 0xD50000 // 13959168 }); Assert.ThrowsException <ServiceException>(() => colors.Validate(null)); colors.UpdateCmvDetailsColorsIfRequired(); colors.Validate(null); }
public void Initialize(ILogger log, IConfigurationStore configurationStore, IFileImportProxy fileImportProxy, ICompactionSettingsManager settingsManager, Guid?projectUid, long projectId, CompactionProjectSettings projectSettings, CompactionProjectSettingsColors projectSettingsColors, IHeaderDictionary headers, FilterResult filter, DesignDescriptor designDescriptor) { filter?.Validate(); // Should be moved to FilterResult.CreateFilterObsolete(). Log = log; ConfigurationStore = configurationStore; FileImportProxy = fileImportProxy; SettingsManager = settingsManager; ProjectUid = projectUid; ProjectId = projectId; Headers = headers; ProjectSettings = projectSettings; ProjectSettingsColors = projectSettingsColors; Filter = filter; DesignDescriptor = designDescriptor; }
/// <summary> /// Deserializes the project settings colors /// </summary> /// <param name="projectSettings">JSON representation of the project settings</param> /// <returns>The project settings colors instance</returns> private CompactionProjectSettingsColors GetProjectSettingsColors(string projectSettings) { CompactionProjectSettingsColors ps = null; if (!string.IsNullOrEmpty(projectSettings)) { try { ps = JsonConvert.DeserializeObject <CompactionProjectSettingsColors>(projectSettings); } catch (Exception ex) { throw new ServiceException(HttpStatusCode.BadRequest, new ContractExecutionResult(ContractExecutionStatesEnum.ValidationError, ex.Message)); } } return(ps); }
/// <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)); }
/// <summary> /// Sets the compaction settings colors used for the project. /// </summary> /// <param name="projectSettingsColors"></param> public ProductionDataRequestFactory ProjectSettingsColors(CompactionProjectSettingsColors projectSettingsColors) { this.projectSettingsColors = projectSettingsColors; return(this); }
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); }