public void ValidateMapToCreate() { var boundaryString = "POLYGON((172.6 -43.5,172.6 -43.5003,172.603 -43.5003,172.603 -43.5,172.6 -43.5))"; var csContent = "MDBUTVNDIFYxMC03MCAgICAgICAwICAgMDkvMDEvMjAyMCAxNToxOTExMzExMQ0KMTBUTVVudGl0bGVkIEpvYiAgICAxMjIyMTINCjc4VE0xMQ0KRDVUTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KRDhUTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQo2NFRNMzM2LjIwNjU1NTM3MTAwMDAtMTE1LjAyNjI2NzgxODAwMC4wMDAwMDAwMDAwMDAwMDExMTkuNzQ4NDM3ODk2OTAyMTkzLjk3OTQ3Njc1OTAwMC4wMDAwMDAwMDAwMDAwMDEuMDAwMDg2NzIzMDAwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KNjVUTTYzNzgxMzcuMDAwMDAxMDAyOTguMjU3MjIyOTMyODkwDQo0OVRNMzYzNzgxMzcuMDAwMDAwMDAyOTguMjU3MjIzNTYzMDAwMC4wMDAwMDAwMDAwMDAwMDAuMDAwMDAwMDAwMDAwMDAwLjAwMDAwMDAwMDAwMDAwMC4wMDAwMDAwMDAwMDAwMDAuMDAwMDAwMDAwMDAwMDAwLjAwMDAwMDAwMDAwMDAwMC4wMDAwMDAwMDAwMDAwMA0KNTBUTTExOTguNzk3MzM5MDkwNzAyNDkxLjQ4Mjg5MTU0MTgwMC4wMDI2NjA5MDkzMjE4MDAuMDAwMTM3MTYwMjc0MzAwLjAwMTkwNzk5NzAwMDAwMS4wMDAwMTMwMTMwMDAwMA0KQzhUTTRTQ1M5MDAgTG9jYWxpemF0aW9uICAgICAgICAgICAgIFNDUzkwMCBSZWNvcmQgICAgICAgICAgICAgICAgICAgRGF0dW0gZnJvbSBEYXRhIENvbGxlY3RvciAgICAgICANCg=="; var csContentBase64 = "TURCVVRWTkRJRll4TUMwM01DQWdJQ0FnSUNBd0lDQWdNRGt2TURFdk1qQXlNQ0F4TlRveE9URXhNekV4TVEwS01UQlVUVlZ1ZEdsMGJHVmtJRXB2WWlBZ0lDQXhNakl5TVRJTkNqYzRWRTB4TVEwS1JEVlVUU0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lBMEtSRGhVVFNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdEUW8yTkZSTk16TTJMakl3TmpVMU5UTTNNVEF3TURBdE1URTFMakF5TmpJMk56Z3hPREF3TUM0d01EQXdNREF3TURBd01EQXdNREV4TVRrdU56UTRORE0zT0RrMk9UQXlNVGt6TGprM09UUTNOamMxT1RBd01DNHdNREF3TURBd01EQXdNREF3TURFdU1EQXdNRGcyTnpJek1EQXdNREFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lBMEtOalZVVFRZek56Z3hNemN1TURBd01EQXhNREF5T1RndU1qVTNNakl5T1RNeU9Ea3dEUW8wT1ZSTk16WXpOemd4TXpjdU1EQXdNREF3TURBeU9UZ3VNalUzTWpJek5UWXpNREF3TUM0d01EQXdNREF3TURBd01EQXdNREF1TURBd01EQXdNREF3TURBd01EQXdMakF3TURBd01EQXdNREF3TURBd01DNHdNREF3TURBd01EQXdNREF3TURBdU1EQXdNREF3TURBd01EQXdNREF3TGpBd01EQXdNREF3TURBd01EQXdNQzR3TURBd01EQXdNREF3TURBd01BMEtOVEJVVFRFeE9UZ3VOemszTXpNNU1Ea3dOekF5TkRreExqUTRNamc1TVRVME1UZ3dNQzR3TURJMk5qQTVNRGt6TWpFNE1EQXVNREF3TVRNM01UWXdNamMwTXpBd0xqQXdNVGt3TnprNU56QXdNREF3TVM0d01EQXdNVE13TVRNd01EQXdNQTBLUXpoVVRUUlRRMU01TURBZ1RHOWpZV3hwZW1GMGFXOXVJQ0FnSUNBZ0lDQWdJQ0FnSUZORFV6a3dNQ0JTWldOdmNtUWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdSR0YwZFcwZ1puSnZiU0JFWVhSaElFTnZiR3hsWTNSdmNpQWdJQ0FnSUNBTkNnPT0="; var projectValidation = new ProjectValidation { CustomerUid = new Guid("372854b8-64f8-4fd0-885f-d663503ffbca"), ProjectType = CwsProjectType.AcceptsTagFiles, ProjectName = "Beside Dimensions JeanieTest1", ProjectBoundaryWKT = boundaryString, UpdateType = ProjectUpdateType.Created, CoordinateSystemFileName = "myOne.dc", CoordinateSystemFileContent = System.Text.Encoding.ASCII.GetBytes(csContent) }; var createProjectRequestModel = AutoMapperUtility.Automapper.Map <CreateProjectRequestModel>(projectValidation); Assert.Equal(TRNHelper.MakeTRN(projectValidation.CustomerUid, TRNHelper.TRN_ACCOUNT), createProjectRequestModel.TRN); Assert.Equal(projectValidation.CustomerUid.ToString(), createProjectRequestModel.AccountId); Assert.Equal(projectValidation.ProjectName, createProjectRequestModel.ProjectName); Assert.Equal(projectValidation.ProjectType, createProjectRequestModel.ProjectType); Assert.Null(createProjectRequestModel.Timezone); Assert.Equal(GeometryConversion.MapProjectBoundary(projectValidation.ProjectBoundaryWKT).type, createProjectRequestModel.Boundary.type); Assert.Equal(GeometryConversion.MapProjectBoundary(projectValidation.ProjectBoundaryWKT).coordinates.Count, createProjectRequestModel.Boundary.coordinates.Count); Assert.Equal(GeometryConversion.MapProjectBoundary(projectValidation.ProjectBoundaryWKT).coordinates.ToArray(), createProjectRequestModel.Boundary.coordinates.ToArray()); Assert.Equal(projectValidation.CoordinateSystemFileName, createProjectRequestModel.CalibrationFileName); Assert.Equal(csContentBase64, createProjectRequestModel.CalibrationFileBase64Content); Assert.Equal(csContent, System.Text.Encoding.ASCII.GetString(Convert.FromBase64String(createProjectRequestModel.CalibrationFileBase64Content))); }
public void PolygonWKTNewBoundaryNotClosed() { var boundary = GeometryWKT.Substring(0, GeometryWKT.LastIndexOf(',')) + "))"; var wkt = GeometryConversion.GetPolygonWKT(boundary); Assert.Equal(GeometryWKT, wkt); }
public async Task <int> StoreEvent(IGeofenceEvent evt) { if (evt == null) { Log.LogWarning("Unsupported geofence event type"); return(0); } // since this is a masterDataService (not landfill specific but will be used for compaction and potentially other apps), // lets just store all geofence types var geofenceType = GetGeofenceType(evt); var geofence = new Geofence(); var eventType = "Unknown"; Log.LogDebug($"Event type is {evt.GetType()}"); if (evt is CreateGeofenceEvent) { var geofenceEvent = (CreateGeofenceEvent)evt; geofence.GeofenceUID = geofenceEvent.GeofenceUID.ToString(); geofence.Name = geofenceEvent.GeofenceName; geofence.GeofenceType = geofenceType; geofence.GeometryWKT = GeometryConversion.GetPolygonWKT(geofenceEvent.GeometryWKT); geofence.FillColor = geofenceEvent.FillColor; geofence.IsTransparent = geofenceEvent.IsTransparent; geofence.IsDeleted = false; geofence.Description = geofenceEvent.Description; geofence.CustomerUID = geofenceEvent.CustomerUID.ToString(); geofence.UserUID = geofenceEvent.UserUID.ToString(); geofence.LastActionedUTC = geofenceEvent.ActionUTC; geofence.AreaSqMeters = geofenceEvent.AreaSqMeters; eventType = "CreateGeofenceEvent"; } else if (evt is UpdateGeofenceEvent) { var geofenceEvent = (UpdateGeofenceEvent)evt; geofence.GeofenceUID = geofenceEvent.GeofenceUID.ToString(); geofence.Name = geofenceEvent.GeofenceName; geofence.GeofenceType = geofenceType; geofence.GeometryWKT = GeometryConversion.GetPolygonWKT(geofenceEvent.GeometryWKT); geofence.FillColor = geofenceEvent.FillColor; geofence.IsTransparent = geofenceEvent.IsTransparent; geofence.Description = geofenceEvent.Description; geofence.UserUID = geofenceEvent.UserUID.ToString(); geofence.AreaSqMeters = geofenceEvent.AreaSqMeters; geofence.LastActionedUTC = geofenceEvent.ActionUTC; eventType = "UpdateGeofenceEvent"; } else if (evt is DeleteGeofenceEvent) { var geofenceEvent = (DeleteGeofenceEvent)evt; geofence.GeofenceUID = geofenceEvent.GeofenceUID.ToString(); geofence.LastActionedUTC = geofenceEvent.ActionUTC; eventType = "DeleteGeofenceEvent"; } return(await UpsertGeofenceDetail(geofence, eventType)); }
public JObject ConvertToDTO(Autodesk.Revit.DB.Wall source) { Autodesk.Revit.DB.Curve curve = (source.Location as LocationCurve).Curve; Autodesk.Revit.DB.Line line = curve as Autodesk.Revit.DB.Line; if (line == null) { return(null); } BoundingBoxXYZ bb = source.get_BoundingBox(null); Autodesk.Revit.DB.XYZ origin = line.Tessellate().First(); Autodesk.Revit.DB.XYZ endpoint = line.Tessellate().Last(); /// origin + line.Direction * line.Length; List <LMAStudio.StreamVR.Common.Models.Face> wallFaces = new List <LMAStudio.StreamVR.Common.Models.Face>(); Autodesk.Revit.DB.GeometryElement defaultGeometry = source.get_Geometry(new Options()); if (defaultGeometry != null) { Solid solidGeometry = defaultGeometry.FirstOrDefault() as Solid; if (solidGeometry != null) { wallFaces = GeometryConversion.ConvertToDTO(source, solidGeometry); } } LMAStudio.StreamVR.Common.Models.Wall dest = new LMAStudio.StreamVR.Common.Models.Wall { Id = source.Id.ToString(), Name = source.Name, Depth = source.Width, Orientation = new LMAStudio.StreamVR.Common.Models.XYZ { X = source.Orientation.X, Y = source.Orientation.Y, Z = source.Orientation.Z, }, Endpoint0 = new LMAStudio.StreamVR.Common.Models.XYZ { X = origin.X, Y = origin.Y, Z = bb.Min.Z, }, Endpoint1 = new LMAStudio.StreamVR.Common.Models.XYZ { X = endpoint.X, Y = endpoint.Y, Z = bb.Max.Z, }, Faces = wallFaces }; return(JObject.FromObject(dest)); }
public static async Task <CreateProjectResponseModel> CreateCustomerProject(string customerUid, string name = "woteva", string boundary = "POLYGON((172.595831670724 -43.5427038560109,172.594630041089 -43.5438859356773,172.59329966542 -43.542486101965, 172.595831670724 -43.5427038560109))") { var createProjectRequestModel = new CreateProjectRequestModel { AccountId = customerUid, ProjectName = name, Boundary = GeometryConversion.MapProjectBoundary(boundary) }; var response = await CwsProjectClient.CreateProject(createProjectRequestModel); return(response); }
public void MapCWSFormatToWkt() { var cwsCoordinates = new List <List <double[]> > { new List <double[]> { new[] { 150.3, 1.2 }, new[] { 150.4, 1.2 }, new[] { 150.4, 1.3 }, new[] { 150.4, 1.4 }, new[] { 150.3, 1.2 } } }; var ProjectBoundary = new ProjectBoundary() { type = "Polygon", coordinates = cwsCoordinates }; var expectedWktPolygon = "POLYGON((150.3 1.2,150.4 1.2,150.4 1.3,150.4 1.4,150.3 1.2))"; var wktBoundary = GeometryConversion.ProjectBoundaryToWKT(ProjectBoundary); Assert.Equal(expectedWktPolygon, wktBoundary); }
public void MapWKTToCWSFormat() { var cwsCoordinates = new List <List <double[]> > { new List <double[]> { new[] { 150.3, 1.2 }, new[] { 150.4, 1.2 }, new[] { 150.4, 1.3 }, new[] { 150.4, 1.4 }, new[] { 150.3, 1.2 } } }; var expectedProjectBoundary = new ProjectBoundary() { type = "Polygon", coordinates = cwsCoordinates }; var wktPolygon = "POLYGON((150.3 1.2,150.4 1.2,150.4 1.3,150.4 1.4,150.3 1.2))"; var cwsBoundary = GeometryConversion.MapProjectBoundary(wktPolygon); Assert.Equal(expectedProjectBoundary.type, cwsBoundary.type); Assert.Equal(expectedProjectBoundary.coordinates, cwsBoundary.coordinates); }
private Common.Models.Face UpdateFace(Document doc, Common.Models.Face face) { _log("GETTING ELEMENT"); using (Transaction tx = new Transaction(doc)) { tx.Start("Paint Element"); ElementId materialId = new ElementId(Int32.Parse(face.MaterialId)); ElementId parentId = new ElementId(Int32.Parse(face.ElementId)); Element parentElement = doc.GetElement(parentId); GeometryElement defaultGeometry = parentElement.get_Geometry(new Options()); Solid solidGeometry = defaultGeometry.FirstOrDefault() as Solid; IEnumerable <PlanarFace> faces = solidGeometry.Faces.Cast <PlanarFace>(); if (solidGeometry == null) { throw new Exception($"Geometry does not exist for {face.ElementId}"); } PlanarFace dbValue = faces.ElementAt(face.FaceIndex); if (dbValue == null) { throw new Exception($"Could not find face at index {face.FaceIndex}"); } doc.Paint(parentId, dbValue, materialId); _log($"MAPPED MATERIAL"); face = GeometryConversion.ConvertToDTO(parentElement, solidGeometry).ElementAt(face.FaceIndex); tx.Commit(); } return(face); }
/// <summary> /// Gets the extruded subspace of points of a line on both sides and both ends. /// </summary> /// <param name="originalLineSegments">List of line points with segments connecting to the next point in the line.</param> /// <param name="extrusionAmount">The extrusion amount.</param> public static List <ExtrudedPointUV> GetExtrudedSubspaceAllSides(List <LinePointUV> originalLinePoints, float extrusionAmount) { var originalLineSegments = GeometryConversion.ConvertLinePointsToForwardLineSegments(originalLinePoints); var reversedLineSegments = GetReversedSegmentsAndReversedParameters(originalLineSegments, originalLinePoints[originalLinePoints.Count - 1]); var extrudedLineCapForwardParameterShift = 0f; var extrudedLineCapForward = GetExtrudedLineCap(originalLineSegments, extrusionAmount, extrudedLineCapForwardParameterShift, false); const float localParameterShift = 0.1f; var lineForwardParameterShift = extrudedLineCapForward[extrudedLineCapForward.Count - 1].Parameter + localParameterShift; var extrudedSubspaceForward = GetExtrudedSubspaceAndUvFromSegmentIntersections(originalLineSegments, originalLinePoints[originalLinePoints.Count - 1], extrusionAmount, lineForwardParameterShift, false); var extrudedLineCapBackwardParameterShift = extrudedSubspaceForward[extrudedSubspaceForward.Count - 1].Parameter + localParameterShift; var extrudedLineCapBackward = GetExtrudedLineCap(reversedLineSegments, extrusionAmount, extrudedLineCapBackwardParameterShift, true); var lineBackwardParameterShift = extrudedLineCapBackward[extrudedLineCapBackward.Count - 1].Parameter + originalLinePoints[0].Parameter + localParameterShift; var reversedLastPoint = originalLinePoints[0]; reversedLastPoint.Parameter = originalLinePoints[originalLinePoints.Count - 1].Parameter; var extrudedSubspaceBackward = GetExtrudedSubspaceAndUvFromSegmentIntersections(reversedLineSegments, reversedLastPoint, extrusionAmount, lineBackwardParameterShift, true); var extrudedSubspaceTotal = new List <ExtrudedPointUV>(); extrudedSubspaceTotal.AddRange(extrudedLineCapForward); extrudedSubspaceTotal.AddRange(extrudedSubspaceForward); extrudedSubspaceTotal.AddRange(extrudedLineCapBackward); extrudedSubspaceTotal.AddRange(extrudedSubspaceBackward); if (_repeatAllSidesStartPointAtEnd) { var endPointWithShiftedParameter = extrudedLineCapForward[0]; endPointWithShiftedParameter.Parameter = extrudedSubspaceBackward[extrudedSubspaceBackward.Count - 1].Parameter + localParameterShift; extrudedSubspaceTotal.Add(endPointWithShiftedParameter); } return(extrudedSubspaceTotal); }
public static void ConfigureAutomapper() { _automapperConfiguration = new MapperConfiguration( //define mappings <source type, destination type> cfg => { cfg.AllowNullCollections = true; // so that byte[] can be null cfg.CreateMap<ProjectDatabaseModel, ProjectV6Descriptor>() .ForMember(dest => dest.ProjectGeofenceWKT, opt => opt.MapFrom(src => src.Boundary)) .ForMember(dest => dest.IanaTimeZone, opt => opt.MapFrom(src => src.ProjectTimeZoneIana)) .ForMember(dest => dest.ShortRaptorProjectId, opt => opt.MapFrom(src => src.ShortRaptorProjectId)) .ForMember(dest => dest.IsArchived, opt => opt.MapFrom(src => src.IsArchived)); cfg.CreateMap<ImportedFile, ImportedFileDescriptor>() .ForMember(dest => dest.ImportedUtc, opt => opt.MapFrom(src => src.LastActionedUtc)) .ForMember(dest => dest.LegacyFileId, opt => opt.MapFrom(src => src.ImportedFileId)) .ForMember(dest => dest.ImportedFileHistory, opt => opt.MapFrom(src => src.ImportedFileHistory.ImportedFileHistoryItems)) .ForMember(dest => dest.IsActivated, opt => opt.MapFrom(x => true)); cfg.CreateMap<Productivity3D.Project.Abstractions.Models.DatabaseModels.ImportedFileHistoryItem, MasterData.Project.WebAPI.Common.Models.ImportedFileHistoryItem>() .ForMember(dest => dest.FileCreatedUtc, opt => opt.MapFrom(src => src.FileCreatedUtc)) .ForMember(dest => dest.FileUpdatedUtc, opt => opt.MapFrom(src => src.FileUpdatedUtc)); cfg.CreateMap<ImportedFile, UpdateImportedFileEvent>() .ForMember(dest => dest.ImportedFileUID, opt => opt.MapFrom(src => Guid.Parse(src.ImportedFileUid))) .ForMember(dest => dest.ProjectUID, opt => opt.MapFrom(src => Guid.Parse(src.ProjectUid))) .ForMember(dest => dest.ActionUTC, opt => opt.MapFrom(src => src.LastActionedUtc)); // for v5 TBC apis cfg.CreateMap<ProjectDatabaseModel, ProjectDataTBCSingleResult>() .ForMember(dest => dest.IsArchived, opt => opt.MapFrom(src => src.IsArchived)) .ForMember(dest => dest.Name, opt => opt.MapFrom(src => src.Name)) .ForMember(dest => dest.ProjectTimeZone, opt => opt.MapFrom(src => src.ProjectTimeZone)) .ForMember(dest => dest.ProjectType, opt => opt.MapFrom(x => 0)) // old standard type .ForMember(dest => dest.ProjectTypeName, opt => opt.MapFrom(x => "Standard")) // old standard type .ForMember(dest => dest.StartDate, opt => opt.MapFrom(x => DateTime.MinValue)) // Obsolete .ForMember(dest => dest.EndDate, opt => opt.MapFrom(x => DateTime.MaxValue)) // Obsolete .ForMember(dest => dest.ProjectUid, opt => opt.MapFrom(src => src.ProjectUID)) .ForMember(dest => dest.ProjectGeofenceWKT, opt => opt.MapFrom(src => src.Boundary)) .ForMember(dest => dest.LegacyProjectId, opt => opt.MapFrom(src => src.ShortRaptorProjectId)) .ForMember(dest => dest.CustomerUid, opt => opt.MapFrom(src => src.CustomerUID)) .ForMember(dest => dest.LegacyCustomerId, opt => opt.MapFrom(src => "0")) // Obsolete .ForMember(dest => dest.Code, opt => opt.Ignore()) .ForMember(dest => dest.Message, opt => opt.Ignore()); cfg.CreateMap<TBCPoint, VSS.MasterData.Models.Models.Point>() .ForMember(dest => dest.y, opt => opt.MapFrom((src => src.Latitude))) .ForMember(dest => dest.x, opt => opt.MapFrom((src => src.Longitude))); // ProjectGeofenceAssociations cfg.CreateMap<GeofenceWithAssociation, GeofenceV4Descriptor>(); // cws clients cfg.CreateMap<ProjectValidation, CreateProjectRequestModel>() .ForMember(dest => dest.TRN, opt => opt.Ignore()) .ForMember(dest => dest.AccountId, opt => opt.MapFrom(src => src.CustomerUid)) .ForMember(dest => dest.ProjectName, opt => opt.MapFrom(src => src.ProjectName)) .ForMember(dest => dest.Timezone, opt => opt.Ignore()) .ForMember(dest => dest.Boundary, opt => opt.MapFrom(src => GeometryConversion.MapProjectBoundary(src.ProjectBoundaryWKT))) .ForMember(dest => dest.ProjectType, opt => opt.MapFrom(src => src.ProjectType)) .ForMember(dest => dest.CalibrationFileName, opt => opt.MapFrom(src => src.CoordinateSystemFileName)) .ForMember(dest => dest.CalibrationFileBase64Content, opt => opt.MapFrom(src => Convert.ToBase64String(src.CoordinateSystemFileContent))) ; cfg.CreateMap<AccountResponseModel, CustomerData>() .ForMember(dest => dest.uid, opt => opt.MapFrom(src => src.Id)) .ForMember(dest => dest.name, opt => opt.MapFrom(src => src.Name)) .ForMember(dest => dest.type, opt => opt.MapFrom(c => CustomerType.Customer.ToString())) ; cfg.CreateMap<AccountResponseModel, AccountHierarchyCustomer>() .ForMember(dest => dest.CustomerUid, opt => opt.MapFrom(src => src.Id)) .ForMember(dest => dest.DisplayName, opt => opt.MapFrom(src => src.Name)) .ForMember(dest => dest.Name, opt => opt.MapFrom(src => src.Name)) .ForMember(dest => dest.CustomerCode, opt => opt.MapFrom(src => src.Name)) .ForMember(dest => dest.CustomerType, opt => opt.MapFrom(src => "Customer")) .ForMember(dest => dest.Children, opt => opt.Ignore()); cfg.CreateMap<ProjectResponseModel, ProjectData>() .ForMember(dest => dest.ProjectUID, opt => opt.MapFrom(src => src.ProjectId)) .ForMember(dest => dest.Name, opt => opt.MapFrom(src => src.ProjectName)) .ForMember(dest => dest.CustomerUID, opt => opt.MapFrom(src => src.AccountId)) .ForMember(dest => dest.ProjectGeofenceWKT, opt => opt.MapFrom(src => GeometryConversion.ProjectBoundaryToWKT(src.Boundary))) .ForMember(dest => dest.IanaTimeZone, opt => opt.MapFrom(src => src.Timezone)) .ForMember(dest => dest.CoordinateSystemFileName, opt => opt.Ignore()) .ForMember(dest => dest.CoordinateSystemLastActionedUTC, opt => opt.Ignore()) .ForMember(dest => dest.ProjectTimeZone, opt => opt.Ignore()) .ForMember(dest => dest.ShortRaptorProjectId, opt => opt.Ignore()) .ForMember(dest => dest.ProjectType, opt => opt.MapFrom(src => src.ProjectType)) .ForMember(dest => dest.IsArchived, opt => opt.Ignore()) ; cfg.CreateMap<ProjectValidateDto, ProjectValidation>() .ForMember(dest => dest.CustomerUid, opt => opt.MapFrom(src => TRNHelper.ExtractGuid(src.AccountTrn))) .ForMember(dest => dest.ProjectUid, opt => opt.MapFrom(src => string.IsNullOrEmpty(src.ProjectTrn) ? null : TRNHelper.ExtractGuid(src.ProjectTrn))) .ForMember(dest => dest.ProjectType, opt => opt.MapFrom(src => src.ProjectType)) .ForMember(dest => dest.UpdateType, opt => opt.MapFrom(src => ResolveUpdateType(src.UpdateType))) .ForMember(dest => dest.ProjectName, opt => opt.MapFrom(src => src.ProjectName)) .ForMember(dest => dest.ProjectBoundaryWKT, opt => opt.MapFrom(src => GeometryConversion.ProjectBoundaryToWKT(src.Boundary))) .ForMember(dest => dest.CoordinateSystemFileName, opt => opt.MapFrom(src => src.CoordinateSystemFileName)) .ForMember(dest => dest.CoordinateSystemFileContent, opt => opt.MapFrom(src => src.CoordinateSystemFileContent)) ; } ); _automapper = _automapperConfiguration.CreateMapper(); }
public void PolygonWKTNewBoundaryClosed() { var wkt = GeometryConversion.GetPolygonWKT(GeometryWKT); Assert.Equal(GeometryWKT, wkt); }
protected override async Task <ContractExecutionResult> ProcessAsyncEx <T>(T item) { var data = CastRequestObjectTo <ProjectValidation>(item, errorCode: 68); //Check customerUid in request matches header since some of the API calls use the data and some the header if (!string.Equals(data.CustomerUid.ToString(), customHeaders["X-VisionLink-CustomerUID"], StringComparison.OrdinalIgnoreCase)) { return(new ContractExecutionResult(135, "Mismatched customerUid.")); } var userUid = new Guid(userId); if (data.UpdateType == ProjectUpdateType.None) { log.LogWarning("Unknown CWS update type in project validation"); return(new ContractExecutionResult(136, "Unknown update type in project validation.")); } else if (data.UpdateType == ProjectUpdateType.Created) { //Validate required fields are present if (!data.ProjectType.HasValue) { return(new ContractExecutionResult(130, "Missing project type.")); } if (string.IsNullOrEmpty(data.ProjectName)) { return(new ContractExecutionResult(11, "Missing Project Name.")); } if (string.IsNullOrEmpty(data.ProjectBoundaryWKT)) { return(new ContractExecutionResult(8, "Missing Project Boundary.")); } if (string.IsNullOrEmpty(data.CoordinateSystemFileName)) { return(new ContractExecutionResult(132, "Missing coordinate system file name.")); } if (data.CoordinateSystemFileContent == null || data.CoordinateSystemFileContent.Length == 0) { return(new ContractExecutionResult(133, "Missing coordinate system file contents.")); } //Validate project name not duplicate // ProjectUID won't be filled yet var duplicates = await ValidateProjectName(data.CustomerUid, userUid, data.ProjectName, data.ProjectUid); if (duplicates > 0) { return(new ContractExecutionResult(109, $"Project Name must be unique. {duplicates} active project duplicates found.")); } //Validate project boundary dynamic boundaryResult = ValidateProjectBoundary(data.ProjectBoundaryWKT); if (boundaryResult.code != ContractExecutionStatesEnum.ExecutedSuccessfully) { return(new ContractExecutionResult(boundaryResult.code, boundaryResult.message)); } //Validate project boundary doesn't overlap existing projects log.LogDebug($"Testing if there are overlapping projects for project {data.ProjectName}"); var overlaps = await ProjectRequestHelper.DoesProjectOverlap(data.CustomerUid, null, userUid, data.ProjectBoundaryWKT, log, serviceExceptionHandler, cwsProjectClient, customHeaders); if (overlaps) { return(new ContractExecutionResult(43, "Project boundary overlaps another project.")); } //Validate coordinate system file dynamic coordSysResult = await ValidateCoordinateSystemFile(data.ProjectUid, data.CoordinateSystemFileName, data.CoordinateSystemFileContent); if (coordSysResult.code != ContractExecutionStatesEnum.ExecutedSuccessfully) { return(new ContractExecutionResult(coordSysResult.code, coordSysResult.message)); } } else if (data.UpdateType == ProjectUpdateType.Updated) { //Validate projectUID if (!data.ProjectUid.HasValue) { return(new ContractExecutionResult(5, "Missing ProjectUID.")); } if (data.ProjectType.HasValue) { //Changing from non 3d-enabled to 3d-enabled. if (string.IsNullOrEmpty(data.CoordinateSystemFileName)) { return(new ContractExecutionResult(132, "Missing coordinate system file name.")); } if (data.CoordinateSystemFileContent == null || data.CoordinateSystemFileContent.Length == 0) { return(new ContractExecutionResult(133, "Missing coordinate system file contents.")); } // Get the existing project to validate name and boundary var project = await cwsProjectClient.GetMyProject(data.ProjectUid.Value, userUid, customHeaders : customHeaders); if (project == null) { return(new ContractExecutionResult(7, "Project does not exist.")); } if (string.IsNullOrEmpty(data.ProjectName)) { data.ProjectName = project.ProjectName; } if (string.IsNullOrEmpty(data.ProjectBoundaryWKT)) { data.ProjectBoundaryWKT = GeometryConversion.ProjectBoundaryToWKT(project.ProjectSettings.Boundary); } } //Validate project name if changed if (!string.IsNullOrEmpty(data.ProjectName)) { var duplicates = await ValidateProjectName(data.CustomerUid, userUid, data.ProjectName, data.ProjectUid); if (duplicates > 0) { return(new ContractExecutionResult(109, $"Project Name must be unique. {duplicates} active project duplicates found.")); } } //Validate project boundary if changed if (!string.IsNullOrEmpty(data.ProjectBoundaryWKT)) { dynamic boundaryResult = ValidateProjectBoundary(data.ProjectBoundaryWKT); if (boundaryResult.code != ContractExecutionStatesEnum.ExecutedSuccessfully) { return(new ContractExecutionResult(boundaryResult.code, boundaryResult.message)); } var overlaps = await ProjectRequestHelper.DoesProjectOverlap(data.CustomerUid, data.ProjectUid, userUid, data.ProjectBoundaryWKT, log, serviceExceptionHandler, cwsProjectClient, customHeaders); if (overlaps) { return(new ContractExecutionResult(43, "Project boundary overlaps another project.")); } } //Validate coordinate system file if changed if (!string.IsNullOrEmpty(data.CoordinateSystemFileName) || (data.CoordinateSystemFileContent?.Length > 0)) { if (string.IsNullOrEmpty(data.CoordinateSystemFileName) || data.CoordinateSystemFileContent == null || data.CoordinateSystemFileContent.Length == 0) { return(new ContractExecutionResult(134, "Both coordinate system file name and contents must be provided.")); } dynamic coordSysResult = await ValidateCoordinateSystemFile(data.ProjectUid, data.CoordinateSystemFileName, data.CoordinateSystemFileContent); if (coordSysResult.code != ContractExecutionStatesEnum.ExecutedSuccessfully) { return(new ContractExecutionResult(coordSysResult.code, coordSysResult.message)); } } } else if (data.UpdateType == ProjectUpdateType.Archived) { if (!data.ProjectUid.HasValue) { return(new ContractExecutionResult(5, "Missing ProjectUID.")); } //no other validation for ProjectUpdateType.Archived } else if (data.UpdateType == ProjectUpdateType.Deleted) { if (!data.ProjectUid.HasValue) { return(new ContractExecutionResult(5, "Missing ProjectUID.")); } try { //If the project, regardless of type, has any tag file data, it cannot be deleted. var result = await productivity3dV2ProxyCompaction.GetProjectStatistics(data.ProjectUid.Value, customHeaders); if (result.extents?.ValidExtents == true && result.extents?.EmptyExtents == false) { log.LogInformation($"ValidateProjectExecutor: Project {data.ProjectUid.Value} has tag file data. NOT ok to delete."); return(new ContractExecutionResult(141, "Cannot delete a project that has 3D production (tag file) data")); } log.LogInformation($"ValidateProjectExecutor: Project {data.ProjectUid.Value} has NO tag file data. Ok to delete."); } catch (Exception e) { if (!e.Message.Contains($"GetStatistics: SiteModel: {data.ProjectUid.Value} not found")) { return(new ContractExecutionResult(57, $"A problem occurred at the validate project deletion endpoint in 3dpm. Exception: {e.Message}")); } log.LogInformation($"ValidateProjectExecutor: Project {data.ProjectUid.Value} not found in TRex. Ok to delete."); } } return(new ContractExecutionResult()); }
public static ProjectDatabaseModel ConvertCwsToWorksOSProject(ProjectDetailResponseModel project, ILogger log) { log.LogInformation($"{nameof(ConvertCwsToWorksOSProject)} project {JsonConvert.SerializeObject(project)}"); var extractedCalibrationFileOk = false; var coordinateSystemFileName = string.Empty; DateTime?coordinateSystemLastActionedUtc = null; if (project.ProjectSettings?.Config != null && project.ProjectSettings.Config.Any()) { extractedCalibrationFileOk = ExtractCalibrationFileDetails(project.ProjectSettings.Config, out coordinateSystemFileName, out coordinateSystemLastActionedUtc); } if (project.ProjectSettings?.Boundary == null || project.ProjectSettings?.TimeZone == null) { log.LogInformation($"{nameof(ConvertCwsToWorksOSProject)} contains no boundary or timezone"); } if (!extractedCalibrationFileOk) { log.LogInformation($"{nameof(ConvertCwsToWorksOSProject)} contains no calibrationFile."); } var projectDatabaseModel = new ProjectDatabaseModel() { ProjectUID = project.ProjectId, CustomerUID = project.AccountId, Name = project.ProjectName, ProjectType = project.ProjectType, UserProjectRole = project.UserProjectRole, ProjectTimeZone = project.ProjectSettings != null?PreferencesTimeZones.IanaToWindows(project.ProjectSettings.TimeZone) : string.Empty, ProjectTimeZoneIana = project.ProjectSettings?.TimeZone, Boundary = project.ProjectSettings?.Boundary != null?GeometryConversion.ProjectBoundaryToWKT(project.ProjectSettings.Boundary) : string.Empty, CoordinateSystemFileName = coordinateSystemFileName, CoordinateSystemLastActionedUTC = coordinateSystemLastActionedUtc, IsArchived = project.Status == ProjectStatus.Archived, LastActionedUTC = project.LastUpdate ?? DateTime.UtcNow }; return(projectDatabaseModel); }