当前位置: 首页 > 工具软件 > dcm4che > 使用案例 >

dcm4che java_java – 从dcm4che2迁移到dcm4che3

孔斌
2023-12-01

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

}

 类似资料: