如何使用LEADTOOLS自定义LEADTOOLS MWL数据库

发布时间:2017/03/22 00:03 发布者:Richard.Ma

返回博客中心

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

有关完整的工作演示程序和包含以下步骤的源代码,请参阅  在<安装目录>\Bin\Dotnet4\Win32 中的CustomizingWorklistDAL 演示程序 和在<安装目录>\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 Enterprise Manager等可视化工具将新列添加到数据库中的相应表中。 或者,您可以使用以下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”列中的新字段中。以下代码完成了这些任务。 此代码假定您已经成功地创建并配置了基本的Modality Worklist数据库,并且有一个有效的数据库连接。 以下代码完成了这些任务。 此代码假定您已经成功地创建并配置了基本的Modality Worklist数据库,并且有一个有效的数据库连接。
    [C#]
                  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 使用uses the Leadtools.Dicom.Scp.Command.MWLCFindCommand 现在,Leadtools.Medical.Worklist.DataAccessLayer.IWorklistDataAccessAgent对象能够查询和更新您创建的新列,您需要在DICOM C-Find响应中支持这些列。 ModalityWorklistAddIn使用Leadtools.Dicom.Scp.Command.MWLCFindCommand将这两列映射到正确DICOM元素来响应客户机查询。

    Leadtools.Dicom.Scp.Command.MWLCFindCommand 有一个静态属性, Leadtools.Dicom.Scp.Command.MWLCFindCommand.DefualtMWLIOD, 会返回一个流. 流是一个包含DICOM Modality Worklist IOD元素的XML文件并告知Leadtools.Dicom.Scp.Command.MWLCFindCommand在返回的QueryModalityWorklists中映射每个元素怎样被映射。

     

  5. 使用下面代码将MWL IOD stream 写入磁盘:
    [C#]
                  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属性:
    • <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" />
    • <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. 您应该根据schema验证您的新XML文件。 使用以下代码验证新的XML文件:
    [C#]
                  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 加载项中使用如下代码:
    [C#]
                  MWLCFindCommand command = new MWLCFindCommand(clientSession, requestDS, GetDataAccessAgent());
                  AutoResetEvent resetEvent = new AutoResetEvent(false);
                  command.MWLConfiguration.ModalityWorklistIODPath = _iodPath;
                        
                  command.Execute(resetEvent);
                     
    

 

以下是MWL IOD文件中的属性的注释和说明:

  • Modality Work-list IOD的所有元素都列在文档中。
  • 元素应依据DICOM规范根据标签号进行排序。
  • MWLCFindCommand命令将根据IOD验证数据集请求,因此如果排序不正确,则会在运行时发生验证错误。
  • 可以添加额外的DICOM元素或私人元素,但是新元素应该以正确的排序顺序放置
  • 使用XML标签<element>将单独DICOM元素添加到文档
  • 使用XML标签<sequence>将Sequence DICOM元素添加到文档
  • Sequence Item DICOM元素被添加到具有XML标签<item>的文档中,它们必须只出现在<sequence>标签之后。
  • IOD由schema定义,当更新IOD时,应确保它根据schema的定义是有效的。

以下是对<element>和<sequence> XML标签的解释:

             <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(其中应该获取此DICOM元素的值)。
  • matchingEntity:如果matchType的值是“NotApplicable”以外的任何值,则在与MWL数据访问层进行通信时,该值应填充用作匹配参数的对象。

关于葡萄城

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

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