[Python] C-MOVE - Python - pydicom/pynetdicom

Discussão em 'Python' iniciado por Stack, Julho 23, 2025.

  1. Stack

    Stack Membro Participativo

    Estou implementando uma operação C-MOVE utilizando a biblioteca pynetdicom. No entanto, o processo só funciona corretamente em ambiente local. Quando um equipamento médico externo tenta recuperar as imagens, a operação não é concluída com sucesso.

    A operação C-FIND está funcionando perfeitamente. O problema ocorre exclusivamente com o C-MOVE, e apenas quando o destino não é a própria máquina local.

    meu handle

    if 'QueryRetrieveLevel' not in event.identifier:
    # Failure
    yield 0xC000, None
    return

    destination_ae, destino_info = obter_destino(event.move_destination)
    if destino_info is None:
    logging.info("AeTitle não cadastrado.")
    yield 0xA801, None
    return

    ip = destino_info.get("ip")
    porta = destino_info.get("port")
    yield (ip, porta)

    datasets, quantidade = buscar_imagens_para_envio(event.identifier)
    if not datasets:
    yield 0xC000, None
    return

    total_imagens = quantidade
    if total_imagens == 0:
    yield 0
    return

    yield str(total_imagens)

    ae, assoc = preparar_associacao(destino_info)
    if not assoc or not assoc.is_established:
    yield 0xA801, None
    return

    total_enviados = enviar_arquivos(datasets, assoc)
    assoc.release()
    yield (0x0000, None)


    Funções especificas:

    preparar_associacao/prepare_association

    ae = AE(ae_title=AETitleQR)

    ae.add_requested_context(StudyRootQueryRetrieveInformationModelMove)

    for context in AllStoragePresentationContexts:
    ae.add_supported_context(
    context.abstract_syntax,
    transfer_syntax=context.transfer_syntax
    )

    configurar_contextos_ae(ae)

    assoc = ae.associate(str(destino['ip']), destino['port'], ae_title=str(destino['aet']))

    return ae, assoc


    enviar_arquivos

    for caminho in arquivos:
    try:
    ds_envio = dcmread(caminho)

    status = assoc.send_c_store(ds_envio)
    if status and status.Status != 0x0000:
    logging.warning(f"[WARN] Falha no envio: 0x{status.Status:04x}")
    else:
    logging.info(f"[INFO] Enviado: {caminho}")

    except Exception as e:
    logging.error(f"[ERRO] Falha ao enviar {caminho}: {e}")
    continue


    De forma local funciona perfeitamente como mencionei apenas quando passo para qualquer outro ip a imagem não é recebida, teste realizado pelo radiant/sant free/orthanc

    Configuração- SCP

    handlers = [
    (evt.EVT_C_GET, handle_c_get),
    (evt.EVT_ACCEPTED, handle_accepted),
    (evt.EVT_C_ECHO, handle_echo),
    (evt.EVT_C_FIND, handle_find),
    (evt.EVT_C_MOVE, handle_c_move),
    ]
    ae.start_server(('', 10001), block=True, evt_handlers=handlers)


    Há algo que eu esteja esquecendo ?

    pydicom: 3.0.1 pynetdicom: 3.0.3

    Continue reading...

Compartilhe esta Página