从dcm4che2迁移到dcm4che3 [英] Migration from dcm4che2 to dcm4che3

查看:1040
本文介绍了从dcm4che2迁移到dcm4che3的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在此存储库中使用了下面提到的dcm4che2的API http://www.dcm4che.org/maven2/dcm4che/ 在我的java项目中。

I have used below mentioned API of dcm4che2 from this repository http://www.dcm4che.org/maven2/dcm4che/ in my java project.

dcm4che-core-2.0.29.jar

org.dcm4che2.data.DicomObject  
org.dcm4che2.io.StopTagInputHandler  
org.dcm4che2.data.BasicDicomObject  
org.dcm4che2.data.UIDDictionary  
org.dcm4che2.data.DicomElement  
org.dcm4che2.data.SimpleDcmElement  
org.dcm4che2.net.service.StorageCommitmentService  
org.dcm4che2.util.CloseUtils  

dcm4che-net-2.0.29.jar

org.dcm4che2.net.CommandUtils  
org.dcm4che2.net.ConfigurationException  
org.dcm4che2.net.NetworkApplicationEntity  
org.dcm4che2.net.NetworkConnection  
org.dcm4che2.net.NewThreadExecutor  
org.dcm4che3.net.service.StorageService  
org.dcm4che3.net.service.VerificationService  

目前我想迁移到dcm4che3但是,我在dcm4che3中找不到上面列出的API从此存储库下载 http://sourceforge.net/projects/dcm4che/files/dcm4che3/

你能指导一下替代方法吗?

Currently i want to migrate to dcm4che3 but, above listed API is not found in dcm4che3 which i have downloaded from this repository http://sourceforge.net/projects/dcm4che/files/dcm4che3/
Could you please guide me for alternate approach?

推荐答案

正如你已经观察过的,BasicDicomObject是历史 - 与其他一些人一起。

As you have already observed, the BasicDicomObject is history -- alongside quite a few others.

新的Dicom对象是属性 - 对象是属性的集合。

The new "Dicom object" is Attributes -- an object is a collection of attributes.

因此,您创建属性,使用RQ行为(C-FIND等)所需的标记填充它们,而您获得的是另一个属性对象,您可以从中拉出所需的标记。

Therefore, you create Attributes, populate them with the tags you need for RQ-behaviour (C-FIND, etc) and what you get in return is another Attributes object from which you pull the tags you want.

在我看来,dcm4che 2.x在处理个别价值陈述方面的含糊不清。 dcm4che 3.x更加清晰。

In my opinion, dcm4che 2.x was vague on the subject of dealing with individual value representations. dcm4che 3.x is quite a bit clearer.

迁移需要重写您的代码,了解您如何查询以及如何处理单个标记。另一方面,dcm4che 3.x使新代码更少复杂。

The migration demands a rewrite of your code regarding how you query and how you treat individual tags. On the other hand, dcm4che 3.x makes the new code less convoluted.

一个相当完整的例子,从给定的登记号码的PACS中检索研究;设置查询并处理结果:

A fairly complete example, retrieving studies from a PACS given accession numbers; setting up the query and handling the result:

    String modality = null;
    String accessionNumber = "1234567890";

    //--------------------------------------------------------
    // HERE follows setup of a query, using an Attributes object
    //--------------------------------------------------------
    Attributes query = new Attributes();

    // Indicate character set
    {
        int tag = Tag.SpecificCharacterSet;
        VR vr = ElementDictionary.vrOf(tag, query.getPrivateCreator(tag));
        query.setString(tag, vr, "ISO_IR 100");
    }

    // Study level query
    {
        int tag = Tag.QueryRetrieveLevel;
        VR vr = ElementDictionary.vrOf(tag, query.getPrivateCreator(tag));
        query.setString(tag, vr, "STUDY");
    }

    // Accession number
    {
        int tag = Tag.AccessionNumber;
        VR vr = ElementDictionary.vrOf(tag, query.getPrivateCreator(tag));
        query.setString(tag, vr, accessionNumber);
    }

    // Optionally filter on modality in study if 'modality' is provided,
    // otherwise retrieve modality
    {
        int tag = Tag.ModalitiesInStudy; 
        VR vr = ElementDictionary.vrOf(tag, query.getPrivateCreator(tag));
        if (null != modality && modality.length() > 0) {
            query.setString(tag, vr, modality);
         } else {
            query.setNull(tag, vr);
         }
    }

    // We are interested in study instance UID
    {
        int tag = Tag.StudyInstanceUID;
        VR vr = ElementDictionary.vrOf(tag, query.getPrivateCreator(tag));
        query.setNull(tag, vr);
    }

    // Do the actual query, needing an AppliationEntity (ae), 
    // a local (local) and remote (remote) Connection, and 
    // an AAssociateRQ (rq) set up earlier.

    // 1) Open a connection to the SCP
    Association as = ae.connect(local, remote, rq);

    // 2) Query
    int priority = 0x0002; // low for the sake of demo :)
    as.cfind(UID.StudyRootQueryRetrieveInformationModelFIND, query, null,
             new DimseRSPHandler(as.nextMessageID()) {

        @Override
        public void onDimseRSP(Association assoc, Attributes cmd,
                               Attributes response) {

            super.onDimseRSP(assoc, cmd, response);

            int status = cmd.getInt(Tag.Status, -1);
            if (Status.isPending(status)) {
                //--------------------------------------------------------
                // HERE follows handling of the response, which
                // is just another Attributes object
                //--------------------------------------------------------
                String studyInstanceUID = response.getString(Tag.StudyInstanceUID);
                // etc...
            }
        }
    });

    // 3) Close the connection to the SCP
    if (as != null && as.isReadyForDataTransfer()) {
        as.waitForOutstandingRSP();
        as.release();
        as = null;
    }

这篇关于从dcm4che2迁移到dcm4che3的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆