def importFromDICOMWeb(dicomWebEndpoint, studyInstanceUID, seriesInstanceUID=None, accessToken=None): """ Downloads and imports DICOM series from a DICOMweb instance. Example usage: from DICOMLib import DICOMUtils loadedUIDs = DICOMUtils.importFromDICOMWeb(dicomWebEndpoint="https://yourdicomweburl/dicomWebEndpoint", studyInstanceUID="2.16.840.1.113669.632.20.1211.10000509338") accessToken="YOUR_ACCESS_TOKEN") :param dicomWebEndpoint: Endpoint URL for retrieving the study/series from DICOMweb :param studyInstanceUID: UID for the study to be downloaded :param seriesInstanceUID: UID for the series to be downloaded. If not specified, all series will be downloaded from the study :param accessToken: Optional access token for the query :return: List of imported study UIDs """ from dicomweb_client.api import DICOMwebClient import random if accessToken is None: client = DICOMwebClient(url = dicomWebEndpoint) else: client = DICOMwebClient( url = dicomWebEndpoint, headers = { "Authorization": "Bearer {}".format(accessToken) }, ) seriesList = client.search_for_series(study_instance_uid=studyInstanceUID) seriesInstanceUIDs = [] if not seriesInstanceUID is None: seriesInstanceUIDs = [seriesInstanceUID] else: for series in seriesList: currentSeriesInstanceUID = series['0020000E']['Value'][0] seriesInstanceUIDs.append(currentSeriesInstanceUID) fileNumber = 0 for currentSeriesInstanceUID in seriesInstanceUIDs: instances = client.retrieve_series( study_instance_uid=studyInstanceUID, series_instance_uid=currentSeriesInstanceUID) outputDirectoryBase = slicer.dicomDatabase.databaseDirectory + "/DICOMweb" if not os.access(outputDirectoryBase, os.F_OK): os.makedirs(outputDirectoryBase) outputDirectoryBase += "/" + qt.QDateTime.currentDateTime().toString("yyyyMMdd-hhmmss") outputDirectory = qt.QTemporaryDir(outputDirectoryBase) # Add unique substring to directory outputDirectory.setAutoRemove(False) outputDirectoryPath = outputDirectory.path() for instance in instances: filename = outputDirectoryPath + "/" + str(fileNumber) + ".dcm" instance.save_as(filename) fileNumber += 1 slicer.app.processEvents() importDicom(outputDirectoryPath) return seriesInstanceUIDs
def _retrieve_series(args): '''Retrieves all Instances of a given Series and either writes them to standard output or to files on disk. ''' client = DICOMwebClient(args.url, username=args.username, password=args.password, ca_bundle=args.ca_bundle, cert=args.cert) instances = client.retrieve_series( args.study_instance_uid, args.series_instance_uid, media_types=args.media_types, ) for inst in instances: sop_instance_uid = inst.SOPInstanceUID if args.save: _save_instance(inst, args.output_dir, sop_instance_uid) else: _print_instance(inst)
def importFromDICOMWeb(dicomWebEndpoint, studyInstanceUID, seriesInstanceUID=None, accessToken=None): """ Downloads and imports DICOM series from a DICOMweb instance. Example usage: from DICOMLib import DICOMUtils loadedUIDs = DICOMUtils.importFromDICOMWeb(dicomWebEndpoint="https://yourdicomweburl/dicomWebEndpoint", studyInstanceUID="2.16.840.1.113669.632.20.1211.10000509338") accessToken="YOUR_ACCESS_TOKEN") :param dicomWebEndpoint: Endpoint URL for retrieving the study/series from DICOMweb :param studyInstanceUID: UID for the study to be downloaded :param seriesInstanceUID: UID for the series to be downloaded. If not specified, all series will be downloaded from the study :param accessToken: Optional access token for the query :return: List of imported study UIDs """ from dicomweb_client.api import DICOMwebClient import random progressDialog = slicer.util.createProgressDialog( parent=slicer.util.mainWindow(), value=0, maximum=100) progressDialog.labelText = f'Retrieving series list...' slicer.app.processEvents() if accessToken is None: client = DICOMwebClient(url=dicomWebEndpoint, callback=progressCallback) else: client = DICOMwebClient( url=dicomWebEndpoint, headers={"Authorization": f"Bearer {accessToken}"}, ) seriesList = client.search_for_series(study_instance_uid=studyInstanceUID) seriesInstanceUIDs = [] if not seriesInstanceUID is None: seriesInstanceUIDs = [seriesInstanceUID] else: for series in seriesList: currentSeriesInstanceUID = series['0020000E']['Value'][0] seriesInstanceUIDs.append(currentSeriesInstanceUID) fileNumber = 0 cancelled = False for seriesIndex, currentSeriesInstanceUID in enumerate(seriesInstanceUIDs): progressDialog.labelText = f'Retrieving series {seriesIndex+1} of {len(seriesInstanceUIDs)}...' slicer.app.processEvents() instances = client.retrieve_series( study_instance_uid=studyInstanceUID, series_instance_uid=currentSeriesInstanceUID) progressDialog.setValue( int(100 * seriesIndex / len(seriesInstanceUIDs))) slicer.app.processEvents() cancelled = progressDialog.wasCanceled if cancelled: break outputDirectoryBase = slicer.dicomDatabase.databaseDirectory + "/DICOMweb" if not os.access(outputDirectoryBase, os.F_OK): os.makedirs(outputDirectoryBase) outputDirectoryBase += "/" + qt.QDateTime.currentDateTime().toString( "yyyyMMdd-hhmmss") outputDirectory = qt.QTemporaryDir( outputDirectoryBase) # Add unique substring to directory outputDirectory.setAutoRemove(False) outputDirectoryPath = outputDirectory.path() for instanceIndex, instance in enumerate(instances): filename = outputDirectoryPath + "/" + str(fileNumber) + ".dcm" instance.save_as(filename) fileNumber += 1 importDicom(outputDirectoryPath) if cancelled: break progressDialog.close() return seriesInstanceUIDs