DcmDirectoryRecord* DicomdirLoader::find_study(const std::string &studyinstanceuid, class DcmDicomDir &dir) { DcmDirectoryRecord *patRec; DcmDirectoryRecord *studyRec; OFCondition ret; DcmDirectoryRecord &root = dir.getRootRecord(); for ( patRec = root.nextSub(NULL); patRec != NULL; patRec = root.nextSub(patRec) ) { if ( patRec->getRecordType() == ERT_Patient ) { for ( studyRec = patRec->nextSub(NULL); studyRec; studyRec = patRec->nextSub(studyRec) ) { if ( studyRec->getRecordType()==ERT_Study ) { OFString uid; if ( studyRec->findAndGetOFString(DCM_StudyInstanceUID, uid)==EC_Normal ) { if ( studyinstanceuid == uid.c_str() ) return studyRec; } } } } } return NULL; }
void open_dicomdir_series(const std::string& studyinstanceuid, const Glib::ustring& dicomdir, const sigc::slot< void, const Glib::RefPtr< ImagePool::Series >& >& resultslot) { DcmDicomDir dir(dicomdir.c_str()); DcmDirectoryRecord *patRec; DcmDirectoryRecord *studyRec; DcmDirectoryRecord *seriesRec; OFCondition ret; if ( dir.error() != ECC_Normal ) { std::cout << "DICOMDIR Error: " << ret.text() << std::endl; return; } DcmDirectoryRecord &root = dir.getRootRecord(); for ( patRec = root.nextSub(NULL); patRec!=NULL; patRec = root.nextSub(patRec) ) { switch ( patRec->getRecordType() ) { case ERT_Patient: for ( studyRec=patRec->nextSub(NULL); studyRec; studyRec = patRec->nextSub(studyRec) ) { if ( studyRec->getRecordType()==ERT_Study ) { OFString uid; if ( studyRec->findAndGetOFString(DCM_StudyInstanceUID, uid)==ECC_Normal ) { if ( studyinstanceuid == uid.c_str() ) { open_dicomdir_series_result(dicomdir, patRec, studyRec, resultslot); return; } } } } break; case ERT_HangingProtocol: // FALLTHROUGH case ERT_Private: break; default: break; } } std::cout << "WARNING: study[" << studyinstanceuid << "] not found in DICOMDIR\n"; }
// Loads all dicom file in m_FileList // Initializes m_Cache // returns true if viewable files found, otherwise false bool DicomdirLoader::scan_study(const std::string &studyinstanceuid, class DcmDirectoryRecord *studyRec, const Glib::ustring &dicomdir) { DcmDirectoryRecord *seriesRec; DcmDirectoryRecord *sopRec; std::string path; std::string file; assert(studyRec->getRecordType()==ERT_Study); path = Glib::path_get_dirname(dicomdir); seriesRec = studyRec->nextSub(NULL); while ( seriesRec ) { OFString modality; if ( seriesRec->findAndGetOFString(DCM_Modality, modality) == EC_Normal ) { OFString seriesinstanceuid; if ( seriesRec->findAndGetOFString(DCM_SeriesInstanceUID, seriesinstanceuid) != EC_Normal ) { seriesRec = studyRec->nextSub(seriesRec); continue; } if ( ImageModalities.find(modality.c_str()) != std::string::npos ) { // Load Series... OFString fileID; int vm; int i; DcmElement *el; for (sopRec = seriesRec->nextSub(NULL); sopRec; sopRec = seriesRec->nextSub(sopRec) ) { switch ( sopRec->getRecordType() ) { case ERT_Image: case ERT_StoredPrint: if ( sopRec->findAndGetElement(DCM_ReferencedFileID, el, true)!=EC_Normal ) { sopRec = seriesRec->nextSub(sopRec); continue; } vm = el->getVM(); file = ""; for ( i=0; i<vm; i++ ) { el->getOFString(fileID, i); file = file + "/" + fileID.c_str(); } if ( file.size() > 0 ) { std::cout << "Loading DICOMDIR file [" << path.c_str() << file.c_str() << "]" << std::endl; m_filelist->push_back(path + file); std::string SeriesUID = seriesinstanceuid.c_str(); m_cache[studyinstanceuid].m_instancecount++; m_cache[studyinstanceuid].m_seriesuid.insert(SeriesUID); m_cache[studyinstanceuid].m_seriescount = m_cache[studyinstanceuid].m_seriesuid.size(); } break; default: break; } } } } seriesRec = studyRec->nextSub(seriesRec); } return true; }