Products | Support | Email a link to this topic. | Send comments on this topic. | Back to Introduction - All Topics | Help Version 19.0.12.8
|
Leadtools.MedicalViewer Namespace : MedicalViewerPanoramicCell Class |
The user cannot draw the MedicalViewerMPRPolygon to:
Imports Leadtools Imports Leadtools.Dicom Imports Leadtools.Medical3D Imports Leadtools.Codecs Imports Leadtools.MedicalViewer Imports Leadtools.Annotations.Core Imports Leadtools.Annotations.Designers Imports Leadtools.ImageProcessing.Core Private Class MedicalViewerMPRPolygonForm : Inherits Form Private _medicalViewer As MedicalViewer Private _seriesManager As MedicalViewerSeriesManager Private Sub MedicalViewer_SizeChanged(ByVal sender As Object, ByVal e As EventArgs) _medicalViewer.Size = New Size(Me.ClientRectangle.Right, Me.ClientRectangle.Bottom) End Sub Public Sub New(ByVal output As MedicalViewerSeriesManager) DicomEngine.Startup() Dim _codecs As RasterCodecs = New RasterCodecs() AddHandler SizeChanged, AddressOf MedicalViewer_SizeChanged ' Create the medical viewer and adjust the size and the location. _medicalViewer = New MedicalViewer(1, 2) _medicalViewer.Location = New Point(0, 0) _medicalViewer.Size = New Size(Me.ClientRectangle.Right, Me.ClientRectangle.Bottom) _seriesManager = output Dim cell As MedicalViewerMultiCell = New MedicalViewerMultiCell(Nothing, True, 1, 1) Dim index As Integer Dim count As Integer = output.Stacks(0).Items.Count Dim codecsInformation As CodecsImageInfo Dim imageInformation As MedicalViewerImageInformation() = New MedicalViewerImageInformation(count - 1) {} index = 0 Do While index < count codecsInformation = _codecs.GetInformation(CStr(output.Stacks(0).Items(index).Data), True) imageInformation(index) = New MedicalViewerImageInformation() imageInformation(index).ImageHeight = codecsInformation.Width imageInformation(index).ImageWidth = codecsInformation.Width imageInformation(index).XResolution = codecsInformation.XResolution imageInformation(index).YResolution = codecsInformation.YResolution index += 1 Loop AddHandler cell.FramesRequested, AddressOf cell_FramesRequested AddHandler FormClosing, AddressOf MedicalViewerLocalizer_FormClosing cell.EnableLowMemoryUsage(2, count, imageInformation) _medicalViewer.Cells.Add(cell) ' add some actions that will be used to change the properties of the images inside the control. cell.AddAction(MedicalViewerActionType.WindowLevel) cell.AddAction(MedicalViewerActionType.Alpha) cell.AddAction(MedicalViewerActionType.Offset) ' assign the added actions to a mouse button, meaning that when the user clicks and drags the mouse button, the associated action will be activated. cell.SetAction(MedicalViewerActionType.WindowLevel, MedicalViewerMouseButtons.Left, MedicalViewerActionFlags.Active) cell.SetAction(MedicalViewerActionType.Alpha, MedicalViewerMouseButtons.Middle, MedicalViewerActionFlags.Active) cell.SetAction(MedicalViewerActionType.Offset, MedicalViewerMouseButtons.Right, MedicalViewerActionFlags.Active) cell.ReferenceLine.Enabled = True cell.ReferenceLine.Color = Color.Yellow cell.ShowCellBoundaries = True ' adjust some properties of the cell and add some tags. _medicalViewer.Cells(0).SetTag(2, MedicalViewerTagAlignment.TopLeft, MedicalViewerTagType.UserData, "EX. ID 230-36-5448") _medicalViewer.Cells(0).SetTag(4, MedicalViewerTagAlignment.TopLeft, MedicalViewerTagType.Frame) _medicalViewer.Cells(0).SetTag(6, MedicalViewerTagAlignment.TopLeft, MedicalViewerTagType.Scale) _medicalViewer.Cells(0).SetTag(2, MedicalViewerTagAlignment.BottomLeft, MedicalViewerTagType.WindowLevelData) _medicalViewer.Cells(0).SetTag(1, MedicalViewerTagAlignment.BottomLeft, MedicalViewerTagType.FieldOfView) cell.PixelSpacing = output.Stacks(0).PixelSpacing index = 0 Do While index < count cell.SetImagePosition(index, output.Stacks(0).Items(index).ImagePosition, (index = count - 1)) index += 1 Loop cell.ImageOrientation = output.Stacks(0).Items(0).ImageOrientationArray cell.FrameOfReferenceUID = output.Stacks(0).Items(0).FrameOfReferenceUID Dim width As Integer = cell.VirtualImage(cell.ActiveSubCell).Image.Width Dim height As Integer = cell.VirtualImage(cell.ActiveSubCell).Image.Height Controls.Add(_medicalViewer) _medicalViewer.Dock = DockStyle.Fill DicomEngine.Shutdown() ' create a new polygon Dim polygon As MedicalViewerMPRPolygon = New MedicalViewerMPRPolygon() ' set some point, here we created a polygon that resembles a rectangle with a missing bottom line. polygon.Points.Add(New PointF(width * 1 \ 4, height * 3 \ 4)) polygon.Points.Add(New PointF(width * 1 \ 4, height * 1 \ 4)) polygon.Points.Add(New PointF(width * 3 \ 4, height * 1 \ 4)) polygon.Points.Add(New PointF(width * 3 \ 4, height * 3 \ 4)) ' now add this polygon you prepared to the cell. cell.Polygons.Add(polygon) ' This event is important, because it's used to request the data that is need to create the internal panoramic data. AddHandler cell.PanoramicDataRequested, AddressOf cell_PanoramicDataRequested ' This event communicate with the Medical3D dll which contains all the internal panormaic calculations. AddHandler cell.Data3DRequested, AddressOf cell_Data3DRequested ' Dispose the internal data automatically if the use decided to delete the polygon. cell.AutoDisposeInternalData = True ' register the polygon click AddHandler cell.MPRPolygonClicked, AddressOf cell_MPRPolygonClicked CreatePanoramicCell(cell, polygon) polygon.Recalculate() End Sub Private Sub cell_Data3DRequested(ByVal sender As Object, ByVal e As MedicalViewerData3DRequestedEventArgs) e.Succeed = Medical3DEngine.Provide3DInformation(e) End Sub Private Sub CreatePanoramicCell(ByVal cellSource As MedicalViewerMultiCell, ByVal polygon As MedicalViewerMPRPolygon) ' create a new panoramic cell assigned to the polygon you created. Dim cell As MedicalViewerPanoramicCell = New MedicalViewerPanoramicCell(polygon) ' add some action, not necessary though. cell.AddAction(MedicalViewerActionType.WindowLevel) cell.AddAction(MedicalViewerActionType.Scale) cell.AddAction(MedicalViewerActionType.Offset) cell.AddAction(MedicalViewerActionType.Stack) cell.SetAction(MedicalViewerActionType.Offset, MedicalViewerMouseButtons.Right, MedicalViewerActionFlags.AllCells Or MedicalViewerActionFlags.RealTime) cell.SetAction(MedicalViewerActionType.Stack, MedicalViewerMouseButtons.Wheel, MedicalViewerActionFlags.Active) cell.SetAction(MedicalViewerActionType.Scale, MedicalViewerMouseButtons.Middle, MedicalViewerActionFlags.Active) ' Add the panoramic cell the viewer. _medicalViewer.Cells.Add(cell) ' Create a paraxial cell, and assign it to the polygon you just created. Dim paraxialCell As MedicalViewerParaxialCutCell = New MedicalViewerParaxialCutCell(polygon, 0) ' set the distance and the length of the paraxial cuts. paraxialCell.ParaxialDistance = 20 paraxialCell.ParaxialLength = 200 ' Add the paraxial cuts to the viewer. _medicalViewer.Cells.Add(paraxialCell) End Sub Private Sub cell_MPRPolygonClicked(ByVal sender As Object, ByVal e As MedicalViewerMPRPolygonClickedEventsArgs) Dim cell As MedicalViewerMultiCell = CType(sender, MedicalViewerMultiCell) Dim paraxialCell As MedicalViewerParaxialCutCell = CType(_medicalViewer.Cells(2), MedicalViewerParaxialCutCell) ' if the user clicks on other polygon lines, the paraxial cut will be assigned to that line If (e.Button = MouseButtons.Left) AndAlso e.Type = MedicalViewerMPRPolygonHitTest.Body Then paraxialCell.PolygonLineIndex = e.Index End If End Sub Private Sub cell_PanoramicDataRequested(ByVal sender As Object, ByVal e As MedicalViewerPanoramicDataRequestedEventArgs) ' get the cell that requested the MPR data. Dim cell As MedicalViewerMultiCell = CType(sender, MedicalViewerMultiCell) ' instantiate a new raster codecs, which will be used to load the requested image. Dim _codecs As RasterCodecs = New RasterCodecs() ' the file name of the images loaded in the original cell. Dim fileName As String = CStr(_seriesManager.Stacks(0).Items(e.FrameIndex).Data) ' load the image and set it to e.Frame. e.Frame = _codecs.Load(fileName, 0, CodecsLoadByteOrder.BgrOrGrayOrRomm, e.FrameIndex + 1, e.FrameIndex + 1) End Sub Private Sub MedicalViewerLocalizer_FormClosing(ByVal sender As Object, ByVal e As FormClosingEventArgs) End Sub Private Sub cell_FramesRequested(ByVal sender As Object, ByVal e As MedicalViewerRequestedFramesInformationEventArgs) Dim cell As MedicalViewerMultiCell = CType(sender, MedicalViewerMultiCell) Dim _codecs As RasterCodecs = New RasterCodecs() Dim i As Integer Dim image As RasterImage Dim fileName As String If e.RequestedFramesIndexes.Length > 0 Then fileName = CStr(_seriesManager.Stacks(0).Items(e.RequestedFramesIndexes(0)).Data) image = _codecs.Load(fileName) Else Return End If i = 1 Do While i < e.RequestedFramesIndexes.Length fileName = CStr(_seriesManager.Stacks(0).Items(e.RequestedFramesIndexes(i)).Data) image.AddPage(_codecs.Load(fileName)) i += 1 Loop cell.SetRequestedImage(image, e.RequestedFramesIndexes, MedicalViewerSetImageOptions.Insert) End Sub Public ReadOnly Property Viewer() As MedicalViewer Get Return _medicalViewer End Get End Property End Class Private Function GetMedicalViewerMPRPolygonForm() As MedicalViewerMPRPolygonForm Dim form As MedicalViewerSeriesManagerFrom = New MedicalViewerSeriesManagerFrom() Dim output As MedicalViewerSeriesManager = form.LoadJamesHead() Return New MedicalViewerMPRPolygonForm(output) End Function ' This example changes the default window level value by decrease the width by 100. Then resets the images based on the new value. <TestMethod()> _ Public Sub MedicalViewerMPRPolygonExample() Dim myForm As MedicalViewerMPRPolygonForm = GetMedicalViewerMPRPolygonForm() Dim medicalViewer As MedicalViewer = myForm.Viewer myForm.ShowDialog() End Sub
using Leadtools; using Leadtools.Dicom; using Leadtools.Medical3D; using Leadtools.Codecs; using Leadtools.MedicalViewer; using Leadtools.ImageProcessing; using Leadtools.ImageProcessing.Core; using Leadtools.ImageProcessing.Color; using Leadtools.Annotations.Core; using Leadtools.Annotations.Designers; class MedicalViewerMPRPolygonForm : Form { private MedicalViewer _medicalViewer; private MedicalViewerSeriesManager _seriesManager; void MedicalViewerLocalizer_SizeChanged(object sender, EventArgs e) { _medicalViewer.Size = new Size(this.ClientRectangle.Right, this.ClientRectangle.Bottom); } public MedicalViewerMPRPolygonForm(MedicalViewerSeriesManager output) { DicomEngine.Startup(); RasterCodecs _codecs = new RasterCodecs(); this.SizeChanged += new EventHandler(MedicalViewerLocalizer_SizeChanged); // Create the medical viewer and adjust the size and the location. _medicalViewer = new MedicalViewer(1, 2); _medicalViewer.Location = new Point(0, 0); _medicalViewer.Size = new Size(this.ClientRectangle.Right, this.ClientRectangle.Bottom); _seriesManager = output; MedicalViewerMultiCell cell = new MedicalViewerMultiCell(null, true, 1, 1); int index; int count = output.Stacks[0].Items.Count; CodecsImageInfo codecsInformation; MedicalViewerImageInformation[] imageInformation = new MedicalViewerImageInformation[count]; for (index = 0; index < count; index++) { codecsInformation = _codecs.GetInformation((string)(output.Stacks[0].Items[index].Data), true); imageInformation[index] = new MedicalViewerImageInformation(); imageInformation[index].ImageHeight = codecsInformation.Width; imageInformation[index].ImageWidth = codecsInformation.Width; imageInformation[index].XResolution = codecsInformation.XResolution; imageInformation[index].YResolution = codecsInformation.YResolution; } cell.FramesRequested += new EventHandler<MedicalViewerRequestedFramesInformationEventArgs>(cell_FramesRequested); FormClosing += new FormClosingEventHandler(MedicalViewerLocalizer_FormClosing); cell.EnableLowMemoryUsage(2, count, imageInformation); _medicalViewer.Cells.Add(cell); // add some actions that will be used to change the properties of the images inside the control. cell.AddAction(MedicalViewerActionType.WindowLevel); cell.AddAction(MedicalViewerActionType.Alpha); cell.AddAction(MedicalViewerActionType.Offset); // assign the added actions to a mouse button, meaning that when the user clicks and drags the mouse button, the associated action will be activated. cell.SetAction(MedicalViewerActionType.WindowLevel, MedicalViewerMouseButtons.Left, MedicalViewerActionFlags.Active); cell.SetAction(MedicalViewerActionType.Alpha, MedicalViewerMouseButtons.Middle, MedicalViewerActionFlags.Active); cell.SetAction(MedicalViewerActionType.Offset, MedicalViewerMouseButtons.Right, MedicalViewerActionFlags.Active); cell.ReferenceLine.Enabled = true; cell.ReferenceLine.Color = Color.Yellow; cell.ShowCellBoundaries = true; // adjust some properties of the cell and add some tags. _medicalViewer.Cells[0].SetTag(2, MedicalViewerTagAlignment.TopLeft, MedicalViewerTagType.UserData, "EX. ID 230-36-5448"); _medicalViewer.Cells[0].SetTag(4, MedicalViewerTagAlignment.TopLeft, MedicalViewerTagType.Frame); _medicalViewer.Cells[0].SetTag(6, MedicalViewerTagAlignment.TopLeft, MedicalViewerTagType.Scale); _medicalViewer.Cells[0].SetTag(2, MedicalViewerTagAlignment.BottomLeft, MedicalViewerTagType.WindowLevelData); _medicalViewer.Cells[0].SetTag(1, MedicalViewerTagAlignment.BottomLeft, MedicalViewerTagType.FieldOfView); cell.PixelSpacing = output.Stacks[0].PixelSpacing; for (index = 0; index < count; index++) { cell.SetImagePosition(index, output.Stacks[0].Items[index].ImagePosition, (index == count - 1)); } cell.ImageOrientation = output.Stacks[0].Items[0].ImageOrientationArray; cell.FrameOfReferenceUID = output.Stacks[0].Items[0].FrameOfReferenceUID; int width = cell.VirtualImage[cell.ActiveSubCell].Image.Width; int height = cell.VirtualImage[cell.ActiveSubCell].Image.Height; Controls.Add(_medicalViewer); _medicalViewer.Dock = DockStyle.Fill; DicomEngine.Shutdown(); // create a new polygon MedicalViewerMPRPolygon polygon = new MedicalViewerMPRPolygon(); // set some point, here we created a polygon that resembles a rectangle with a missing bottom line. polygon.Points.Add(new PointF(width * 1 / 4, height * 3 / 4)); polygon.Points.Add(new PointF(width * 1 / 4, height * 1 / 4)); polygon.Points.Add(new PointF(width * 3 / 4, height * 1 / 4)); polygon.Points.Add(new PointF(width * 3 / 4, height * 3 / 4)); // now add this polygon you prepared to the cell. cell.Polygons.Add(polygon); // This event is important, because it's used to request the data that is need to create the internal panoramic data. cell.PanoramicDataRequested += new EventHandler<MedicalViewerPanoramicDataRequestedEventArgs>(cell_PanoramicDataRequested); // This event communicate with the Medical3D dll which contains all the internal panormaic calculations. cell.Data3DRequested += new EventHandler<MedicalViewerData3DRequestedEventArgs>(cell_Data3DRequested); // Dispose the internal data automatically if the use decided to delete the polygon. cell.AutoDisposeInternalData = true; // register the polygon click cell.MPRPolygonClicked += new EventHandler<MedicalViewerMPRPolygonClickedEventsArgs>(cell_MPRPolygonClicked); CreatePanoramicCell(cell, polygon); polygon.Recalculate(); } void cell_Data3DRequested(object sender, MedicalViewerData3DRequestedEventArgs e) { e.Succeed = Medical3DEngine.Provide3DInformation(e); } void CreatePanoramicCell(MedicalViewerMultiCell cellSource, MedicalViewerMPRPolygon polygon) { // create a new panoramic cell assigned to the polygon you created. MedicalViewerPanoramicCell cell = new MedicalViewerPanoramicCell(polygon); // add some action, not necessary though. cell.AddAction(MedicalViewerActionType.WindowLevel); cell.AddAction(MedicalViewerActionType.Scale); cell.AddAction(MedicalViewerActionType.Offset); cell.AddAction(MedicalViewerActionType.Stack); cell.SetAction(MedicalViewerActionType.Offset, MedicalViewerMouseButtons.Right, MedicalViewerActionFlags.AllCells | MedicalViewerActionFlags.RealTime); cell.SetAction(MedicalViewerActionType.Stack, MedicalViewerMouseButtons.Wheel, MedicalViewerActionFlags.Active); cell.SetAction(MedicalViewerActionType.Scale, MedicalViewerMouseButtons.Middle, MedicalViewerActionFlags.Active); // Add the panoramic cell the viewer. _medicalViewer.Cells.Add(cell); // Create a paraxial cell, and assign it to the polygon you just created. MedicalViewerParaxialCutCell paraxialCell = new MedicalViewerParaxialCutCell (polygon, 0); // set the distance and the length of the paraxial cuts. paraxialCell.ParaxialDistance = 20; paraxialCell.ParaxialLength = 200; // Add the paraxial cuts to the viewer. _medicalViewer.Cells.Add(paraxialCell); } void cell_MPRPolygonClicked(object sender, MedicalViewerMPRPolygonClickedEventsArgs e) { MedicalViewerMultiCell cell = (MedicalViewerMultiCell)sender; MedicalViewerParaxialCutCell paraxialCell = (MedicalViewerParaxialCutCell)_medicalViewer.Cells[2]; // if the user clicks on other polygon lines, the paraxial cut will be assigned to that line if ((e.Button == MouseButtons.Left) && e.Type == MedicalViewerMPRPolygonHitTest.Body) { paraxialCell.PolygonLineIndex = e.Index; } } void cell_PanoramicDataRequested(object sender, MedicalViewerPanoramicDataRequestedEventArgs e) { // get the cell that requested the MPR data. MedicalViewerMultiCell cell = (MedicalViewerMultiCell)sender; // instantiate a new raster codecs, which will be used to load the requested image. RasterCodecs _codecs = new RasterCodecs(); // the file name of the images loaded in the original cell. String fileName = (string)(_seriesManager.Stacks[0].Items[e.FrameIndex].Data); // load the image and set it to e.Frame. e.Frame = _codecs.Load(fileName, 0, CodecsLoadByteOrder.BgrOrGrayOrRomm, e.FrameIndex + 1, e.FrameIndex + 1); } void MedicalViewerLocalizer_FormClosing(object sender, FormClosingEventArgs e) { } void cell_FramesRequested(object sender, MedicalViewerRequestedFramesInformationEventArgs e) { MedicalViewerMultiCell cell = (MedicalViewerMultiCell)(sender); RasterCodecs _codecs = new RasterCodecs(); int i; RasterImage image; string fileName; if (e.RequestedFramesIndexes.Length > 0) { fileName = (string)(_seriesManager.Stacks[0].Items[e.RequestedFramesIndexes[0]].Data); image = _codecs.Load(fileName); } else return; for (i = 1; i < e.RequestedFramesIndexes.Length; i++) { fileName = (string)(_seriesManager.Stacks[0].Items[e.RequestedFramesIndexes[i]].Data); image.AddPage(_codecs.Load(fileName)); } cell.SetRequestedImage(image, e.RequestedFramesIndexes, MedicalViewerSetImageOptions.Insert); } public MedicalViewer Viewer { get { return _medicalViewer; } } } MedicalViewerMPRPolygonForm GetMedicalViewerMPRPolygonForm() { MedicalViewerSeriesManagerFrom form = new MedicalViewerSeriesManagerFrom(); MedicalViewerSeriesManager output = form.LoadJamesHead(); return new MedicalViewerMPRPolygonForm(output); } // This example changes the default window level value by decrease the width by 100. Then resets the images based on the new value. [TestMethod] public void MedicalViewerMPRPolygonExample() { MedicalViewerMPRPolygonForm myForm = GetMedicalViewerMPRPolygonForm(); MedicalViewer medicalViewer = myForm.Viewer; myForm.ShowDialog(); }