В настоящее время я разрабатываю простое приложение для запроса / извлечения данных на PACS.Для этой цели я использую DCMTK и PACS DCM4CHEE в качестве тестового сервера.
Моя цель - реализовать простые запросы C-FIND и систему извлечения C-MOVE (в сочетании с пользовательским SCP для фактической загрузки данных).
Для этого я создал класс CustomSCU , который наследует класс DCMTK DcmSCU .
Сначала я реализовал сообщение C-ECHO, которое прекрасно работало.
Затем я попытался реализовать запрос C-FIND, но получил ошибку "DIMSE Нет действительного идентификатора контекста представления" (подробнее об этом в следующем абзаце) из моего приложения, но нет другого журнала из DCM4CHEE.Затем я использовал командный инструмент findcu (из dcmtk), чтобы увидеть, была ли какая-то проблема с конфигурацией, но инструмент просто работал нормально.Поэтому, чтобы реализовать мой запрос C-FIND, я прочитал источник findcu ( здесь ) и адаптировал его в своем коде (это означает, что я не использую DcmSCU :: sendCFindRequest , но класс DcmFindSU ).
Но сейчас я сталкиваюсь с той же проблемой с запросом C-MOVE.Мой код довольно прост:
//transfer syntaxes
OFList<OFString> ts;
ts.push_back(UID_LittleEndianExplicitTransferSyntax);
ts.push_back(UID_BigEndianExplicitTransferSyntax);
ts.push_back(UID_LittleEndianImplicitTransferSyntax);
//sop class
OFString pc = UID_MOVEPatientRootQueryRetrieveInformationModel;
addPresentationContext(pc, ts);
DcmDataset query;
query.putAndInsertOFStringArray(DCM_QueryRetrieveLevel, "PATIENT");
query.putAndInsertOFStringArray(DCM_PatientID, <ThePatientId>);
OFCondition condition = sendMOVERequest(findPresentationContextID(pc, ""), getAETitle(), &query, nullptr);
return condition.good();
Я также пытался использовать UID_MOVEStudyRootQueryRetrieveInformationModel вместо UID_MOVEPatientRootQueryRetrieveInformationModel , с тем же результатом ошибки:
DIMSE Нет действительного идентификатора контекста представления
Как я понимаю, контекст представления - это конкатенация одного или нескольких синтаксисов передачи и одного класса SOP.Я прочитал, что проблема может исходить от PACS, которая не принимает мои контексты презентации.Чтобы быть уверенным, я использовал инструмент movecu (из DCMTK).Это сработало, и я видел это в журналах с сервера DCM4CHEE:
received AAssociatedRQ
pc-1 : as=<numbers>/Patient Root Q/R InfoModel = FIND
ts=<numbers>/Explicit VR Little Endian
ts=<numbers>/Explicit VR Big Endian
ts=<numbers>/Implicit VR Little Endian
Это означает, что инструмент movcu выполняет поиск перед попыткой фактического перемещения?Поэтому я изменил создание контекста приложения с помощью:
OFList<OFString> ts;
ts.push_back(UID_LittleEndianExplicitTransferSyntax);
ts.push_back(UID_BigEndianExplicitTransferSyntax);
ts.push_back(UID_LittleEndianImplicitTransferSyntax);
OFString pc1 = UID_FINDPatientRootQueryRetrieveInformationModel;
OFString pc = UID_MOVEPatientRootQueryRetrieveInformationModel;
addPresentationContext(pc1, ts);
addPresentationContext(pc, ts);
(также попытался изучить root)
Но это не сработало.Проблема, кажется, лежит на стороне клиента, так как findPresentationContextID (pc, ""); всегда возвращает 0, несмотря ни на что.
Я не чувствую, что возможно адаптироватькод инструмента movcu, поскольку он выглядит очень сложным и не подходит для простых операций извлечения.
Я не знаю, что попробовать.Я надеюсь, что кто-то может помочь мне понять, что происходит.Это последняя часть моего приложения, так как хранилище SCP уже работает.
С уважением