private SegmentationMenuInfo MenuInfoFromDocumentAndSeg(SegmentationDocument segmentationDocument, Seg seg, Sop sop)
        {
            if (seg.SegmentImageData != null &&
                seg.SegmentImageData.SegmentFrameData != null &&
                seg.SegmentImageData.SegmentFrameData.Count > 0)
            {
                return(new SegmentationMenuInfo
                {
                    DisplayLabel = seg.DisplayLabel,
                    DisplayImageSeriesUid = seg.ImageSeriesUid,
                    SegmentationNumber = seg.SegmentationNumber,
                    SegmentationDocumentUid = segmentationDocument.SopInstanceUid,
                    SeriesNumber = segmentationDocument.SeriesNumber,
                    ImagePositionPatient = seg.SegmentImageData.SegmentFrameData[0].ImagePositionPatient,
                    ImageOrientationPatient =
                        seg.SegmentImageData.SegmentFrameData[0].ImageOrientationPatient,
                    FrameOfReferenceUid = seg.SegmentImageData.FrameOfReferenceUid,
                    PatientId = sop.PatientId,
                    PatientsName = sop.PatientsName,
                    StudyAccessionNumber = sop.AccessionNumber,
                    StudyDate = sop.StudyDate,
                    StudyTime = sop.StudyTime,
                    StudyDescription = sop.StudyDescription,
                    StudyInstanceUid = sop.StudyInstanceUid
                });
            }

            return(null);
        }
        public static bool IsSegmentationDocumentGraphicLoaded(SegmentationDocument segmentationDocument, IDisplaySet displaySet)
        {
            Platform.CheckForNullReference(segmentationDocument, "segmentationDocument");
            Platform.CheckForNullReference(displaySet, "displaySet");

            return
                (displaySet.PresentationImages.OfType <IOverlayGraphicsProvider>()
                 .SelectMany(overlayGraphicProvider => overlayGraphicProvider.OverlayGraphics.OfType <SegFrameImageGraphic>())
                 .Any(
                     segFrameImageGraphic =>
                     segFrameImageGraphic.SegmentationDocumentReference.SegmentationDocument.SopInstanceUid == segmentationDocument.SopInstanceUid));
        }
 private void AddSegmentationMenuInfo(SegmentationDocument segmentationDocument, Seg seg, Sop sop)
 {
     if (
         !_segmentationMenuInfos.ContainsKey(
             segmentationDocument.SopInstanceUid + seg.SegmentationNumber))
     {
         SegmentationMenuInfo info =
             MenuInfoFromDocumentAndSeg(segmentationDocument, seg, sop);
         if (info != null)
         {
             _segmentationMenuInfos.Add(
                 segmentationDocument.SopInstanceUid + seg.SegmentationNumber,
                 info);
         }
     }
 }
        public static void CreateSeriesGraphicsForSeg(IPresentationImage presentationImage, Seg seg,
                                                      SegmentationDocument segmentationDocument,
                                                      IDicomMessageSopDataSource dicomMessageSopDataSourceSop)
        {
            Platform.CheckForNullReference(presentationImage, "presentationImage");
            Platform.CheckForNullReference(seg, "seg");
            Platform.CheckForNullReference(segmentationDocument, "segmentationDocument");

            SegmentImageData segImageData = seg.SegmentImageData;

            if (segImageData == null)
            {
                Platform.Log(LogLevel.Error,
                             "Cannot create segmentation graphics when no segmentation imaging data is provided");
                return;
            }

            var imageSopProvider = presentationImage as IImageSopProvider;

            if (imageSopProvider == null)
            {
                Platform.Log(LogLevel.Error,
                             "Failed to populate SegFrameGraphics collection. Image is not an ImageSopProvider");
                return;
            }

            DicomPixelData segmentationPixelData = DicomPixelData.CreateFrom(dicomMessageSopDataSourceSop.SourceMessage);
            var            rawPixelData          =
                (byte[])dicomMessageSopDataSourceSop.SourceMessage.DataSet.GetAttribute(DicomTags.PixelData).Values;
            var pixelDataGetter = new Func <int, byte[]>(frameIndex =>
            {
                if (segImageData.BitsStored == 1)
                {
                    // Do unpacking
                    int frameLength = segImageData.Rows *
                                      segImageData.Columns;
                    var overlayData =
                        new OverlayData(frameIndex * frameLength,
                                        segImageData.Rows,
                                        segImageData.Columns, false,
                                        rawPixelData);
                    return(overlayData.Unpack());
                }
                if (segImageData.BitsStored == 8)
                {
                    return(segmentationPixelData.GetFrame(frameIndex));
                }
                throw new InvalidDataException(
                    "Segmentation objects need to have BitsStored as either 1 or 8");
            });

            // NOTE: SegmentFrameData was already sorted
            foreach (SegmentFrameData segmentFrameData in segImageData.SegmentFrameData)
            {
                IPresentationImage segPresentationImage = null;

                // Get the presentation image if we have an image reference
                string referencedSopInstanceUid   = segmentFrameData.ReferencedSopInstanceUid;
                int    referencedImageFrameNumber = segmentFrameData.ReferencedFrameNumber ?? 1;
                if (!string.IsNullOrEmpty(referencedSopInstanceUid))
                {
                    segPresentationImage =
                        presentationImage.ParentDisplaySet.PresentationImages.OfType <IImageSopProvider>()
                        .FirstOrDefault(curImageSopProvider => curImageSopProvider != null &&
                                        curImageSopProvider.ImageSop.SopInstanceUid ==
                                        referencedSopInstanceUid &&
                                        curImageSopProvider.Frame.FrameNumber ==
                                        referencedImageFrameNumber) as IPresentationImage;
                }

                // Location defaults to 0, 0 unless determined otherwise from image position and image orientation
                var segLocation = new PointF();

                // Get the presentation image from the image position and orientation
                if (segmentFrameData.ImagePositionPatient != null &&
                    segmentFrameData.ImagePositionPatient.Count() > 2 &&
                    segmentFrameData.ImageOrientationPatient != null &&
                    segmentFrameData.ImageOrientationPatient.Count() > 5)
                {
                    var imagePositionPatient = new ImagePositionPatient(
                        segmentFrameData.ImagePositionPatient[0],
                        segmentFrameData.ImagePositionPatient[1],
                        segmentFrameData.ImagePositionPatient[2]);
                    var imageOrientationPatient = new ImageOrientationPatient(
                        segmentFrameData.ImageOrientationPatient[0],
                        segmentFrameData.ImageOrientationPatient[1],
                        segmentFrameData.ImageOrientationPatient[2],
                        segmentFrameData.ImageOrientationPatient[3],
                        segmentFrameData.ImageOrientationPatient[4],
                        segmentFrameData.ImageOrientationPatient[5]);
                    IDisplaySet displaySet = presentationImage.ParentDisplaySet;

                    if (segPresentationImage == null)
                    {
                        segPresentationImage = PresentationImageFromPositionOrientation(
                            imagePositionPatient,
                            imageOrientationPatient,
                            displaySet,
                            segImageData.FrameOfReferenceUid);
                    }

                    var imageSop = segPresentationImage as IImageSopProvider;
                    if (imageSop != null)
                    {
                        Vector3D segImageLocation =
                            imageSop.Frame.ImagePlaneHelper.ConvertToImagePlane(new Vector3D(
                                                                                    (float)imagePositionPatient.X,
                                                                                    (float)imagePositionPatient.Y,
                                                                                    (float)imagePositionPatient.Z));
                        PointF?segPixelLocation =
                            imageSop.Frame.ImagePlaneHelper.ConvertToImage(
                                new PointF(segImageLocation.X, segImageLocation.Y));
                        if (segPixelLocation.HasValue)
                        {
                            segLocation = segPixelLocation.Value;
                        }
                    }
                }

                if (segPresentationImage != null)
                {
                    SegFrameImageGraphic newGraphic = AddSegFrameImageGraphicToPresentationImage(
                        segPresentationImage,
                        segImageData.Rows,
                        segImageData.Columns,
                        segLocation.X,
                        segLocation.Y,
                        seg.Color,
                        referencedImageFrameNumber,
                        seg.Label,
                        seg.Description,
                        pixelDataGetter.Invoke(segmentFrameData.FrameNumber - 1),
                        new SegmentationDocumentReference(segmentationDocument, seg.SegmentationNumber));
                    if (newGraphic != null &&
                        segPresentationImage == segPresentationImage.ParentDisplaySet.ImageBox.TopLeftPresentationImage)
                    {
                        newGraphic.Draw();
                    }
                }
                else
                {
                    Platform.Log(LogLevel.Error, "Failed to find Presentation Image to display a segment on");
                }
            }
        }
 public SegmentationDocumentReference(SegmentationDocument segmentationDocument, int segmentNumber)
 {
     SegmentationDocument = segmentationDocument;
     SegmentNumber = segmentNumber;
 }
        public SegmentationDocument DeserializeSegmenationDocument()
        {
            if (_segDocumentIod == null)
            {
                return(null);
            }

            var segDocument = new SegmentationDocument(_segDocumentIod);

            segDocument.CreationDateTime  = _segDocumentIod.CreationDateTime ?? DateTime.Now;            // ??
            segDocument.SeriesInstanceUid = _segDocumentIod.SeriesInstanceUid;
            segDocument.SeriesDescription = _segDocumentIod.SeriesDescription;
            segDocument.SeriesNumber      = _segDocumentIod.SeriesNumber ?? 0;        // ??
            //segDocument.PreviousSegmentationUid = _segDocumentIod.PriorSegmentationUid;
            segDocument.SopInstanceUid = _segDocumentIod.SopInstanceUid;
            segDocument.ContentLabel   = _segDocumentIod.SegmentationImageModuleIod.ContentLabel;

            //var userName = _segDocumentIod.GeneralSeriesModuleIod.OperatorsName;
            var userName = _segDocumentIod.SegmentationImageModuleIod.ContentCreatorsName;

            if (!string.IsNullOrEmpty(userName))
            {
                segDocument.UserInfo = new UserInfo
                {
                    Name      = userName,
                    LoginName = userName                             // TODO - use _segDocumentIod.GeneralSeriesModuleIod.OperatorsName[1] when available
                };
            }

            var hasErrors = false;

            if (CanUnderstandSopInstance())
            {
                var segmentationImageModule = _segDocumentIod.SegmentationImageModuleIod;
                if (segmentationImageModule != null)
                {
                    for (int i = 0; i < segmentationImageModule.SegmentSequence.Length; i++)
                    {
                        var seg = InitializeSegFromIod(i);
                        if (seg == null)
                        {
                            hasErrors = true;
                        }
                        else
                        {
                            segDocument.Segs.Add(seg);
                        }
                    }
                }
            }

            if (hasErrors || segDocument.Segs.Count == 0)
            {
                var invalidSeg = new Seg(false, null);
                invalidSeg.Description = "Segmentation reading error(s) - see log for details";
                invalidSeg.Label       = "Errors/Not Supported";
                segDocument.Segs.Add(invalidSeg);
            }

            return(segDocument);
        }
Example #7
0
 public SegmentationDocumentReference(SegmentationDocument segmentationDocument, int segmentNumber)
 {
     SegmentationDocument = segmentationDocument;
     SegmentNumber        = segmentNumber;
 }