/// <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);
 }
Ejemplo n.º 2
0
 /// <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;
 }
Ejemplo n.º 3
0
        /// <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);
        }
Ejemplo n.º 4
0
        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();
        }