LEADTOOLS Medical(Leadtools.Dicomアセンブリ)

フレームを表示

アソシエーション(String、Int32、String、String、DicomPrintScuPrintManagementClassFlags)メソッド








印刷SCPのIPアドレスまたはDNS名。
印刷SCPのポート番号。
呼び出されたAEタイトル(印刷SCPのAEタイトル)。
呼び出しているAEタイトル(印刷SCUのAEタイトル)。
印刷SCUによってサポートされるSOP/Meta SOPクラス。Meta SOPクラスのどれも指定されないならば、基本グレースケールプリント管理機構Meta SOPクラスは自動的に指定されます。
印刷SCPに接続して、それからDICOMアソシエーションを確立します。
構文
'Declaration
 
Public Overloads Function Associate( _
   ByVal printScpIP As String, _
   ByVal printScpPort As Integer, _
   ByVal calledTitle As String, _
   ByVal callingTitle As String, _
   ByVal supportedClasses As DicomPrintScuPrintManagementClassFlags _
) As Boolean
'Usage
 
Dim instance As DicomPrintScu
Dim printScpIP As String
Dim printScpPort As Integer
Dim calledTitle As String
Dim callingTitle As String
Dim supportedClasses As DicomPrintScuPrintManagementClassFlags
Dim value As Boolean
 
value = instance.Associate(printScpIP, printScpPort, calledTitle, callingTitle, supportedClasses)
 function Leadtools.Dicom.DicomPrintScu.Associate(String,Int32,String,String,DicomPrintScuPrintManagementClassFlags)( 
   printScpIP ,
   printScpPort ,
   calledTitle ,
   callingTitle ,
   supportedClasses 
)

パラメーター

printScpIP
印刷SCPのIPアドレスまたはDNS名。
printScpPort
印刷SCPのポート番号。
calledTitle
呼び出されたAEタイトル(印刷SCPのAEタイトル)。
callingTitle
呼び出しているAEタイトル(印刷SCUのAEタイトル)。
supportedClasses
印刷SCUによってサポートされるSOP/Meta SOPクラス。Meta SOPクラスのどれも指定されないならば、基本グレースケールプリント管理機構Meta SOPクラスは自動的に指定されます。

戻り値

アソシエーションが正常に確立されるならば、true;アソシエーション要求が印刷SCPによって拒否されるならば、間違った。
解説
少しでもプリントで管理操作が実行されることができる前に、アソシエーションは正常に確立されなければなりません。

このメソッドは、最初に印刷SCPに接続しようとします。成功した場合、それはその後アソシエーションを確立しようとします。アソシエーションが受け取られて/印刷SCPによって拒絶されるまで、このメソッドは返りません、または、エラーは発生します。

アソシエーション要求が印刷SCPによって拒否される場合に備えて、メソッドGetAssociateRejectInformationはアソシエーション除外に関する情報を取得するのに用いられることができます。

supportedClassesパラメーターは、印刷SCU自体によってサポートされるそれらのSOP/Meta SOPクラスを指定します。一度アソシエーションが確立されたら、メソッドIsClassSupportedは特定のSOP/Meta SOPクラスがアソシエーション(そして、それゆえに、印刷SCPによって)の上でサポートされるかどうか調べるのに用いられることができます。

確立したアソシエーションは、メソッドリリースを使用してリリースされることができます。それは、メソッドAbortを用いて中止されることもできます。

サンプル
Copy Code  
Imports Leadtools
Imports Leadtools.Dicom

Public Class MyDicomPrintSCU : Inherits DicomPrintSCU
   Public Sub New(ByVal path As String)
      MyBase.New(path)
   End Sub
   Public Overrides Sub OnStatus(ByVal status As DicomPrintScuStatus, ByVal operationStatus As DicomCommandStatusType)
      Dim statusCodeType As String = "Unknown"
      Dim msg As StringBuilder = New StringBuilder()
      Select Case status
         Case DicomPrintScuStatus.ReceiveAbort
            Dim printSCUAbortInfo As DicomPrintScuAbortInformation = GetAbortInformation()
            msg.AppendFormat("Source = {0}, Reason = {1}", printSCUAbortInfo.Source, printSCUAbortInfo.Reason)
            MessageBox.Show(msg.ToString(), "Print SCP Aborted the Association", MessageBoxButtons.OK)

         Case DicomPrintScuStatus.ReceivePrintFilmSessionRsp
            Dim commandStatusType As DicomCommandStatusType = GetLastOperationStatus()
            If operationStatus = DicomCommandStatusType.Success Then
               If commandStatusType = DicomCommandStatusType.Success Then
                  statusCodeType = "Success"
               Else
                  statusCodeType = "Warning"
               End If
            Else
               statusCodeType = "Failure"
            End If
            msg.AppendFormat("Status: 0x{0:X4} {1}", commandStatusType, statusCodeType)
            MessageBox.Show(msg.ToString(), "Received N-ACTION-RSP (Basic Film Session SOP Class)", MessageBoxButtons.OK)
      End Select
   End Sub
   <TestMethod()> _
   Public Overrides Sub OnPrinterReport(ByVal eventTypeID As Integer, ByVal reportInfo As DicomPrinterReportInformation)
      Dim msg As StringBuilder = New StringBuilder()
      Dim eventTypeName As String = "Normal"
      Select Case eventTypeID
         Case 2
            eventTypeName = "Warning"

         Case 3
            eventTypeName = "Failure"
      End Select

      msg.AppendFormat("Event Type Name: {0}", eventTypeName)

      If eventTypeID <> 1 AndAlso Not reportInfo Is Nothing Then
         If Not reportInfo.PrinterStatusInfo Is Nothing Then
            msg.AppendFormat("{0}Printer Status Info: {1}", Environment.NewLine, reportInfo.PrinterStatusInfo)
         End If

         If Not reportInfo.FilmDestination Is Nothing Then
            msg.AppendFormat("{0}Film Destination: {1}", Environment.NewLine, reportInfo.FilmDestination)
         End If

         If Not reportInfo.PrinterName Is Nothing Then
            msg.AppendFormat("{0}Printer Name: {1}", Environment.NewLine, reportInfo.PrinterName)
         End If
      End If
      MessageBox.Show(msg.ToString(), "Printer Status Report", MessageBoxButtons.OK)
   End Sub

   Public Overrides Sub OnPrintJobReport(ByVal printJobInstanceUID As String, ByVal eventTypeID As Integer, ByVal reportInfo As DicomPrintJobReportInformation)
      Dim msg As StringBuilder = New StringBuilder()
      msg.AppendFormat("Print Job SOP Instance UID: {0}", printJobInstanceUID)

      Dim eventTypeName As String = "Pending"
      Select Case eventTypeID
         Case 2
            eventTypeName = "Printing"

         Case 3
            eventTypeName = "Done"

         Case 4
            eventTypeName = "Failure"
      End Select
      msg.AppendFormat("{0}Event Type Name: {1}", Environment.NewLine, eventTypeName)

      If Not reportInfo Is Nothing Then
         If Not reportInfo.ExecutionStatusInfo Is Nothing Then
            msg.AppendFormat("{0}Execution Status Info: {1}", Environment.NewLine, reportInfo.ExecutionStatusInfo)
         End If

         If Not reportInfo.FilmSessionLabel Is Nothing Then
            msg.AppendFormat("{0}Film Session Label: {1}", Environment.NewLine, reportInfo.FilmSessionLabel)
         End If

         If Not reportInfo.PrinterName Is Nothing Then
            msg.AppendFormat("{0}Printer Name: {1}", Environment.NewLine, reportInfo.PrinterName)
         End If
      End If
      MessageBox.Show(msg.ToString(), "Print Job Status Report", MessageBoxButtons.OK)
   End Sub
End Class

Private Sub PerformBasicPM()

   'It's assumed that support for medical communication is already unlocked

   'Make sure to initialize the DICOM engine, this needs to be done only once 
   'In the whole application
   DicomEngine.Startup()

   'Make sure to initialize the DICOM Communication engine, this needs to be done only once 
   'In the whole application
   DicomNet.Startup()

   'The DicomPrintSCU is disposable, this is why we are using the "using" keyword

   Dim printSCU As MyDicomPrintSCU = New MyDicomPrintSCU(Nothing)
   Using (printSCU)
      printSCU.SetTimeout(60)

      Try
         ' Establish the Association
         Dim ret As Boolean = printSCU.Associate("10.1.1.209", 7104, "PrintSCP", "PrintSCU", DicomPrintScuPrintManagementClassFlags.BasicGrayscalePmMetaSopClass Or _
                                                 DicomPrintScuPrintManagementClassFlags.BasicColorPmMetaSopClass Or _
                                                 DicomPrintScuPrintManagementClassFlags.BasicAnnotationBoxSopClass Or _
                                                 DicomPrintScuPrintManagementClassFlags.BasicPrintImageOverlayBoxSopClass Or _
                                                 DicomPrintScuPrintManagementClassFlags.PresentationLutSopClass Or _
                                                 DicomPrintScuPrintManagementClassFlags.PrintJobSopClass Or _
                                                 DicomPrintScuPrintManagementClassFlags.PrinterConfigurationRetrievalSopClass)
         'The method will return false if the association was rejected,
         'if some other error occurred then an exception will be thrown
         If ret = False Then
            Dim associateRejectInfo As DicomPrintScuAssociateRejectInformation = printSCU.GetAssociateRejectInformation()
            If Not associateRejectInfo Is Nothing Then
               Dim msg As StringBuilder = New StringBuilder()
               msg.AppendFormat("Source = {0}, Reason = {1}", associateRejectInfo.Source, associateRejectInfo.Reason)
               MessageBox.Show(msg.ToString())
               Return
            End If
         End If

         ' Display some printer info
         GetPrinterInfo(printSCU)

         ' Display some printer configuration info
         GetPrinterConfigInfo(printSCU)

         ' Create a Film Session
         Dim filmSessionParameters As DicomFilmSessionParameters = printSCU.GetDefaultFilmSessionParameters()
         filmSessionParameters.NumberOfCopies = 1

         'Over here we can set some other film session parameters before creating the film session.
         'To set these parameters we can access one or more of these properties:
         'DicomFilmSessionParameters.NumberOfCopies
         'DicomFilmSessionParameters.MemoryAllocation
         'DicomFilmSessionParameters.OwnerID
         'DicomFilmSessionParameters.PrintPriority
         'DicomFilmSessionParameters.MediumType
         'DicomFilmSessionParameters.FilmDestination
         'DicomFilmSessionParameters.FilmSessionLabel

         printSCU.CreateFilmSession(filmSessionParameters, True)
         MessageBox.Show(printSCU.GetFilmSessionInstanceUid(), "Film Session SOP Instance UID", MessageBoxButtons.OK)

         ' Update the Film Session to specify a "MED" Print Priority
         filmSessionParameters = printSCU.GetDefaultFilmSessionParameters()
         filmSessionParameters.PrintPriority = "MED"
         printSCU.UpdateFilmSession(filmSessionParameters)


         Dim filmBoxParameters As DicomFilmBoxParameters = printSCU.GetDefaultFilmBoxParameters()

         If printSCU.IsClassSupported(DicomPrintScuPrintManagementClassFlags.BasicAnnotationBoxSopClass) Then
            filmBoxParameters.AnnotationDisplayFormatID = "SomeID"
         End If

         'Over here we can set some other film box parameters before creating the film box.
         'To set these parameters we can access one or more of these properties:
         'DicomFilmBoxParameters.ImageDisplayFormat
         'DicomFilmBoxParameters.FilmOrientation
         'DicomFilmBoxParameters.FilmSizeID
         'DicomFilmBoxParameters.ConfigurationInformation
         'DicomFilmBoxParameters.AnnotationDisplayFormatID
         'DicomFilmBoxParameters.SmoothingType
         'DicomFilmBoxParameters.BorderDensity
         'DicomFilmBoxParameters.EmptyImageDensity
         'DicomFilmBoxParameters.Trim
         'DicomFilmBoxParameters.RequestedResolutionID
         'DicomFilmBoxParameters.MaxDensity
         'DicomFilmBoxParameters.MinDensity
         'DicomFilmBoxParameters.Illumination
         'DicomFilmBoxParameters.ReflectedAmbientLight
         'DicomFilmBoxParameters.MagnificationType

         ' Create a Film Box
         printSCU.CreateFilmBox(filmBoxParameters, Nothing)
         MessageBox.Show(printSCU.GetFilmBoxInstanceUid(), "Film Box SOP Instance UID", MessageBoxButtons.OK)

         ' Create a Presentation LUT
         If printSCU.IsClassSupported(DicomPrintScuPrintManagementClassFlags.PresentationLutSopClass) Then
            ' Make sure that you have a valid presentation state dataset,
            ' otherwise leave this code commented out

            '
            'using (DicomDataSet presentationLUTDataset = new DicomDataSet())
            '{
            '//Load DICOM File
            'presentationLUTDataset.Load(@"C:\PresLUT.dcm", DicomDataSetLoadFlags.None);
            'printSCU.CreatePresentationLUT(presentationLUTDataset, null);

            'string presLUTInstanceUID = printSCU.GetPresentationLutInstanceUid();
            'if(presLUTInstanceUID != null)
            '{
            'MessageBox.Show(presLUTInstanceUID, "Pres LUT SOP Instance UID", MessageBoxButtons.OK);
            'printSCU.UpdateFilmBox(null, presLUTInstanceUID);
            '}
            '}
            '
         End If

         Dim imageDataset As DicomDataSet = New DicomDataSet()
         Using (imageDataset)
            'Load DICOM File
            imageDataset.Load(Path.Combine(LEAD_VARS.ImagesDir, "IMAGE3.dcm"), DicomDataSetLoadFlags.LoadAndClose)
            ' Update the Image Box. Since the Image Display Format of the Film Box was
            ' set to "STANDARD\1,1", then we are supposed to have one Image Box created
            ' by the Print SCP.
            If printSCU.GetImageBoxesCount() > 0 Then
               MessageBox.Show(printSCU.GetImageBoxInstanceUid(0), "Image Box SOP Instance UID", MessageBoxButtons.OK)

               Dim imageBoxParameters As DicomImageBoxParameters = printSCU.GetDefaultImageBoxParameters()
               imageBoxParameters.ImagePosition = 1
               'Over here we can set some other image box parameters before updating the image box.
               'To set these parameters we can access one or more of these properties:
               'DicomImageBoxParameters.MinDensity
               'DicomImageBoxParameters.MaxDensity
               'DicomImageBoxParameters.RequestedImageSize
               'DicomImageBoxParameters.Polarity
               'DicomImageBoxParameters.MagnificationType
               'DicomImageBoxParameters.SmoothingType
               'DicomImageBoxParameters.ConfigurationInformation
               'DicomImageBoxParameters.RequestedDecimateCropBehavior

               printSCU.UpdateImageBox(printSCU.GetImageBoxInstanceUid(0), imageDataset, 0, imageBoxParameters, Nothing, Nothing)
               ' We don't need them any more
               printSCU.FreeImageBoxesInstanceUids()
            End If
         End Using

         ' Update the Annotation Boxes (if there are any) 
         Dim annotationBoxCount As Integer = printSCU.GetAnnotationBoxesCount()
         Dim i As Integer = 0
         Do While i < annotationBoxCount
            printSCU.UpdateAnnotationBox(printSCU.GetAnnotationBoxInstanceUid(i), i + 1, "Some Text")
            i += 1
         Loop
         printSCU.FreeAnnotationBoxesInstanceUids() ' We don't need them any more

         ' Print the Film Session (or the Film Box; there is no difference since we
         ' have a single Film Box in the Film Session) 
         printSCU.PrintFilmSession()
         ' We can also call this
         'PrintSCU.PrintFilmBox();

         ' Display some info about the Print Job
         If printSCU.IsClassSupported(DicomPrintScuPrintManagementClassFlags.PrintJobSopClass) Then
            GetPrintJobInfo(printSCU, printSCU.GetPrintJobInstanceUid())
         End If

         ' Delete the Film Box (anyway, it would be deleted when the Film Session
         ' is deleted) 
         printSCU.DeleteFilmBox()

         ' Delete the Film Session
         printSCU.DeleteFilmSession()

         ' We can also call printSCU.DeletePresentationLUT and printSCU.DeleteOverlayBox
         ' to Delete the Presentation LUT and the Image Overlay Box 

      Catch ex As DicomException
         MessageBox.Show(String.Format("An error occurred, code: {0}", ex.Code))
         Return
      Finally
         ' Release the Association and close the connection
         printSCU.Release()
      End Try
   End Using
   DicomNet.Shutdown()
   DicomEngine.Shutdown()
End Sub

Private Sub GetPrinterInfo(ByVal printSCU As DicomPrintScu)
   ' Query the Print SCP for the information
   Try
      Dim printerInfo As DicomPrinterInformation = printSCU.GetPrinterInformation(Nothing, True)
      Dim msg As StringBuilder = New StringBuilder()
      msg.AppendFormat("Printer Status: {0}{2}Printer Status Info: {1}", printerInfo.PrinterStatus, printerInfo.PrinterStatusInfo, Environment.NewLine)
      'Over here we can also investigate other printer information by accessing the following 
      'properties from the DicomPrinterInformation class: TimeOfLastCalibration, DateOfLastCalibration,
      'SoftwareVersions, DeviceSerialNumber, ManufacturerModelName , Manufacturer, CreationDate, and CreationTime.
      MessageBox.Show(msg.ToString(), "Printer Info", MessageBoxButtons.OK)
   Catch ex As DicomException
      MessageBox.Show(String.Format("Failed to get printer information, Error code: {0}", ex.Code))
   End Try
End Sub

Private Sub GetPrinterConfigInfo(ByVal printSCU As DicomPrintScu)
   ' Assume that the Association is already established

   Try
      ' Query the Print SCP for the printer configuration information
      Dim printerConfiguration As DicomDataSet = printSCU.GetPrinterConfiguration()

      ' We will display only the Printer Name and Memory Bit Depth
      ' in the first Item

      Dim element As DicomElement = printerConfiguration.FindFirstElement(Nothing, DicomTag.PrinterConfigurationSequence, False)
      If element Is Nothing Then
         Return
      End If

      element = printerConfiguration.GetChildElement(element, True)
      If element Is Nothing Then
         Return
      End If

      element = printerConfiguration.GetChildElement(element, True)
      If element Is Nothing Then
         Return
      End If

      Dim msg As StringBuilder = New StringBuilder()
      msg.Append("Printer Name: ")

      Dim printerName As DicomElement = printerConfiguration.FindFirstElement(element, DicomTag.PrinterName, True)
      If Not printerName Is Nothing Then
         Dim name As String = printerConfiguration.GetStringValue(printerName, 0)
         If Not name Is Nothing Then
            msg.AppendFormat("{0}{1}", name, Environment.NewLine)
         Else
            msg.AppendFormat("N/A{0}", Environment.NewLine)
         End If
      End If

      msg.Append("Memory Bit Depth: ")

      Dim memoryBitDepth As DicomElement = printerConfiguration.FindFirstElement(element, DicomTag.MemoryBitDepth, True)
      If Not memoryBitDepth Is Nothing Then
         Dim value As Short() = printerConfiguration.GetShortValue(memoryBitDepth, 0, 1)
         If value.Length > 0 Then
            msg.AppendFormat("{0}", value(0))
         Else
            msg.Append("N/A")
         End If
      End If
      MessageBox.Show(msg.ToString(), "Printer Config Info", MessageBoxButtons.OK)

   Catch ex As DicomException
      MessageBox.Show(String.Format("Failed to get Printer Configuration Info, Error code: {0}", ex.Code))
   End Try
End Sub

Private Sub GetPrintJobInfo(ByVal printSCU As DicomPrintScu, ByVal printJobInstanceUID As String)
   ' Query the Print SCP for the Print Job information
   Try
      Dim printJobInfo As DicomPrintJobInformation = printSCU.GetPrintJobInformation(printJobInstanceUID, Nothing)
      Dim msg As StringBuilder = New StringBuilder()

      msg.AppendFormat("Execution Status: {0}{2}Execution Status Info: {1}", printJobInfo.ExecutionStatus, printJobInfo.ExecutionStatusInfo, Environment.NewLine)

      MessageBox.Show(msg.ToString(), "Print Job Info", MessageBoxButtons.OK)
   Catch ex As DicomException
      MessageBox.Show(String.Format("Failed to get Print Job information, Error code: {0}", ex.Code))
   End Try
End Sub

Public NotInheritable Class LEAD_VARS
Public Const ImagesDir As String = "C:\Users\Public\Documents\LEADTOOLS Images"
End Class
using Leadtools;
using Leadtools.Dicom;

public class MyDicomPrintSCU : DicomPrintScu
{
   public MyDicomPrintSCU(string path) : base(path) { }
   public override void OnStatus(DicomPrintScuStatus status, DicomCommandStatusType operationStatus)
   {
      string statusCodeType = "Unknown";
      StringBuilder msg = new StringBuilder();
      switch (status)
      {
         case DicomPrintScuStatus.ReceiveAbort:
            DicomPrintScuAbortInformation printSCUAbortInfo = GetAbortInformation();
            msg.AppendFormat("Source = {0}, Reason = {1}", printSCUAbortInfo.Source, printSCUAbortInfo.Reason);
            MessageBox.Show(msg.ToString(), "Print SCP Aborted the Association", MessageBoxButtons.OK);
            break;

         case DicomPrintScuStatus.ReceivePrintFilmSessionRsp:
            DicomCommandStatusType commandStatusType = GetLastOperationStatus();
            if (operationStatus == DicomCommandStatusType.Success)
            {
               if (commandStatusType == DicomCommandStatusType.Success)
               {
                  statusCodeType = "Success";
               }
               else
               {
                  statusCodeType = "Warning";
               }
            }
            else
            {
               statusCodeType = "Failure";
            }
            msg.AppendFormat("Status: 0x{0:X4} {1}", commandStatusType, statusCodeType);
            MessageBox.Show(msg.ToString(), "Received N-ACTION-RSP (Basic Film Session SOP Class)", MessageBoxButtons.OK);
            break;
      }
   }

   [TestMethod]
   public override void OnPrinterReport(int eventTypeID, DicomPrinterReportInformation reportInfo)
   {
      StringBuilder msg = new StringBuilder();
      string eventTypeName = "Normal";
      switch (eventTypeID)
      {
         case 2:
            eventTypeName = "Warning";
            break;

         case 3:
            eventTypeName = "Failure";
            break;
      }

      msg.AppendFormat("Event Type Name: {0}", eventTypeName);

      if (eventTypeID != 1 && reportInfo != null)
      {
         if (reportInfo.PrinterStatusInfo != null)
         {
            msg.AppendFormat("{0}Printer Status Info: {1}", Environment.NewLine, reportInfo.PrinterStatusInfo);
         }

         if (reportInfo.FilmDestination != null)
         {
            msg.AppendFormat("{0}Film Destination: {1}", Environment.NewLine, reportInfo.FilmDestination);
         }

         if (reportInfo.PrinterName != null)
         {
            msg.AppendFormat("{0}Printer Name: {1}", Environment.NewLine, reportInfo.PrinterName);
         }
      }
      MessageBox.Show(msg.ToString(), "Printer Status Report", MessageBoxButtons.OK);
   }

   public override void OnPrintJobReport(string printJobInstanceUID, int eventTypeID, DicomPrintJobReportInformation reportInfo)
   {
      StringBuilder msg = new StringBuilder();
      msg.AppendFormat("Print Job SOP Instance UID: {0}", printJobInstanceUID);

      string eventTypeName = "Pending";
      switch (eventTypeID)
      {
         case 2:
            eventTypeName = "Printing";
            break;

         case 3:
            eventTypeName = "Done";
            break;

         case 4:
            eventTypeName = "Failure";
            break;
      }
      msg.AppendFormat("{0}Event Type Name: {1}", Environment.NewLine, eventTypeName);

      if (reportInfo != null)
      {
         if (reportInfo.ExecutionStatusInfo != null)
         {
            msg.AppendFormat("{0}Execution Status Info: {1}", Environment.NewLine, reportInfo.ExecutionStatusInfo);
         }

         if (reportInfo.FilmSessionLabel != null)
         {
            msg.AppendFormat("{0}Film Session Label: {1}", Environment.NewLine, reportInfo.FilmSessionLabel);
         }

         if (reportInfo.PrinterName != null)
         {
            msg.AppendFormat("{0}Printer Name: {1}", Environment.NewLine, reportInfo.PrinterName);
         }
      }
      MessageBox.Show(msg.ToString(), "Print Job Status Report", MessageBoxButtons.OK);
   }
};

void PerformBasicPM()
{

   //It's assumed that support for medical communication is already unlocked

   //Make sure to initialize the DICOM engine, this needs to be done only once 
   //In the whole application
   DicomEngine.Startup();

   //Make sure to initialize the DICOM Communication engine, this needs to be done only once 
   //In the whole application
   DicomNet.Startup();

   //The DicomPrintSCU is disposable, this is why we are using the "using" keyword
   using (MyDicomPrintSCU printSCU = new MyDicomPrintSCU(null))
   {
      printSCU.SetTimeout(60);

      try
      {
         // Establish the Association
         bool ret = printSCU.Associate("10.1.1.209", 7104, "PrintSCP", "PrintSCU",
                              DicomPrintScuPrintManagementClassFlags.BasicGrayscalePmMetaSopClass |
                              DicomPrintScuPrintManagementClassFlags.BasicColorPmMetaSopClass |
                              DicomPrintScuPrintManagementClassFlags.BasicAnnotationBoxSopClass |
                              DicomPrintScuPrintManagementClassFlags.BasicPrintImageOverlayBoxSopClass |
                              DicomPrintScuPrintManagementClassFlags.PresentationLutSopClass |
                              DicomPrintScuPrintManagementClassFlags.PrintJobSopClass |
                              DicomPrintScuPrintManagementClassFlags.PrinterConfigurationRetrievalSopClass);
         //The method will return false if the association was rejected,
         //if some other error occurred then an exception will be thrown
         if (ret == false)
         {
            DicomPrintScuAssociateRejectInformation associateRejectInfo = printSCU.GetAssociateRejectInformation();
            if (associateRejectInfo != null)
            {
               StringBuilder msg = new StringBuilder();
               msg.AppendFormat("Source = {0}, Reason = {1}", associateRejectInfo.Source, associateRejectInfo.Reason);
               MessageBox.Show(msg.ToString());
               return;
            }
         }

         // Display some printer info
         GetPrinterInfo(printSCU);

         // Display some printer configuration info
         GetPrinterConfigInfo(printSCU);

         // Create a Film Session
         DicomFilmSessionParameters filmSessionParameters = printSCU.GetDefaultFilmSessionParameters();
         filmSessionParameters.NumberOfCopies = 1;

         //Over here we can set some other film session parameters before creating the film session.
         //To set these parameters we can access one or more of these properties:
         //DicomFilmSessionParameters.NumberOfCopies
         //DicomFilmSessionParameters.MemoryAllocation
         //DicomFilmSessionParameters.OwnerID
         //DicomFilmSessionParameters.PrintPriority
         //DicomFilmSessionParameters.MediumType
         //DicomFilmSessionParameters.FilmDestination
         //DicomFilmSessionParameters.FilmSessionLabel

         printSCU.CreateFilmSession(filmSessionParameters, true);
         MessageBox.Show(printSCU.GetFilmSessionInstanceUid(), "Film Session SOP Instance UID", MessageBoxButtons.OK);

         // Update the Film Session to specify a "MED" Print Priority
         filmSessionParameters = printSCU.GetDefaultFilmSessionParameters();
         filmSessionParameters.PrintPriority = "MED";
         printSCU.UpdateFilmSession(filmSessionParameters);


         DicomFilmBoxParameters filmBoxParameters = printSCU.GetDefaultFilmBoxParameters();

         if (printSCU.IsClassSupported(DicomPrintScuPrintManagementClassFlags.BasicAnnotationBoxSopClass))
         {
            filmBoxParameters.AnnotationDisplayFormatID = "SomeID";
         }

         //Over here we can set some other film box parameters before creating the film box.
         //To set these parameters we can access one or more of these properties:
         //DicomFilmBoxParameters.ImageDisplayFormat
         //DicomFilmBoxParameters.FilmOrientation
         //DicomFilmBoxParameters.FilmSizeID
         //DicomFilmBoxParameters.ConfigurationInformation
         //DicomFilmBoxParameters.AnnotationDisplayFormatID
         //DicomFilmBoxParameters.SmoothingType
         //DicomFilmBoxParameters.BorderDensity
         //DicomFilmBoxParameters.EmptyImageDensity
         //DicomFilmBoxParameters.Trim
         //DicomFilmBoxParameters.RequestedResolutionID
         //DicomFilmBoxParameters.MaxDensity
         //DicomFilmBoxParameters.MinDensity
         //DicomFilmBoxParameters.Illumination
         //DicomFilmBoxParameters.ReflectedAmbientLight
         //DicomFilmBoxParameters.MagnificationType

         // Create a Film Box
         printSCU.CreateFilmBox(filmBoxParameters, null);
         MessageBox.Show(printSCU.GetFilmBoxInstanceUid(), "Film Box SOP Instance UID", MessageBoxButtons.OK);

         // Create a Presentation LUT
         if (printSCU.IsClassSupported(DicomPrintScuPrintManagementClassFlags.PresentationLutSopClass))
         {
            // Make sure that you have a valid presentation state dataset,
            // otherwise leave this code commented out

            /*
            using (DicomDataSet presentationLUTDataset = new DicomDataSet())
            {
               //Load DICOM File
               presentationLUTDataset.Load(LeadtoolsExamples.Common.ImagesPath.Path + "plut_Pre.dcm", DicomDataSetLoadFlags.None);
               printSCU.CreatePresentationLUT(presentationLUTDataset, null);

               string presLUTInstanceUID = printSCU.GetPresentationLutInstanceUid();
               if(presLUTInstanceUID != null)
               {
                  MessageBox.Show(presLUTInstanceUID, "Pres LUT SOP Instance UID", MessageBoxButtons.OK);
                  printSCU.UpdateFilmBox(null, presLUTInstanceUID);
               }
            }
             */
         }

         using (DicomDataSet imageDataset = new DicomDataSet())
         {
            //Load DICOM File
            imageDataset.Load(Path.Combine(LEAD_VARS.ImagesDir, "IMAGE3.dcm"), DicomDataSetLoadFlags.LoadAndClose);
            // Update the Image Box. Since the Image Display Format of the Film Box was
            // set to "STANDARD\1,1", then we are supposed to have one Image Box created
            // by the Print SCP.
            if (printSCU.GetImageBoxesCount() > 0)
            {
               MessageBox.Show(printSCU.GetImageBoxInstanceUid(0), "Image Box SOP Instance UID", MessageBoxButtons.OK);

               DicomImageBoxParameters imageBoxParameters = printSCU.GetDefaultImageBoxParameters();
               imageBoxParameters.ImagePosition = 1;

               //Over here we can set some other image box parameters before updating the image box.
               //To set these parameters we can access one or more of these properties:
               //DicomImageBoxParameters.MinDensity
               //DicomImageBoxParameters.MaxDensity
               //DicomImageBoxParameters.RequestedImageSize
               //DicomImageBoxParameters.Polarity
               //DicomImageBoxParameters.MagnificationType
               //DicomImageBoxParameters.SmoothingType
               //DicomImageBoxParameters.ConfigurationInformation
               //DicomImageBoxParameters.RequestedDecimateCropBehavior

               printSCU.UpdateImageBox(printSCU.GetImageBoxInstanceUid(0),
                                       imageDataset,
                                       0,
                                       imageBoxParameters,
                                       null,
                                       null);
               // We don't need them any more
               printSCU.FreeImageBoxesInstanceUids();
            }
         }

         // Update the Annotation Boxes (if there are any) 
         int annotationBoxCount = printSCU.GetAnnotationBoxesCount();
         for (int i = 0; i < annotationBoxCount; i++)
         {
            printSCU.UpdateAnnotationBox(printSCU.GetAnnotationBoxInstanceUid(i), i + 1, "Some Text");
         }
         printSCU.FreeAnnotationBoxesInstanceUids(); // We don't need them any more

         // Print the Film Session (or the Film Box; there is no difference since we
         // have a single Film Box in the Film Session) 
         printSCU.PrintFilmSession();
         // We can also call this
         //PrintSCU.PrintFilmBox();

         // Display some info about the Print Job
         if (printSCU.IsClassSupported(DicomPrintScuPrintManagementClassFlags.PrintJobSopClass))
         {
            GetPrintJobInfo(printSCU, printSCU.GetPrintJobInstanceUid());
         }

         // Delete the Film Box (anyway, it would be deleted when the Film Session
         // is deleted) 
         printSCU.DeleteFilmBox();

         // Delete the Film Session
         printSCU.DeleteFilmSession();

         // We can also call printSCU.DeletePresentationLUT and printSCU.DeleteOverlayBox
         // to Delete the Presentation LUT and the Image Overlay Box 

      }
      catch (DicomException ex)
      {
         MessageBox.Show(string.Format("An error occurred, code: {0}", ex.Code));
         return;
      }
      finally
      {
         // Release the Association and close the connection
         printSCU.Release();
      }
   }
   DicomNet.Shutdown();
   DicomEngine.Shutdown();
}

void GetPrinterInfo(DicomPrintScu printSCU)
{
   // Query the Print SCP for the information
   try
   {
      DicomPrinterInformation printerInfo = printSCU.GetPrinterInformation(null, true);
      StringBuilder msg = new StringBuilder();
      msg.AppendFormat("Printer Status: {0}{2}Printer Status Info: {1}", printerInfo.PrinterStatus, printerInfo.PrinterStatusInfo, Environment.NewLine);

      //Over here we can also investigate other printer information by accessing the following 
      //properties from the DicomPrinterInformation class: TimeOfLastCalibration, DateOfLastCalibration,
      //SoftwareVersions, DeviceSerialNumber, ManufacturerModelName , Manufacturer, CreationDate, and CreationTime.

      MessageBox.Show(msg.ToString(), "Printer Info", MessageBoxButtons.OK);
   }
   catch (DicomException ex)
   {
      MessageBox.Show(string.Format("Failed to get printer information, Error code: {0}", ex.Code));
   }
}

void GetPrinterConfigInfo(DicomPrintScu printSCU)
{
   // Assume that the Association is already established

   try
   {
      // Query the Print SCP for the printer configuration information
      DicomDataSet printerConfiguration = printSCU.GetPrinterConfiguration();

      // We will display only the Printer Name and Memory Bit Depth
      // in the first Item

      DicomElement element = printerConfiguration.FindFirstElement(null, DicomTag.PrinterConfigurationSequence, false);
      if (element == null)
         return;

      element = printerConfiguration.GetChildElement(element, true);
      if (element == null)
         return;

      element = printerConfiguration.GetChildElement(element, true);
      if (element == null)
         return;

      StringBuilder msg = new StringBuilder();
      msg.Append("Printer Name: ");

      DicomElement printerName = printerConfiguration.FindFirstElement(element, DicomTag.PrinterName, true);
      if (printerName != null)
      {
         string name = printerConfiguration.GetStringValue(printerName, 0);
         if (name != null)
         {
            msg.AppendFormat("{0}{1}", name, Environment.NewLine);
         }
         else
         {
            msg.AppendFormat("N/A{0}", Environment.NewLine);
         }
      }

      msg.Append("Memory Bit Depth: ");

      DicomElement memoryBitDepth = printerConfiguration.FindFirstElement(element, DicomTag.MemoryBitDepth, true);
      if (memoryBitDepth != null)
      {
         short[] value = printerConfiguration.GetShortValue(memoryBitDepth, 0, 1);
         if (value.Length > 0)
         {
            msg.AppendFormat("{0}", value[0]);
         }
         else
         {
            msg.Append("N/A");
         }
      }
      MessageBox.Show(msg.ToString(), "Printer Config Info", MessageBoxButtons.OK);

   }
   catch (DicomException ex)
   {
      MessageBox.Show(string.Format("Failed to get Printer Configuration Info, Error code: {0}", ex.Code));
   }
}

void GetPrintJobInfo(DicomPrintScu printSCU, string printJobInstanceUID)
{
   // Query the Print SCP for the Print Job information
   try
   {
      DicomPrintJobInformation printJobInfo = printSCU.GetPrintJobInformation(printJobInstanceUID, null);
      StringBuilder msg = new StringBuilder();

      msg.AppendFormat("Execution Status: {0}{2}Execution Status Info: {1}",
         printJobInfo.ExecutionStatus,
         printJobInfo.ExecutionStatusInfo,
         Environment.NewLine);

      MessageBox.Show(msg.ToString(), "Print Job Info", MessageBoxButtons.OK);
   }
   catch (DicomException ex)
   {
      MessageBox.Show(string.Format("Failed to get Print Job information, Error code: {0}", ex.Code));
   }
}

static class LEAD_VARS
{
public const string ImagesDir = @"C:\Users\Public\Documents\LEADTOOLS Images";
}
必要条件

ターゲットプラットホーム

参照

参照

DicomPrintScuクラス
DicomPrintScuメンバ
オーバーロードリスト
アソシエーション(String、Int32、String、Int32、String、String、DicomPrintScuPrintManagementClassFlags)メソッド
IsClassSupportedメソッド
Releaseメソッド
Abortメソッド
GetAssociateRejectInformationメソッド
GetAbortInformationメソッド
SetTimeoutメソッド
OnStatusメソッド

Leadtools.Dicomは、Medicalツールキットサーバのライセンスと、解除キーが必要です。詳細は、以下を参照してください。Imaging Pro/Document/Medicalの機能