LeadTools 自定义 MWL数据库

发布时间:2015/11/13 00:11 发布者:iceman

返回博客中心

在本教程中,您可以通过在现有数据库的两个表格中添加两个新列的方法来定义数据库。然后,再创建一个Leadtools.Medical.Worklist.DataAccessLayer.IWorklistDataAccessAgent对象,用来查询和更新这两个新列。最后,您可以为客户端查询响应而将这两个新列映射到相应的DICOM 元素

为了有一个完整的工作演示程序,以及包括以下步骤的源代码,请您参考<InstallationDirectory>\ BIN\ Dotnet4\ Win32中的CustomizingWorklistDAL演示程序,以及<InstallationDirectory>\Examples\Dotnet\.中的源代码。

注意:这些任务和代码片段可以假定您已经创建和配置了基础成像设备工作列表数据库,且会假定有一个有效的连接存在。 LEADTOOLS可以提供Microsoft SQL Server Compact Edition数据库文件,以便供您在必要时使用。这些文件被命名为LeadDicomWorklist32.sdf和LeadDicomWorklist64.sdf。他们分别是32位和64位的,且都位于该目录C:\Users\Public\Documents下。请您自行选择适合自己的应用程序和环境的数据库。

1.您需要创建的两个新列分别是,“Patient”表格中的一个“SmokingStatus”列,和“ScheduledProcedureStep”表格中的一个“CommentsOnTheScheduledProcedureStep”列。这两个新列将被映射到以下的DICOM元素:

  • Smoking Status(0010,21A0)
  • Procedure Step Comments on the Scheduled(0040,0400)
  • 您可以像使用SQL企业管理器一样使用一个可视化工具,来将新列添加到数据库里相应的表格中。另外,您也可以使用以下的SQL命令:

alter table [Patient] add [SmokingStatus]nvarchar(10)
alter table [ScheduledProcedureStep] add [CommentOnTheSchedulerProcedureStep] nvarchar(400)   

    2. 请您在数据库列中选择一个有效的数据类型,它代表的是您将它们所映射到的元素的实际DICOM VR

    3. 您可以使用Leadtools.Medical.Worklist.DataAccessLayer.IWorklistDataAccessAgent对象来进行查询,且可以用来在“SmokingStatus”列和“CommentsOnTheScheduleProcedureStep”列的新的字段中插入一个新值。以下的代码可以用来完成这些任务。此代码会假定您已经成功地创建和配置了基础成像设备工作列表数据库,并且会假定有一个有效的数据库连接存在。

                  private void QueryWorklistItems ()
    
                  {
    
                     IWorklistDataAccessAgent agent = GetDataAccessAgent() ;
    
                     
    
                     MWLDataset queryResults = agent.QueryModalityWorklists(new MatchingParameterCollection(), new StringCollection());
    
                     
    
                     if (queryResults.Patient.Rows.Count > 0)
    
                    {
    
                        queryResults.Patient[0] ["SmokingStatus"] = "UNKNOWN";
    
                     }
    
                     
    
                     if (queryResults.ScheduledProcedureStep.Rows.Count > 0)
    
                     {
    
                        queryResults.ScheduledProcedureStep[0] ["CommentsOnTheScheduledProcedureStep"] = "Some comments on the procedure
    
                     }
    
                     
    
                     agent.UpdateMWL(queryResults);
    
                  }
    
                
    
                  private IWorklistDataAccessAgent GetDataAccessAgent()
    
                  {
    
                        WorklistDataAccessConfigurationView view = new WorklistDataAccessConfigurationView();
    
                        IWorklistDataAccessAgent agent;
    
                       
    
                        string connectionString = view.GetConnectionStringSettings().ConnectionString;
    
                        string provider         = view.GetConnectionStringSettings().ProviderName;
    
                        
    
                        if (provider == DataAccessMapping.DefaultSqlProviderName)
    
                        {
    
                           agent    = new WorklistSqlDbDataAccessAgent (connectionString);
    
                        }
    
                        else if (provider == DataAccessMapping.DefaultSqlCe3_5ProviderName)
    
                        {
    
                           agent    = new WorklistSqlCeDataAccessAgent(connectionString);
    
                        }
    
                        else
    
                        {
    
                           throw new NotImplementedException();
    
                        }
    
                        
    
                        return agent;
    
                  }
    
                         
    

        4. 既然Leadtools.Medical.Worklist.DataAccessLayer.IWorklistDataAccessAgent对象可以用来对您所创建的新列进行查询和更新,那么您就需要在DICOM C-FIND响应时支持这些列。在响应一个客户端查询时,ModalityWorklistAddIn可以使用theLeadtools.Dicom.Scp.Command.MWLCFindCommand来将这两列映射到正确的DICOM元素。

        Leadtools.Dicom.Scp.Command.MWLCFindCommand有一个静态属性,即Leadtools.Dicom.Scp.Command.MWLCFindCommand.DefualtMWLIOD,该属性可以返回一个流。该流是一个包含DICOM成像设备工作列表IOD元素的XML文件,并且它可以告诉theLeadtools.Dicom.Scp.Command.MWLCFindCommand每个元素是如何映射到返回的QueryModalityWorklists的。

        5.请您使用以下的代码来将MWL IOD流写入磁盘:

        using (Stream iodStream = MWLCFindCommand.DefualtMWLIOD)
        
                      {
        
                          using (FileStream customIODStream = new FileStream(_iodPath, FileMode.Create))
        
                          {
        
                             int readCount;
        
                             var buffer = new byte[8192];
        
                             while((readCount = iodStream.Read(buffer, 0, buffer.Length)) != 0)
        
                             {
        
                             customIODStream.Write(buffer, 0, readCount);
        
                             }
        
                          }
        
                      }
        

         

        6.请您在任意的文本编辑器中打开一个新的XML文件,并从中找到SmokingStatus和ScheduledProcedureStep元素。请用新的值来更新tableName和columnsName这两个属性:

        SmokingStatus和ScheduledProcedureStep元素。请用新的值来更新tableName和columnsName这两个属性:
        
        o	<element tag="(0010,21a0)" tagName="SmokingStatus" vr="CS" minVM="1" maxVM="1" vmDivider="1" returnType="Type3" matchingType="NotApplicable" returning="true" tableName="Patient" matchingEntity="" columnsName="SmokingStatus" />
        
        o	<element tag="(0040,0400)" tagName="CommentsOnTheScheduledProcedureStep" vr="LT" minVM="1" maxVM="1" vmDivider="1" returnType="Type3" matchingType="NotApplicable" returning="true" tableName="ScheduledProcedureStep" matchingEntity="" columnsName="CommentsOnTheScheduledProcedureStep" />
        

         

        7.您应该根据架构来验证新的XML文件。并使用以下的代码来验证新的XML文件:

                      private static void ValidateDocument(string iodPath)
        
                      {
        
                         XmlSchema         mwlSchema;
        
                         XmlReaderSettings settings;
        
                         
        
                         mwlSchema = MWLCFindCommand.IODSchema;
        
                         
        
                         settings = new XmlReaderSettings();
        
                         
        
                         settings.Schemas.Add(mwlSchema);
        
                         settings.ValidationType = ValidationType.Schema;
        
                         
        
                         settings.ValidationEventHandler += new ValidationEventHandler(schemaValidationHandler);
        
                         
        
                         using (XmlReader reader = XmlTextReader.Create(iodPath, settings))
        
                         {
        
                            while (reader.Read());
        
                         }
        
                      }
        
                      private static void schemaValidationHandler(object sender, ValidationEventArgs args) 
        
                      {
        
                         throw args.Exception;
        
                      }
        

         

        8.请您使用Leadtools.Dicom.Scp.Command.MWLCFindCommand的这个新文件。并在ModalityWorklistAddIn加载项中使用以下的代码:

        MWLCFindCommand command = new MWLCFindCommand(clientSession, requestDS, GetDataAccessAgent());
        
        AutoResetEvent resetEvent = new AutoResetEvent(false);
        
        command.MWLConfiguration.ModalityWorklistIODPath = _iodPath;
        
                            
        
        command.Execute(resetEvent);
        

         

        9.以下是有关MWL IOD文件中属性的说明和描述:

        • 该成像设备工作列表IOD的所有元素都列在此文档中。
        • 元素应根据基于所述标签号码的DICOM规格来进行排序。
        • 该MWLCFindCommand命令将验证对IOD数据集的要求,因此,如果排序不正确的话,运行时会发生一个验证错误。
        • 虽然可能会增加一些超常的DICOM元素或专属的因素,但新的项目应该按照正确的排序顺序排列。
        • 带有XML标签<element>的、单一的DICOM元素会被添加到文档中。
        • 带有XML标签<sequence>的、连续的DICOM元素会被添加到文档中。
        • 带有XML标签<item> 的、序列项目的DICOM元素会被添加到文档中,且它们必须且只能出现在<sequence>标签后。
        • 该IOD是由一个模式来定义的。在对IOD进行更新时,您应该确保根据所定义的模式来看它是有效的。
        • 以下是对每个XML标签<element> 和 <sequence>的说明。

        以下是对XML标签<element>和<sequence>的说明:

        <element  tag="" tagName="" vr="" minVM="" maxVM="" vmDivider="" returnType="" matchingType="" returning="" tableName="" matchingEntity="" columnsName="" />
        
                     <sequence tag="" tagName="" vr="SQ" minVM="" maxVM="" vmDivider="" returnType="" returning="" tableName="">
        

         

        • tag:元素的DICOM标签。这是用来定义该标签到底与哪个DICOM元素相对应的最重要的标签。
        • tagName: 这可以是任意的、人类可读的名字。
        • vr: 这是被用来验证所述请求值的DICOM值表征。
        • MinVM: 这是用于验证的多个值里的最小值。
        • MaxVM: 这是用于验证的多个值里的最大值。
        • vmDivider: 值多样性的步进大小。
        • returnType: DICOM的返回类型(检查所允许值的模式)。可以用来验证type1元素在返回时有值,且可以在没有响应值时删除type3元素。
        • matchingType: DICOM的匹配类型(检查所允许值的模式)。可以用来向MWL命令指示要如何对每个元素进行匹配。
        • returning: 可以用来向MWL命令指示该元素是否应在响应时返回。tableName: 可以用来向MWL命令指示该元素存在于哪个ADO.NET表格。
        • ColumnsName: 可以用来向MWL命令指示它应该在ADO.NET的DataColumn(S)获取该DICOM元素的值。
        • matchingEntity: 如果matchingType的值是除“NotApplicable”以外的任意值,那么该值应该用与MWL数据访问层通信时作为匹配参数所使用的对象来填充。

        支持

        关于其他产品的更多信息,请访问我们的官方网站

        欢迎下载免费的全功能评估版SDK,全功能试用版中有这个例子的全部源代码。

        同时欢迎您使用评估版期间的免费技术支持


        关于葡萄城

        赋能开发者!葡萄城是专业的集开发工具、商业智能解决方案、低代码开发平台于一身的软件和服务提供商,为超过 75% 的全球财富 500 强企业提供服务。葡萄城专注控件软件领域30年,希望通过模块化的开发控件、灵活的低代码应用开发平台等一系列开发工具、解决方案和服务,帮助开发者快速响应复杂多变的业务需求,最大程度地发挥开发者的才智和潜能,让开发者的 IT 人生更从容更美好。

        了解详情,请访问葡萄城官网