我在我的Java项目中使用了来自此存储库http://www.dcm4che.org/maven2/dcm4che/的dcm4che2的以下API。

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,但是在我从此存储库http://sourceforge.net/projects/dcm4che/files/dcm4che3/下载的dcm4che3中找不到上面列出的API。
您能指导我替代方法吗?

最佳答案

正如您已经观察到的,BasicDicomObject是历史记录-以及许多其他历史记录。

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

因此,您创建了属性,并在其中填充了RQ行为所需的标签(C-FIND等),作为返回,您将获得另一个Attributes对象,您可以从该对象中提取所需的标签。

我认为,dcm4che 2.x在处理单个值表示形式时含糊不清。 dcm4che 3.x更加清晰了。

迁移需要重写有关查询方式和如何处理单个标签的代码。另一方面,dcm4che 3.x使得新代码的卷积更少。

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

    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;
    }

关于java - 从dcm4che2迁移到dcm4che3,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31728477/

10-11 05:00