/// <summary> /// Gets a sequence item. /// </summary> /// <remarks> /// This method is only meaningfull if this instance has a VR SQ. /// </remarks> /// <param name="oneBasedIndex">The one based index.</param> /// <returns>The sequence item.</returns> public override SequenceItem GetItem(int oneBasedIndex) { SequenceItem sequenceItem = null; if (this.VR == VR.SQ) { if ((oneBasedIndex >= 1) && (oneBasedIndex <= ItemCount)) { TagSequence sequenceItemTagSequence = TagSequence.Clone(); Tag lastTag = sequenceItemTagSequence.Tags[sequenceItemTagSequence.Tags.Count - 1] as Tag; lastTag.IndexNumber = oneBasedIndex; sequenceItem = new SequenceItem(sequenceItemTagSequence, DvtkDataSequence[oneBasedIndex - 1]); } else { sequenceItem = new SequenceItem(); Thread.WriteWarningCurrentThread("Getting sequence item " + oneBasedIndex.ToString() + " from attribute with tag sequence " + TagSequence.ToString() + " containing " + ItemCount.ToString() + " items. Returning an empty sequence item."); } } else { sequenceItem = new SequenceItem(); Thread.WriteWarningCurrentThread("Getting a sequence item from attribute with tag sequence " + TagSequence.ToString() + " and VR " + this.VR.ToString() + ". Returning an empty sequence item."); } return(sequenceItem); }
/// <summary> /// Get all attributes that are refered to by this tag sequence. /// /// Precondition for the supplied TagSequence: /// All but the last tag contains an index. /// The last tag doesn't contain an index. /// </summary> /// <param name="tagSequence">The tag sequence.</param> /// <returns>The attributes.</returns> internal AttributeCollection GetAttributes(TagSequence tagSequence) { AttributeCollection attributeCollection = new AttributeCollection(); Tag firstTag = (tagSequence.Tags[0]) as Tag; Attribute firstAttribute = GetAttribute(firstTag.AsUInt32); if (firstAttribute is InvalidAttribute) { // Do nothing, just return an empty set. } else { if (tagSequence.Tags.Count > 1) // Expecting a sequence attribute as first tag. { if (firstAttribute.VR == VR.SQ) { int fromIndex = 0; int toIndex = 0; if (firstTag.ContainsWildcardIndex) { fromIndex = 1; toIndex = firstAttribute.ItemCount; } else { fromIndex = firstTag.IndexNumber; toIndex = firstTag.IndexNumber; } TagSequence itemTagSequence = tagSequence.Clone(); itemTagSequence.Tags.RemoveAt(0); for (int index = fromIndex; index <= toIndex; index++) { SequenceItem item = firstAttribute.GetItem(index); AttributeCollection itemAttributeCollection = item.GetAttributes(itemTagSequence); attributeCollection.AddRange(itemAttributeCollection); } } else { // Do nothing, just return an empty set. } } else // Expecting a non-sequence attribute as tag. { attributeCollection.Add(firstAttribute); } } return(attributeCollection); }