Products | Support | Email a link to this topic. | Send comments on this topic. | Back to Introduction - All Topics | Help Version 19.0.4.28
|
Leadtools.Medical.Workstation.Loader Namespace : MedicalViewerLoader Class |
public class MedicalViewerLoader : MedicalViewerLoaderBase
'Declaration Public Class MedicalViewerLoader Inherits MedicalViewerLoaderBase
'Usage Dim instance As MedicalViewerLoader
public ref class MedicalViewerLoader : public MedicalViewerLoaderBase
When streaming images the MedicalViewerLoader will use the low-memory usage feature of the Leadtools.MedicalViewer.MedicalViewer control. This allows images for cells that are not visible to be unloaded from memory and then re-loaded when they are once again visible.
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() <TestMethod()> _ Public Sub LoadSeries() #If LEADTOOLS_V175_OR_LATER Then Leadtools.Examples.Support.SetLicense() #Else Leadtools.Examples.Support.Unlock() #End If ''' #if LEADTOOLS_V175_OR_LATER 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:\Users\Public\Documents\LEADTOOLS Images" End Class
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(); [TestMethod] public void LoadSeries ( ) { #if LEADTOOLS_V175_OR_LATER Leadtools.Examples.Support.SetLicense(); #else Leadtools.Examples.Support.Unlock(); #endif // #if LEADTOOLS_V175_OR_LATER 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 listning 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:\Users\Public\Documents\LEADTOOLS Images"; }