MedicalViewerCellRequested Event

Summary
Occurs when a Leadtools.MedicalViewer.MedicalViewerMultiCell is needed to display a series images and the value of ViewerControl is null (Nothing in VB)
Syntax
C#
VB
C++
public event EventHandler<MedicalViewerCellRequestedEventArgs> MedicalViewerCellRequested 
  
Public Event MedicalViewerCellRequested As EventHandler(Of MedicalViewerCellRequestedEventArgs) 
public: 
event EventHandler<MedicalViewerCellRequestedEventArgs^>^ MedicalViewerCellRequested 
Event Data

The event handler receives an argument of type MedicalViewerCellRequestedEventArgs containing data related to this event. The following MedicalViewerCellRequestedEventArgs properties provide information specific to this event.

PropertyDescription
SeriesInstanceUID Gets the Series Instance UID for the images to be loaded in the cell.
StudyInstanceUID Gets the Study Instance UID for the images to be loaded in the cell.
ViewerCell Gets or sets the cell that will load the series.
Remarks

The user must register to this event and provide a Leadtools.MedicalViewer.MedicalViewerMultiCell control if no value is set in the ViewerControl otherwise the LoadSeries(String,String) will fail and throw an exception.

Example
C#
VB
using LeadtoolsExamples.Common; 
using Leadtools; 
using Leadtools.Codecs; 
using Leadtools.Dicom; 
using Leadtools.MedicalViewer; 
using Leadtools.Dicom.Scu.Common; 
using Leadtools.ImageProcessing; 
using Leadtools.Dicom.AddIn.Common; 
using Leadtools.Dicom.Scu; 
using Leadtools.Medical.Workstation.Client; 
using Leadtools.Medical.Workstation.Client.Pacs; 
using Leadtools.Medical.Workstation.Loader; 
 
 
MedicalViewer viewer = new MedicalViewer(); 
public void LoadSeries() 
{ 
   Leadtools.Examples.Support.SetLicense(); 
 
   AeInfo clientInfo = new AeInfo(); 
 
   clientInfo.Address = Dns.GetHostName(); 
   clientInfo.Port = 1000; 
   clientInfo.AETitle = "TEST_CLIENT"; 
 
   DicomScp serverInfo = new DicomScp(); 
   serverInfo.AETitle = "LEAD_SERVER"; 
   serverInfo.Port = 104; 
   serverInfo.PeerAddress = GetLocalServerAddress(); 
   serverInfo.Timeout = 30; 
 
   PacsQueryClient queryClient = new PacsQueryClient(clientInfo, serverInfo); 
 
   DicomDataSet[] queryResult = queryClient.FindSeries(new FindQuery()); 
 
   if (queryResult.Length > 0) 
   { 
      PacsRetrieveClient retrieveClient = new PacsRetrieveClient(clientInfo, serverInfo); 
 
 
      //make sure you have configured the workstation database correctly for the PacsRetrieveClient to store the images. 
      retrieveClient.StoreRetrievedImages = true; //we want to store the images locally so we can view them later. 
 
      MedicalViewerLoader loader = new MedicalViewerLoader(retrieveClient); 
 
      loader.ViewerControl = viewer; 
      loader.Layout.Auto = true; 
      loader.LazyLoading = true; //this will cause to load the images for displayed sub-cells only 
      loader.ViewerPreLoadedImages = 1; //this will allow to load 1 image after and before the displayed sub-cell for fast scrolling. 
 
      loader.ProgressState += new ProgressEventHandler(loader_ProgressState); 
      loader.RequestedImageUpdated += new EventHandler<RequestedImageUpdatedEventArgs>(loader_RequestedImageUpdated); 
 
      string studyInstanceUID = queryResult[0].GetValue<string>(DicomTag.StudyInstanceUID, string.Empty); 
      string seriesInstanceUID = queryResult[0].GetValue<string>(DicomTag.SeriesInstanceUID, string.Empty); 
 
      if (loader.LoadSeries(studyInstanceUID, seriesInstanceUID)) 
      { 
         Console.WriteLine("Number of viewer cells: {0}", viewer.Cells.Count); 
         Console.WriteLine("Number of loader created cells: {0}", loader.SeriesCells.Length); 
 
         foreach (MedicalViewerMultiCell cell in loader.FindSeriesCells(seriesInstanceUID)) 
         { 
            string sopInstanceUID = loader.FindDisplayedCellInstanceInformation(cell, 0).SOPInstanceUID; 
 
            Console.WriteLine("Cell #{0} has first image with SOPInstanceUID={1}", viewer.Cells.IndexOf(cell), sopInstanceUID); 
 
 
            DicomDataSet ds = loader.GetDicom(sopInstanceUID); 
            DicomElement imageElement = ds.FindFirstElement(null, DicomTag.PixelData, true); 
 
            if (null != imageElement && imageElement.Length > 0) 
            { 
               using (RasterCodecs codec = new RasterCodecs()) 
               { 
                  using (RasterImage image = ds.GetImage(imageElement, 0, 24, RasterByteOrder.Gray, DicomGetImageFlags.AutoApplyModalityLut | DicomGetImageFlags.AutoApplyVoiLut)) 
                  { 
                     codec.Save(image, Path.Combine(LEAD_VARS.ImagesDir, sopInstanceUID), RasterImageFormat.Jpeg, image.BitsPerPixel); 
 
                     Console.WriteLine("Image with SOPInstanceUID={0} saved to {1}", sopInstanceUID, Path.Combine(LEAD_VARS.ImagesDir, sopInstanceUID)); 
                  } 
               } 
            } 
 
            string[] imagesPath = loader.GetSeriesImages(cell); 
 
            Console.WriteLine("Cell #{0} is loaded from {1} file(s):", viewer.Cells.IndexOf(cell), imagesPath.Length); 
 
            foreach (string imagePath in imagesPath) 
            { 
               Console.WriteLine(imagesPath); 
            } 
         } 
      } 
 
      loader.Close(); 
   } 
} 
 
void loader_RequestedImageUpdated(object sender, RequestedImageUpdatedEventArgs e) 
{ 
   Console.WriteLine("Image streamer for cell {0}, sub-cell {1}", viewer.Cells.IndexOf(e.Cell), e.SubCellIndex); 
} 
 
void loader_ProgressState(object sender, ProgressEventArgs e) 
{ 
   Console.WriteLine(e.Message); 
} 
 
public IPAddress GetLocalServerAddress() 
{ 
   IPAddress[] addresses; 
 
   //you can use any IP address which a DICOM server is listening to. 
   addresses = Dns.GetHostAddresses(Dns.GetHostName()); 
 
   foreach (IPAddress address in addresses) 
   { 
      if (address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) 
      { 
         return address; 
      } 
   } 
 
   throw new InvalidOperationException("No IP Address V4 found for this machine."); 
} 
 
static class LEAD_VARS 
{ 
   public const string ImagesDir = @"C:\LEADTOOLS21\Resources\Images"; 
} 
Imports LeadtoolsExamples.Common 
Imports Leadtools 
Imports Leadtools.Codecs 
Imports Leadtools.Dicom 
Imports Leadtools.MedicalViewer 
Imports Leadtools.Dicom.Scu.Common 
Imports Leadtools.ImageProcessing 
Imports Leadtools.Dicom.AddIn.Common 
Imports Leadtools.Dicom.Scu 
Imports Leadtools.Medical.Workstation.Client 
Imports Leadtools.Medical.Workstation.Client.Pacs 
Imports Leadtools.Medical.Workstation.Loader 
 
 
Private viewer As New MedicalViewer() 
Public Sub LoadSeries() 
   Leadtools.Examples.Support.SetLicense() 
   Dim clientInfo As New AeInfo() 
   clientInfo.Address = Dns.GetHostName() 
   clientInfo.Port = 1000 
   clientInfo.AETitle = "TEST_CLIENT" 
 
   Dim serverInfo As New DicomScp() 
   serverInfo.AETitle = "LEAD_SERVER" 
   serverInfo.Port = 104 
   serverInfo.PeerAddress = GetLocalServerAddress() 
   serverInfo.Timeout = 30 
 
   Dim queryClient As New PacsQueryClient(clientInfo, serverInfo) 
 
   Dim queryResult() As DicomDataSet = queryClient.FindSeries(New FindQuery()) 
 
   If queryResult.Length > 0 Then 
      Dim retrieveClient As New PacsRetrieveClient(clientInfo, serverInfo) 
 
 
      'make sure you have configured the workstation database correctly for the PacsRetrieveClient to store the images. 
      retrieveClient.StoreRetrievedImages = True 'we want to store the images locally so we can view them later. 
 
      Dim loader As New MedicalViewerLoader(retrieveClient) 
 
      loader.ViewerControl = viewer 
      loader.Layout.Auto = True 
      loader.LazyLoading = True 'this will cause to load the images for displayed sub-cells only 
      loader.ViewerPreLoadedImages = 1 'this will allow to load 1 image after and before the displayed sub-cell for fast scrolling. 
 
      AddHandler loader.ProgressState, AddressOf loader_ProgressState 
      AddHandler loader.RequestedImageUpdated, AddressOf loader_RequestedImageUpdated 
 
      Dim studyInstanceUID As String = queryResult(0).GetValue(Of String)(DicomTag.StudyInstanceUID, String.Empty) 
      Dim seriesInstanceUID As String = queryResult(0).GetValue(Of String)(DicomTag.SeriesInstanceUID, String.Empty) 
 
      If loader.LoadSeries(studyInstanceUID, seriesInstanceUID) Then 
         Console.WriteLine("Number of viewer cells: {0}", viewer.Cells.Count) 
         Console.WriteLine("Number of loader created cells: {0}", loader.SeriesCells.Length) 
 
         For Each cell As MedicalViewerMultiCell In loader.FindSeriesCells(seriesInstanceUID) 
            Dim sopInstanceUID As String = loader.FindDisplayedCellInstanceInformation(cell, 0).SOPInstanceUID 
 
            Console.WriteLine("Cell #{0} has first image with SOPInstanceUID={1}", viewer.Cells.IndexOf(cell), sopInstanceUID) 
 
 
            Dim ds As DicomDataSet = loader.GetDicom(sopInstanceUID) 
            Dim imageElement As DicomElement = ds.FindFirstElement(Nothing, DicomTag.PixelData, True) 
 
            If Nothing IsNot imageElement AndAlso imageElement.Length > 0 Then 
               Using codec As New RasterCodecs() 
                  Using image As RasterImage = ds.GetImage(imageElement, 0, 24, RasterByteOrder.Gray, DicomGetImageFlags.AutoApplyModalityLut Or DicomGetImageFlags.AutoApplyVoiLut) 
                     codec.Save(image, Path.Combine(LEAD_VARS.ImagesDir, sopInstanceUID), RasterImageFormat.Jpeg, image.BitsPerPixel) 
 
                     Console.WriteLine("Image with SOPInstanceUID={0} saved to {1}", sopInstanceUID, Path.Combine(LEAD_VARS.ImagesDir, sopInstanceUID)) 
                  End Using 
               End Using 
            End If 
 
            Dim imagesPath() As String = loader.GetSeriesImages(cell) 
 
            Console.WriteLine("Cell #{0} is loaded from {1} file(s):", viewer.Cells.IndexOf(cell), imagesPath.Length) 
 
            For Each imagePath As String In imagesPath 
               Console.WriteLine(imagesPath) 
            Next imagePath 
         Next cell 
      End If 
 
      loader.Close() 
   End If 
End Sub 
 
Private Sub loader_RequestedImageUpdated(ByVal sender As Object, ByVal e As RequestedImageUpdatedEventArgs) 
   Console.WriteLine("Image streamer for cell {0}, sub-cell {1}", viewer.Cells.IndexOf(e.Cell), e.SubCellIndex) 
End Sub 
 
Private Sub loader_ProgressState(ByVal sender As Object, ByVal e As ProgressEventArgs) 
   Console.WriteLine(e.Message) 
End Sub 
 
Public Function GetLocalServerAddress() As IPAddress 
   Dim addresses() As IPAddress 
 
   'you can use any IP address which a DICOM server is listning to. 
   addresses = Dns.GetHostAddresses(Dns.GetHostName()) 
 
   For Each address As IPAddress In addresses 
      If address.AddressFamily = System.Net.Sockets.AddressFamily.InterNetwork Then 
         Return address 
      End If 
   Next address 
 
   Throw New InvalidOperationException("No IP Address V4 found for this machine.") 
End Function 
 
Public NotInheritable Class LEAD_VARS 
   Public Const ImagesDir As String = "C:\LEADTOOLS21\Resources\Images" 
End Class 
Requirements

Target Platforms

Help Version 21.0.2021.3.2
Products | Support | Contact Us | Intellectual Property Notices
© 1991-2021 LEAD Technologies, Inc. All Rights Reserved.

Leadtools.Medical.Workstation.Loader Assembly