示例#1
0
        /// <summary>
        /// Computes a geometric profile across the design given a series of vertices describing the path to be profiled.
        /// </summary>
        public async Task <(List <XYZS> profile, DesignProfilerRequestResult errorCode)> ComputeProfile(Guid projectUid, WGS84Point startPoint, WGS84Point endPoint, double cellSize, double offset, bool arePositionsGrid)
        {
            // Query the DesignProfiler service to get the patch of elevations calculated
            try
            {
                var profileRequest = new DesignProfileRequest();
                var arg            = new CalculateDesignProfileArgument
                {
                    ProjectID        = projectUid,
                    CellSize         = cellSize,
                    StartPoint       = startPoint,
                    EndPoint         = endPoint,
                    PositionsAreGrid = arePositionsGrid,
                    ReferenceDesign  =
                    {
                        DesignID = DesignDescriptor.DesignID,
                        Offset   = offset
                    }
                };

                var profileResult = await profileRequest.ExecuteAsync(arg);

                return(profileResult.Profile, profileResult.RequestResult);
            }
            catch
            {
                return(null, DesignProfilerRequestResult.UnknownError);
            }
        }
示例#2
0
        /// <summary>
        /// Performs execution business logic for this executor
        /// </summary>
        public List <XYZS> Execute(CalculateDesignProfileArgument args, out DesignProfilerRequestResult calcResult)
        {
            // Perform the design profile calculation
            var result = Calc(args, out calcResult);

            if (result == null)
            {
                Log.LogInformation($"Unable to calculate a design profiler result for {args}");
                result = new List <XYZS>();
            }

            return(result);
        }
示例#3
0
        public void Test_CalculateDesignElevationPatchArgument()
        {
            var argument = new CalculateDesignProfileArgument()
            {
                ProjectID       = Guid.NewGuid(),
                ReferenceDesign = new DesignOffset(),
                CellSize        = 1.0,
                StartPoint      = new WGS84Point(0, 0),
                EndPoint        = new WGS84Point(100, 100)
            };

            SimpleBinarizableInstanceTester.TestClass(argument, "Custom CalculateDesignProfileArgument not same after round trip serialisation");
        }
示例#4
0
        /// <summary>
        /// Performs the donkey work of the profile calculation
        /// </summary>
        private List <XYZS> Calc(CalculateDesignProfileArgument arg, out DesignProfilerRequestResult calcResult)
        {
            calcResult = DesignProfilerRequestResult.UnknownError;

            var siteModel = DIContext.Obtain <ISiteModels>().GetSiteModel(arg.ProjectID);

            var Design = Designs.Lock(arg.ReferenceDesign.DesignID, siteModel, arg.CellSize, out DesignLoadResult LockResult);

            var arg2 = new CalculateDesignProfileArgument_ClusterCompute
            {
                ProjectID       = arg.ProjectID,
                CellSize        = arg.CellSize,
                ReferenceDesign = arg.ReferenceDesign,
            };

            if (arg.PositionsAreGrid)
            {
                arg2.ProfilePathNEE = new[] { arg.StartPoint, arg.EndPoint }.Select(x => new XYZ(x.Lon, x.Lat)).ToArray();
            }
            else
            {
                if (siteModel != null)
                {
                    arg2.ProfilePathNEE = DIContext.Obtain <ICoreXWrapper>().WGS84ToCalibration(
                        siteModel.CSIB(),
                        new[] { arg.StartPoint, arg.EndPoint }
                        .ToCoreX_WGS84Point(),
                        CoreX.Types.InputAs.Radians)
                                          .ToTRex_XYZ();
                }
            }



            if (Design == null)
            {
                Log.LogWarning($"Failed to read file for design {arg.ReferenceDesign.DesignID} lock result was {LockResult}");
                calcResult = DesignProfilerRequestResult.FailedToLoadDesignFile;
                return(null);
            }

            try
            {
                var result = Design.ComputeProfile(arg2.ProfilePathNEE, arg.CellSize);
                //Apply any offset to the profile
                if (arg.ReferenceDesign.Offset != 0)
                {
                    for (var i = 0; i < result.Count; i++)
                    {
                        result[i] = new XYZS(result[i].X, result[i].Y, result[i].Z + arg.ReferenceDesign.Offset, result[i].Station, result[i].TriIndex);
                    }
                }
                calcResult = DesignProfilerRequestResult.OK;

                return(result);
            }
            finally
            {
                Designs.UnLock(arg.ReferenceDesign.DesignID, Design);
            }
        }