Exemple #1
0
        protected static void Parse(string tagPath, out List<DicomTag> parentTags, out DicomTag tag)
        {
            Platform.CheckForNullReference(tagPath, "tagPath");

            parentTags = null;
            tag = null;

            string[] tagPathComponents = tagPath.Split(',');
            if (tagPathComponents != null)
            {
                uint tagValue;
                if (tagPathComponents.Length > 1)
                {
                    parentTags = new List<DicomTag>();

                    for (int i = 0; i < tagPathComponents.Length - 1; i++)
                    {
                        tagValue = uint.Parse(tagPathComponents[i], NumberStyles.HexNumber);
                        DicomTag parent = DicomTagDictionary.GetDicomTag(tagValue);
                        if (parent == null)
                            throw new Exception(String.Format("Specified tag {0} is not in the dictionary", parent));
                        parentTags.Add(parent);
                    }
                }

                tagValue = uint.Parse(tagPathComponents[tagPathComponents.Length - 1], NumberStyles.HexNumber);
                tag = DicomTagDictionary.GetDicomTag(tagValue);
                if (tag == null)
                    throw new Exception(String.Format("Specified tag {0} is not in the dictionary", tag));

            }
        }
		public DicomFieldAttribute(uint tag, uint parentTag)
			: this(tag)
		{
			_parentTag = DicomTagDictionary.GetDicomTag(parentTag);
			if (_parentTag == null)
				_parentTag = new DicomTag(parentTag, "Unknown Tag", "UnknownTag", DicomVr.UNvr, false, 1, uint.MaxValue, false);
		}
		public DicomAttribute this[DicomTag tag]
		{
			get
			{
				if (_attributes.ContainsKey(tag))
					return _attributes[tag];

				if (!_fieldMap.ContainsKey(tag))
				{
					return null;
				}

				DicomAttribute attr = tag.CreateDicomAttribute();
				object value = _fieldMap[tag].GetValue(_entity, null);
				if (value!=null)
					attr.SetStringValue(value.ToString());
				_attributes.Add(tag, attr);
				return attr;
			}
			set
			{
				if (_fieldMap[tag]!=null)
				{
					_fieldMap[tag].SetValue(_entity, value.ToString(), null);
				}
			}
		}
        internal DicomAttributeMultiValueText(DicomTag tag, ByteBuffer item)
            : base(tag)
        {
            string valueArray;

            valueArray = item.GetString();

            // store the length before removing pad chars
            StreamLength = (uint) valueArray.Length;

            // Saw some Osirix images that had padding on SH attributes with a null character, just
            // pull them out here.
			// Leading and trailing space characters are non-significant in all multi-valued VRs,
			// so pull them out here as well since some devices seem to pad UI attributes with spaces too.
            valueArray = valueArray.Trim(new [] {tag.VR.PadChar, '\0', ' '});

            if (valueArray.Length == 0)
            {
                _values = new string[0];
                Count = 1;
                StreamLength = 0;
            }
            else
            {
                _values = valueArray.Split(new char[] {'\\'});

                Count = (long) _values.Length;
                StreamLength = (uint) valueArray.Length;
            }
        }
 public DicomAttributeSQ(DicomTag tag)
     : base(tag)
 {
     if (!tag.VR.Equals(DicomVr.SQvr)
      && !tag.MultiVR)
         throw new DicomException(SR.InvalidVR);
 }
		public override bool TryGetAttribute(DicomTag tag, out DicomAttribute attribute)
		{
			lock (SyncLock)
			{
				// the instance dataset should always override the prototype values from the sliceset
				return DataSet.TryGetAttribute(tag, out attribute) || Slice.TryGetAttribute(tag, out attribute);
			}
		}
		public override DicomAttribute this[DicomTag tag]
		{
			get
			{
				DicomAttribute dicomAttribute;
				return _fusionHeaders.TryGetAttribute(tag, out dicomAttribute) ? dicomAttribute : _realSopDataSource[tag];
			}
		}
        public DicomFieldAttribute(uint tag)
        {
            _tag = DicomTagDictionary.GetDicomTag(tag);
            if (_tag == null)
                _tag = new DicomTag(tag, "Unknown Tag", "UnknownTag", DicomVr.UNvr, false, 1, uint.MaxValue, false);

            _default = DicomFieldDefault.None;
            _defltOnZL = false;
            _createEmpty = false;
        }
        public override bool TryGetAttribute(DicomTag tag, out DicomAttribute attribute)
        {
            lock (SyncLock)
            {
                if (NeedFullHeader(tag.TagValue))
                    GetFullHeader();

                return base.TryGetAttribute(tag, out attribute);
            }
        }
		internal DicomAttributeSingleValueText(DicomTag tag, ByteBuffer item)
			: base(tag)
		{
			_value = item.GetString();

			// Saw some Osirix images that had padding on SH attributes with a null character, just
			// pull them out here.
			_value = _value.Trim(new char[] {tag.VR.PadChar, '\0'});

			Count = 1;
			StreamLength = (uint) _value.Length;
		}
        public override DicomAttribute this[DicomTag tag]
        {
            get
            {
                lock (SyncLock)
                {
                    if (NeedFullHeader(tag.TagValue))
						LoadFullHeader();

                    return base[tag];
                }
            }
        }
        public override DicomAttribute this[DicomTag tag]
        {
            get
            {
                //the _sop indexer is not thread-safe.
                lock (SyncLock)
                {
                    if (_sop.IsStoredTag(tag))
                        return _sop[tag];

                    return base[tag];
                }
            }
        }
        public override bool TryGetAttribute(DicomTag tag, out DicomAttribute attribute)
        {
            lock (SyncLock)
            {
                if (_sop.IsStoredTag(tag))
                {
                    attribute = _sop[tag];
                    if (!attribute.IsEmpty)
                        return true;
                }

                return base.TryGetAttribute(tag, out attribute);
            }
        }
        public override DicomAttribute this[DicomTag tag]
        {
            get
            {
                lock (SyncLock)
                {
                    DicomAttribute attribute;
                    if (TryGetXmlAttribute(tag.TagValue, out attribute))
                        return attribute;

                    return base[tag];
                }
            }
        }
		public override DicomAttribute this[DicomTag tag]
		{
			get
			{
				lock (SyncLock)
				{
					// the instance dataset should always override the prototype values from the sliceset
					// if the operation results in a new attribute being inserted, do it in the instance dataset
					DicomAttribute attribute;
					if (DataSet.TryGetAttribute(tag, out attribute) || Slice.TryGetAttribute(tag, out attribute))
						return attribute;
					return DataSet[tag];
				}
			}
		}
		/// <summary>
		/// Contructor from a <see cref="DicomCompressedPixelData"/> instance.
		/// </summary>
		/// <param name="compressedPixelData"></param>
		public DicomUncompressedPixelData(DicomCompressedPixelData compressedPixelData)
			: base(compressedPixelData)
		{
			if (BitsAllocated > 8)
			{
				_pd = new DicomAttributeOW(DicomTags.PixelData);
			}
			else
			{
				var pdTag = DicomTagDictionary.GetDicomTag(DicomTags.PixelData);
				var obTag = new DicomTag(DicomTags.PixelData, pdTag.Name, pdTag.VariableName, DicomVr.OBvr, pdTag.MultiVR, pdTag.VMLow, pdTag.VMHigh, pdTag.Retired);
				_pd = new DicomAttributeOB(obTag);
			}
			InitializeFrameData(this, _pd);
		}
		public DicomAttributeSQ(DicomTag tag, ByteBuffer bb)
			: base(tag)
		{
			if (!tag.VR.Equals(DicomVr.SQvr)
			 && !tag.MultiVR)
				throw new DicomException(SR.InvalidVR);

/* This doesn't work yet.  Need to implement a different way.
			DicomStreamReader reader = new DicomStreamReader(bb.Stream);
			reader.Dataset = ds;
			reader.TransferSyntax = TransferSyntax.ImplicitVrLittleEndian;
			DicomReadStatus stat = reader.Read(new DicomTag(0xffffffff, "Test", "Test", DicomVr.UNvr, false, 1, 1, true), DicomReadOptions.Default);
			if (stat != DicomReadStatus.Success)
			{
				Platform.Log(LogLevel.Error, "Unexpected parsing error ({0}) when reading sequence attribute.", stat);
				throw new DicomDataException("Unexpected error parsing SQ attribute");
			}
*/
		}
        private InstanceXml GetInstanceXml(StudyXmlOutputSettings outputSettings, out DicomFile real)
        {
            var xml = new StudyXml();
            real = new DicomFile();
            SetupMR(real.DataSet);
            real.MediaStorageSopClassUid = real.DataSet[DicomTags.SopClassUid].ToString();
            real.MetaInfo[DicomTags.SopClassUid].SetString(0, real.DataSet[DicomTags.SopClassUid].ToString());
            
            var bytes = new Byte[2048];
            real.DataSet[DicomTags.RedPaletteColorLookupTableData].Values = bytes;

            var privateTag = new DicomTag(0x00111301, "Private Tag", "PrivateTag", DicomVr.CSvr, false, 1, 1, false);
            real.DataSet[privateTag].SetString(0, "Private");

            var sequences = (DicomSequenceItem[])real.DataSet[DicomTags.RequestAttributesSequence].Values;
            var firstItem = sequences.First();
            firstItem[DicomTags.RedPaletteColorLookupTableData].Values = bytes;

            var attr = real.DataSet[DicomTags.ReferencedStudySequence];
            var sequenceItem = new DicomSequenceItem();
            attr.AddSequenceItem(sequenceItem);
            sequenceItem[privateTag].SetString(0, "Private");

            xml.AddFile(real);
            
            var memento = xml.GetMemento(outputSettings ?? new StudyXmlOutputSettings
            {
                IncludeLargeTags = StudyXmlTagInclusion.IncludeTagExclusion,
                IncludePrivateValues = StudyXmlTagInclusion.IgnoreTag,
                MaxTagLength = 1024
            });

            xml = new StudyXml();
            xml.SetMemento(memento);
            return xml.First().First();
        }
		public DicomFragmentSequence(DicomTag tag) : base(tag) {}
			public BinaryDicomColumnDefintion(DicomTag tag) : base(tag) {}
			public AttributeTagDicomColumnDefintion(DicomTag tag) : base(tag) {}
			public TextDicomColumnDefintion(DicomTag tag) : base(tag) {}
			public DateTimeDicomColumnDefintion(DicomTag tag) : base(tag) {}
			public AgeDicomColumnDefintion(DicomTag tag) : base(tag) {}
 /// <summary>
 /// Load a DICOM file (as set by the <see cref="Filename"/> property).
 /// </summary>
 /// <remarks>
 /// Note:  If the file does not contain DICM encoded in it, the routine will assume
 /// the file is not a Part 10 format file, and is instead encoded as just a DataSet
 /// with the transfer syntax set to Implicit VR Little Endian.
 /// </remarks>
 /// <param name="stopTag"></param>
 /// <param name="options">The options to use when reading the file.</param>
 /// <param name="filename">The path of the file to load.</param>
 public void Load(DicomTag stopTag, DicomReadOptions options, string filename)
 {
     Platform.CheckForEmptyString(filename, "filename");
     Filename = filename;
     Load(stopTag, options);
 }
			public UnsignedDicomColumnDefintion(DicomTag tag) : base(tag) {}
			public IntegerDicomColumnDefintion(DicomTag tag) : base(tag) {}
        private void LoadCore(Stream stream, DicomStreamOpener streamOpener, DicomTag stopTag, DicomReadOptions options)
        {
            // TODO CR (24 Jan 2014): DICOM stream read only uses tag value, so the real implementation should be the uint overload!
            if (stopTag == null)
            {
                stopTag = new DicomTag(0xFFFFFFFF, "Bogus Tag", "BogusTag", DicomVr.NONE, false, 1, 1, false);
            }

            DicomStreamReader dsr;

            var iStream = stream ?? streamOpener.Open();

            if (iStream.CanSeek)
            {
                iStream.Seek(128, SeekOrigin.Begin);
                if (!FileHasPart10Header(iStream))
                {
                    if (!Flags.IsSet(options, DicomReadOptions.ReadNonPart10Files))
                    {
                        throw new DicomException(String.Format("File is not part 10 format file: {0}", Filename));
                    }

                    iStream.Seek(0, SeekOrigin.Begin);
                    dsr = new DicomStreamReader(iStream)
                    {
                        StreamOpener   = streamOpener,
                        TransferSyntax = TransferSyntax.ImplicitVrLittleEndian,
                        Dataset        = DataSet
                    };
                    DicomReadStatus stat = dsr.Read(stopTag, options);
                    if (stat != DicomReadStatus.Success)
                    {
                        Platform.Log(LogLevel.Error, "Unexpected error when reading file: {0}", Filename);
                        throw new DicomException("Unexpected read error with file: " + Filename);
                    }

                    TransferSyntax = TransferSyntax.ImplicitVrLittleEndian;
                    if (DataSet.Contains(DicomTags.SopClassUid))
                    {
                        MediaStorageSopClassUid = DataSet[DicomTags.SopClassUid].ToString();
                    }
                    if (DataSet.Contains(DicomTags.SopInstanceUid))
                    {
                        MediaStorageSopInstanceUid = DataSet[DicomTags.SopInstanceUid].ToString();
                    }

                    Loaded = true;
                    return;
                }
            }
            else
            {
                // TODO CR (04 Apr 2014): this code here is almost identical to the seekable stream above, except that we use the 4CC wrapper
                // we can combine these two when we trust that the wrapper works in all cases
                iStream = FourCcReadStream.Create(iStream);

                // Read the 128 byte header first, then check for DICM
                iStream.SeekEx(128, SeekOrigin.Begin);

                if (!FileHasPart10Header(iStream))
                {
                    if (!Flags.IsSet(options, DicomReadOptions.ReadNonPart10Files))
                    {
                        throw new DicomException(String.Format("File is not part 10 format file: {0}", Filename));
                    }

                    iStream.Seek(0, SeekOrigin.Begin);
                    dsr = new DicomStreamReader(iStream)
                    {
                        StreamOpener   = streamOpener,
                        TransferSyntax = TransferSyntax.ImplicitVrLittleEndian,
                        Dataset        = DataSet
                    };
                    DicomReadStatus stat = dsr.Read(stopTag, options);
                    if (stat != DicomReadStatus.Success)
                    {
                        Platform.Log(LogLevel.Error, "Unexpected error when reading file: {0}", Filename);
                        throw new DicomException("Unexpected read error with file: " + Filename);
                    }

                    TransferSyntax = TransferSyntax.ImplicitVrLittleEndian;
                    if (DataSet.Contains(DicomTags.SopClassUid))
                    {
                        MediaStorageSopClassUid = DataSet[DicomTags.SopClassUid].ToString();
                    }
                    if (DataSet.Contains(DicomTags.SopInstanceUid))
                    {
                        MediaStorageSopInstanceUid = DataSet[DicomTags.SopInstanceUid].ToString();
                    }

                    Loaded = true;
                    return;
                }
            }

            dsr = new DicomStreamReader(iStream)
            {
                TransferSyntax = TransferSyntax.ExplicitVrLittleEndian,
                StreamOpener   = streamOpener,
                Dataset        = MetaInfo
            };

            DicomReadStatus readStat =
                dsr.Read(new DicomTag(0x0002FFFF, "Bogus Tag", "BogusTag", DicomVr.UNvr, false, 1, 1, false), options);

            if (readStat != DicomReadStatus.Success)
            {
                Platform.Log(LogLevel.Error, "Unexpected error when reading file Meta info for file: {0}", Filename);
                throw new DicomException("Unexpected failure reading file Meta info for file: " + Filename);
            }

            MetaInfoFileLength = dsr.EndGroupTwo + 128 + 4;

            dsr.Dataset        = DataSet;
            dsr.TransferSyntax = TransferSyntax;
            readStat           = dsr.Read(stopTag, options);
            if (readStat != DicomReadStatus.Success)
            {
                Platform.Log(LogLevel.Error, "Unexpected error ({0}) when reading file at offset {2}: {1}", readStat, Filename, dsr.BytesRead);
                throw new DicomException("Unexpected failure (" + readStat + ") reading file at offset " + dsr.BytesRead + ": " + Filename);
            }

            Loaded = true;
        }
Exemple #29
0
        /// <summary>
        /// Load a DICOM file from an input stream.
        /// </summary>
        /// <remarks>
        /// Note:  If the file does not contain DICM encoded in it, and
        /// <see cref="Stream.CanSeek"/> is true for <paramref name="iStream"/>,
        /// the routine will assume the file is not a Part 10 format file, and is
        /// instead encoded as just a DataSet with the transfer syntax set to
        /// Implicit VR Little Endian.
        /// </remarks>
        /// <param name="iStream">The input stream to read from.</param>
        /// <param name="stopTag">The dicom tag to stop the reading at.</param>
        /// <param name="options">The dicom read options to consider.</param>
        public void Load(Stream iStream, DicomTag stopTag, DicomReadOptions options)
        {
            if (iStream == null)
            {
                throw new ArgumentNullException("iStream");
            }

            if (stopTag == null)
            {
                stopTag = new DicomTag(0xFFFFFFFF, "Bogus Tag", "BogusTag", DicomVr.NONE, false, 1, 1, false);
            }

            DicomStreamReader dsr;

            if (iStream.CanSeek)
            {
                iStream.Seek(128, SeekOrigin.Begin);
                if (!FileHasPart10Header(iStream))
                {
                    if (!Flags.IsSet(options, DicomReadOptions.ReadNonPart10Files))
                    {
                        throw new DicomException(String.Format("File is not part 10 format file: {0}", Filename));
                    }

                    iStream.Seek(0, SeekOrigin.Begin);
                    dsr = new DicomStreamReader(iStream)
                    {
                        Filename       = Filename,
                        TransferSyntax = TransferSyntax.ImplicitVrLittleEndian,
                        Dataset        = DataSet
                    };
                    DicomReadStatus stat = dsr.Read(stopTag, options);
                    if (stat != DicomReadStatus.Success)
                    {
                        Platform.Log(LogLevel.Error, "Unexpected error when reading file: {0}", Filename);
                        throw new DicomException("Unexpected read error with file: " + Filename);
                    }

                    TransferSyntax = TransferSyntax.ImplicitVrLittleEndian;
                    if (DataSet.Contains(DicomTags.SopClassUid))
                    {
                        MediaStorageSopClassUid = DataSet[DicomTags.SopClassUid].ToString();
                    }
                    if (DataSet.Contains(DicomTags.SopInstanceUid))
                    {
                        MediaStorageSopInstanceUid = DataSet[DicomTags.SopInstanceUid].ToString();
                    }
                    return;
                }
            }
            else
            {
                // Read the 128 byte header first, then check for DICM
                iStream.Read(new byte[128], 0, 128);

                if (!FileHasPart10Header(iStream))
                {
                    Platform.Log(LogLevel.Error, "Reading DICOM file from stream, file does not have part 10 format header.");
                    throw new DicomException("File being read from stream is not a part 10 format file");
                }
            }

            dsr = new DicomStreamReader(iStream)
            {
                TransferSyntax = TransferSyntax.ExplicitVrLittleEndian,
                //TransferSyntax = TransferSyntax.ImplicitVrLittleEndian,
                Filename = Filename,
                Dataset  = MetaInfo
            };

            DicomReadStatus readStat =
                dsr.Read(new DicomTag(0x0002FFFF, "Bogus Tag", "BogusTag", DicomVr.UNvr, false, 1, 1, false), options);

            if (readStat != DicomReadStatus.Success)
            {
                Platform.Log(LogLevel.Error, "Unexpected error when reading file Meta info for file: {0}", Filename);
                throw new DicomException("Unexpected failure reading file Meta info for file: " + Filename);
            }

            MetaInfoFileLength = dsr.EndGroupTwo + 128 + 4;

            dsr.Dataset        = DataSet;
            dsr.TransferSyntax = TransferSyntax;
            readStat           = dsr.Read(stopTag, options);
            if (readStat != DicomReadStatus.Success)
            {
                Platform.Log(LogLevel.Error, "Unexpected error ({0}) when reading file at offset {2}: {1}", readStat, Filename, dsr.BytesRead);
                //throw new DicomException("Unexpected failure (" + readStat + ") reading file at offset " + dsr.BytesRead + ": " + Filename);
            }

            Loaded = true;
        }
Exemple #30
0
 /// <summary>
 /// Internal method for creating a new <see cref="DicomAttribute"/> derived class for the VR.
 /// </summary>
 /// <param name="tag"></param>
 /// <returns></returns>
 internal DicomAttribute CreateDicomAttribute(DicomTag tag)
 {
     return(_createDelegate(tag, null));
 }
Exemple #31
0
 /// <summary>
 /// Internal method for creating a new <see cref="DicomAttribute"/> derived class for the VR.
 /// </summary>
 /// <param name="tag"></param>
 /// <param name="bb"></param>
 /// <returns></returns>
 internal DicomAttribute CreateDicomAttribute(DicomTag tag, ByteBuffer bb)
 {
     return(_createDelegate(tag, bb));
 }
 /// <summary>
 /// Load a DICOM file from an input stream.
 /// </summary>
 /// <remarks>
 /// Note:  If the file does not contain DICM encoded in it, and
 /// <see cref="Stream.CanSeek"/> is true for <paramref name="stream"/>,
 /// the routine will assume the file is not a Part 10 format file, and is
 /// instead encoded as just a DataSet with the transfer syntax set to
 /// Implicit VR Little Endian.
 ///
 /// Also, this overload cannot be used directly with <see cref="DicomReadOptions.StorePixelDataReferences"/>,
 /// as there must be a way to re-open the same stream at a later time. If the option is required,
 /// use the <see cref="Load(Func{Stream}, DicomTag, DicomReadOptions)">overload</see> that accepts a delegate for opening the stream.
 /// </remarks>
 /// <param name="stream">The input stream to read from.</param>
 /// <param name="stopTag">The dicom tag to stop the reading at.</param>
 /// <param name="options">The dicom read options to consider.</param>
 public void Load(Stream stream, DicomTag stopTag, DicomReadOptions options)
 {
     Platform.CheckForNullReference(stream, "stream");
     LoadCore(stream, null, stopTag, options);
 }
			public FloatingPointDicomColumnDefintion(DicomTag tag) : base(tag) {}
		public override bool TryGetAttribute(DicomTag tag, out DicomAttribute attribute)
		{
			return _fusionHeaders.TryGetAttribute(tag, out attribute) || _realSopDataSource.TryGetAttribute(tag, out attribute);
		}
			public override DicomAttribute this[DicomTag tag]
			{
				get { return _sopDataSource[tag]; }
			}
			public override bool TryGetAttribute(DicomTag tag, out DicomAttribute attribute)
			{
				return _sopDataSource.TryGetAttribute(tag, out attribute);
			}
Exemple #37
0
 public DicomFragmentSequence(DicomTag tag) : base(tag)
 {
 }