如何使用pynetdicom展示DICOM C-FIND返回结果中的Series数据
基于pynetdicom实现STUDY-SERIES层级联动查询方案
DICOM Study Root查询模型原生支持层级匹配,不需要通过正则拆分字段关联,直接用标准的唯一标识符作为匹配条件即可实现层级联动。你遇到的问题核心是没有提取并保存Study Instance UID这个STUDY层级的唯一主键,用这个字段作为SERIES层级查询的过滤条件,就能精准拿到对应STUDY下的所有序列。
第一步:执行STUDY层级查询,存储关联主键
查询STUDY层级时,必须在返回字段中包含Study Instance UID,将该值与展示字段绑定存储在GUI控件的隐藏属性中(如Qt的QListWidgetItem.setData()、Tkinter的列表项绑定额外属性),不要只存展示用的文本信息。
STUDY层级查询示例代码:
from pynetdicom import AE from pynetdicom.sop_class import StudyRootQueryRetrieveInformationModelFind from pydicom.dataset import Dataset ae = AE() ae.add_requested_context(StudyRootQueryRetrieveInformationModelFind) # 替换为你对接的PACS参数 assoc = ae.associate("PACS_IP", PACS_PORT, ae_title="PACS_AE_TITLE") if assoc.is_established: ds = Dataset() ds.QueryRetrieveLevel = "STUDY" # 声明需要返回的字段 ds.PatientName = "" ds.StudyDate = "" ds.StudyInstanceUID = "" # 必须保留的关联主键 ds.StudyDescription = "" responses = assoc.send_c_find(ds, StudyRootQueryRetrieveInformationModelFind) study_result = [] for status, identifier in responses: if status and status.Status == 0xFF00: study_result.append({ "show_text": f"{identifier.PatientName} | {identifier.StudyDate} | {identifier.StudyDescription}", "study_uid": identifier.StudyInstanceUID # 存储主键用于后续关联 }) assoc.release() # 将study_result渲染到GUI的STUDY列表中,每个项绑定对应的study_uid
第二步:触发展开时执行SERIES层级查询
当用户点击某条STUDY的下拉/展开按钮时,取出该STUDY绑定的Study Instance UID,作为SERIES层级查询的过滤条件,发起SERIES级C-FIND请求,返回的结果就是该STUDY下的所有序列,直接渲染到下拉区域即可。
SERIES层级查询示例代码:
# target_study_uid 为选中STUDY对应的关联主键 def query_series(target_study_uid): assoc = ae.associate("PACS_IP", PACS_PORT, ae_title="PACS_AE_TITLE") if not assoc.is_established: return [] ds = Dataset() ds.QueryRetrieveLevel = "SERIES" # 过滤条件:仅返回对应STUDY下的序列 ds.StudyInstanceUID = target_study_uid # 声明SERIES层级需要返回的字段 ds.SeriesDescription = "" ds.Modality = "" ds.SeriesNumber = "" ds.SeriesInstanceUID = "" responses = assoc.send_c_find(ds, StudyRootQueryRetrieveInformationModelFind) series_result = [] for status, identifier in responses: if status and status.Status == 0xFF00: series_result.append({ "series_desc": identifier.SeriesDescription, "modality": identifier.Modality, "series_num": identifier.SeriesNumber }) assoc.release() return series_result
优化方案(可选)
如果需要提升交互响应速度,可以在首次查询完所有STUDY后,后台异步预查询所有STUDY对应的SERIES列表,存储在本地字典中(key为Study Instance UID,value为对应SERIES列表),用户展开时直接读取本地缓存即可,无需重复发起C-FIND请求。
注意事项
- 需确认对接的PACS支持Study Root模式的层级查询,绝大多数标准PACS均支持该特性
- 不要用正则提取字段做关联,DICOM标准的UID字段是全局唯一的,稳定性远高于自定义正则匹配
- 每次查询时需明确声明需要返回的UID字段,否则PACS不会返回对应值,无法完成层级关联
你当前的返回结果参考:
内容的提问来源于stack exchange,提问作者Sun B
相关产品推荐
相关产品推荐

