/// <summary> /// /// </summary> /// <param name="sdc"></param> /// <returns></returns> public StructureDataContract AddStructure(StructureDataContract sdc) { System.Diagnostics.Trace.Assert(sdc.Id.CompareTo(Guid.Empty) == 0); sdc.Id = Guid.NewGuid(); _cacheStructures.Add(sdc.Id, sdc); return(sdc); }
/// <summary> /// /// </summary> /// <param name="sdc"></param> /// <returns></returns> public StructureDataContract AddStructure(StructureDataContract sdc) { System.Diagnostics.Trace.Assert(sdc.Id.CompareTo(Guid.Empty) == 0); sdc.Id = Guid.NewGuid(); _cacheStructures.TryAdd(sdc.Id, sdc); return sdc; }
/// <summary> /// synchronous call in to the meshing /// </summary> /// <param name="request">the request contract describing the meshing to be performed</param> /// <returns></returns> public MeshingResponse MeshStructure(MeshingRequest request) { // set up a resource accessor LocalGeometryResourceManagerClient cmsc1 = new LocalGeometryResourceManagerClient(); // and get the designated structure StructureDataContract sdc = cmsc1.GetStructure(request.StructureGuid); System.Diagnostics.Trace.WriteLine(string.Format("Meshing for structure {0} {1} {2}", sdc.SeriesInstanceUID, sdc.SOPInstanceUID, sdc.Id.ToString(), sdc.Contours.Count)); // System.Threading.Thread.Sleep(1000); // get the contours for the strucutre var contours = from guid in sdc.Contours select cmsc1.GetPolygon(guid); // TODO: check that contours match those in the request contract // create the resulting surface mesh data contract SurfaceMeshDataContract smdc = new SurfaceMeshDataContract(); // set up and calculate sizes smdc.FrameOfReferenceUID = sdc.FrameOfReferenceUID; smdc.RelatedStructureId = sdc.Id; smdc.VertexCount = contours.Sum(c => c.VertexCount); smdc.TriangleCount = smdc.VertexCount / 3; // create the mesh object, to allocate the buffers smdc = cmsc1.AddSurfaceMesh(smdc); // get a handle to the vertices var meshVertexHandle = smdc.VertexBuffer.GetHandle(); ulong currentMeshOffset = 0; // now iterate over the the contours foreach (var contour in contours) { Vector3D[] vertices = new Vector3D[contour.VertexBuffer.ElementCount]; // get access to the buffer var contourHandle = contour.VertexBuffer.GetHandle(); // and copy from the contour... contourHandle.ReadArray <Vector3D>(0, vertices, 0, vertices.Length); // to the mesh vertex buffer meshVertexHandle.WriteArray <Vector3D>(currentMeshOffset, vertices, 0, vertices.Length); // and release contour.VertexBuffer.ReleaseHandle(); contour.VertexBuffer.CloseMapping(); // increment to the next position currentMeshOffset += (ulong)(vertices.Length * Marshal.SizeOf(typeof(Vector3D))); } // done with vertex buffer smdc.VertexBuffer.ReleaseHandle(); smdc.VertexBuffer.CloseMapping(); cmsc1.Close(); // construct the response MeshingResponse response = new MeshingResponse(); response.StructureGuid = sdc.Id; response.SurfaceMeshGuid = smdc.Id; return(response); }
void StoreStructureSet(DicomDataset ds) { // store in cached resource LocalGeometryResourceManagerClient cache1 = new LocalGeometryResourceManagerClient(); string seriesInstanceUID = ds.Get <string>(DicomTag.SeriesInstanceUID); string sopInstanceUID = ds.Get <string>(DicomTag.SOPInstanceUID); string structureSetLabel = ds.Get <string>(DicomTag.StructureSetLabel); DicomSequence referencedForSequence = ds.Get <DicomSequence>(DicomTag.ReferencedFrameOfReferenceSequence); string frameOfReferenceUID = referencedForSequence.First().Get <string>(DicomTag.FrameOfReferenceUID); DicomSequence ssRoiSequence = ds.Get <DicomSequence>(DicomTag.StructureSetROISequence); foreach (var ssRoiItem in ssRoiSequence) { // process structure set StructureDataContract sdc = new StructureDataContract(); sdc.PatientId = ds.Get <string>(DicomTag.PatientID); sdc.SeriesInstanceUID = seriesInstanceUID; sdc.SOPInstanceUID = sopInstanceUID; sdc.StructureSetLabel = structureSetLabel; string roiName = ssRoiItem.Get <string>(DicomTag.ROIName); sdc.ROIName = roiName; int roiNumber = ssRoiItem.Get <int>(DicomTag.ROINumber); // sdc.ROINumber = roiNumber; string relatedForUID = ssRoiItem.Get <string>(DicomTag.ReferencedFrameOfReferenceUID); sdc.FrameOfReferenceUID = relatedForUID; var roiContourSeq = ds.Get <DicomSequence>(DicomTag.ROIContourSequence); var roiContourItem = from item in roiContourSeq where item.Get <int>(DicomTag.ReferencedROINumber) == roiNumber select item; System.Diagnostics.Trace.Assert(roiContourItem.Count() == 1); List <Guid> polygonGuidList = new List <Guid>(); var contourSequence = roiContourItem.First().Get <DicomSequence>(DicomTag.ContourSequence); if (contourSequence != null) { foreach (var contourItem in contourSequence) { var contourGeometricType = contourItem.Get <string>(DicomTag.ContourGeometricType); // TODO: if it is a point then store differently var numberOfContourPoints = contourItem.Get <int>(DicomTag.NumberOfContourPoints); ContourDataContract pdc = new ContourDataContract(); pdc.FrameOfReferenceUID = sdc.FrameOfReferenceUID; pdc.VertexCount = numberOfContourPoints; pdc = cache1.AddPolygon(pdc); polygonGuidList.Add(pdc.Id); // now access vertex buffer var handle = pdc.VertexBuffer.GetHandle(); for (int n = 0; n < numberOfContourPoints; n++) { var x = contourItem.Get <double>(DicomTag.ContourData, n * 3 + 0); var y = contourItem.Get <double>(DicomTag.ContourData, n * 3 + 1); var z = contourItem.Get <double>(DicomTag.ContourData, n * 3 + 2); Vector3D vertex = new Vector3D(x, y, z); handle.Write <Vector3D>((ulong)(n * Marshal.SizeOf(vertex)), vertex); } pdc.VertexBuffer.ReleaseHandle(); } } sdc.Contours = polygonGuidList; sdc = cache1.AddStructure(sdc); // publish the structure stored message _endpointInstance.Publish(new StructureStored { StructureGuid = sdc.Id, }); } //proxy.Close(); cache1.Close(); }