本教程展示了如何添加一个XML数据库pac服务器,允许客户端DICOM服务器上的数据存储在一个c#使用LEADTOOLS SDK WinForms应用程序。
| 概述 | |
|---|---|
| 总结 | 本教程介绍了如何添加一个数据库和处理C-STORE请求PACS服务器在WinForms c#应用程序。 |
| 完成时间 | 60分钟 |
| Visual Studio项目 | 下载教程项目(18 KB) |
| 平台 | Windows WinForms c#应用程序 |
| IDE | Visual Studio 2019 |
| 开发许可 | 下载LEADTOOLS |
熟悉的基本步骤和pac服务器创建一个项目的审查添加引用和设置一个许可证和创建一个简单的PACS服务器教程,在工作之前服务器处理请求存储在一个政治行动委员会——WinForms c#教程。
从项目中创建的副本创建一个简单的PACS服务器教程。如果你没有这个项目,按照这个教程中的步骤创建它。
的引用需要取决于项目的目的。引用可以通过添加一个或另一个下面的两种方法(但不是全部)。
如果使用NuGet引用,本教程需要以下NuGet包:
Leadtools.Dicom.Pacs.Scp如果使用本地DLL的引用,下面的DLL是必要的。
dll位于< INSTALL_DIR > \ LEADTOOLS22 \ Bin \ Dotnet4 \ x64:
Leadtools.dllLeadtools.Dicom.dll对于一个完整的列表的应用程序所需的DLL文件,请参考文件包含在您的应用程序。
许可解锁项目需要的特性。它必须设置工具箱函数被调用之前。详情,包括教程为不同的平台,请参考设置一个运行时许可。
有两种类型的运行时许可证:
请注意
添加LEADTOOLS NuGet和本地引用设置许可中会详细介绍添加引用和设置一个许可证教程。
与项目创建、添加引用,许可,可以开始编码。
在解决方案资源管理器,右键单击<项目> .csproj并选择添加- >新文件夹。创建一个文件夹叫数据库。右键单击该文件夹并选择添加- >新项目…。选择类选择和名称DicomDB.cs,然后单击添加。
的DicomDB类拥有pac服务器中的数据集,允许插入的数据集记录后C-STORE请求和储蓄和数据库加载到一个外部XML文件。
请注意
确保类的命名空间
PacsServer。
添加使用下面的语句服务器类:
/ /使用块使用Leadtools.Dicom;使用系统;使用System.Data;使用先;
使用下面的代码来定义公共和私人的属性DicomDB随着它的构造函数类。
构造函数加载数据库从一个外部XML文件,如果它已经存在。如果它不存在,就创建数据库使用DICOM服务器中数据集的图像文件夹。
公共类DicomDB{受保护的数据集ds =新数据集(“DICOMSVR”);/ / System.Data。数据集实例受保护的字符串dbFileName;/ /外部XML文件的名字公共boolNeedImport =假;公共字符串ImageDir;私人对象adoDatasetLock =新对象();/ /获取/设置属性公共int计数{得到{返回ds.Tables [0] .Rows.Count;}}公共数据集DB {得到{返回ds;}}公共DicomDB (字符串dbFileName){这.dbFileName = dbFileName;如果(! LoadDatabase ()){CreateDatabase ();NeedImport =真正的;}锁(adoDatasetLock){如果(ds.Tables [“图片”]! =零){ds.Tables [“图片”]。RowDeleting + =新DataRowChangeEventHandler (DicomDB_RowDeleting);}}}无效DicomDB_RowDeleting (对象发送方,DataRowChangeEventArgs e){字符串文件= e.Row [“ReferencedFile”].ToString ();试一试{File.Delete(文件);}抓{}}}
添加两个新方法DicomDB类命名LoadDatabase ()和Save ()。LoadDatabase ()被称为内吗DicomDB ()方法如前一节所示。的Save ()方法将被称为整个DicomDB类,见第二部分。
将下面的代码添加到LoadDatabase方法从外部加载数据库的XML文件。
受保护的boolLoadDatabase (){bool加载=真正的;试一试{ds.ReadXml (dbFileName);}抓{加载=假;}返回加载;}
添加的代码Save ()方法将数据库保存到一个外部XML文件。
公共boolSave (){boolret =假;试一试{ds。WriteXml (dbFileName XmlWriteMode.WriteSchema)即可;ret =真正的;}抓{}返回受潮湿腐烂;}
添加一个新方法DicomDB类命名CreateDatabase ()。该方法将被称为内DicomDB ()方法,如第一部分中所示。使用下面的代码来创建表结构为DICOM数据集。
私人boolCreateDatabase (){bool创建了=真正的;锁(adoDatasetLock){试一试{DataTable表;上Patients_PatientID Studies_PatientID;上Studies_InstUID Series_InstUID;上Series_ID Images_ID;上=[]键新上[1];表= ds.Tables.Add (“病人”);Patients_PatientID = table.Columns.Add (“PatientID”,typeof(字符串));table.Columns.Add (“PatientName”,typeof(字符串));table.Columns.Add (“PatientBirthDate”,typeof(DateTime));table.Columns.Add (“PatientBirthTime”,typeof(DateTime));table.Columns.Add (“PatientSex”,typeof(字符串));table.Columns.Add (“EthnicGroup”,typeof(字符串));table.Columns.Add (“PatientComments”,typeof(字符串));关键[0]= Patients_PatientID;表。PrimaryKey =关键;表= ds.Tables.Add (“研究”);Studies_InstUID = table.Columns.Add (“StudyInstanceUID”,typeof(字符串));table.Columns.Add (“StudyDate”,typeof(DateTime));table.Columns.Add (“StudyTime”,typeof(DateTime));table.Columns.Add (“AccessionNumber”,typeof(字符串));table.Columns.Add (“StudyID”,typeof(字符串));table.Columns.Add (“PatientName”,typeof(字符串));Studies_PatientID = table.Columns.Add (“PatientID”,typeof(字符串));table.Columns.Add (“StudyDescription”,typeof(字符串));table.Columns.Add (“ReferringDrName”,typeof(字符串));关键[0]= Studies_InstUID;表。PrimaryKey =关键;ds.Relations.Add (“研究”、Patients_PatientID Studies_PatientID);表= ds.Tables.Add (“系列”);Series_ID = table.Columns.Add (“SeriesInstanceUID”,typeof(字符串));Series_InstUID = table.Columns.Add (“StudyInstanceUID”,typeof(字符串));table.Columns.Add (“形态”,typeof(字符串));table.Columns.Add (“SeriesNumber”,typeof(int));table.Columns.Add (“PatientID”,typeof(字符串));table.Columns.Add (“SeriesDate”,typeof(DateTime));关键[0]= Series_ID;表。PrimaryKey =关键;ds.Relations.Add (“系列”、Studies_InstUID Series_InstUID);表= ds.Tables.Add (“图片”);table.Columns.Add (“SOPInstanceUID”,typeof(字符串));Images_ID = table.Columns.Add (“SeriesInstanceUID”,typeof(字符串));table.Columns.Add (“StudyInstanceUID”,typeof(字符串));table.Columns.Add (“InstanceNumber”,typeof(int));table.Columns.Add (“ReferencedFile”,typeof(字符串));table.Columns.Add (“PatientID”,typeof(字符串));table.Columns.Add (“SOPClassUID”,typeof(字符串));table.Columns.Add (“TransferSyntaxUID”,typeof(字符串));ds.Relations.Add (“图片”、Series_ID Images_ID);Save ();}抓{创建了=假;}}返回创建;}
后直接添加下面的枚举名称空间声明。
公共枚举InsertReturn{存在,错误,成功}
创建一个新的插入(DicomDataSet dcm字符串文件名)方法,并使用下面的代码来解析一个DICOM数据集文件并将其添加到表结构和外部XML文件。
公共InsertReturn插入(DicomDataSet扩张型心肌病,字符串文件名){字符串patientID;字符串studyInstanceUID;字符串seriesInstanceUID;字符串sopInstanceUID;InsertReturn ret = InsertReturn.Success;patientID = AddPatient (dcm),裁判ret);如果(ret ! = InsertReturn。成功&& ret != InsertReturn.Exists){返回受潮湿腐烂;}patientID studyInstanceUID = AddStudy (dcm,裁判ret);如果(ret ! = InsertReturn。成功&& ret != InsertReturn.Exists){返回受潮湿腐烂;}seriesInstanceUID = AddSeries (dcm、studyInstanceUID patientID,裁判ret);如果(ret ! = InsertReturn。成功&& ret != InsertReturn.Exists){返回受潮湿腐烂;}sopInstanceUID = AddImage (dcm seriesInstanceUID、studyInstanceUID patientID,文件名,裁判ret);如果(ret ! = InsertReturn。成功&& ret != InsertReturn.Exists){返回受潮湿腐烂;}如果(ret = = InsertReturn.Success){Save ();}返回受潮湿腐烂;}
创建一个新的插入(DicomDataSet dcm字符串文件名)方法并将下面的代码添加到检查表中如果记录已经存在。
私人boolRecordExists (DataTable表,字符串过滤器){DataView dv =新DataView(表);如果(dv ! =零){dv。RowFilter =过滤器;返回dv。数> 0;}返回假;}
右键单击<项目> .csproj在解决方案资源管理器并选择添加- >新文件夹。创建一个文件夹叫DicomCommon。右键单击该文件夹并选择添加- >新项目…。选择类选择和名称Utils.cs,然后单击添加。
请注意
对于这个和其他相关pac教程,
跑龙套类拥有数量的实用程序方法解析DICOM数据集的数据文件。
使用下面的代码来添加一个GetStringValue ()方法,该方法返回的字符串值DICOM标签:
使用Leadtools.Dicom;名称空间PacsServer{类跑龙套{公共静态字符串GetStringValue (DicomDataSet扩张型心肌病,长标签){DicomElement元素;元素= dcm.FindFirstElement (零、标签、真正的);如果(元素! =零){如果(dcm.GetElementValueCount(元素)> 0){返回dcm.GetConvertValue(元素);}}返回”“;}}}
在DicomDB.cs文件,可以使用下面的代码来解析和添加病人从DICOM数据到数据库表信息。
私人字符串AddPatient (DicomDataSet扩张型心肌病,裁判InsertReturn ret){字符串patientID =”“;ret = InsertReturn.Success;patientID =跑龙套。GetStringValue (dcm DicomTag.PatientID);如果(patientID。长度= = 0){ret = InsertReturn.Error;返回”“;}锁(adoDatasetLock){如果(! RecordExists (ds.Tables [“病人”),“PatientID = '”+ patientID +“”)){我们应该博士;= ds.Tables[博士“病人”].NewRow ();如果(博士! =零){博士(“PatientID”)= patientID;博士(“PatientName”)=跑龙套。GetStringValue (dcm DicomTag.PatientName);博士(“PatientSex”)=跑龙套。GetStringValue (dcm DicomTag.PatientSex);博士(“EthnicGroup”)=跑龙套。GetStringValue (dcm DicomTag.EthnicGroup);博士(“PatientComments”)=跑龙套。GetStringValue (dcm DicomTag.PatientComments);试一试{博士(“PatientBirthDate”)= DateTime.Parse(跑龙套。DicomTag.PatientBirthDate GetStringValue (dcm));博士(“PatientBirthTime”)= DateTime.Parse(跑龙套。DicomTag.PatientBirthTime GetStringValue (dcm));}抓{}ds.Tables [“病人”].Rows.Add(博士);}}其他的{ret = InsertReturn.Exists;}}返回patientID;}
在DicomDB.cs文件,添加一个新的AddStudy (DicomDataSet dcm、字符串patientID ref InsertReturn ret)方法来解析和添加研究从DICOM数据到数据库表信息。
私人字符串AddStudy (DicomDataSet扩张型心肌病,字符串patientID,裁判InsertReturn ret){字符串studyInstanceUID;字符串过滤器;ret = InsertReturn.Success;studyInstanceUID =跑龙套。GetStringValue (dcm DicomTag.StudyInstanceUID);如果(studyInstanceUID。长度= = 0){ret = InsertReturn.Error;返回”“;}锁(adoDatasetLock){过滤器=“StudyInstanceUID = '”+ studyInstanceUID +“和PatientID =”+ patientID +“”;如果(RecordExists (ds.Tables [“研究”)、过滤){ret = InsertReturn.Exists;返回studyInstanceUID;}过滤器=字符串.Format (“StudyInstanceUID = {0}”,studyInstanceUID);如果(RecordExists (ds.Tables [“研究”)、过滤){ret = InsertReturn.Error;返回studyInstanceUID;}/ /添加试一试{我们应该= ds.Tables[博士“研究”].NewRow ();如果(博士! =零){博士(“StudyInstanceUID”)= studyInstanceUID;博士(“StudyID”)=跑龙套。GetStringValue (dcm DicomTag.StudyID);博士(“StudyDescription”)=跑龙套。GetStringValue (dcm DicomTag.StudyDescription);博士(“AccessionNumber”)=跑龙套。GetStringValue (dcm DicomTag.AccessionNumber);博士(“PatientID”)= patientID;博士(“PatientName”)=跑龙套。GetStringValue (dcm DicomTag.PatientName);博士(“ReferringDrName”)=跑龙套。GetStringValue (dcm DicomTag.ReferringPhysicianName);试一试{博士(“StudyDate”)= DateTime.Parse(跑龙套。DicomTag.StudyDate GetStringValue (dcm));博士(“StudyTime”)= DateTime.Parse(跑龙套。DicomTag.StudyTime GetStringValue (dcm));}抓{}ds.Tables [“研究”].Rows.Add(博士);}}抓(异常){ret = InsertReturn.Error;}}返回studyInstanceUID;}
在DicomDB.cs文件,添加一个新的AddSeries (studyInstanceUID DicomDataSet dcm,字符串,字符串patientID ref InsertReturn ret)方法来解析和添加系列从DICOM数据到数据库表信息。
私人字符串AddSeries (DicomDataSet扩张型心肌病,字符串studyInstanceUID,字符串patientID,裁判InsertReturn ret){字符串seriesInstanceUID;字符串过滤器;ret = InsertReturn.Success;seriesInstanceUID =跑龙套。GetStringValue (dcm DicomTag.SeriesInstanceUID);如果(seriesInstanceUID。长度= = 0){ret = InsertReturn.Error;返回”“;}过滤器=“StudyInstanceUID = '”+ studyInstanceUID +“和SeriesInstanceUID =”+ seriesInstanceUID +“”;锁(adoDatasetLock){如果(RecordExists (ds.Tables [“系列”)、过滤){ret = InsertReturn.Exists;返回seriesInstanceUID;}过滤器=字符串.Format (“SeriesInstanceUID = {0}”,seriesInstanceUID);如果(RecordExists (ds.Tables [“系列”)、过滤){ret = InsertReturn.Error;返回seriesInstanceUID;}/ /添加试一试{我们应该博士;= ds.Tables[博士“系列”].NewRow ();如果(博士! =零){字符串温度;temp =跑龙套。GetStringValue (dcm DicomTag.SeriesNumber);博士(“SeriesInstanceUID”)= seriesInstanceUID;博士(“StudyInstanceUID”)= studyInstanceUID;博士(“形态”)=跑龙套。GetStringValue (dcm DicomTag.Modality);博士(“PatientID”)= patientID;试一试{博士(“SeriesDate”)= DateTime.Parse(跑龙套。DicomTag.SeriesDate GetStringValue (dcm));}抓{}试一试{如果(temp.Length > 0){博士(“SeriesNumber”]= Convert.ToInt32(临时);}}抓{}ds.Tables [“系列”].Rows.Add(博士);}}抓(异常){ret = InsertReturn.Error;}}返回seriesInstanceUID;}
在DicomDB.cs文件,添加一个新的AddImage (studyInstanceUID seriesInstanceUID DicomDataSet dcm,字符串,字符串,字符串patientID,字符串文件名,裁判InsertReturn ret)方法来解析和添加图片从DICOM数据到数据库表信息。
私人字符串AddImage (DicomDataSet扩张型心肌病,字符串seriesInstanceUID,字符串studyInstanceUID,字符串patientID,字符串文件名,裁判InsertReturn ret){字符串sopInstanceUID;字符串过滤器;ret = InsertReturn.Success;sopInstanceUID =跑龙套。GetStringValue (dcm DicomTag.SOPInstanceUID);如果(sopInstanceUID。长度= = 0){ret = InsertReturn.Error;返回”“;}过滤器=“StudyInstanceUID = '”+ studyInstanceUID +“和SeriesInstanceUID =”+ seriesInstanceUID +“”;过滤器+ =”和SOPInstanceUID = '”+ sopInstanceUID +“”;锁(adoDatasetLock){如果(RecordExists (ds.Tables [“图片”)、过滤){ret = InsertReturn.Exists;返回sopInstanceUID;}过滤器=字符串.Format (“SOPInstanceUID = {0}”,sopInstanceUID);如果(RecordExists (ds.Tables [“图片”)、过滤){ret = InsertReturn.Error;返回sopInstanceUID;}/ /添加试一试{我们应该博士;= ds.Tables[博士“图片”].NewRow ();如果(博士! =零){字符串温度;博士(“SOPInstanceUID”)= sopInstanceUID;博士(“SeriesInstanceUID”)= seriesInstanceUID;博士(“StudyInstanceUID”)= studyInstanceUID;博士(“PatientID”)= patientID;博士(“ReferencedFile”)=文件名;temp =跑龙套。GetStringValue (dcm DicomTag.SOPClassUID);如果(temp.Length = = 0){temp =跑龙套。GetStringValue (dcm DicomTag.MediaStorageSOPClassUID);如果(temp.Length = = 0){temp =“1.1.1.1”;}}博士(“SOPClassUID”)= temp;temp =跑龙套。GetStringValue (dcm DicomTag.TransferSyntaxUID);如果(temp.Length = = 0){temp = DicomUidType.ImplicitVRLittleEndian;}博士(“TransferSyntaxUID”)= temp;temp =跑龙套。GetStringValue (dcm DicomTag.InstanceNumber);如果(temp.Length > 0){博士(“InstanceNumber”]= Convert.ToInt32(临时);}ds.Tables [“图片”].Rows.Add(博士);}}抓(异常){ret = InsertReturn.Error;}}返回sopInstanceUID;}
与数据库配置工具/ Server.cs并添加一个DicomDB类的属性:
公共DicomDB DicomDB;
添加的一个实例DicomDB类的form1.cs文件:
私人DicomDB DicomDB =新DicomDB(应用程序。StartupPath +@ " \ DicomCS.xml ");公共DicomDB DicomData {得到{返回dicomDB;}}
初始化服务器的dicomDB使用该实例的属性InitServer ()方法:
dicomServer。dicomDB= dicomDB;/ /添加InitServer ()
去公用事业\ Server.cs文件。添加以下使用声明。
使用System.Windows.Forms;/ /添加到使用块
添加一个ImageDir字符串值,使用的目录服务器用于存储本地数据集。
/ /图片目录私人字符串_ImageDir =应用程序。StartupPath +@“\显示亮度图像\”;
在获取/设置服务器属性部分的Server.cs文件添加ImageDir下面的属性。
/ /添加到服务器获取/设置属性公共字符串ImageDir {得到{返回_ImageDir;}集{_ImageDir =价值;}}
修改InitAction ()方法接受一个DicomDataSet实例的参数和使用它来初始化一个DicomAction类。
公共DicomAction InitAction (字符串actionOp, ProcessType过程,客户端,DicomDataSet ds){DicomAction action =新DicomAction(过程,这、客户、ds);行动。AETitle = client.Association.Calling;行动。ipAddress = client.PeerAddress;client.Timer.Start ();MainForm。日志(actionOp +”:收到“+ action.AETitle);返回行动;}
去公用事业\ Client.cs文件,添加下面的代码OnReceiveCStoreRequest ()处理程序方法叫做当C-STORE请求发送:
受保护的覆盖无效OnReceiveCStoreRequest (字节presentationID,int消息id,字符串affectedClass,字符串DicomCommandPriorityType优先,字符串moveAE,intmoveMessageID DicomDataSet数据集){action = _server.InitAction (“C-STORE-REQUEST”ProcessType.StoreRequest,这数据集);行动。PresentationID = PresentationID;行动。消息id =消息id;行动。类= affectedClass;行动。实例=实例;行动。优先级=的优先级;行动。MoveAETitle = moveAE;行动。MoveMessageID = MoveMessageID;action.DoAction ();dataSet.Dispose ();}
修改OnReceiveCEchoRequest通过零对修改后的_server.InitAction ()方法,因为C-ECHO不涉及数据集。
受保护的覆盖无效OnReceiveCEchoRequest (字节presentationID,int消息id,字符串affectedClass){action = _server.InitAction (“C-ECHO-REQUEST”ProcessType.EchoRequest,这,零);行动。PresentationID = PresentationID;行动。消息id =消息id;行动。类= affectedClass;action.DoAction ();}
导航到Form1.cs文件,并将以下代码添加到InitServer ()方法。
/ /创建图像文件夹如果(! Directory.Exists (dicomServer.ImageDir))Directory.CreateDirectory (dicomServer.ImageDir);
打开公用事业\ DicomAction.cs文件和存储请求添加到后直接枚举名称空间声明。
公共枚举ProcessType{EchoRequest,StoreRequest}
使用下面的代码来添加属性用于存储请求DicomAction类。
/ /添加到请求属性私人DicomCommandPriorityType _Priority;私人字符串_MoveAETitle;私人int_MoveMessageID;/ / DICOM数据集属性公共字符串dsFileName;私人DicomDataSet ds =新DicomDataSet ();
/ /添加获取/设置属性的方法公共DicomCommandPriorityType优先{得到{返回_Priority;}集{_Priority =价值;}}公共字符串MoveAETitle {得到{返回_MoveAETitle;}集{_MoveAETitle =价值;}}公共intMoveMessageID {得到{返回_MoveMessageID;}集{_MoveMessageID =价值;}}公共DicomDataSet DS {得到{返回ds;}}
修改DicomAction构造函数将一个数据集内的参数。
公共DicomAction (ProcessType过程中,服务器服务器,客户端,DicomDataSet ds){这.server =服务器;这.client =客户;这.process =过程;如果(ds ! =零){这.ds.Copy (ds,零,零);}}
修改DoAction方法解析StoreRequest的过程。
公共无效DoAction (){如果(客户端。协会! =零){开关(流程){/ / C-ECHO情况下ProcessType.EchoRequest:DoEchoRequest ();打破;/ / C-STORE情况下ProcessType.StoreRequest:DoStoreRequest ();打破;}}}
添加一个新的DoStoreRequest ()方法和添加以下代码。
私人无效DoStoreRequest (){DicomCommandStatusType状态= DicomCommandStatusType.ProcessingFailure;字符串味精=”保存数据集错误收到:“+ AETitle;DicomElement元素;如果(! IsActionSupported ()){字符串name = GetUIDName ();server.MainForm.Log (“C-STORE-REQUEST:抽象语法(“+名称+不支持通过协会”);客户端。SendCStoreResponse (_PresentationID、_MessageID _Class、_Instance DicomCommandStatusType.ClassNotSupported);返回;}元素= ds.FindFirstElement (零DicomTag.SOPInstanceUID,真正的);如果(元素! =零){字符串值= ds.GetConvertValue(元素);字符串文件;InsertReturn ret;文件服务器=。ImageDir+ value +“.dcm”;ret = server.MainForm.DicomData。插入(ds、文件);开关(ret){情况下InsertReturn.Success:DicomExceptionCode dret = SaveDataSet(文件);如果(dret = = DicomExceptionCode.Success){状态= DicomCommandStatusType.Success;}其他的{味精=“保存dicom文件:错误”+ dret.ToString ();状态= DicomCommandStatusType.ProcessingFailure;}server.MainForm.Log (“C-STORE-REQUEST:新文件导入:“+文件);打破;情况下InsertReturn.Exists:味精=”文件(“+文件+”)而不是进口的。记录已经存在于数据库”;状态= DicomCommandStatusType.DuplicateInstance;打破;情况下InsertReturn.Error:味精=“错误导入文件:“+文件;状态= DicomCommandStatusType.ProcessingFailure;打破;}}如果(状态! = DicomCommandStatusType.Success){server.MainForm.Log (”C-STORE-REQUEST:“+味精);}客户端。SendCStoreResponse (_PresentationID _MessageID、_Class _Instance,状态);server.MainForm.Log (“C-STORE-RESPONSE:响应发送到”+ AETitle);}
添加一个新的SaveDataSet(字符串文件名)方法和添加以下代码。
私人DicomExceptionCode SaveDataSet (字符串文件名){字符串温度;跑龙套。SetTag (ds, DicomTag.FillerOrderNumberProcedure“01”);temp =跑龙套。GetStringValue (ds, DicomTag.SOPClassUID);跑龙套。SetTag (ds, DicomTag。MediaStorageSOPClassUID、临时);temp =跑龙套。GetStringValue (ds, DicomTag.SOPInstanceUID);跑龙套。SetTag (ds, DicomTag。MediaStorageSOPInstanceUID、临时);跑龙套。SetTag (ds, DicomTag。ImplementationClassUID client.Association.ImplementClass);跑龙套。SetTag (ds, DicomTag。ImplementationVersionName client.Association.ImplementationVersionName);试一试{ds。保存(文件名,DicomDataSetSaveFlags。MetaHeaderPresent | DicomDataSetSaveFlags.GroupLengths);}抓(DicomException de){返回de.Code;}返回DicomExceptionCode.Success;}
打开DicomCommon / Utils.cs文件并添加使用下面的语句。
使用包含;/ /添加到使用块
添加一个新的SetTag (tagValue DicomDataSet dcm,长标签,对象)方法和添加以下代码。
公共静态DicomExceptionCode SetTag (DicomDataSet扩张型心肌病,长标签,对象tagValue){DicomExceptionCode ret = DicomExceptionCode.Success;DicomElement元素;如果(tagValue = =零)返回DicomExceptionCode.Parameter;元素= dcm.FindFirstElement (零、标签、真正的);如果(元素= =零){元素= dcm.InsertElement (零,假、标签、DicomVRType.UN假,0);}如果(元素= =零)返回DicomExceptionCode.Parameter;试一试{字符串s = tagValue.ToString ();如果(IsAscii (s))扩张型心肌病。SetConvertValue(元素,年代,1);其他的扩张型心肌病。SetStringValue(元素、年代DicomCharacterSetType.UnicodeInUtf8);}抓(DicomException de){ret = de.Code;}返回受潮湿腐烂;}
添加一个新的IsAscii(字符串值)方法和添加以下代码。
公共静态boolIsAscii (字符串值){返回Encoding.UTF8.GetByteCount(价值)= = value.Length;}
在运行项目,之前打开工具/ Server.cs支持存储DICOM文件并添加语法示例文件中找到< INSTALL_DIR > \ LEADTOOLS22 \ \ \ DICOM图像资源:
私人无效BuildInclusionList (){_UidInclusionList.Add (DicomUidType.VerificationClass);/ /存储传输语法_UidInclusionList.Add (DicomUidType.JPEG2000LosslessOnly);/ / Image1.dcm_UidInclusionList.Add (DicomUidType.JPEGLosslessNonhier14B);/ / Image2.dcm_UidInclusionList.Add (DicomUidType.ImplicitVRLittleEndian);/ / Image3.dcm/ /存储抽象语法_UidInclusionList.Add (DicomUidType.EnhancedMRImageStorage);/ / Image1.dcm_UidInclusionList.Add (DicomUidType.DXImageStoragePresentation);/ / Image2.dcm_UidInclusionList.Add (DicomUidType.MRImageStorage);/ / Image3.dcm}
按运行项目F5,或通过选择调试- >开始调试。
如果是正确的步骤,应用程序运行时,允许pac客户机发送C-STORE请求到服务器。在成功验证,处理请求允许图像添加到数据库中。
运行LEADTOOLS Dicom存储并- c#演示测试服务器,这个演示是在这里找到:< INSTALL_DIR > \ LEADTOOLS22 \ Bin \ DotNet4 \ x64 \ DicomStoreDemo_Original.exe
使用文件- >选项配置连接文件- >添加Dicom…添加示例DICOM数据集(Image1、Image2 Image3)演示。
然后使用文件- >存储为每个数据集发送C-STORE请求到服务器。
本教程展示了如何添加一个数据库pac服务器实施C-STORE请求的处理。