public bool LoadSeries(
string studyInstanceUID,
string seriesInstanceUID,
IMedicalViewerCellFactory cellFactory
)
studyInstanceUID
A System.String representing the Study Instance UID.
seriesInstanceUID
A System.String representing the Series Instance UID.
cellFactory
A IMedicalViewerCellFactory representing the medical cell.
True if the series is loaded; otherwise it is false.
The series of images will be displayed in Leadtools.MedicalViewer.MedicalViewerMultiCell controls with their overlay tag information.
If the ViewerControl is set before calling this method, A Leadtools.MedicalViewer.MedicalViewerMultiCell will be created and added to that MedicalViewer control which will raise the ViewerCellCreated event.
If the value of the ViewerControl is null (Nothing in VB) the MedicalViewerCellRequested event will be raised and the user is responsible for handling the event and providing the Leadtools.MedicalViewer.MedicalViewerMultiCell control. If the MedicalViewerCellRequested event is not handled an exception will be thrown and the method will fail.
A series will be sorted and depending on the DICOM information of the series may be separated among multiple cells. The images with the same Frame Of Reference, Echo Number and Image Orientation will be grouped together. This will ensure the DICOM images in the Leadtools.MedicalViewer.MedicalViewerMultiCell are displayed properly.
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:\LEADTOOLS22\Resources\Images";
}