Exemplo n.º 1
0
        /// <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;
        }
Exemplo n.º 2
0
 /// <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;
 }
Exemplo n.º 3
0
 /// <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;
 }
Exemplo n.º 4
0
 /// <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;
 }
Exemplo n.º 5
0
        /// <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;
        }
Exemplo n.º 6
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;
 }
Exemplo n.º 7
0
    	/// <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);
        }
Exemplo n.º 8
0
		/// <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;
			}
		}