private (ISiteModel siteModelId, Guid alignmentId) ConstructSimpleArcNFFFileModel() { var siteModel = DITAGFileAndSubGridRequestsWithIgniteFixture.NewEmptyModel(); var arc = new NFFLineworkArcEntity(0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, true, false) { StartStation = 0 }; var alignment = new NFFGuidableAlignmentEntity(); alignment.Entities.Add(arc); var alignmentGuid = Guid.NewGuid(); var testDesign = new SVLAlignmentDesign(alignment); siteModel.Alignments.AddAlignmentDetails(alignmentGuid, new DesignDescriptor(alignmentGuid, "", ""), BoundingWorldExtent3D.Full()); var mockDesignFiles = new Mock <IDesignFiles>(); mockDesignFiles.Setup(x => x.Lock(It.IsAny <Guid>(), It.IsAny <ISiteModelBase>(), It.IsAny <double>(), out It.Ref <DesignLoadResult> .IsAny)) .Returns(new GobbleDesignFilesLockReturns((Guid designUid, ISiteModelBase siteModel, double cellSize, out DesignLoadResult result) => { result = DesignLoadResult.Success; return(testDesign); })); DIBuilder. Continue() .Add(x => x.AddSingleton(mockDesignFiles.Object)) .Complete(); return(siteModel, alignmentGuid); }
private void AddTheAlignmentToSiteModel(Guid siteModelUid, Guid designUid, string localPath, string localFileName) { // Invoke the service to add the alignment try { // Load the file and extract its extents? var alignmentDesign = new SVLAlignmentDesign(); alignmentDesign.LoadFromFile(Path.Combine(new[] { localPath, localFileName })); var extents = new BoundingWorldExtent3D(); alignmentDesign.GetExtents(out extents.MinX, out extents.MinY, out extents.MaxX, out extents.MaxY); alignmentDesign.GetHeightRange(out extents.MinZ, out extents.MaxZ); // Create the new design for the site model var design = DIContext.Obtain <IAlignmentManager>() .Add(siteModelUid, new VSS.TRex.Designs.Models.DesignDescriptor(designUid, string.Empty, localFileName), extents); } catch (Exception e) { throw new TRexException($"Exception writing alignment to siteModel:", e); } }
public IDesignBase NewInstance(Guid designUid, string fileName, double cellSize, Guid siteModelUid) { IDesignBase result; if (string.Compare(Path.GetExtension(fileName), ".ttm", StringComparison.InvariantCultureIgnoreCase) == 0) { result = new TTMDesign(cellSize); } else if (string.Compare(Path.GetExtension(fileName), ".svl", StringComparison.InvariantCultureIgnoreCase) == 0) { result = new SVLAlignmentDesign(); } else { throw new TRexException($"Unknown design file type in design class factory for design {fileName}"); } result.DesignUid = designUid; result.FileName = fileName; result.ProjectUid = siteModelUid; return(result); }
/// <summary> /// Add a design or surveyed surface or alignment file to TRex /// </summary> protected async Task AddDesign(DesignRequest request, string executorName) { // load core file from s3 to local var localPath = FilePathHelper.GetTempFolderForProject(request.ProjectUid); var localPathAndFileName = Path.Combine(new[] { localPath, request.FileName }); DesignBase design; if (request.FileType == ImportedFileType.Alignment) { design = new SVLAlignmentDesign(); } else { design = new TTMDesign(SubGridTreeConsts.DefaultCellSize); } var designLoadResult = design.LoadFromStorage(request.ProjectUid, request.FileName, localPath); if (designLoadResult != DesignLoadResult.Success) { log.LogError($"#Out# {executorName}. Addition of design failed :{request.FileName}, Project:{request.ProjectUid}, DesignUid:{request.DesignUid}, designLoadResult: {designLoadResult}"); throw CreateServiceException <TExecutor> (HttpStatusCode.InternalServerError, ContractExecutionStatesEnum.InternalProcessingError, RequestErrorStatus.DesignImportUnableToRetrieveFromS3, designLoadResult.ToString()); } if (request.FileType != ImportedFileType.Alignment) { // This generates the 2 index files designLoadResult = design.LoadFromFile(localPathAndFileName); if (designLoadResult != DesignLoadResult.Success) { log.LogError($"#Out# {executorName}. Addition of design failed :{request.FileName}, Project:{request.ProjectUid}, DesignUid:{request.DesignUid}, designLoadResult: {designLoadResult}"); throw CreateServiceException <TExecutor> (HttpStatusCode.InternalServerError, ContractExecutionStatesEnum.InternalProcessingError, RequestErrorStatus.DesignImportUnableToCreateDesign, designLoadResult.ToString()); } } var extents = new BoundingWorldExtent3D(); design.GetExtents(out extents.MinX, out extents.MinY, out extents.MaxX, out extents.MaxY); design.GetHeightRange(out extents.MinZ, out extents.MaxZ); if (request.FileType == ImportedFileType.DesignSurface) { // Create the new designSurface in our site var tRexRequest = new AddTTMDesignRequest(); var designSurfaceUid = await tRexRequest.ExecuteAsync(new AddTTMDesignArgument { ProjectID = request.ProjectUid, DesignDescriptor = new Designs.Models.DesignDescriptor(request.DesignUid, localPathAndFileName, request.FileName), Extents = extents, ExistenceMap = design.SubGridOverlayIndex() }); } if (request.FileType == ImportedFileType.SurveyedSurface) { // Create the new SurveyedSurface in our site model var tRexRequest = new AddSurveyedSurfaceRequest(); var surveyedSurfaceUid = await tRexRequest.ExecuteAsync(new AddSurveyedSurfaceArgument { ProjectID = request.ProjectUid, DesignDescriptor = new Designs.Models.DesignDescriptor(request.DesignUid, localPathAndFileName, request.FileName), AsAtDate = request.SurveyedUtc ?? TRex.Common.Consts.MIN_DATETIME_AS_UTC, // validation will have ensured this exists Extents = extents, ExistenceMap = design.SubGridOverlayIndex() }); } if (request.FileType == ImportedFileType.Alignment) { // Create the new alignment in our site model var tRexRequest = new AddAlignmentRequest(); var alignmentUid = await tRexRequest.ExecuteAsync(new AddAlignmentArgument { ProjectID = request.ProjectUid, DesignDescriptor = new Designs.Models.DesignDescriptor(request.DesignUid, localPathAndFileName, request.FileName), Extents = extents }); } if (request.FileType != ImportedFileType.Alignment) { // TTM.LoadFromFile() will have created these 3 files. We need to store them on S3 to reload cache when required var s3FileTransfer = new S3FileTransfer(TransferProxyType.DesignImport); s3FileTransfer.WriteFile(localPath, request.ProjectUid, SubGridIndexFileName(request.FileName)); s3FileTransfer.WriteFile(localPath, request.ProjectUid, SpatialIndexFileName(request.FileName)); s3FileTransfer.WriteFile(localPath, request.ProjectUid, BoundaryFileName(request.FileName)); } }
public async Task Geometry_SimpleLine() { AddDesignProfilerGridRouting(); var siteModel = DITAGFileAndSubGridRequestsWithIgniteFixture.NewEmptyModel(); var polyline = new NFFLineworkPolyLineEntity(); polyline.Vertices.Add(new NFFLineworkPolyLineVertexEntity(polyline, 1, 2, 3, 0)); polyline.Vertices.Add(new NFFLineworkPolyLineVertexEntity(polyline, 2, 2, 4, 1)); var alignment = new NFFGuidableAlignmentEntity(); alignment.Entities.Add(polyline); var alignmentGuid = Guid.NewGuid(); var testDesign = new SVLAlignmentDesign(alignment); siteModel.Alignments.AddAlignmentDetails(alignmentGuid, new DesignDescriptor(alignmentGuid, "", ""), BoundingWorldExtent3D.Full()); var mockDesignFiles = new Mock <IDesignFiles>(); mockDesignFiles.Setup(x => x.Lock(It.IsAny <Guid>(), It.IsAny <ISiteModelBase>(), It.IsAny <double>(), out It.Ref <DesignLoadResult> .IsAny)) .Returns(new GobbleDesignFilesLockReturns((Guid designUid, ISiteModelBase siteModel, double cellSize, out DesignLoadResult result) => { result = DesignLoadResult.Success; return(testDesign); })); DIBuilder. Continue() .Add(x => x.AddSingleton(mockDesignFiles.Object)) .Complete(); var request = new AlignmentDesignGeometryRequest(); var response = await request.ExecuteAsync(new AlignmentDesignGeometryArgument { ProjectID = siteModel.ID, AlignmentDesignID = alignmentGuid, ConvertArcsToPolyLines = false, ArcChordTolerance = 0.0 }); response.RequestResult.Should().Be(DesignProfilerRequestResult.OK); response.Vertices.Should().NotBeNull(); response.Vertices.Length.Should().Be(1); response.Vertices[0].Length.Should().Be(2); response.Vertices[0][0].Length.Should().Be(3); response.Vertices[0][1].Length.Should().Be(3); response.Vertices[0][0].Should().BeEquivalentTo(new double[] { 1, 2, 0 }); response.Vertices[0][1].Should().BeEquivalentTo(new double[] { 2, 2, 1 }); response.Arcs.Should().BeNullOrEmpty(); response.Labels.Length.Should().Be(2); response.Labels[0].Station.Should().BeApproximately(0.0, 0.001); response.Labels[0].X.Should().BeApproximately(1.0, 0.001); response.Labels[0].Y.Should().BeApproximately(2.0, 0.001); response.Labels[0].Rotation.Should().BeApproximately(Math.PI / 2, 0.001); response.Labels[1].Station.Should().BeApproximately(1.0, 0.001); response.Labels[1].X.Should().BeApproximately(2.0, 0.001); response.Labels[1].Y.Should().BeApproximately(2.0, 0.001); response.Labels[1].Rotation.Should().BeApproximately(Math.PI / 2, 0.001); }