/// <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); } }
/// <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); }
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"); }
/// <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); } }