public void SelectDisplaySet()
		{
			IDisplaySet displaySet1 = new DisplaySet();
			displaySet1.PresentationImages.Add(new TestPresentationImage());
			displaySet1.PresentationImages.Add(new TestPresentationImage());
			displaySet1.PresentationImages.Add(new TestPresentationImage());
			displaySet1.PresentationImages.Add(new TestPresentationImage());

			IDisplaySet displaySet2 = new DisplaySet();
			displaySet2.PresentationImages.Add(new TestPresentationImage());
			displaySet2.PresentationImages.Add(new TestPresentationImage());

			IImageViewer viewer = new ImageViewerComponent();
			IImageBox imageBox = new ImageBox();
			viewer.PhysicalWorkspace.ImageBoxes.Add(imageBox);

			imageBox.SetTileGrid(2, 2);
			imageBox.DisplaySet = displaySet1;
			imageBox[0, 0].Select();

			Assert.IsTrue(imageBox[0, 0].Selected);
			Assert.IsFalse(imageBox[0, 1].Selected);

			imageBox[0, 1].Select();
			Assert.IsFalse(imageBox[0, 0].Selected);
			Assert.IsTrue(imageBox[0, 1].Selected);

			imageBox.DisplaySet = displaySet2;
			Assert.IsFalse(imageBox[0, 0].Selected);
			Assert.IsTrue(imageBox[0, 1].Selected);
		}
        public void TestImage()
        {
            if (ImageViewer.SelectedImageBox == null)
            {
                return;
            }

            try
            {
                var sphere = new EllipsoidPrimitive {
                    FrontTopLeft = new Vector3D(85, 85, 85), BackBottomRight = new Vector3D(115, 115, 115), Color = Color.Yellow
                };

                var image = new VtkTestPresentationImage();
                image.OverlayGraphics3D.Add(sphere);

                var dset = new DisplaySet {
                    Description = "blah", Name = "blah", Uid = Guid.NewGuid().ToString()
                };
                dset.PresentationImages.Add(image);

                ImageViewer.SelectedImageBox.DisplaySet = dset;
                ImageViewer.SelectedImageBox.Draw();
            }
            catch (Exception ex)
            {
                ExceptionHandler.Report(ex, Context.DesktopWindow);
            }
        }
		public void SetDisplaySet()
		{
			ImageBox imageBox = new ImageBox();
			IDisplaySet displaySet1 = new DisplaySet();
			IDisplaySet displaySet2 = new DisplaySet();
			PresentationImage image1 = new TestPresentationImage();
			PresentationImage image2 = new TestPresentationImage();
			displaySet1.PresentationImages.Add(image1);
			displaySet2.PresentationImages.Add(image2);

			imageBox.DisplaySet = displaySet1;
			Assert.IsTrue(displaySet1.Visible);
			Assert.AreEqual(imageBox, displaySet1.ImageBox);

			imageBox.DisplaySet = null;
			Assert.IsFalse(displaySet1.Visible);
			Assert.IsNull(displaySet1.ImageBox);

			imageBox.DisplaySet = displaySet1;
			Assert.IsTrue(displaySet1.Visible);
			Assert.AreEqual(imageBox, displaySet1.ImageBox);

			imageBox.DisplaySet = displaySet2;
			Assert.IsTrue(displaySet2.Visible);
			Assert.IsFalse(displaySet1.Visible);
			Assert.AreEqual(imageBox, displaySet2.ImageBox);
			Assert.IsNull(displaySet1.ImageBox);
		}
Beispiel #4
0
        /// <summary>
        /// Process the user preferences for this scenario
        /// </summary>
        /// <param name="preferences"></param>
        public void SetPreferences(PopulationPrefs preferences)
        {
            // Gets the custom DIsplaySets
            if (preferences == null)
            {
                return;
            }

            // Add teh custom DisplaySets to the DisplaySet List
            foreach (DisplaySetInformation displaySet in preferences.DisplaySets)
            {
                DisplaySet.DisplaySetList.Add(displaySet);
            }

            // Assign the selected DisplaySet
            if (!preferences.SelectedDisplaySetName.Equals(""))
            {
                DisplaySetInformation displaySet = DisplaySet.GetDisplaySetByName(preferences.SelectedDisplaySetName);
                if (displaySet != null)
                {
                    DisplaySet.CurrentDisplaySet = displaySet;
                }
            }

            Context.BlockSize = preferences.BlockSize;
        }
        private static DisplaySet CreateFusionDisplaySet(IEnumerable <ImageSop> baseSops, IEnumerable <ImageSop> overlaySops)
        {
            var descriptor = new PETFusionDisplaySetDescriptor(
                GetSeriesIdentifier(CollectionUtils.FirstElement(baseSops).DataSource),
                GetSeriesIdentifier(CollectionUtils.FirstElement(overlaySops).DataSource),
                false);
            var displaySet = new DisplaySet(descriptor);

            using (var fusionOverlayData = new FusionOverlayData(GetFrames(overlaySops)))
            {
                int bitDepth = fusionOverlayData.Frames[0].ParentImageSop.DataSource[DicomTags.BitsStored].GetInt32(0, 16);
                foreach (var baseFrame in GetFrames(baseSops))
                {
                    using (var fusionOverlaySlice = fusionOverlayData.CreateOverlaySlice(baseFrame))
                    {
                        var fus = new FusionPresentationImage(baseFrame, fusionOverlaySlice);
                        fus.BaseVoiLutManager.InstallVoiLut(new IdentityVoiLinearLut());
                        fus.OverlayVoiLutManager.InstallVoiLut(new IdentityVoiLinearLut());
                        displaySet.PresentationImages.Add(fus);
                    }
                }
            }

            return(displaySet);
        }
Beispiel #6
0
        public void CreateVolume()
        {
            if (this.ImageViewer == null)
            {
                return;
            }

            if (this.ImageViewer.SelectedImageBox == null)
            {
                return;
            }

            IDisplaySet             selectedDisplaySet = this.ImageViewer.SelectedImageBox.DisplaySet;
            VolumePresentationImage image = new VolumePresentationImage(selectedDisplaySet);

            AddTissueLayers(image);

            IDisplaySet displaySet = new DisplaySet(String.Format("{0} (3D)", selectedDisplaySet.Name), String.Format("VTK.{0}", Guid.NewGuid().ToString()));

            displaySet.PresentationImages.Add(image);
            this.ImageViewer.LogicalWorkspace.ImageSets[0].DisplaySets.Add(displaySet);

            IImageBox imageBox = this.ImageViewer.SelectedImageBox;

            imageBox.DisplaySet = displaySet;
            imageBox.Draw();
            imageBox[0, 0].Select();

            NotifyAllPropertiesChanged();
        }
        public void ReplaceDisplaySet()
        {
            IDisplaySet        displaySet1 = new DisplaySet();
            IPresentationImage image1      = new TestPresentationImage();

            displaySet1.PresentationImages.Add(image1);

            IDisplaySet        displaySet2 = new DisplaySet();
            IPresentationImage image2      = new TestPresentationImage();

            displaySet2.PresentationImages.Add(image2);

            ImageViewerComponent viewer = new ImageViewerComponent();

            IImageBox imageBox1 = new ImageBox();

            viewer.PhysicalWorkspace.ImageBoxes.Add(imageBox1);

            imageBox1.SetTileGrid(2, 2);
            imageBox1.DisplaySet = displaySet1;
            imageBox1[0, 0].Select();

            Assert.IsTrue(displaySet1.Selected);
            Assert.IsTrue(image1.Selected);

            imageBox1.DisplaySet = displaySet2;

            Assert.IsFalse(displaySet1.Selected);
            Assert.IsFalse(image1.Selected);

            Assert.IsTrue(displaySet2.Selected);
            Assert.IsTrue(image2.Selected);
        }
Beispiel #8
0
        private void 導入預設文件IToolStripMenuItem_Click(object sender, EventArgs e)
        {
            OpenFileDialog ImportSettingDialog = new OpenFileDialog();

            ImportSettingDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "\\弹幕姬\\Plugins\\";
            ImportSettingDialog.FileName         = "setting.xml";
            ImportSettingDialog.Filter           = "程式設置檔文件 (*.xml)|*.xml|所有文件 (*.*)|*.*";
            ImportSettingDialog.FilterIndex      = 1;
            ImportSettingDialog.RestoreDirectory = true;
            if (ImportSettingDialog.ShowDialog() == DialogResult.OK)
            {
                try
                {
                    DisplaySet.Clear();
                    DisplaySet.ReadXml(ImportSettingDialog.FileName);
                    dataGridView1.DataSource = DisplaySet;
                    dataGridView1.DataMember = "event";
                    setting_file_path        = ImportSettingDialog.FileName;
                }
                catch (Exception ex)
                {
                    MessageBox.Show("讀取設置檔失敗,原始錯誤檔如下: \n" + ex.Message);
                }
            }
        }
        /// <summary>
        /// Creates a clone of a <see cref="IPresentationImage"/> suitable for static export.
        /// </summary>
        /// <remarks>
        /// Functionally, this method is similar to <see cref="IPresentationImage.Clone"/>.
        /// However, this method also fills the <see cref="IPresentationImage.ParentDisplaySet"/>
        /// property with a static <see cref="IDisplaySet"/> instance whose properties are a snapshot
        /// of the source image's parent display set at the time the clone was created.
        /// This makes the resulting images suitable for export with features like annotation overlay
        /// enabled, as certain items (specifically, display set description and number) depend on
        /// this information.
        /// </remarks>
        /// <param name="presentationImage">The source image to be cloned.</param>
        /// <returns>A clone of the source image.</returns>
        /// <exception cref="ArgumentNullException">Thrown if <paramref name="presentationImage"/> is null.</exception>
        public static IPresentationImage ClonePresentationImage(IPresentationImage presentationImage)
        {
            Platform.CheckForNullReference(presentationImage, "presentationImage");
            var imageClone = presentationImage.Clone();

            try
            {
                var parentDisplaySet = presentationImage.ParentDisplaySet;
                if (parentDisplaySet != null)
                {
                    var descriptor = parentDisplaySet.Descriptor;
                    if (descriptor != null)
                    {
                        parentDisplaySet = new DisplaySet(new BasicDisplaySetDescriptor {
                            Description = descriptor.Description, Name = descriptor.Name, Number = descriptor.Number, Uid = descriptor.Uid
                        });
                    }
                    else
                    {
                        parentDisplaySet = new DisplaySet(parentDisplaySet.Name, parentDisplaySet.Uid);
                    }
                    parentDisplaySet.PresentationImages.Add(imageClone);
                }
            }
            catch (Exception ex)
            {
                Platform.Log(LogLevel.Debug, ex, "Failed to create a dummy parent display set for the cloned presentation image");
            }
            return(imageClone);
        }
    private void ListDisplaySet(DisplaySet ds)
    {
        Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage("DisplaySet Name:" + ds.Name + "\n");
        Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage("DisplaySet Description:" + ds.Description + "\n");

        return;
    }
Beispiel #11
0
        private void 導出預設文件OToolStripMenuItem_Click(object sender, EventArgs e)
        {
            OpenFileDialog ExportSettingDialog = new OpenFileDialog();

            ExportSettingDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "\\弹幕姬\\Plugins\\";
            ExportSettingDialog.FileName         = "setting.xml";
            ExportSettingDialog.Filter           = "程式設置檔文件 (*.xml)|*.xml|所有文件 (*.*)|*.*";
            ExportSettingDialog.FilterIndex      = 1;
            ExportSettingDialog.RestoreDirectory = true;

            if (ExportSettingDialog.ShowDialog() == DialogResult.OK)
            {
                try
                {
                    if (DisplaySet == null)
                    {
                        return;
                    }
                    string filename             = ExportSettingDialog.FileName;
                    System.IO.FileStream stream = new System.IO.FileStream
                                                      (filename, System.IO.FileMode.Create);
                    DisplaySet.WriteXml(stream);
                }
                catch (Exception ex)
                {
                    MessageBox.Show("導出設置檔失敗,原始錯誤檔如下: \n" + ex.Message);
                }
            }
        }
        public static IDisplaySet CreateDisplaySet(string text)
        {
            var displaySet = new DisplaySet();

            displaySet.PresentationImages.Add(new MessagePresentationImage(text));
            return(displaySet);
        }
    //  added. list all the disp set registered.
    private void ListDisplaySets()
    {
        Autodesk.AutoCAD.EditorInput.Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
        ed.WriteMessage("===================================\n");
        ed.WriteMessage("  Currently Registerd Display Set  \n");
        ed.WriteMessage("===================================\n");

        Database    db    = Application.DocumentManager.MdiActiveDocument.Database;
        Transaction trans = db.TransactionManager.StartTransaction();

        // get the dictionary.
        DictionaryDisplaySet dictDispSet = new DictionaryDisplaySet(db, false);

        ed.WriteMessage("Current # of display set = " + dictDispSet.Records.Count.ToString() + "\n");

        try
        {
            // loop throught it and print out the name.
            foreach (ObjectId id in dictDispSet.Records)
            {
                DisplaySet dispSet = trans.GetObject(id, OpenMode.ForRead) as DisplaySet;
                ListDisplaySet(dispSet);
            }
        }
        catch (System.Exception)
        { trans.Abort(); }
        finally
        { trans.Dispose(); }
    }
        public void SetDisplaySet()
        {
            ImageBox          imageBox    = new ImageBox();
            IDisplaySet       displaySet1 = new DisplaySet();
            IDisplaySet       displaySet2 = new DisplaySet();
            PresentationImage image1      = new TestPresentationImage();
            PresentationImage image2      = new TestPresentationImage();

            displaySet1.PresentationImages.Add(image1);
            displaySet2.PresentationImages.Add(image2);

            imageBox.DisplaySet = displaySet1;
            Assert.IsTrue(displaySet1.Visible);
            Assert.AreEqual(imageBox, displaySet1.ImageBox);

            imageBox.DisplaySet = null;
            Assert.IsFalse(displaySet1.Visible);
            Assert.IsNull(displaySet1.ImageBox);

            imageBox.DisplaySet = displaySet1;
            Assert.IsTrue(displaySet1.Visible);
            Assert.AreEqual(imageBox, displaySet1.ImageBox);

            imageBox.DisplaySet = displaySet2;
            Assert.IsTrue(displaySet2.Visible);
            Assert.IsFalse(displaySet1.Visible);
            Assert.AreEqual(imageBox, displaySet2.ImageBox);
            Assert.IsNull(displaySet1.ImageBox);
        }
Beispiel #15
0
 private void dispSet_Click(object sender, RoutedEventArgs e)
 {
     if (this.MapContainer == null)
     {
         return;
     }
     if (m_catalog.ActiveMapDoc != null && m_catalog.ActiveMapDoc.Display)
     {
         if (m_dispOption == null)
         {
             m_dispOption            = new DisplaySet();
             m_dispOption.IMSCatalog = this.IMSCatalog;
         }
         m_dispOption.ShowAsModal();
     }
     //if (m_catalog.ActiveLayerObj != null && m_catalog.ActiveLayerObj.Display)
     //{
     //    if (m_LayerdispOption == null)
     //    {
     //        m_LayerdispOption = new LayerDisplaySet();
     //        m_LayerdispOption.IMSCatalog = this.IMSCatalog;
     //    }
     //    m_LayerdispOption.ShowAsModal();
     //}
 }
        public void SelectDisplaySet()
        {
            IDisplaySet displaySet1 = new DisplaySet();

            displaySet1.PresentationImages.Add(new TestPresentationImage());
            displaySet1.PresentationImages.Add(new TestPresentationImage());
            displaySet1.PresentationImages.Add(new TestPresentationImage());
            displaySet1.PresentationImages.Add(new TestPresentationImage());

            IDisplaySet displaySet2 = new DisplaySet();

            displaySet2.PresentationImages.Add(new TestPresentationImage());
            displaySet2.PresentationImages.Add(new TestPresentationImage());

            IImageViewer viewer   = new ImageViewerComponent();
            IImageBox    imageBox = new ImageBox();

            viewer.PhysicalWorkspace.ImageBoxes.Add(imageBox);

            imageBox.SetTileGrid(2, 2);
            imageBox.DisplaySet = displaySet1;
            imageBox[0, 0].Select();

            Assert.IsTrue(imageBox[0, 0].Selected);
            Assert.IsFalse(imageBox[0, 1].Selected);

            imageBox[0, 1].Select();
            Assert.IsFalse(imageBox[0, 0].Selected);
            Assert.IsTrue(imageBox[0, 1].Selected);

            imageBox.DisplaySet = displaySet2;
            Assert.IsFalse(imageBox[0, 0].Selected);
            Assert.IsTrue(imageBox[0, 1].Selected);
        }
Beispiel #17
0
		public void ReplaceDisplaySet()
		{
			IDisplaySet displaySet1 = new DisplaySet();
			IPresentationImage image1 = new TestPresentationImage();
			displaySet1.PresentationImages.Add(image1);

			IDisplaySet displaySet2 = new DisplaySet();
			IPresentationImage image2 = new TestPresentationImage();
			displaySet2.PresentationImages.Add(image2);

			ImageViewerComponent viewer = new ImageViewerComponent();

			IImageBox imageBox1 = new ImageBox();
			viewer.PhysicalWorkspace.ImageBoxes.Add(imageBox1);

			imageBox1.SetTileGrid(2, 2);
			imageBox1.DisplaySet = displaySet1;
			imageBox1[0,0].Select();

			Assert.IsTrue(displaySet1.Selected);
			Assert.IsTrue(image1.Selected);

			imageBox1.DisplaySet = displaySet2;

			Assert.IsFalse(displaySet1.Selected);
			Assert.IsFalse(image1.Selected);

			Assert.IsTrue(displaySet2.Selected);
			Assert.IsTrue(image2.Selected);

		}
    ////////////////////////////
    //// Display Rep
    ////
    //// list all the display reps for MassElem and MassGroup for the current display config.
    ////////////////////////////

    private void DisplayReps()
    {
        Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage("\n====================================================\n");
        Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage("Get All the AecDbMassElem/Massgroup Display Reps for the current display config\n");
        Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage("====================================================\n");

        Database    db    = Application.DocumentManager.MdiActiveDocument.Database;
        Transaction trans = db.TransactionManager.StartTransaction();

        Autodesk.AutoCAD.EditorInput.Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;

        DisplaySet         ds  = new DisplaySet();
        ObjectIdCollection ids = DisplayRepresentationManager.GetActiveDisplayRepresentationSets(db);

        ed.WriteMessage("# of active display sets = " + ids.Count + "\n");

        DisplaySet acds = new DisplaySet();

        try
        {
            //  loop through the active disp sets (i.e., disp sets of active dis confid.)
            foreach (ObjectId id in ids)
            {
                acds = trans.GetObject(id, OpenMode.ForRead) as DisplaySet;
                foreach (ObjectId drid in acds.DisplayRepresentationIds)
                {
                    DisplayRepresentation dr = trans.GetObject(drid, OpenMode.ForRead) as DisplayRepresentation;
                    dr = trans.GetObject(drid, OpenMode.ForRead) as DisplayRepresentation;
                    RXClass rc = dr.WorksWith;
                    if (rc.Name == "AecDbMassElem" || rc.Name == "AecDbMassGroup")
                    {
                        if (ds.DisplayRepresentationIds.Contains(drid))
                        {
                            continue;
                        }
                        else
                        {
                            ds.DisplayRepresentationIds.Add(drid);
                            ListDisplayRep(dr);
                        }
                    }
                }
            }
            trans.Commit();
        }
        catch (System.Exception)
        {
            trans.Abort();
        }
        finally
        {
            trans.Dispose();
        }
        return;
    }
        public static void Create(IDesktopWindow desktopWindow, IImageViewer viewer)
        {
            IDisplaySet selectedDisplaySet = viewer.SelectedImageBox.DisplaySet;
            string      name         = String.Format("{0} - Dynamic TE", selectedDisplaySet.Name);
            IDisplaySet t2DisplaySet = new DisplaySet(name, "");

            double currentSliceLocation = 0.0;

            BackgroundTask task = new BackgroundTask(
                delegate(IBackgroundTaskContext context)
            {
                int i = 0;

                foreach (IPresentationImage image in selectedDisplaySet.PresentationImages)
                {
                    IImageSopProvider imageSopProvider = image as IImageSopProvider;

                    if (imageSopProvider == null)
                    {
                        continue;
                    }

                    ImageSop imageSop = imageSopProvider.ImageSop;
                    Frame frame       = imageSopProvider.Frame;

                    if (frame.SliceLocation != currentSliceLocation)
                    {
                        currentSliceLocation = frame.SliceLocation;

                        try
                        {
                            DynamicTePresentationImage t2Image = CreateT2Image(imageSop, frame);
                            t2DisplaySet.PresentationImages.Add(t2Image);
                        }
                        catch (Exception e)
                        {
                            Platform.Log(LogLevel.Error, e);
                            desktopWindow.ShowMessageBox("Unable to create T2 series.  Please check the log for details.",
                                                         MessageBoxActions.Ok);
                            break;
                        }
                    }

                    string message = String.Format("Processing {0} of {1} images", i, selectedDisplaySet.PresentationImages.Count);
                    i++;

                    BackgroundTaskProgress progress = new BackgroundTaskProgress(i, selectedDisplaySet.PresentationImages.Count, message);
                    context.ReportProgress(progress);
                }
            }, false);

            ProgressDialog.Show(task, desktopWindow, true, ProgressBarStyle.Blocks);

            viewer.LogicalWorkspace.ImageSets[0].DisplaySets.Add(t2DisplaySet);
        }
        public override List <IDisplaySet> CreateDisplaySets(Series series)
        {
            List <IDisplaySet> displaySets = new List <IDisplaySet>();

            if (IsValidPETFusionSeries(series))
            {
                var fuseableBaseSeries = new List <Series>(FindFuseableBaseSeries(series));
                if (fuseableBaseSeries.Count > 0)
                {
                    string error;
                    if (!CheckPETFusionSeries(series, out error))
                    {
                        // if there is an error with the PET series, avoid trying to generate the volume entirely
                        // instead, generate a placeholder series for each base series
                        foreach (var baseSeries in fuseableBaseSeries)
                        {
                            displaySets.Add(CreateFusionErrorDisplaySet(baseSeries, series, error));
                        }
                        return(displaySets);
                    }

                    var overlayFrames = GetFrames(series.Sops);
                    using (var fusionOverlayData = new FusionOverlayData(overlayFrames))
                    {
                        foreach (var baseSeries in fuseableBaseSeries)
                        {
                            if (!CheckBaseSeries(baseSeries, out error))
                            {
                                // if there is an error with a single base series, generate a placeholder series
                                displaySets.Add(CreateFusionErrorDisplaySet(baseSeries, series, error));
                                continue;
                            }

                            var descriptor = new PETFusionDisplaySetDescriptor(baseSeries.GetIdentifier(), series.GetIdentifier(), IsAttenuationCorrected(series.Sops[0]));
                            var displaySet = new DisplaySet(descriptor);
                            using (var sops = new DisposableList <Sop>(baseSeries.Sops.OfType <ImageSop>().Select(s => new ImageSop(new FusionSopDataSource(s.DataSource, _fusionType, overlayFrames)))))
                            {
                                foreach (var baseFrame in GetFrames(sops))
                                {
                                    using (var fusionOverlaySlice = fusionOverlayData.CreateOverlaySlice(baseFrame))
                                    {
                                        var fus = new FusionPresentationImage(baseFrame, fusionOverlaySlice);
                                        displaySet.PresentationImages.Add(fus);
                                    }
                                }
                            }
                            displaySet.PresentationImages.Sort();
                            displaySets.Add(displaySet);
                        }
                    }
                }
            }
            return(displaySets);
        }
		public static void Create(IDesktopWindow desktopWindow, IImageViewer viewer)
		{
			IDisplaySet selectedDisplaySet = viewer.SelectedImageBox.DisplaySet;
			string name = String.Format("{0} - Dynamic TE", selectedDisplaySet.Name);
			IDisplaySet t2DisplaySet = new DisplaySet(name, "");

			double currentSliceLocation = 0.0;

			BackgroundTask task = new BackgroundTask(
				delegate(IBackgroundTaskContext context)
				{
					int i = 0;

					foreach (IPresentationImage image in selectedDisplaySet.PresentationImages)
					{
						IImageSopProvider imageSopProvider = image as IImageSopProvider;

						if (imageSopProvider == null)
							continue;

						ImageSop imageSop = imageSopProvider.ImageSop;
						Frame frame = imageSopProvider.Frame;

						if (frame.SliceLocation != currentSliceLocation)
						{
							currentSliceLocation = frame.SliceLocation;

							try
							{
								DynamicTePresentationImage t2Image = CreateT2Image(imageSop, frame);
								t2DisplaySet.PresentationImages.Add(t2Image);
							}
							catch (Exception e)
							{
								Platform.Log(LogLevel.Error, e);
								desktopWindow.ShowMessageBox("Unable to create T2 series.  Please check the log for details.",
								                             MessageBoxActions.Ok);
								break;
							}

						}

						string message = String.Format("Processing {0} of {1} images", i, selectedDisplaySet.PresentationImages.Count);
						i++;

						BackgroundTaskProgress progress = new BackgroundTaskProgress(i, selectedDisplaySet.PresentationImages.Count, message);
						context.ReportProgress(progress);
					}
				}, false);

			ProgressDialog.Show(task, desktopWindow, true, ProgressBarStyle.Blocks);

			viewer.LogicalWorkspace.ImageSets[0].DisplaySets.Add(t2DisplaySet);
		}
    //  create a display config with a little more information filled.
    private DisplayConfiguration CreateDisplayConfig()
    {
        Database    db    = Application.DocumentManager.MdiActiveDocument.Database;
        Transaction trans = db.TransactionManager.StartTransaction();

        DisplayRepresentationManager drm      = new DisplayRepresentationManager(db);
        ObjectId             currentDisConfId = drm.DisplayConfigurationIdForCurrentViewport;
        DisplayConfiguration currentDisConf   = trans.GetObject(currentDisConfId, OpenMode.ForRead) as DisplayConfiguration;

        DisplayConfiguration dc = new DisplayConfiguration();

        try
        {
            DisplaySet ds = new DisplaySet();
            ds.SetToStandard(db);
            ds.SubSetDatabaseDefaults(db);

            //  top
            dc.ViewDependentCombinations.Add(new ViewDependentCombination(new Vector3d(0, 0, 1), DictionaryDisplaySet.GetStandardPlanId(db)));
            //  for bottom. No DictionaryDisplaySet.GetStandardXxxId for Plan Diagnostic, so get it from the name.
            ObjectId id = DictionaryDisplaySet.GetStandardSet("Plan Diagnostic", db);
            if (id != ObjectId.Null)
            {
                dc.ViewDependentCombinations.Add(new ViewDependentCombination(new Vector3d(0, 0, -1), id));
            }
            else  // if not found, let's use Reflected.
            {
                dc.ViewDependentCombinations.Add(new ViewDependentCombination(new Vector3d(0, 0, -1), DictionaryDisplaySet.GetStandardReflectedId(db)));  //buttom
            }
            dc.ViewDependentCombinations.Add(new ViewDependentCombination(new Vector3d(-1, 0, 0), DictionaryDisplaySet.GetStandardSectionElevId(db))); // left
            dc.ViewDependentCombinations.Add(new ViewDependentCombination(new Vector3d(1, 0, 0), DictionaryDisplaySet.GetStandardSectionElevId(db)));  // right
            dc.ViewDependentCombinations.Add(new ViewDependentCombination(new Vector3d(0, -1, 0), DictionaryDisplaySet.GetStandardSectionElevId(db))); //  front
            dc.ViewDependentCombinations.Add(new ViewDependentCombination(new Vector3d(0, 1, 0), DictionaryDisplaySet.GetStandardSectionElevId(db)));  // back

            //  try adding DefaultViewDependentViewSet here.
            dc.DefaultViewDependentViewSet = DictionaryDisplaySet.GetStandardModelId(db);

            DictionaryDisplayConfiguration dictDisplayConfigs = new DictionaryDisplayConfiguration(db);
            string newName = GetNewName();
            dictDisplayConfigs.AddNewRecord(newName, dc);
            trans.AddNewlyCreatedDBObject(dc, true);
            trans.Commit();
        }
        catch (System.Exception)
        {
            trans.Abort();
        }
        finally
        {
            trans.Dispose();
        }
        return(dc);
    }
Beispiel #23
0
        private static DisplaySet CreateFusionErrorDisplaySet(Series baseSeries, Series fusionSeries, string error)
        {
            // create a basic descriptor that's templated from the real PET fusion display descriptor
            var baseDescriptor = new PETFusionDisplaySetDescriptor(baseSeries.GetIdentifier(), fusionSeries.GetIdentifier(), IsAttenuationCorrected(fusionSeries.Sops[0]));
            var descriptor     = new BasicDisplaySetDescriptor {
                Description = baseDescriptor.Description, Name = baseDescriptor.Name, Number = baseDescriptor.Number, Uid = baseDescriptor.Uid
            };
            var displaySet = new DisplaySet(descriptor);

            displaySet.PresentationImages.Add(new ErrorPresentationImage(SR.MessageFusionError + Environment.NewLine + string.Format(SR.FormatReason, error)));
            return(displaySet);
        }
Beispiel #24
0
        /// <summary>
        /// Called to create a clipboard item representing a display set.
        /// </summary>
        /// <param name="displaySet"></param>
        /// <param name="selectionStrategy"></param>
        /// <returns></returns>
        public virtual ClipboardItem CreateDisplaySetItem(IDisplaySet displaySet, IImageSelectionStrategy selectionStrategy = null)
        {
            if (displaySet.PresentationImages.Count == 0)
            {
                throw new ArgumentException("DisplaySet must have at least one image.");
            }

            var presentationImage = displaySet.ImageBox != null &&
                                    displaySet.ImageBox.SelectedTile != null &&
                                    displaySet.ImageBox.SelectedTile.PresentationImage != null
                                                        ? displaySet.ImageBox.SelectedTile.PresentationImage
                                                        : displaySet.PresentationImages[displaySet.PresentationImages.Count / 2];

            var clientRectangle = presentationImage.ClientRectangle;

            if (clientRectangle.IsEmpty)
            {
                clientRectangle = new Rectangle(new Point(), presentationImage.SceneSize);
            }

            if (selectionStrategy == null)
            {
                if (displaySet.PresentationImages.Count == 1)
                {
                    // Add as a single image.
                    return(CreatePresentationImageItem(displaySet.PresentationImages[0]));
                }
                else
                {
                    return(CreateDisplaySetItem(displaySet.Clone(), clientRectangle));
                }
            }
            else
            {
                List <IPresentationImage> images = new List <IPresentationImage>(selectionStrategy.GetImages(displaySet));
                if (images.Count == 1)
                {
                    // Add as a single image.
                    return(CreatePresentationImageItem(images[0]));
                }
                else
                {
                    string name = String.Format("{0} - {1}", selectionStrategy.Description, displaySet.Name);
                    displaySet = new DisplaySet(name, displaySet.Uid)
                    {
                        Description = displaySet.Description, Number = displaySet.Number
                    };
                    images.ForEach(image => displaySet.PresentationImages.Add(image.Clone()));
                    return(CreateDisplaySetItem(displaySet, clientRectangle));
                }
            }
        }
Beispiel #25
0
 private void Setting_Load(object sender, EventArgs e)
 {
     try
     {
         DisplaySet.Clear();
         DisplaySet.ReadXml(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "\\弹幕姬\\Plugins\\setting.xml");
         dataGridView1.DataSource = DisplaySet;
         dataGridView1.DataMember = "event";
     }
     catch (Exception ex)
     {
         MessageBox.Show("載入預設檔失敗,請檢查插件目錄下是否存在配置文件! 詳細錯誤信息: \n" + ex.Message);
     }
 }
Beispiel #26
0
 /// <summary>
 /// 视图参数设置
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 private void dispSet_Click(object sender, RoutedEventArgs e)
 {
     if (this.ImsMap == null)
     {
         return;
     }
     if (catalog.ActiveMapDoc != null && catalog.ActiveMapDoc.Display)
     {
         if (dispOption == null)
         {
             dispOption            = new DisplaySet();
             dispOption.IMSCatalog = this.IMSCatalog;
         }
         dispOption.Show();
     }
 }
        private void TestSortingDisplaySetsBySeriesNumber(bool reverse)
        {
            DisplaySetCollection orderedCollection    = new DisplaySetCollection();
            DisplaySetCollection nonOrderedCollection = new DisplaySetCollection();

            for (int i = 1; i <= 20; ++i)
            {
                string             id         = i.ToString();
                DisplaySet         displaySet = new DisplaySet(id, id);
                ImageSop           sop        = NewImageSop(id, id, i);
                IPresentationImage image      = new DicomGrayscalePresentationImage(sop.Frames[1]);
                sop.Dispose();
                IImageSopProvider         sopProvider = (IImageSopProvider)image;
                DicomMessageSopDataSource dataSource  = ((DicomMessageSopDataSource)sopProvider.ImageSop.DataSource);
                dataSource.SourceMessage.DataSet[DicomTags.SeriesNumber].SetInt32(0, i);

                displaySet.PresentationImages.Add(image);
                orderedCollection.Add(displaySet);
            }

            Randomize(orderedCollection, nonOrderedCollection);

            Debug.WriteLine("Before Sort\n------------------------\n");
            CollectionUtils.ForEach(nonOrderedCollection, delegate(IDisplaySet displaySet) { Debug.WriteLine(String.Format("name: {0}", displaySet.Name)); });

            nonOrderedCollection.Sort(new SeriesNumberComparer(reverse));

            Debug.WriteLine("\nAfter Sort\n------------------------\n");
            CollectionUtils.ForEach(nonOrderedCollection, delegate(IDisplaySet displaySet) { Debug.WriteLine(String.Format("name: {0}", displaySet.Name)); });

            int j = reverse ? 20 : 1;

            foreach (IDisplaySet set in nonOrderedCollection)
            {
                Assert.AreEqual(j.ToString(), set.Name);
                j += reverse ? -1 : 1;
            }

            foreach (DisplaySet set in nonOrderedCollection)
            {
                set.Dispose();
            }
            foreach (DisplaySet set in orderedCollection)
            {
                set.Dispose();
            }
        }
		public override List<IDisplaySet> CreateDisplaySets(Series series)
		{
			List<IDisplaySet> displaySets = new List<IDisplaySet>();
			if (IsValidPETFusionSeries(series))
			{
				var fuseableBaseSeries = new List<Series>(FindFuseableBaseSeries(series));
				if (fuseableBaseSeries.Count > 0)
				{
					string error;
					if (!CheckPETFusionSeries(series, out error))
					{
						// if there is an error with the PET series, avoid trying to generate the volume entirely
						// instead, generate a placeholder series for each base series
						foreach (var baseSeries in fuseableBaseSeries)
							displaySets.Add(CreateFusionErrorDisplaySet(baseSeries, series, error));
						return displaySets;
					}

					using (var fusionOverlayData = new FusionOverlayData(GetFrames(series.Sops)))
					{
						foreach (var baseSeries in fuseableBaseSeries)
						{
							if (!CheckBaseSeries(baseSeries, out error))
							{
								// if there is an error with a single base series, generate a placeholder series
								displaySets.Add(CreateFusionErrorDisplaySet(baseSeries, series, error));
								continue;
							}

							var descriptor = new PETFusionDisplaySetDescriptor(baseSeries.GetIdentifier(), series.GetIdentifier(), IsAttenuationCorrected(series.Sops[0]));
							var displaySet = new DisplaySet(descriptor);
							foreach (var baseFrame in GetFrames(baseSeries.Sops))
							{
								using (var fusionOverlaySlice = fusionOverlayData.CreateOverlaySlice(baseFrame))
								{
									var fus = new FusionPresentationImage(baseFrame, fusionOverlaySlice);
									displaySet.PresentationImages.Add(fus);
								}
							}
							displaySet.PresentationImages.Sort();
							displaySets.Add(displaySet);
						}
					}
				}
			}
			return displaySets;
		}
    ////////////////////////////
    //// MATERIALS
    ////////////////////////////

    private void DisplayPropsMaterial()
    {
        Database           db    = Application.DocumentManager.MdiActiveDocument.Database;
        TransactionManager tm    = db.TransactionManager;
        Transaction        trans = db.TransactionManager.StartTransaction();

        try
        {
            Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage("=======================================\n");
            Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage("Get all the Display Properties and the Display components works with AecDbMaterialDef in ZAxis view\n");
            Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage("=======================================\n");

            DisplayRepresentationManager drm = new DisplayRepresentationManager(db);
            Viewport         vport           = new Viewport();
            BlockTableRecord btr             = (BlockTableRecord)trans.GetObject(db.CurrentSpaceId, OpenMode.ForWrite, false);
            btr.AppendEntity(vport);
            trans.AddNewlyCreatedDBObject(vport, true);
            ObjectId viewportId = vport.ObjectId;

            Vector3d   viewDirection = Vector3d.ZAxis;
            ObjectId   setId         = drm.DisplayRepresentationSet(viewportId, viewDirection);
            DisplaySet ds            = trans.GetObject(setId, OpenMode.ForWrite) as DisplaySet;
            DisplayRepresentationIdCollection repIds = ds.DisplayRepresentationIds;
            DisplayRepresentation             dr     = null;
            foreach (ObjectId repId in repIds)
            {
                dr = trans.GetObject(repId, OpenMode.ForRead) as DisplayRepresentation;
                if (dr.WorksWith.Name == "AecDbMaterialDef")
                {
                    ObjectId          dpId = dr.DefaultDisplayPropertiesId;
                    DisplayProperties dp   = trans.GetObject(dpId, OpenMode.ForWrite) as DisplayProperties;
                    ListDisplayProperties(dp);
                }
            }
        }
        catch (System.Exception e)
        {
            Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage(e.Message + "\n");
            trans.Abort();
        }
        finally
        {
            trans.Dispose();
        }
        return;
    }
        private static DisplaySet CreateDisplaySet(IEnumerable <ImageSop> sops)
        {
            var descriptor = new XDisplaySetDescriptor(CollectionUtils.FirstElement(sops).DataSource);
            var displaySet = new DisplaySet(descriptor);

            foreach (var sop in sops)
            {
                foreach (var image in PresentationImageFactory.Create(sop))
                {
                    if (image is IVoiLutProvider)
                    {
                        ((IVoiLutProvider)image).VoiLutManager.InstallVoiLut(new IdentityVoiLinearLut());
                    }
                    displaySet.PresentationImages.Add(image);
                }
            }
            return(displaySet);
        }
Beispiel #31
0
		private IImageSet CreateImageSet(string patientId, string description)
		{
			string studyInstanceUid = DicomUid.GenerateUid().UID;
			string seriesInstanceUid = DicomUid.GenerateUid().UID;
			string sopInstanceUid = DicomUid.GenerateUid().UID;

			ImageSop sop = CreateImageSop(patientId, studyInstanceUid, seriesInstanceUid, sopInstanceUid);
			DicomGrayscalePresentationImage img = new DicomGrayscalePresentationImage(sop.Frames[1]);
			sop.Dispose();

			DisplaySet displaySet = new DisplaySet(patientId, seriesInstanceUid);
			displaySet.PresentationImages.Add(img);
			ImageSet imageSet = new ImageSet();
			imageSet.PatientInfo = description;
			imageSet.DisplaySets.Add(displaySet);

			return imageSet;
		}
		public void LayoutImageBoxes()
		{
			IImageViewer viewer = new ImageViewerComponent();
			viewer.PhysicalWorkspace.SetImageBoxGrid(2, 1);

			IDisplaySet displaySet1 = new DisplaySet();
			IDisplaySet displaySet2 = new DisplaySet();
			PresentationImage image1 = new TestPresentationImage();
			PresentationImage image2 = new TestPresentationImage();
			displaySet1.PresentationImages.Add(image1);
			displaySet2.PresentationImages.Add(image2);

			viewer.PhysicalWorkspace.ImageBoxes[0].DisplaySet = displaySet1;
			viewer.PhysicalWorkspace.ImageBoxes[1].DisplaySet = displaySet2;
			viewer.PhysicalWorkspace.SetImageBoxGrid(1, 1);

			Assert.IsFalse(displaySet1.Visible);
			Assert.IsFalse(displaySet2.Visible);
		}
Beispiel #33
0
        public static IClipboardItem CreateDisplaySetItem(IDisplaySet displaySet, IImageSelectionStrategy selectionStrategy)
        {
            if (displaySet.ImageBox == null ||
                displaySet.ImageBox.SelectedTile == null ||
                displaySet.ImageBox.SelectedTile.PresentationImage == null)
            {
                throw new ArgumentException("DisplaySet must have a selected image.");
            }

            Rectangle clientRectangle = displaySet.ImageBox.SelectedTile.PresentationImage.ClientRectangle;

            if (selectionStrategy == null)
            {
                if (displaySet.PresentationImages.Count == 1)
                {
                    // Add as a single image.
                    return(CreatePresentationImageItem(displaySet.PresentationImages[0]));
                }
                else
                {
                    return(CreateDisplaySetItem(displaySet.Clone(), clientRectangle));
                }
            }
            else
            {
                List <IPresentationImage> images = new List <IPresentationImage>(selectionStrategy.GetImages(displaySet));
                if (images.Count == 1)
                {
                    // Add as a single image.
                    return(CreatePresentationImageItem(images[0]));
                }
                else
                {
                    string name = String.Format("{0} - {1}", selectionStrategy.Description, displaySet.Name);
                    displaySet = new DisplaySet(name, displaySet.Uid)
                    {
                        Description = displaySet.Description, Number = displaySet.Number
                    };
                    images.ForEach(delegate(IPresentationImage image) { displaySet.PresentationImages.Add(image.Clone()); });
                    return(CreateDisplaySetItem(displaySet, clientRectangle));
                }
            }
        }
        public void LayoutImageBoxes()
        {
            IImageViewer viewer = new ImageViewerComponent();

            viewer.PhysicalWorkspace.SetImageBoxGrid(2, 1);

            IDisplaySet       displaySet1 = new DisplaySet();
            IDisplaySet       displaySet2 = new DisplaySet();
            PresentationImage image1      = new TestPresentationImage();
            PresentationImage image2      = new TestPresentationImage();

            displaySet1.PresentationImages.Add(image1);
            displaySet2.PresentationImages.Add(image2);

            viewer.PhysicalWorkspace.ImageBoxes[0].DisplaySet = displaySet1;
            viewer.PhysicalWorkspace.ImageBoxes[1].DisplaySet = displaySet2;
            viewer.PhysicalWorkspace.SetImageBoxGrid(1, 1);

            Assert.IsFalse(displaySet1.Visible);
            Assert.IsFalse(displaySet2.Visible);
        }
Beispiel #35
0
 private void button1_Click(object sender, EventArgs e)
 {
     if (DisplaySet == null)
     {
         MessageBox.Show("當前數據内容爲空,無法保存!", "保存錯誤", MessageBoxButtons.OK, MessageBoxIcon.Information);
         return;
     }
     try
     {
         string filename             = setting_file_path;
         System.IO.FileStream stream = new System.IO.FileStream
                                           (filename, System.IO.FileMode.Create);
         DisplaySet.WriteXml(stream);
         this.DialogResult = DialogResult.OK;
         this.Close();
     }
     catch (Exception ex)
     {
         MessageBox.Show("導出設置檔失敗,原始錯誤檔如下: \n" + ex.Message);
     }
 }
Beispiel #36
0
        private IImageSet CreateImageSet(string patientId, string description)
        {
            string studyInstanceUid  = DicomUid.GenerateUid().UID;
            string seriesInstanceUid = DicomUid.GenerateUid().UID;
            string sopInstanceUid    = DicomUid.GenerateUid().UID;

            ImageSop sop = CreateImageSop(patientId, studyInstanceUid, seriesInstanceUid, sopInstanceUid);
            DicomGrayscalePresentationImage img = new DicomGrayscalePresentationImage(sop.Frames[1]);

            sop.Dispose();

            DisplaySet displaySet = new DisplaySet(patientId, seriesInstanceUid);

            displaySet.PresentationImages.Add(img);
            ImageSet imageSet = new ImageSet();

            imageSet.PatientInfo = description;
            imageSet.DisplaySets.Add(displaySet);

            return(imageSet);
        }
        /// <summary>
        /// Compares two <see cref="IDisplaySet"/>s.
        /// </summary>
        public override int Compare(IDisplaySet x, IDisplaySet y)
        {
            DisplaySet displaySet1 = x as DisplaySet;
            DisplaySet displaySet2 = y as DisplaySet;

            if (ReferenceEquals(displaySet1, displaySet2))
            {
                return(0);                //same object or both are null
            }
            //at this point, at least one of x or y is non-null and they are not the same object

            if (displaySet1 == null)
            {
                return(-ReturnValue);                // x > y (because we want x at the end for non-reverse sorting)
            }
            if (displaySet2 == null)
            {
                return(ReturnValue);                // x < y (because we want y at the end for non-reverse sorting)
            }
            return(base.Compare(GetCompareValues(displaySet1), GetCompareValues(displaySet2)));
        }
		public void TestImage()
		{
			if (ImageViewer.SelectedImageBox == null) return;

			try
			{
				var sphere = new EllipsoidPrimitive {FrontTopLeft = new Vector3D(85, 85, 85), BackBottomRight = new Vector3D(115, 115, 115), Color = Color.Yellow};

				var image = new VtkTestPresentationImage();
				image.OverlayGraphics3D.Add(sphere);

				var dset = new DisplaySet {Description = "blah", Name = "blah", Uid = Guid.NewGuid().ToString()};
				dset.PresentationImages.Add(image);

				ImageViewer.SelectedImageBox.DisplaySet = dset;
				ImageViewer.SelectedImageBox.Draw();
			}
			catch (Exception ex)
			{
				ExceptionHandler.Report(ex, Context.DesktopWindow);
			}
		}
		private static DisplaySet CreateFusionErrorDisplaySet(Series baseSeries, Series fusionSeries, string error)
		{
			// create a basic descriptor that's templated from the real PET fusion display descriptor
			var baseDescriptor = new PETFusionDisplaySetDescriptor(baseSeries.GetIdentifier(), fusionSeries.GetIdentifier(), IsAttenuationCorrected(fusionSeries.Sops[0]));
			var descriptor = new BasicDisplaySetDescriptor {Description = baseDescriptor.Description, Name = baseDescriptor.Name, Number = baseDescriptor.Number, Uid = baseDescriptor.Uid};
			var displaySet = new DisplaySet(descriptor);
			displaySet.PresentationImages.Add(new ErrorPresentationImage(SR.MessageFusionError + Environment.NewLine + string.Format(SR.FormatReason, error)));
			return displaySet;
		}
Beispiel #40
0
		/// <summary>
		/// Creates a clone of a <see cref="IPresentationImage"/> suitable for static export.
		/// </summary>
		/// <remarks>
		/// Functionally, this method is similar to <see cref="IPresentationImage.Clone"/>.
		/// However, this method also fills the <see cref="IPresentationImage.ParentDisplaySet"/>
		/// property with a static <see cref="IDisplaySet"/> instance whose properties are a snapshot
		/// of the source image's parent display set at the time the clone was created.
		/// This makes the resulting images suitable for export with features like annotation overlay
		/// enabled, as certain items (specifically, display set description and number) depend on
		/// this information.
		/// </remarks>
		/// <param name="presentationImage">The source image to be cloned.</param>
		/// <returns>A clone of the source image.</returns>
		/// <exception cref="ArgumentNullException">Thrown if <paramref name="presentationImage"/> is null.</exception>
		public static IPresentationImage ClonePresentationImage(IPresentationImage presentationImage)
		{
			Platform.CheckForNullReference(presentationImage, "presentationImage");
			var imageClone = presentationImage.Clone();
			try
			{
				var parentDisplaySet = presentationImage.ParentDisplaySet;
				if (parentDisplaySet != null)
				{
					var descriptor = parentDisplaySet.Descriptor;
					if (descriptor != null)
						parentDisplaySet = new DisplaySet(new BasicDisplaySetDescriptor {Description = descriptor.Description, Name = descriptor.Name, Number = descriptor.Number, Uid = descriptor.Uid});
					else
						parentDisplaySet = new DisplaySet(parentDisplaySet.Name, parentDisplaySet.Uid);
					parentDisplaySet.PresentationImages.Add(imageClone);
				}
			}
			catch (Exception ex)
			{
				Platform.Log(LogLevel.Debug, ex, "Failed to create a dummy parent display set for the cloned presentation image");
			}
			return imageClone;
		}
Beispiel #41
0
		/// <summary>
		/// Called to create a clipboard item representing a display set.
		/// </summary>
		/// <param name="displaySet"></param>
		/// <param name="selectionStrategy"></param>
		/// <returns></returns>
		public virtual ClipboardItem CreateDisplaySetItem(IDisplaySet displaySet, IImageSelectionStrategy selectionStrategy = null)
		{
			if (displaySet.PresentationImages.Count == 0)
				throw new ArgumentException("DisplaySet must have at least one image.");

			var presentationImage = displaySet.ImageBox != null
			                        && displaySet.ImageBox.SelectedTile != null
			                        && displaySet.ImageBox.SelectedTile.PresentationImage != null
			                        	? displaySet.ImageBox.SelectedTile.PresentationImage
			                        	: displaySet.PresentationImages[displaySet.PresentationImages.Count/2];

			var clientRectangle = presentationImage.ClientRectangle;
			if (clientRectangle.IsEmpty) clientRectangle = new Rectangle(new Point(), presentationImage.SceneSize);

			if (selectionStrategy == null)
			{
				if (displaySet.PresentationImages.Count == 1)
				{
					// Add as a single image.
					return CreatePresentationImageItem(displaySet.PresentationImages[0]);
				}
				else
				{
					return CreateDisplaySetItem(displaySet.Clone(), clientRectangle);
				}
			}
			else
			{
				List<IPresentationImage> images = new List<IPresentationImage>(selectionStrategy.GetImages(displaySet));
				if (images.Count == 1)
				{
					// Add as a single image.
					return CreatePresentationImageItem(images[0]);
				}
				else
				{
					string name = String.Format("{0} - {1}", selectionStrategy.Description, displaySet.Name);
					displaySet = new DisplaySet(name, displaySet.Uid) {Description = displaySet.Description, Number = displaySet.Number};
					images.ForEach(image => displaySet.PresentationImages.Add(image.Clone()));
					return CreateDisplaySetItem(displaySet, clientRectangle);
				}
			}
		}
        public static void AddKeyImage(IPresentationImage image)
        {
            Platform.CheckForNullReference(image, "image");
            Platform.CheckForNullReference(image.ImageViewer, "image.ImageViewer");

            if (!PermissionsHelper.IsInRole(AuthorityTokens.KeyImages))
                throw new PolicyException(SR.ExceptionCreateKeyImagePermissionDenied);

            var sopProvider = image as IImageSopProvider;
            if (sopProvider == null)
                throw new ArgumentException("The image must be an IImageSopProvider.", "image");

            IDisplaySet displaySet = null;

            foreach (var set in image.ImageViewer.LogicalWorkspace.ImageSets)
            {
                if (set.Descriptor.Equals(image.ParentDisplaySet.ParentImageSet.Descriptor))
                {
                    foreach (var d in set.DisplaySets)
                    {
                        var displaySetDescriptor = d.Descriptor as KeyImageDisplaySetDescriptor;

                        if (displaySetDescriptor != null
                            &&
                            displaySetDescriptor.SourceStudy.StudyInstanceUid.Equals(sopProvider.Sop.StudyInstanceUid))
                        {
                            displaySet = d;
                            break;
                        }
                    }

                    break;
                }
            }

            if (displaySet == null)
            {
                var displaySetDescriptor = new KeyImageDisplaySetDescriptor(new StudyIdentifier(sopProvider.ImageSop));
                displaySet = new DisplaySet(displaySetDescriptor);
                bool displaySetAdded = false;
                foreach (var imageSet in image.ImageViewer.LogicalWorkspace.ImageSets)
                {
                    if (imageSet.Descriptor.Equals(image.ParentDisplaySet.ParentImageSet.Descriptor))
                    {
                        imageSet.DisplaySets.Add(displaySet);
                        displaySetAdded = true;
                        break;
                    }
                }
                if (!displaySetAdded)
                {
                    throw new ApplicationException(SR.MessageCreateKeyImageFailed);
                }
            }

            var presentationImage = image.CreateFreshCopy();
            
            var presentationState = DicomSoftcopyPresentationState.Create(image);
            var basicImage = presentationImage as BasicPresentationImage;
            if (basicImage != null)
                basicImage.PresentationState = presentationState;

            displaySet.PresentationImages.Add(presentationImage);

            foreach (var imageBox in image.ImageViewer.PhysicalWorkspace.ImageBoxes)
            {
                if (imageBox.DisplaySet != null && imageBox.DisplaySet.Descriptor.Uid == displaySet.Descriptor.Uid)
                {
                    var physicalImage = presentationImage.CreateFreshCopy();

                    presentationState = DicomSoftcopyPresentationState.Create(image);
                    basicImage = physicalImage as BasicPresentationImage;
                    if (basicImage != null)
                        basicImage.PresentationState = presentationState;

                    imageBox.DisplaySet.PresentationImages.Add(physicalImage);

                    imageBox.Draw();
                }
            }
        }