我正在尝试使用 pynetdicom 编写一个简单的 DICOM MWL Worklist SCP。文档中没有提供任何示例,只是说它与 C-FIND 相同。
下面的代码仅发送状态
SUCCESS
,但数据集/患者不会出现在测试 MWL SCU 的列表中。我正在使用 miele-wl-scu 模拟查询工作列表的方式。
import pydicom
from pydicom.dataset import Dataset
from pydicom.uid import UID
from pynetdicom import AE, evt, debug_logger
from pynetdicom.sop_class import ModalityWorklistInformationFind
debug_logger()
def on_c_find(dataset, context= None, info= None):
"""Handle a C-FIND request event."""
# Check if ScheduledProcedureStepSequence exists
# Create the response dataset
identifier = Dataset()
identifier.PatientName = 'Hahah'
identifier.AccessionNumber = 'asa'
identifier.RequestedProcedureDescription = 'asa'
identifier.is_little_endian = True
identifier.is_implicit_VR = True
# Yield the response dataset
yield (0x0000, identifier) # Success
def main():
ae = AE()
# Add supported presentation contexts
ae.add_supported_context(ModalityWorklistInformationFind) # C FIND
ae.add_supported_context(UID('1.2.840.10008.1.1')) # ECHO
# Set callback functions
handlers = [(evt.EVT_C_FIND, on_c_find)]
print("Starting DICOM Worklist Server...")
# Start the DICOM server
ae.start_server(('localhost', 11112), evt_handlers=handlers)
if __name__ == "__main__":
main()
我从未使用过该工具包,但我认为以下代码行是问题所在:
yield (0x0000, identifier) # Success
0x0000
是SUCCESS
,应在末尾发送,不附加任何数据集(在您的情况下为identifier
)。在此之前,对于每个数据集,您的状态应为 0xFF00
,即 PENDING
。
我不了解相关编程语言的语法;如果我错了请纠正我。您的代码可能如下所示:
yield (0xFF00, identifier) # Pending
yield (0x0000, null) # Success
请参阅this答案了解更多详情。以下为原话:
MWL SCU(在您的情况下 - CR)使用它适合的(可选)过滤器启动查询。像往常一样,关联发生并且 MWL SCP 收到 MWL 请求。然后,它从数据库中获取与过滤器匹配的数据(如果有)。然后,它为从数据库获取的每一行发送一个 MWL 响应,每个响应的状态为 PENDING。传输所有行后,将发送最终的 SUCCESS 响应。如果没有找到与过滤器匹配的行,则仅发送最终响应。如果出现问题,则会发送正确的故障响应。然后,SCU 发送释放请求并在收到释放响应后关闭关联。