/// <summary> /// Adds a sequence item to temporarydictionary with the current offset. /// </summary> /// <param name="recordType">Type of the record.</param> /// <param name="dataSet">The data set.</param> /// <param name="tags">The tags.</param> /// <returns>The newly created DirectoryRecord</returns> /// <remarks>Tags are a dictionary of tags and optional values - if the value is null, then it will get the value from the specified dataset</remarks> private static DirectoryRecordSequenceItem AddSequenceItem(DirectoryRecordType recordType, IDicomAttributeProvider dataSet, IDictionary<uint, object> tags) { DirectoryRecordSequenceItem dicomSequenceItem = new DirectoryRecordSequenceItem(); dicomSequenceItem[DicomTags.OffsetOfTheNextDirectoryRecord].Values = 0; dicomSequenceItem[DicomTags.RecordInUseFlag].Values = 0xFFFF; dicomSequenceItem[DicomTags.OffsetOfReferencedLowerLevelDirectoryEntity].Values = 0; string recordName; DirectoryRecordTypeDictionary.TryGetName(recordType, out recordName); dicomSequenceItem[DicomTags.DirectoryRecordType].Values = recordName; DicomAttribute charSetAttrib; if (dataSet.TryGetAttribute(DicomTags.SpecificCharacterSet, out charSetAttrib)) dicomSequenceItem[DicomTags.SpecificCharacterSet] = charSetAttrib.Copy(); foreach (uint dicomTag in tags.Keys) { try { DicomTag dicomTag2 = DicomTagDictionary.GetDicomTag(dicomTag); DicomAttribute attrib; if (tags[dicomTag] != null) { dicomSequenceItem[dicomTag].Values = tags[dicomTag]; } else if (dataSet.TryGetAttribute(dicomTag, out attrib)) { dicomSequenceItem[dicomTag].Values = attrib.Values; } else { Platform.Log(LogLevel.Info, "Cannot find dicomTag {0} for record type {1}", dicomTag2 != null ? dicomTag2.ToString() : dicomTag.ToString(), recordType); } } catch (Exception ex) { Platform.Log(LogLevel.Error, ex, "Exception adding dicomTag {0} to directory record for record type {1}", dicomTag, recordType); } } return dicomSequenceItem; }
/// <summary> /// Traverse at the Study level to check if a Study exists or create a Study if it doesn't exist. /// </summary> /// <param name="studies"></param> /// <param name="file"></param> /// <returns></returns> private static DirectoryRecordSequenceItem GetExistingOrCreateNewStudy(DirectoryRecordSequenceItem studies, DicomMessageBase file) { DirectoryRecordSequenceItem currentStudy = studies; while (currentStudy != null) { if (currentStudy[DicomTags.StudyInstanceUid].Equals(file.DataSet[DicomTags.StudyInstanceUid])) { return currentStudy; } if (currentStudy.NextDirectoryRecord == null) { currentStudy.NextDirectoryRecord = CreateStudyItem(file); return currentStudy.NextDirectoryRecord; } currentStudy = currentStudy.NextDirectoryRecord; } return null; }
/// <summary> /// Traverse at the Series level to check if a Series exists, or create a Series if it doesn't exist. /// </summary> /// <param name="series"></param> /// <param name="file"></param> /// <returns></returns> private static DirectoryRecordSequenceItem GetExistingOrCreateNewSeries(DirectoryRecordSequenceItem series, DicomMessageBase file) { DirectoryRecordSequenceItem currentSeries = series; while (currentSeries != null) { if (currentSeries[DicomTags.SeriesInstanceUid].Equals(file.DataSet[DicomTags.SeriesInstanceUid])) { return currentSeries; } if (currentSeries.NextDirectoryRecord == null) { currentSeries.NextDirectoryRecord = CreateSeriesItem(file); return currentSeries.NextDirectoryRecord; } currentSeries = currentSeries.NextDirectoryRecord; } return null; }
/// <summary> /// Traverse at the Patient level to check if a Patient exists or create a Patient if it doesn't exist. /// </summary> /// <param name="patients"></param> /// <param name="file"></param> /// <returns></returns> private static DirectoryRecordSequenceItem GetExistingOrCreateNewPatient(DirectoryRecordSequenceItem patients, DicomMessageBase file) { DirectoryRecordSequenceItem currentPatient = patients; while (currentPatient != null) { if (currentPatient[DicomTags.PatientId].Equals(file.DataSet[DicomTags.PatientId]) && currentPatient[DicomTags.PatientsName].Equals(file.DataSet[DicomTags.PatientsName])) { return currentPatient; } if (currentPatient.NextDirectoryRecord == null) { currentPatient.NextDirectoryRecord = CreatePatientItem(file); return currentPatient.NextDirectoryRecord; } currentPatient = currentPatient.NextDirectoryRecord; } return null; }
/// <summary> /// Traverse through the tree of directory records, and set the values for the offsets for each /// record. /// </summary> private static void SetOffsets(DirectoryRecordSequenceItem root) { if (root.NextDirectoryRecord != null) { root[DicomTags.OffsetOfTheNextDirectoryRecord].Values = root.NextDirectoryRecord.Offset; SetOffsets(root.NextDirectoryRecord); } else root[DicomTags.OffsetOfTheNextDirectoryRecord].Values = 0; if (root.LowerLevelDirectoryRecord != null) { root[DicomTags.OffsetOfReferencedLowerLevelDirectoryEntity].Values = root.LowerLevelDirectoryRecord.Offset; SetOffsets(root.LowerLevelDirectoryRecord); } else root[DicomTags.OffsetOfReferencedLowerLevelDirectoryEntity].Values = 0; }
/// <summary> /// Traverse at the image level to see if the image exists or create a new image if it doesn't. /// </summary> /// <param name="images"></param> /// <param name="file"></param> /// <param name="optionalDicomDirFileLocation"></param> /// <returns></returns> private void GetExistingOrCreateNewImage(DirectoryRecordSequenceItem images, DicomFile file, string optionalDicomDirFileLocation) { DirectoryRecordSequenceItem currentImage = images; while (currentImage != null) { if (currentImage[DicomTags.ReferencedSopInstanceUidInFile].Equals(file.DataSet[DicomTags.SopInstanceUid])) { return; } if (currentImage.NextDirectoryRecord == null) { currentImage.NextDirectoryRecord = CreateImageItem(file, optionalDicomDirFileLocation); return; } currentImage = currentImage.NextDirectoryRecord; } return; }
/// <summary> /// Traverse the directory record tree and insert them into the directory record sequence. /// </summary> private void AddDirectoryRecordsToSequenceItem(DirectoryRecordSequenceItem root) { if (root == null) return; _directoryRecordSequence.AddSequenceItem(root); if (root.LowerLevelDirectoryRecord != null) AddDirectoryRecordsToSequenceItem(root.LowerLevelDirectoryRecord); if (root.NextDirectoryRecord != null) AddDirectoryRecordsToSequenceItem(root.NextDirectoryRecord); }
/// <summary> /// Called to insert a DICOM file into the directory record structure. /// </summary> /// <param name="dicomFile"></param> /// <param name="optionalRelativeRootPath"></param> private void InsertFile(DicomFile dicomFile, string optionalRelativeRootPath) { try { if (dicomFile.DataSet.Count == 0) dicomFile.Load(DicomReadOptions.StorePixelDataReferences | DicomReadOptions.Default); DirectoryRecordSequenceItem patientRecord; DirectoryRecordSequenceItem studyRecord; DirectoryRecordSequenceItem seriesRecord; if (_rootRecord == null) _rootRecord = patientRecord = CreatePatientItem(dicomFile); else patientRecord = GetExistingOrCreateNewPatient(_rootRecord, dicomFile); if (patientRecord.LowerLevelDirectoryRecord == null) patientRecord.LowerLevelDirectoryRecord = studyRecord = CreateStudyItem(dicomFile); else studyRecord = GetExistingOrCreateNewStudy(patientRecord.LowerLevelDirectoryRecord, dicomFile); if (studyRecord.LowerLevelDirectoryRecord == null) studyRecord.LowerLevelDirectoryRecord = seriesRecord = CreateSeriesItem(dicomFile); else seriesRecord = GetExistingOrCreateNewSeries(studyRecord.LowerLevelDirectoryRecord, dicomFile); if (seriesRecord.LowerLevelDirectoryRecord == null) seriesRecord.LowerLevelDirectoryRecord = CreateImageItem(dicomFile, optionalRelativeRootPath); else GetExistingOrCreateNewImage(seriesRecord.LowerLevelDirectoryRecord, dicomFile, optionalRelativeRootPath); } catch (Exception ex) { Platform.Log(LogLevel.Error, ex, "Error adding image {0} to directory file", dicomFile.Filename); throw; } }