예제 #1
0
        public static DicomDataset Write(DicomRTContourImageItem contour)
        {
            var ds = new DicomDataset();

            ds.Add(DicomTag.ReferencedSOPClassUID, contour.ReferencedSOPClassUID);
            ds.Add(DicomTag.ReferencedSOPInstanceUID, contour.ReferencedSOPInstanceUID);
            return(ds);
        }
예제 #2
0
        public static DicomDataset Write(DicomRTReferencedSeries series)
        {
            var ds = new DicomDataset();

            ds.Add(DicomTag.SeriesInstanceUID, series.SeriesInstanceUID);

            var listOfContour = new List <DicomDataset>();

            foreach (var contour in series.ContourImages)
            {
                var newDS = DicomRTContourImageItem.Write(contour);
                listOfContour.Add(newDS);
            }

            ds.Add(new DicomSequence(DicomTag.ContourImageSequence, listOfContour.ToArray()));
            return(ds);
        }
예제 #3
0
        public static DicomRTReferencedSeries Read(DicomDataset ds)
        {
            var seriesInstanceUID = ds.GetStringOrEmpty(DicomTag.SeriesInstanceUID);

            var contourImages = new List <DicomRTContourImageItem>();

            if (ds.Contains(DicomTag.ContourImageSequence))
            {
                // Changed for new OSS fo-dicom-desktop
                var seq = ds.GetSequence(DicomTag.ContourImageSequence);
                //var seq = ds.Get<DicomSequence>(DicomTag.ContourImageSequence);

                foreach (var item in seq)
                {
                    var contourImageItem = DicomRTContourImageItem.Read(item);
                    contourImages.Add(contourImageItem);
                }
            }

            return(new DicomRTReferencedSeries(seriesInstanceUID, contourImages));
        }
예제 #4
0
        /// <summary>
        /// Constructs a new DicomDataSet representing the given DicomRTContourItem
        /// </summary>
        /// <param name="contourItem"></param>
        /// <returns></returns>
        public static DicomDataset Write(DicomRTContourItem contourItem)
        {
            var newDS = new DicomDataset();

            // The contour data is in Dicom Patient Coordinates (always mm units)
            // rounding to 0.001 gives us 1 micron accuracy and should not blow the 16 char limit in DICOM
            // for DS value representations.
            var roundedData = contourItem.Data.Select(d => d.ToString("F3", CultureInfo.InvariantCulture)).ToArray();

            newDS.Add(DicomTag.ContourData, roundedData);
            newDS.Add(DicomTag.NumberOfContourPoints, contourItem.NumberOfPoints);
            newDS.Add(DicomTag.ContourGeometricType, contourItem.GeometricType);
            var imageDataSets = new List <DicomDataset>();

            foreach (var imageSeq in contourItem.ImageSeq)
            {
                imageDataSets.Add(DicomRTContourImageItem.Write(imageSeq));
            }
            newDS.Add(new DicomSequence(DicomTag.ContourImageSequence, imageDataSets.ToArray()));
            return(newDS);
        }
예제 #5
0
        /// <summary>
        /// Read an RT Contour Item from the given dataset.
        /// </summary>
        /// <param name="ds"></param>
        /// <returns></returns>
        public static DicomRTContourItem Read(DicomDataset ds)
        {
            // Changed for new OSS fo-dicom-desktop
            var numberOfPoints = ds.GetSingleValue <int>(DicomTag.NumberOfContourPoints);
            // fo-dicom internally parses strings to decimal using InvariantCulture and then converts to double
            var data = ds.GetValues <double>(DicomTag.ContourData);
            //var numberOfPoints = ds.Get<int>(DicomTag.NumberOfContourPoints);
            //// fo-dicom internally parses strings to decimal using InvariantCulture and then converts to double
            //var data = ds.Get<double[]>(DicomTag.ContourData);
            var geometricType = ds.GetTrimmedStringOrEmpty(DicomTag.ContourGeometricType);
            List <DicomRTContourImageItem> listImages = new List <DicomRTContourImageItem>();

            if (ds.Contains(DicomTag.ContourImageSequence))
            {
                // Changed for new OSS fo-dicom-desktop
                var seqImages = ds.GetSequence(DicomTag.ContourImageSequence);
                //var seqImages = ds.Get<DicomSequence>(DicomTag.ContourImageSequence);
                foreach (var item in seqImages)
                {
                    listImages.Add(DicomRTContourImageItem.Read(item));
                }
            }
            return(new DicomRTContourItem(data, numberOfPoints, geometricType, listImages));
        }
        public static DicomRTFrameOFReference CreateReferencedFrames(IReadOnlyList <DicomIdentifiers> identifiers)
        {
            // Check all identifiers have the same SeriesInstanceUid
            var firstIdentifier = identifiers.First();

            if (identifiers.Any(x => x.Series.SeriesInstanceUid != firstIdentifier.Series.SeriesInstanceUid))
            {
                throw new InvalidOperationException("the list of slices are not for the same series");
            }

            if (identifiers.Any(x => x.Study.StudyInstanceUid != firstIdentifier.Study.StudyInstanceUid))
            {
                throw new InvalidOperationException("the list of slices are not for the same study");
            }

            if (identifiers.Any(x => x.FrameOfReference.FrameOfReferenceUid != firstIdentifier.FrameOfReference.FrameOfReferenceUid))
            {
                throw new InvalidOperationException("the list of slices are not from the same frame of reference");
            }

            var frameOfReference = new DicomRTFrameOFReference(firstIdentifier.FrameOfReference.FrameOfReferenceUid, new List <DicomRTReferencedStudy>()
            {
                new DicomRTReferencedStudy(DicomRTReferencedStudy.StudyComponentManagementSopClass, firstIdentifier.Study.StudyInstanceUid, new List <DicomRTReferencedSeries>()
                {
                    new DicomRTReferencedSeries(firstIdentifier.Series.SeriesInstanceUid, identifiers.Select(x => DicomRTContourImageItem.Reference(x.Image.SopCommon)).ToList())
                })
            });

            return(frameOfReference);
        }