In the "Solution Explorer" window right-click on the "References" folder, and select "Add Reference..." from the context menu. In the "Add Reference" dialog box, select the "Browse" tab and browse to the Leadtools for .NET "C:\LEADTOOLS 20\Bin\DotNet\Win32" folder and select the following DLLS:
Click the OK button to add the above DLLs to the application.
Open the Module.cs file and add the following using statements:
using Leadtools.Dicom.AddIn;
using Leadtools.Dicom.AddIn.Attributes;
using System.IO;
Define the module class as listed below:
public class Module : ModuleInit
{
private static string _ImageDirectory = string.Empty;
public static string ImageDirectory
{
get
{
return _ImageDirectory;
}
}
public override void Load(string ServiceDirectory, string DisplayName)
{
string dir = ServiceDirectory + @"\Images\";
if(!Directory.Exists(dir))
Directory.CreateDirectory(dir);
_ImageDirectory = dir;
}
}
When this add-in loads, the Load function is called by the LEADTOOLS PACS Framework. This class checks for the Images directory. If the directory does not exist, it is created by the add-in.
In the "Solution Explorer" window right-click Class1.cs and select Rename from the context menu. Type CStoreAddIn.cs and press Enter.
Open the CStoreAddIn.cs file and add the following using statements:
using Leadtools.Dicom;
using Leadtools.Dicom.AddIn;
using Leadtools.Dicom.AddIn.Interfaces;
using Microsoft.Practices.Unity;
Add IProcessCStore to the CStoreAddIn class derivation list. Your class should look like the following:
public class CStoreAddIn : IProcessCStore
{
}
Right-click on IProcessCStore and select "Implement Interface-> Implement Interface" from the context menu. Your class should now look as follows:
[DicomAddInAttribute("CStore","1.0.0.0",Description="DICOM Storage",Author="")]
public class CStoreAddIn : IProcessCStore
{
#region IProcessCStore Members
public DicomCommandStatusType OnStore(DicomClient Client, byte PresentationId, int MessageId, string AffectedClass, string Instance, DicomCommandPriorityType Priority, string MoveAE, int MoveMessageId, DicomDataSet Request)
{
throw new NotImplementedException();
}
#endregion
#region IProcessBreak Members
public void Break(BreakType type)
{
throw new NotImplementedException();
}
#endregion
}
To tell the server what we are interested in, we need to specify PresentationContextAttributes for the OnStore method. This will allow the server to build an association for use when a client connections. For this example we will only store CT images. Thus, we need to enter the following attributes for the OnStore method:
[PresentationContext(DicomUidType.CTImageStorage,
DicomUidType.ImplicitVRLittleEndian,
DicomUidType.JPEG2000,
DicomUidType.JPEG2000LosslessOnly,
DicomUidType.JPEGBaseline1,
DicomUidType.JPEGExtended2_4,
DicomUidType.ExplicitVRBigEndian,
DicomUidType.ExplicitVRLittleEndian,
DicomUidType.JPEGLosslessNonhier14,
DicomUidType.JPEGLosslessNonhier14B)]
public DicomCommandStatusType OnStore(DicomClient Client, byte PresentationId, int MessageId, string AffectedClass, string Instance, DicomCommandPriorityType Priority, string MoveAE, int MoveMessageId, DicomDataSet Request)
This makes it possible to store CT images with the above transfer syntaxes.
Add the code to the OnStore method to save the image to disk. Your OnStore method should look like the following:
public DicomCommandStatusType OnStore(DicomClient Client, byte PresentationId, int MessageId, string AffectedClass, string Instance, DicomCommandPriorityType Priority, string MoveAE, int MoveMessageId, DicomDataSet Request)
{
DicomCommandStatusType status = DicomCommandStatusType.Success;
try
{
if(Request!=null)
{
string sop = Request.GetValue(DicomTag.SOPInstanceUID, string.Empty);
if(string.IsNullOrEmpty(sop))
status = DicomCommandStatusType.ProcessingFailure;
else
{
string file = string.Format("{0}{1}.dic", Module.ImageDirectory,sop);
Request.Save(file, DicomDataSetSaveFlags.None);
}
}
}
catch(Exception e)
{
status = DicomCommandStatusType.ProcessingFailure;
}
return status;
}
Build the class library and take the output and put it in the 'AddIn' directory of your previously created server.
Help Collections
Raster .NET | C API | C++ Class Library | HTML5 JavaScript
Document .NET | C API | C++ Class Library | HTML5 JavaScript
Medical .NET | C API | C++ Class Library | HTML5 JavaScript
Medical Web Viewer .NET
Multimedia
Direct Show .NET | C API | Filters
Media Foundation .NET | C API | Transforms
Supported Platforms
.NET, Java, Android, and iOS/macOS Assemblies
Imaging, Medical, and Document
C API/C++ Class Libraries
Imaging, Medical, and Document
HTML5 JavaScript Libraries
Imaging, Medical, and Document