从dcm4che2迁移到dcm4che3

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

dcm4che核心,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净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/
你可以指导我采取替代方法吗?

正如您已经观察到的那样,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; }