Example #1
0
        /// <summary>
        /// Processes the summary MDP request by passing the request to Raptor and returning the result.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="item"></param>
        /// <returns>a CMVSummaryResult if successful</returns>
        protected override async Task <ContractExecutionResult> ProcessAsyncEx <T>(T item)
        {
            try
            {
                var request = CastRequestObjectTo <MDPRequest>(item);
#if RAPTOR
                if (configStore.GetValueBool("ENABLE_TREX_GATEWAY_MDP") ?? false)
                {
#endif
                var mdpSummaryRequest = new MDPSummaryRequest(
                    request.ProjectUid.Value,
                    request.Filter,
                    request.MdpSettings.MdpTarget,
                    request.MdpSettings.OverrideTargetMDP,
                    request.MdpSettings.MaxMDPPercent,
                    request.MdpSettings.MinMDPPercent,
                    AutoMapperUtility.Automapper.Map <LiftSettings>(request.LiftBuildSettings));

                return(await trexCompactionDataProxy.SendDataPostRequest <MDPSummaryResult, MDPSummaryRequest>(mdpSummaryRequest, "/mdp/summary", customHeaders));

#if RAPTOR
            }

            string fileSpaceName = FileDescriptorExtensions.GetFileSpaceId(configStore, log);

            var raptorFilter = RaptorConverters.ConvertFilter(request.Filter, request.ProjectId, raptorClient, request.OverrideStartUtc, request.OverrideEndUtc, request.OverrideAssetIds, fileSpaceName);
            var raptorResult = raptorClient.GetMDPSummary(request.ProjectId ?? VelociraptorConstants.NO_PROJECT_ID,
                                                          ASNodeRPC.__Global.Construct_TASNodeRequestDescriptor((request.CallId ?? Guid.NewGuid()), 0, TASNodeCancellationDescriptorType.cdtMDPSummary),
                                                          ConvertSettings(request.MdpSettings),
                                                          raptorFilter,
                                                          RaptorConverters.ConvertLift(request.LiftBuildSettings, raptorFilter.LayerMethod),
                                                          out var mdpSummary);

            if (raptorResult == TASNodeErrorStatus.asneOK)
            {
                return(ConvertResult(mdpSummary));
            }

            throw CreateServiceException <SummaryMDPExecutor>((int)raptorResult);
#endif
            }
            finally
            {
                ContractExecutionStates.ClearDynamic();
            }
        }
Example #2
0
        protected override async Task <ContractExecutionResult> ProcessAsyncEx <T>(T item)
        {
            var request = item as DxfTileRequest;

            if (request == null)
            {
                ThrowRequestTypeCastException <DxfTileRequest>();
            }

            string filespaceId = FileDescriptorExtensions.GetFileSpaceId(configStore, log);

            //Calculate zoom level
            int zoomLevel = TileServiceUtils.CalculateZoomLevel(request.bbox.TopRightLat - request.bbox.BottomLeftLat,
                                                                request.bbox.TopRightLon - request.bbox.BottomLeftLon);

            log.LogDebug("DxfTileExecutor: BBOX differences {0} {1} {2}", request.bbox.TopRightLat - request.bbox.BottomLeftLat,
                         request.bbox.TopRightLon - request.bbox.BottomLeftLon, zoomLevel);
            int   numTiles      = TileServiceUtils.NumberOfTiles(zoomLevel);
            Point topLeftLatLng = new Point(request.bbox.TopRightLat.LatRadiansToDegrees(),
                                            request.bbox.BottomLeftLon.LonRadiansToDegrees());
            Point topLeftTile = WebMercatorProjection.LatLngToTile(topLeftLatLng, numTiles);

            log.LogDebug("DxfTileExecutor: zoomLevel={0}, numTiles={1}, xtile={2}, ytile={3}", zoomLevel, numTiles,
                         topLeftTile.x, topLeftTile.y);

            log.LogDebug("DxfTileExecutor: {0} files", request.files.Count());

            //Short circuit overlaying if there no files to overlay as ForAll is an expensive operation
            if (!request.files.Any())
            {
                byte[] emptyOverlayData = null;
                using (Bitmap bitmap = new Bitmap(WebMercatorProjection.TILE_SIZE, WebMercatorProjection.TILE_SIZE))
                {
                    emptyOverlayData = bitmap.BitmapToByteArray();
                }
                return(new TileResult(emptyOverlayData));
            }

            log.LogDebug(string.Join(",", request.files.Select(f => f.Name).ToList()));

            List <byte[]> tileList = new List <byte[]>();

            var fileTasks = request.files.Select(async file =>
            {
                //foreach (var file in request.files)
                //Check file type to see if it has tiles
                if (file.ImportedFileType == ImportedFileType.Alignment ||
                    file.ImportedFileType == ImportedFileType.DesignSurface ||
                    file.ImportedFileType == ImportedFileType.Linework)
                {
                    if (zoomLevel >= file.MinZoomLevel)
                    {
                        var suffix           = FileUtils.GeneratedFileSuffix(file.ImportedFileType);
                        string generatedName = FileUtils.GeneratedFileName(file.Name, suffix, FileUtils.DXF_FILE_EXTENSION);
                        byte[] tileData      = null;
                        if (zoomLevel <= file.MaxZoomLevel || file.MaxZoomLevel == 0) //0 means not calculated
                        {
                            tileData = await GetTileAtRequestedZoom(topLeftTile, zoomLevel, file.Path, generatedName, filespaceId);
                        }
                        else if (zoomLevel - file.MaxZoomLevel <= 5) //Don't try to scale if the difference is too excessive
                        {
                            tileData = await GetTileAtHigherZoom(topLeftTile, zoomLevel, file.Path, generatedName, filespaceId,
                                                                 file.MaxZoomLevel, numTiles);
                        }
                        else
                        {
                            log.LogDebug(
                                "DxfTileExecutor: difference between requested and maximum zooms too large; not even going to try to scale tile");
                        }
                        if (tileData != null)
                        {
                            tileList.Add(tileData);
                        }
                    }
                }
            });

            await Task.WhenAll(fileTasks);

            //Overlay the tiles. Return an empty tile if none to overlay.
            log.LogDebug("DxfTileExecutor: Overlaying {0} tiles", tileList.Count);
            byte[] overlayData          = null;
            System.Drawing.Point origin = new System.Drawing.Point(0, 0);
            using (Bitmap bitmap = new Bitmap(WebMercatorProjection.TILE_SIZE, WebMercatorProjection.TILE_SIZE))
                using (Graphics g = Graphics.FromImage(bitmap))
                {
                    foreach (byte[] tileData in tileList)
                    {
                        using (var tileStream = new MemoryStream(tileData))
                        {
                            Image image = Image.FromStream(tileStream);
                            g.DrawImage(image, origin);
                        }
                    }
                    overlayData = bitmap.BitmapToByteArray();
                }

            return(new TileResult(overlayData));
        }