Как получить доступ ко всему содержимому последовательности DICOM, используя clearcanvas
В настоящее время я создаю небольшое настольное приложение, которое может обрабатывать файлы DICOM. Я пишу на C# и.NET и использую библиотеку ClearCanvas. Одна вещь, которую мне нужно сделать, это уметь отображать все содержимое файла, включая все последовательности. Но последовательности выполняются рекурсивным способом, поэтому каждая последовательность может иметь больше последовательностей внутри нее. Прямо сейчас мой код может получить доступ к первым двум уровням, но я просто делаю это в качестве тестера, поскольку мне нужно иметь доступ к n-му уровню последовательностей. Поэтому мне нужно как-то автоматизировать это. Вот как мой код выглядит прямо сейчас для первых двух уровней.
DicomSequenceItem[] seq = attrs2[i].Values as DicomSequenceItem[];
if (seq != null)
{
for (int j = 0; j < seq.Length; j++)
{
for (int n = 0; n < seq[j].Count; n++)
{
DicomSequenceItem[] level2 = seq[j].ElementAt(n).Values as DicomSequenceItem[];
if(seq[j].ElementAt(n).GetValueType().ToString().Equals("ClearCanvas.Dicom.DicomSequenceItem"))
{
for (int k = 0; k < level2.Length; k++)
{
for (int l = 0; l < level2[k].Count; l++)
{
text += "\t\t" + level2[k].ElementAt(l) + "\r\n";
}
}
}
else
{
text += "\t" + seq[j].ElementAt(n) + "\r\n";
}
}
}
}
Любая помощь (примеры кода) будет принята с благодарностью.
Спасибо!
1 ответ
Вот простая рекурсивная процедура для обхода тегов в коллекции атрибутов, включая рекурсивный пошаговый просмотр любых элементов Sequence, которые могут быть в коллекции:
void Dump(DicomAttributeCollection collection, string prefix, StringBuilder sb)
{
foreach (DicomAttribute attribute in collection)
{
var attribSQ = attribute as DicomAttributeSQ;
if (attribSQ != null)
{
for (int i=0; i< attribSQ.Count; i++)
{
sb.AppendLine(prefix + "SQ Item: " + attribSQ.ToString());
DicomSequenceItem sqItem = attribSQ[i];
Dump(sqItem, prefix + "\t", sb);
}
}
else
{
sb.AppendLine(prefix + attribute.ToString());
}
}
}
DicomAttributeCollection является Enumerable, поэтому вы можете просто использовать цикл foreach для прохождения всех атрибутов в коллекции. Сами атрибуты хранятся в SortedDictionary, поэтому при перечислении они также будут в порядке возрастания тегов.
Обратите внимание: если вы загрузили исходный код для библиотек ClearCanvas, вы также можете взглянуть на настоящий метод Dump(), который является частью класса DicomAttributeCollection. Он проходит через коллекцию и записывает в экземпляр StringBuilder все теги в коллекции.