コード例 #1
0
        public void PD_PostProfileProductionDataFailed()
        {
            ProfileProductionDataRequest request = CreateRequest();
            MemoryStream raptorResult            = null;

            Assert.IsTrue(RaptorConverters.DesignDescriptor(request.AlignmentDesign).IsNull(), "A linear profile expected.");

            ProfilesHelper.ConvertProfileEndPositions(request.GridPoints, request.WGS84Points, out TWGS84Point startPt, out var endPt, out bool positionsAreGrid);

            TASNodeServiceRPCVerb_RequestProfile_Args args
                = __Global.Construct_RequestProfile_Args
                      (request.ProjectId.Value,
                      -1, // don't care
                      positionsAreGrid,
                      startPt,
                      endPt,
                      RaptorConverters.ConvertFilter(request.Filter),
                      RaptorConverters.ConvertLift(request.LiftBuildSettings, TFilterLayerMethod.flmAutomatic),
                      RaptorConverters.DesignDescriptor(request.AlignmentDesign),
                      request.ReturnAllPassesAndLayers);

            // Create the mock PDSClient with successful result...
            var mockRaptorClient = new Mock <IASNodeClient>();
            var mockLogger       = new Mock <ILoggerFactory>();
            var mockConfigStore  = new Mock <IConfigurationStore>();

            mockRaptorClient.Setup(prj => prj.GetProfile(It.IsAny <TASNodeServiceRPCVerb_RequestProfile_Args>() /*args*/)).Returns(raptorResult);

            // Create an executor...
            var executor = RequestExecutorContainerFactory.Build <ProfileProductionDataExecutor>(mockLogger.Object, mockRaptorClient.Object, configStore: mockConfigStore.Object);

            Assert.ThrowsExceptionAsync <ServiceException>(async() => await executor.ProcessAsync(request));
        }
コード例 #2
0
        public void CompactionReportStationOffsetExecutor_Raptor_NoResult()
        {
            var userPreferences = new UserPreferenceData {
                Language = "en-US"
            };
            var request = CompactionReportStationOffsetRequest.CreateRequest(
                33, null, null, 0, null, true, true, true, true, true, true, null, null, 0, 0, 0, null, userPreferences, "New Zealand Standard Time");
            var filterSettings          = RaptorConverters.ConvertFilter(request.Filter);
            var cutfillDesignDescriptor = RaptorConverters.DesignDescriptor(request.DesignFile);
            var alignmentDescriptor     = RaptorConverters.DesignDescriptor(request.AlignmentFile);
            var TASNodeUserPreference   = ExportRequestHelper.ConvertToRaptorUserPreferences(request.UserPreferences, request.ProjectTimezone);

            var options = RaptorConverters.convertOptions(null, request.LiftBuildSettings, 0,
                                                          request.Filter?.LayerType ?? FilterLayerMethod.None, DisplayMode.Height, false);

            var mockConfigStore = new Mock <IConfigurationStore>();

            mockConfigStore.Setup(x => x.GetValueBool("ENABLE_TREX_GATEWAY_STATIONOFFSET")).Returns(false);

            MemoryStream responseData;

            var raptorClient = new Mock <IASNodeClient>();

            var args = ASNode.StationOffsetReport.RPC.__Global.Construct_StationOffsetReport_Args(
                request.ProjectId ?? VelociraptorConstants.NO_PROJECT_ID,
                (int)CompactionReportType.StationOffset,
                ASNodeRPC.__Global.Construct_TASNodeRequestDescriptor(Guid.NewGuid(), 0,
                                                                      TASNodeCancellationDescriptorType.cdtProdDataReport),
                TASNodeUserPreference,
                alignmentDescriptor,
                cutfillDesignDescriptor,
                request.StartStation,
                request.EndStation,
                request.Offsets,
                request.CrossSectionInterval,
                request.ReportElevation,
                request.ReportCutFill,
                request.ReportCMV,
                request.ReportMDP,
                request.ReportPassCount,
                request.ReportTemperature,
                (int)GridReportOption.Unused,
                0, 0, 0, 0, 0, 0, 0, // Northings, Eastings and Direction values are not used on Station Offset report.
                filterSettings,
                RaptorConverters.ConvertLift(request.LiftBuildSettings, filterSettings.LayerMethod),
                options
                );

            raptorClient.Setup(x => x.GetReportStationOffset(args, out responseData)).Returns(0); // icsrrUnknownError
            var executor = RequestExecutorContainerFactory
                           .Build <CompactionReportStationOffsetExecutor>(_logger, raptorClient.Object, configStore: mockConfigStore.Object);

            Assert.ThrowsExceptionAsync <ServiceException>(async() => await executor.ProcessAsync(request));
        }
コード例 #3
0
        protected override async Task <ContractExecutionResult> ProcessAsyncEx <T>(T item)
        {
            try
            {
                var request = CastRequestObjectTo <CutFillDetailsRequest>(item);
#if RAPTOR
                if (UseTRexGateway("ENABLE_TREX_GATEWAY_CUTFILL"))
                {
#endif
                var trexRequest = new TRexCutFillDetailsRequest(
                    request.ProjectUid.Value,
                    request.CutFillTolerances,
                    request.Filter,
                    request.DesignDescriptor,
                    AutoMapperUtility.Automapper.Map <OverridingTargets>(request.LiftBuildSettings),
                    AutoMapperUtility.Automapper.Map <LiftSettings>(request.LiftBuildSettings));
                return(await trexCompactionDataProxy.SendDataPostRequest <CompactionCutFillDetailedResult, TRexCutFillDetailsRequest>(trexRequest, "/cutfill/details", customHeaders));

#if RAPTOR
            }

            var filter            = RaptorConverters.ConvertFilter(request.Filter, request.ProjectId, raptorClient);
            var designDescriptor  = RaptorConverters.DesignDescriptor(request.DesignDescriptor);
            var liftBuildSettings =
                RaptorConverters.ConvertLift(request.LiftBuildSettings, TFilterLayerMethod.flmNone);

            var raptorResult = raptorClient.GetCutFillDetails(request.ProjectId ?? VelociraptorConstants.NO_PROJECT_ID,
                                                              ASNodeRPC.__Global.Construct_TASNodeRequestDescriptor(Guid.NewGuid(), 0, TASNodeCancellationDescriptorType.cdtCutfillDetailed),
                                                              new TCutFillSettings
            {
                Offsets          = request.CutFillTolerances,
                DesignDescriptor = designDescriptor
            }
                                                              ,
                                                              filter,
                                                              liftBuildSettings,
                                                              out var cutFillDetails);

            if (raptorResult == TASNodeErrorStatus.asneOK)
            {
                return(new CompactionCutFillDetailedResult(cutFillDetails.Percents));
            }

            throw CreateServiceException <CompactionCutFillExecutor>((int)raptorResult);
#endif
            }
            finally
            {
                ContractExecutionStates.ClearDynamic();
            }
        }
コード例 #4
0
        private CompactionProfileResult <CompactionProfileCell> ProcessProductionDataWithRaptor(
            CompactionProfileProductionDataRequest request)
        {
            MemoryStream memoryStream;

            var filter              = RaptorConverters.ConvertFilter(request.Filter, request.ProjectId, raptorClient);
            var designDescriptor    = RaptorConverters.DesignDescriptor(request.CutFillDesignDescriptor);
            var alignmentDescriptor = RaptorConverters.DesignDescriptor(request.AlignmentDesign);
            var liftBuildSettings   =
                RaptorConverters.ConvertLift(request.LiftBuildSettings, TFilterLayerMethod.flmNone);

            ProfilesHelper.ConvertProfileEndPositions(request.GridPoints, request.WGS84Points, out var startPt, out var endPt,
                                                      out var positionsAreGrid);

            if (request.IsAlignmentDesign)
            {
                var args
                    = ASNode.RequestAlignmentProfile.RPC.__Global.Construct_RequestAlignmentProfile_Args
                          (request.ProjectId ?? VelociraptorConstants.NO_PROJECT_ID,
                          ProfilesHelper.PROFILE_TYPE_NOT_REQUIRED,
                          request.StartStation ?? ValidationConstants3D.MIN_STATION,
                          request.EndStation ?? ValidationConstants3D.MIN_STATION,
                          alignmentDescriptor,
                          filter,
                          liftBuildSettings,
                          designDescriptor,
                          request.ReturnAllPassesAndLayers);

                memoryStream = raptorClient.GetAlignmentProfile(args);
            }
            else
            {
                var args
                    = ASNode.RequestProfile.RPC.__Global.Construct_RequestProfile_Args
                          (request.ProjectId ?? VelociraptorConstants.NO_PROJECT_ID,
                          ProfilesHelper.PROFILE_TYPE_HEIGHT,
                          positionsAreGrid,
                          startPt,
                          endPt,
                          filter,
                          liftBuildSettings,
                          designDescriptor,
                          request.ReturnAllPassesAndLayers);

                memoryStream = raptorClient.GetProfile(args);
            }

            return(memoryStream != null?ConvertProfileResult(memoryStream, request.LiftBuildSettings) : null);
        }
コード例 #5
0
        private ContractExecutionResult ProcessWithRaptor(CompactionReportStationOffsetRequest request)
        {
            var filterSettings          = RaptorConverters.ConvertFilter(request.Filter, request.ProjectId, raptorClient);
            var cutfillDesignDescriptor = RaptorConverters.DesignDescriptor(request.DesignFile);
            var alignmentDescriptor     = RaptorConverters.DesignDescriptor(request.AlignmentFile);
            var userPreferences         =
                ExportRequestHelper.ConvertToRaptorUserPreferences(request.UserPreferences, request.ProjectTimezone);

            var options = RaptorConverters.convertOptions(null, request.LiftBuildSettings, 0,
                                                          request.Filter?.LayerType ?? FilterLayerMethod.None, DisplayMode.Height, false);

            log.LogDebug($"{nameof(ProcessWithRaptor)}: About to call GetReportStationOffset");

            var args = ASNode.StationOffsetReport.RPC.__Global.Construct_StationOffsetReport_Args(
                request.ProjectId ?? VelociraptorConstants.NO_PROJECT_ID,
                (int)CompactionReportType.StationOffset,
                ASNodeRPC.__Global.Construct_TASNodeRequestDescriptor(Guid.NewGuid(), 0,
                                                                      TASNodeCancellationDescriptorType.cdtProdDataReport),
                userPreferences,
                alignmentDescriptor,
                cutfillDesignDescriptor,
                request.StartStation,
                request.EndStation,
                request.Offsets,
                request.CrossSectionInterval,
                request.ReportElevation,
                request.ReportCutFill,
                request.ReportCMV,
                request.ReportMDP,
                request.ReportPassCount,
                request.ReportTemperature,
                (int)GridReportOption.Unused,
                0, 0, 0, 0, 0, 0, 0, // Northings, Eastings and Direction values are not used on Station Offset report.
                filterSettings,
                RaptorConverters.ConvertLift(request.LiftBuildSettings, filterSettings.LayerMethod),
                options
                );

            int raptorResult = raptorClient.GetReportStationOffset(args, out var responseData);

            if (raptorResult == 1) // icsrrNoError
            {
                return(responseData.Length > 0
          ? ConvertStationOffsetResult(request, responseData)
          : CreateNullStationOffsetReturnedResult());
            }

            throw CreateServiceException <CompactionReportStationOffsetExecutor>();
        }
コード例 #6
0
        /// <summary>
        /// Sends a POST request to Production Data Server (PDS) client.
        /// </summary>
        /// <param name="item">POST request description.</param>
        /// <param name="surveyedSurfaces">Returned list of Surveyed Surfaces.</param>
        /// <returns>True if the processed request from PDS was successful, false - otherwise.</returns>
        protected override bool SendRequestToPdsClient(object item, out TSurveyedSurfaceDetails[] surveyedSurfaces)
        {
            var request = CastRequestObjectTo <SurveyedSurfaceRequest>(item);

            surveyedSurfaces = null;

            var args = ASNode.GroundSurface.RPC.__Global
                       .Construct_GroundSurface_Args(
                request.ProjectId ?? VelociraptorConstants.NO_PROJECT_ID,
                request.SurveyedSurface.Id,
                request.SurveyedUtc,
                RaptorConverters.DesignDescriptor(request.SurveyedSurface)
                );

            return(raptorClient.StoreGroundSurfaceFile(args));
        }
コード例 #7
0
        protected virtual bool GetCellDatumData(CellDatumRequest request, out TCellProductionData data)
        {
            var raptorFilter = RaptorConverters.ConvertFilter(request.Filter, request.ProjectId, raptorClient);

            return(raptorClient.GetCellProductionData
                       (request.ProjectId ?? VelociraptorConstants.NO_PROJECT_ID,
                       (int)RaptorConverters.convertDisplayMode(request.DisplayMode),
                       request.GridPoint?.x ?? 0,
                       request.GridPoint?.y ?? 0,
                       request.LLPoint != null ? RaptorConverters.ConvertWGSPoint(request.LLPoint) : new TWGS84Point(),
                       request.LLPoint == null,
                       raptorFilter,
                       RaptorConverters.ConvertLift(request.LiftBuildSettings, raptorFilter.LayerMethod),
                       RaptorConverters.DesignDescriptor(request.Design),
                       out data));
        }
コード例 #8
0
        private ProfileResult PerformProductionDataProfilePost(ProfileProductionDataRequest request)
        {
            MemoryStream memoryStream;

            if (request.IsAlignmentDesign)
            {
                var args = ASNode.RequestAlignmentProfile.RPC.__Global.Construct_RequestAlignmentProfile_Args(
                    request.ProjectId ?? VelociraptorConstants.NO_PROJECT_ID,
                    ProfilesHelper.PROFILE_TYPE_NOT_REQUIRED,
                    request.StartStation ?? ValidationConstants3D.MIN_STATION,
                    request.EndStation ?? ValidationConstants3D.MIN_STATION,
                    RaptorConverters.DesignDescriptor(request.AlignmentDesign),
                    RaptorConverters.ConvertFilter(request.Filter, request.ProjectId, raptorClient),
                    RaptorConverters.ConvertLift(request.LiftBuildSettings, TFilterLayerMethod.flmAutomatic),
                    RaptorConverters.DesignDescriptor(request.AlignmentDesign),
                    request.ReturnAllPassesAndLayers);

                memoryStream = raptorClient.GetAlignmentProfile(args);
            }
            else
            {
                ProfilesHelper.ConvertProfileEndPositions(
                    request.GridPoints,
                    request.WGS84Points,
                    out VLPDDecls.TWGS84Point startPt,
                    out VLPDDecls.TWGS84Point endPt,
                    out bool positionsAreGrid);

                var args = ASNode.RequestProfile.RPC.__Global.Construct_RequestProfile_Args(
                    request.ProjectId ?? VelociraptorConstants.NO_PROJECT_ID,
                    ProfilesHelper.PROFILE_TYPE_NOT_REQUIRED,
                    positionsAreGrid,
                    startPt,
                    endPt,
                    RaptorConverters.ConvertFilter(request.Filter, request.ProjectId, raptorClient),
                    RaptorConverters.ConvertLift(request.LiftBuildSettings, TFilterLayerMethod.flmAutomatic),
                    RaptorConverters.DesignDescriptor(request.AlignmentDesign),
                    request.ReturnAllPassesAndLayers);

                memoryStream = raptorClient.GetProfile(args);
            }

            return(memoryStream != null
        ? ConvertProfileResult(memoryStream, request.CallId ?? Guid.NewGuid())
        : null); // TODO: return appropriate result
        }
コード例 #9
0
        /// <summary>
        /// Get the station range for the alignment file
        /// </summary>
        /// <param name="project"></param>
        /// <param name="alignDescriptor"></param>
        /// <param name="customHeaders"></param>
        /// <returns>The station range</returns>
        public async Task <AlignmentStationRangeResult> GetAlignmentStationRange(ProjectData project, DesignDescriptor alignDescriptor, IHeaderDictionary customHeaders)
        {
            if (alignDescriptor == null)
            {
                throw new ServiceException(HttpStatusCode.BadRequest, new ContractExecutionResult(
                                               ContractExecutionStatesEnum.FailedToGetResults,
                                               "Invalid request - Missing alignment file"));
            }

            //AlignmentStationResult result = null;
            var description = TileServiceUtils.DesignDescriptionForLogging(alignDescriptor);

            log.LogDebug($"{nameof(GetAlignmentStationRange)}: projectUid={project.ProjectUID}, projectId={project.ShortRaptorProjectId}, alignment={description}");

            //Get the station extents
#if RAPTOR
            if (UseTRexGateway("ENABLE_TREX_GATEWAY_DESIGN_BOUNDARY"))
            {
#endif
            var queryParams = new List <KeyValuePair <string, string> >
            {
                new KeyValuePair <string, string>("projectUid", project.ProjectUID.ToString()),
                new KeyValuePair <string, string>("designUid", alignDescriptor.FileUid.ToString())
            }
            ;

            return(await tRexCompactionDataProxy.SendDataGetRequest <AlignmentStationRangeResult>(project.ProjectUID.ToString(), "/design/alignment/stationrange", customHeaders, queryParams));

#if RAPTOR
        }

        var alignmentDescriptor = RaptorConverters.DesignDescriptor(alignDescriptor);
        var success             = raptorClient.GetStationExtents(project.LegacyProjectId, alignmentDescriptor,
                                                                 out double startStation, out double endStation);

        if (success)
        {
            return(new AlignmentStationRangeResult(startStation, endStation));
        }
#endif

            throw new ServiceException(HttpStatusCode.BadRequest, new ContractExecutionResult(
                                           ContractExecutionStatesEnum.FailedToGetResults,
                                           $"Failed to get station range for alignment file: {alignDescriptor.File.FileName}"));
        }
コード例 #10
0
        private ContractExecutionResult ProcessWithRaptor(CompactionReportGridRequest request)
        {
            var raptorFilter = RaptorConverters.ConvertFilter(request.Filter, request.ProjectId, raptorClient);

            var options = RaptorConverters.convertOptions(null, request.LiftBuildSettings, 0,
                                                          request.Filter?.LayerType ?? FilterLayerMethod.None, DisplayMode.Height, false);

            log.LogDebug($"{nameof(ProcessWithRaptor)}: About to call GetReportGrid");

            var args = ASNode.GridReport.RPC.__Global.Construct_GridReport_Args(
                request.ProjectId ?? VelociraptorConstants.NO_PROJECT_ID,
                (int)CompactionReportType.Grid,
                ASNodeRPC.__Global.Construct_TASNodeRequestDescriptor(Guid.NewGuid(), 0,
                                                                      TASNodeCancellationDescriptorType.cdtProdDataReport),
                RaptorConverters.DesignDescriptor(request.DesignFile),
                request.GridInterval,
                request.ReportElevation,
                request.ReportCutFill,
                request.ReportCMV,
                request.ReportMDP,
                request.ReportPassCount,
                request.ReportTemperature,
                (int)request.GridReportOption,
                request.StartNorthing,
                request.StartEasting,
                request.EndNorthing,
                request.EndEasting,
                request.Azimuth,
                raptorFilter,
                RaptorConverters.ConvertLift(request.LiftBuildSettings, raptorFilter.LayerMethod),
                options
                );

            int raptorResult = raptorClient.GetReportGrid(args, out var responseData);

            if (raptorResult == 1) // icsrrNoError
            {
                return(responseData.Length > 0
          ? ConvertGridResult(request, responseData)
          : CreateNullGridReturnedResult());
            }

            throw CreateServiceException <CompactionReportGridExecutor>();
        }
コード例 #11
0
        private CompactionProfileResult <CompactionProfileVertex> PerformProductionDataProfilePost(CompactionProfileDesignRequest request)
        {
            CompactionProfileResult <CompactionProfileVertex> result;

            try
            {
                ProfilesHelper.ConvertProfileEndPositions(request.GridPoints, request.WGS84Points, out TWGS84Point startPt, out TWGS84Point endPt, out bool positionsAreGrid);

                var designProfile = DesignProfiler.ComputeProfile.RPC.__Global.Construct_CalculateDesignProfile_Args(
                    request.ProjectId ?? VelociraptorConstants.NO_PROJECT_ID,
                    false,
                    startPt,
                    endPt,
                    ValidationConstants3D.MIN_STATION,
                    ValidationConstants3D.MAX_STATION,
                    RaptorConverters.DesignDescriptor(request.DesignDescriptor),
                    RaptorConverters.EmptyDesignDescriptor,
                    RaptorConverters.ConvertFilter(request.Filter, request.ProjectId, raptorClient),
                    positionsAreGrid);

                var memoryStream = raptorClient.GetDesignProfile(designProfile);

                if (memoryStream != null)
                {
                    result = ConvertProfileResult(memoryStream);
                    memoryStream.Close();
                }
                else
                {
                    //For convenience return empty list rather than null for easier manipulation
                    result = new CompactionProfileResult <CompactionProfileVertex> {
                        results = new List <CompactionProfileVertex>()
                    };
                }
            }
            finally
            {
                ContractExecutionStates.ClearDynamic();
            }

            return(result);
        }
コード例 #12
0
        protected override async Task <ContractExecutionResult> ProcessAsyncEx <T>(T item)
        {
            try
            {
                var request    = CastRequestObjectTo <ProjectFileDescriptor>(item);
                var zoomResult = new ZoomRangeResult();
                var fileType   = request.FileType;
                log.LogDebug($"FileType is: {fileType}");

                //Tell Raptor to update its cache.
                //Note: surveyed surface file names are the TCC one including the surveyed UTC in the file name
                if (fileType == ImportedFileType.Alignment ||
                    fileType == ImportedFileType.DesignSurface ||
                    fileType == ImportedFileType.SurveyedSurface)
                {
                    log.LogDebug("Updating Raptor design cache");

                    var result1 = raptorClient.UpdateCacheWithDesign(request.ProjectId.Value, request.File.FileName, 0, false);
                    if (result1 != TDesignProfilerRequestResult.dppiOK)
                    {
                        throw new ServiceException(HttpStatusCode.BadRequest, new ContractExecutionResult(
                                                       ContractExecutionStatesEnum.FailedToGetResults,
                                                       $"Failed to update Raptor design cache with error: {ContractExecutionStates.FirstNameWithOffset((int) result1)}"));
                    }
                }

                switch (fileType)
                {
                case ImportedFileType.Linework:
                //case ImportedFileType.DesignSurface:
                case ImportedFileType.Alignment:

                    var suffix = FileUtils.GeneratedFileSuffix(fileType);
                    //Get PRJ file contents from Raptor
                    log.LogDebug($"Getting projection file from Raptor for file {request.File.FileName}");
                    var dxfUnitsType = fileType == ImportedFileType.Linework
              ? (TVLPDDistanceUnits)request.DXFUnitsType
              : TVLPDDistanceUnits.vduMeters; //always metric for design surface and alignment as we generate the DXF file.
                    log.LogDebug($"Units selected {dxfUnitsType}");

                    var result2 = raptorClient.GetCoordinateSystemProjectionFile(request.ProjectId.Value,
                                                                                 dxfUnitsType, out string prjFile);
                    if (result2 != TASNodeErrorStatus.asneOK)
                    {
                        //We need gracefully fail here as the file may be imported to an empty datamodel
                        log.LogWarning("Failed to get requested " + FileUtils.PROJECTION_FILE_EXTENSION + " file with error: {0}.",
                                       ContractExecutionStates.FirstNameWithOffset((int)result2));

                        return(new AddFileResult(ContractExecutionStatesEnum.ExecutedSuccessfully, "Add file notification partially successful - no tiles can be generated")
                        {
                            MinZoomLevel = 0,
                            MaxZoomLevel = 0,
                            FileUid = request.FileUid,
                            FileDescriptor = request.File,
                            UserEmailAddress = request.UserEmailAddress
                        });

                        /*throw new ServiceException(HttpStatusCode.BadRequest, new ContractExecutionResult(
                         * ContractExecutionStatesEnum.FailedToGetResults,
                         * string.Format("Failed to get requested " + FileUtils.PROJECTION_FILE_EXTENSION + " file with error: {0}.",
                         * ContractExecutionStates.FirstNameWithOffset((int)result2))));*/
                    }
                    //Note: Cannot have async void therefore bool result from method. However, failure handled inside method so ignore return value here.
                    await CreateTransformFile(request.ProjectId.Value, request.File, prjFile, suffix, FileUtils.PROJECTION_FILE_EXTENSION);

                    //Get GM_XFORM file contents from Raptor
                    log.LogDebug("Getting horizontal adjustment file from Raptor");

                    var result3 = raptorClient.GetCoordinateSystemHorizontalAdjustmentFile(request.CoordSystemFileName,
                                                                                           request.ProjectId.Value, dxfUnitsType, out string haFile);
                    if (result3 != TASNodeErrorStatus.asneOK)
                    {
                        log.LogWarning("Failed to get requested " + FileUtils.HORIZONTAL_ADJUSTMENT_FILE_EXTENSION + $" file with error: {ContractExecutionStates.FirstNameWithOffset((int) result2)}.");
                        return(new AddFileResult(ContractExecutionStatesEnum.ExecutedSuccessfully, "Add file notification partially successful. Can not create horizontal adjustment - no tiles can be generated")
                        {
                            MinZoomLevel = 0,
                            MaxZoomLevel = 0,
                            FileUid = request.FileUid,
                            FileDescriptor = request.File,
                            UserEmailAddress = request.UserEmailAddress
                        });

                        /* throw new ServiceException(HttpStatusCode.BadRequest, new ContractExecutionResult(
                         * ContractExecutionStatesEnum.FailedToGetResults,
                         * string.Format(
                         * "Failed to get requested " + FileUtils.HORIZONTAL_ADJUSTMENT_FILE_EXTENSION + " file with error: {0}.",
                         * ContractExecutionStates.FirstNameWithOffset((int)result2))));*/
                    }
                    //An empty string means there is no horizontal adjustment in coordinate system so no file to create
                    if (haFile != string.Empty)
                    {
                        await CreateTransformFile(request.ProjectId.Value, request.File, haFile, suffix,
                                                  FileUtils.HORIZONTAL_ADJUSTMENT_FILE_EXTENSION);
                    }

                    if (fileType != ImportedFileType.Linework)
                    {
                        log.LogDebug($"Creating DXF file with Units selected {request.DXFUnitsType}");
                        //Get alignment or surface boundary as DXF file from Raptor
                        if (!await CreateDxfFile(request.ProjectId.Value, request.File, suffix, request.DXFUnitsType))
                        {
                            //We need gracefully fail here as the file may be imported to an empty datamodel
                            log.LogWarning("Failed to get requested " + FileUtils.DXF_FILE_EXTENSION);

                            return(new AddFileResult(ContractExecutionStatesEnum.ExecutedSuccessfully, "Add file notification partially successful. Can not create DXF - no tiles can be generated")
                            {
                                MinZoomLevel = 0,
                                MaxZoomLevel = 0,
                                FileUid = request.FileUid,
                                FileDescriptor = request.File,
                                UserEmailAddress = request.UserEmailAddress
                            });
                        }
                    }
                    //Calculate the zoom range
                    string generatedName     = FileUtils.GeneratedFileName(request.File.FileName, suffix, FileUtils.DXF_FILE_EXTENSION);
                    var    fullGeneratedName = $"{request.File.Path}/{generatedName}";
                    zoomResult = await tileGenerator.CalculateTileZoomRange(request.File.FilespaceId, fullGeneratedName).ConfigureAwait(false);

                    //Generate DXF tiles
                    await tileGenerator.CreateDxfTiles(request.ProjectId.Value, request.File, suffix, zoomResult, false).ConfigureAwait(false);

                    break;

                case ImportedFileType.SurveyedSurface:
                    log.LogDebug("Storing ground surface file in Raptor");
                    var dd   = new DesignDescriptor(request.FileId, request.File, 0.0);
                    var args = ASNode.GroundSurface.RPC.__Global
                               .Construct_GroundSurface_Args(
                        request.ProjectId.Value,
                        request.FileId,
                        FileUtils.SurveyedSurfaceUtc(request.File.FileName).Value,
                        RaptorConverters.DesignDescriptor(dd)
                        );

                    if (!raptorClient.StoreGroundSurfaceFile(args))
                    {
                        throw new ServiceException(HttpStatusCode.BadRequest,
                                                   new ContractExecutionResult(ContractExecutionStatesEnum.InternalProcessingError,
                                                                               "Failed to store ground surface file"));
                    }

                    break;
                }

                return(new AddFileResult(ContractExecutionStatesEnum.ExecutedSuccessfully, "Add file notification successful")
                {
                    MinZoomLevel = zoomResult.minZoom,
                    MaxZoomLevel = zoomResult.maxZoom,
                    FileUid = request.FileUid,
                    FileDescriptor = request.File,
                    UserEmailAddress = request.UserEmailAddress
                });
            }
            finally
            {
                ContractExecutionStates.ClearDynamic();
            }
        }
コード例 #13
0
        private CompactionProfileResult <CompactionSummaryVolumesProfileCell> ProcessSummaryVolumesWithRaptor(CompactionProfileProductionDataRequest request)
        {
            var alignmentDescriptor = RaptorConverters.DesignDescriptor(request.AlignmentDesign);
            var liftBuildSettings   =
                RaptorConverters.ConvertLift(request.LiftBuildSettings, TFilterLayerMethod.flmNone);
            var baseFilter             = RaptorConverters.ConvertFilter(request.BaseFilter, request.ProjectId, raptorClient);
            var topFilter              = RaptorConverters.ConvertFilter(request.TopFilter, request.ProjectId, raptorClient);
            var volumeDesignDescriptor = RaptorConverters.DesignDescriptor(request.VolumeDesignDescriptor);

            ProfilesHelper.ConvertProfileEndPositions(request.GridPoints, request.WGS84Points, out var startPt, out var endPt,
                                                      out var positionsAreGrid);

            if (request.VolumeCalcType.HasValue && request.VolumeCalcType.Value != VolumeCalcType.None)
            {
                var volCalcType = (TComputeICVolumesType)request.VolumeCalcType.Value;
                if (volCalcType == TComputeICVolumesType.ic_cvtBetween2Filters && !request.ExplicitFilters)
                {
                    RaptorConverters.AdjustFilterToFilter(ref baseFilter, topFilter);
                }

                MemoryStream memoryStream;
                if (request.IsAlignmentDesign)
                {
                    var args
                        = ASNode.RequestSummaryVolumesAlignmentProfile.RPC.__Global
                          .Construct_RequestSummaryVolumesAlignmentProfile_Args
                              (request.ProjectId ?? VelociraptorConstants.NO_PROJECT_ID,
                              ProfilesHelper.PROFILE_TYPE_NOT_REQUIRED,
                              volCalcType,
                              request.StartStation ?? ValidationConstants3D.MIN_STATION,
                              request.EndStation ?? ValidationConstants3D.MIN_STATION,
                              alignmentDescriptor,
                              baseFilter,
                              topFilter,
                              liftBuildSettings,
                              volumeDesignDescriptor);

                    memoryStream = raptorClient.GetSummaryVolumesAlignmentProfile(args);
                }
                else
                {
                    var args
                        = ASNode.RequestSummaryVolumesProfile.RPC.__Global.Construct_RequestSummaryVolumesProfile_Args(
                              request.ProjectId ?? VelociraptorConstants.NO_PROJECT_ID,
                              ProfilesHelper.PROFILE_TYPE_HEIGHT,
                              volCalcType,
                              startPt,
                              endPt,
                              positionsAreGrid,
                              baseFilter,
                              topFilter,
                              liftBuildSettings,
                              volumeDesignDescriptor);
                    memoryStream = raptorClient.GetSummaryVolumesProfile(args);
                }

                return(memoryStream != null?ConvertSummaryVolumesProfileResult(memoryStream, request.VolumeCalcType.Value) : null);
            }

            return(null);
        }
コード例 #14
0
        /// <summary>
        /// Gets the list of points making up the alignment boundary.
        /// If the start & end station and left & right offsets are zero,
        /// then gets the centerline of the alignment.
        /// </summary>
        /// <param name="project">The project.</param>
        /// <param name="alignDescriptor">Design descriptor for the alignment file</param>
        /// <param name="startStation">Start station for the alignment file boundary</param>
        /// <param name="endStation">End station for the alignment file boundary</param>
        /// <param name="leftOffset">Left offset for the alignment file boundary</param>
        /// <param name="rightOffset">Right offset for the alignment file boundary</param>
        /// <param name="customHeaders"></param>
        /// <returns>A list of latitude/longitude points in degrees</returns>
        public async Task <IEnumerable <WGSPoint> > GetAlignmentPoints(ProjectData project, DesignDescriptor alignDescriptor,
                                                                       double startStation = 0, double endStation = 0, double leftOffset = 0, double rightOffset = 0, IHeaderDictionary customHeaders = null)
        {
            var description = TileServiceUtils.DesignDescriptionForLogging(alignDescriptor);

            log.LogDebug($"{nameof(GetAlignmentPoints)}: projectUid={project.ProjectUID}, projectId={project.ShortRaptorProjectId}, alignment={description}");
            List <WGSPoint> alignmentPoints = null;

            if (alignDescriptor != null)
            {
                bool success      = true;
                bool isCenterline = startStation == 0 && endStation == 0 &&
                                    leftOffset == 0 && rightOffset == 0;
                if (isCenterline)
                {
                    try
                    {
                        var stationRange = await GetAlignmentStationRange(project, alignDescriptor, customHeaders);

                        startStation = stationRange.StartStation;
                        endStation   = stationRange.EndStation;
                    }
                    catch
                    {
                        success = false;
                    }
                }

                if (success)
                {
                    log.LogDebug($"{nameof(GetAlignmentPoints)}: projectId={project.ShortRaptorProjectId}, station range={startStation}-{endStation}");
#if RAPTOR
                    if (UseTRexGateway("ENABLE_TREX_GATEWAY_DESIGN_BOUNDARY"))
#endif
                    return(await ProcessDesignFilterBoundaryWithTRex(project.ProjectUID.ToString(), alignDescriptor, customHeaders));

#if RAPTOR
                    var alignmentDescriptor = RaptorConverters.DesignDescriptor(alignDescriptor);

                    success = raptorClient.GetDesignFilterBoundaryAsPolygon(
                        DesignProfiler.ComputeDesignFilterBoundary.RPC.__Global.Construct_CalculateDesignFilterBoundary_Args(
                            project.LegacyProjectId,
                            alignmentDescriptor,
                            startStation, endStation, leftOffset, rightOffset,
                            DesignProfiler.ComputeDesignFilterBoundary.RPC.TDesignFilterBoundaryReturnType.dfbrtList), out TWGS84Point[] pdsPoints);

                    if (success && pdsPoints != null && pdsPoints.Length > 0)
                    {
                        log.LogDebug($"{nameof(GetAlignmentPoints)} success: projectId={project.LegacyProjectId}, number of points={pdsPoints.Length}");

                        alignmentPoints = new List <WGSPoint>();
                        //For centerline, we only need half the points as normally GetDesignFilterBoundaryAsPolygon
                        //has offsets so is returning a polygon.
                        //Since we have no offsets we have the centreline twice.
                        var count = isCenterline ? pdsPoints.Length / 2 : pdsPoints.Length;
                        for (var i = 0; i < count; i++)
                        {
                            alignmentPoints.Add(new WGSPoint(pdsPoints[i].Lat, pdsPoints[i].Lon));
                        }
                    }
#endif
                }
            }
            return(alignmentPoints);
        }