Перейти к статье

 

Форматы файлов VTK

Visualization Toolkit предоставляет ряд исходных и записывающих объектов для чтения и записи популярных форматов файлов данных. Visualization Toolkit также предоставляет некоторые из своих собственных форматов файлов. Основной причиной создания еще одного формата файлов данных является предложение согласованной схемы представления данных для различных типов наборов данных и предоставление простого метода передачи данных между программами. По возможности мы рекомендуем использовать более широко используемые форматы. Но если это невозможно, вместо этого можно использовать форматы Visualization Toolkit, описанные здесь. Обратите внимание, что эти форматы могут не поддерживаться многими другими инструментами.

В VTK доступны два разных стиля форматов файлов. Простейшими являются устаревшие последовательные форматы, которые легко читать и записывать как вручную, так и программно. Однако эти форматы менее гибки, чем форматы файлов на основе XML, описанные далее в этом разделе. Форматы XML поддерживают произвольный доступ, параллельный ввод-вывод и переносимое сжатие данных и предпочтительнее последовательных форматов файлов VTK, когда это возможно.

Простые «Легаси» форматы

Легаси VTK форматы файлов состоят из 5 основных частей.

Обзор формата файла показан на рисунке 1. Первые три части являются обязательными, а остальные две — необязательными. Таким образом, у вас есть гибкость смешивания и сопоставления атрибутов набора данных и геометрии, либо путем манипуляции файлами операционной системы, либо с помощью фильтров VTK для объединения данных. Ключевые слова нечувствительны к регистру и могут быть разделены пробелами. Перед описанием форматов файлов данных, пожалуйста, обратите внимание на следующее.

Двоичные файлы. Двоичные файлы в VTK переносимы между различными компьютерными системами, если вы соблюдаете два условия. Во-первых, убедитесь, что порядок байтов данных правильный, а во-вторых, убедитесь, что длина каждого типа данных согласована.

Большую часть времени VTK управляет порядком байтов двоичных файлов для вас. Когда вы пишете двоичный файл на одном компьютере и считываете его с другого компьютера, байты, представляющие данные, будут автоматически переставлены по мере необходимости. Например, двоичные файлы, записанные на Sun, хранятся в порядке big endian, в то время как файлы на ПК хранятся в порядке little endian. В результате файлы, записанные на рабочей станции Sun, требуют перестановки байтов при чтении на ПК. (См. класс vtkByteSwap для получения подробной информации о реализации.) Файлы данных VTK, описанные здесь, записаны в форме big endian.

Однако некоторые форматы файлов явно не определяют форму порядка байтов. Вы обнаружите, что данные, считываемые или записываемые внешними программами или классами vtkVolume16Reader, vtkMCubesReader и vtkMCubesWriter, могут иметь другой порядок байтов в зависимости от исходной системы. В таких случаях VTK позволяет вам указать порядок байтов с помощью методов.

SetDataByteOrderToBigEndian()

SetDataByteOrderToLittleEndian()

Другая проблема с двоичными файлами заключается в том, что системы могут использовать разное количество байтов для представления целого числа или другого собственного типа. Например, некоторые 64-битные системы будут представлять целое число 8 байтами, в то время как другие представляют целое число 4 байтами. В настоящее время Visualization Toolkit не может обрабатывать передачу двоичных файлов между системами с несовместимой длиной данных. В этом случае используйте вместо этого форматы файлов ASCII.

Формат набора данных. Visualization Toolkit поддерживает пять различных форматов наборов данных: структурированные точки, структурированная сетка, прямоугольная сетка, неструктурированная сетка и полигональные данные. Данные с неявной топологией (структурированные данные, такие как vtkImageData и vtkStructuredGrid) упорядочены с x, увеличивающимся быстрее всего, затем y, затем z. Эти форматы следующие.

Формат атрибута набора данных. Visualization Toolkit поддерживает следующие атрибуты набора данных: скаляры (от одного до четырех компонентов), векторы, нормали, координаты текстуры (1D, 2D и 3D), тензоры 3 × 3 и данные поля. Кроме того, можно определить таблицу поиска, использующую цветовую спецификацию RGBA, связанную со скалярными данными. Атрибуты набора данных поддерживаются как для точек, так и для ячеек.

Каждый тип данных атрибута имеет связанное с ним dataName. Это строка символов (без встроенных пробелов), используемая для идентификации конкретных данных. dataName используется считывателями VTK для извлечения данных. В результате в файл может быть включено более одного атрибута одного типа. Например, два разных скалярных поля, определенных для точек набора данных, давление и температура, могут содержаться в одном файле. (Если соответствующее dataName не указано в считывателе VTK, то из файла извлекаются первые данные этого типа).

Примеры. Первый пример — куб, представленный шестью многоугольными гранями. Мы определяем однокомпонентный скаляр, нормали и данные поля на шести гранях. Имеются скалярные данные, связанные с восемью вершинами. Также определена таблица поиска из восьми цветов, связанных с точечными скалярами. ВАЖНО! Файл должен иметь расширение .vtk, а не .VTK, иначе появится ошибка считывания.

Следующий пример — это том размером 3 × 4 × 5. Поскольку таблица поиска не определена, пользователь должен либо создать ее в VTK, либо будет использована таблица поиска по умолчанию.

Третий пример — неструктурированная сетка, содержащая двенадцать из девятнадцати типов ячеек VTK (см. Рисунок 2 и Рисунок 3). Файл содержит скалярные и векторные данные.

Рисунок 2 Линейные типы ячеек, найденные в VTK. Используйте включаемый файл CellType  для управления типами ячеек.

Рисунок 3 Нелинейные типы ячеек, обнаруженные в VТК

Четвертый и последний пример — данные, представленные в виде поля. Вы также можете посмотреть «Работа с данными поля», чтобы узнать, как манипулировать этими данными. (Файл данных, показанный ниже, можно найти целиком в $VTK_DATA_ROOT/Data/financial.vtk).

В этом примере поле представлено с помощью шести массивов. Каждый массив имеет один компонент и 3188 кортежей. Пять из шести массивов имеют тип float, а последний массив имеет тип unsigned_short.

Дополнительные примеры доступны в каталоге данных.

Форматы файлов XML

VTK предоставляет другой набор форматов данных с использованием синтаксиса XML. Хотя эти форматы намного сложнее, чем исходный формат VTK, описанный ранее (см. «Простые устаревшие форматы»), они поддерживают гораздо больше функций. Основной мотивацией их разработки было упрощение потоковой передачи данных и параллельного ввода-вывода. Некоторые функции формата включают поддержку сжатия, переносимого двоичного кодирования, произвольного доступа, порядка байтов big endian и little endian, многофайлового представления фрагментарных данных и новых расширений файлов для различных типов наборов данных VTK. XML также предоставляет множество функций, особенно возможность расширять формат файла с помощью специфических для приложения тегов. Существует два типа файлов данных VTK XML: параллельные и последовательные, как описано ниже.

В формате XML наборы данных VTK классифицируются по одной из двух категорий.

По соглашению, каждый тип данных и тип файла сопоставляется с определенным расширением файла. Типы и соответствующие расширения:

Все типы файлов VTK XML являются допустимыми документами XML.* Элементом уровня документа является VTKFile:

Атрибуты элемента:

type — Тип файла (маркированные элементы в предыдущем списке).

version — Номер версии файла в формате «major.minor».

byte_order — Машинный порядок байтов, в котором хранятся данные. Это либо «BigEndian», либо «LittleEndian».

compressor — Некоторые данные в файле могут быть сжаты. Указывает подкласс vtkDataCompressor, который использовался для сжатия данных.

Внутри элемента VTKFile находится элемент, имя которого соответствует типу формата данных (т. е. атрибуту type). Этот элемент описывает топологию набора данных и отличается для последовательного и параллельного форматов, которые описаны следующим образом.

Форматы последовательных XML-файлов. Элемент VTKFile содержит один элемент, имя которого соответствует типу набора данных, описываемого файлом. Мы называем его элементом набора данных, который является одним из ImageData, RectilinearGrid, StructuredGrid, PolyData или UnstructuredGrid. Элемент набора данных содержит один или несколько элементов Piece, каждый из которых описывает часть набора данных. Вместе элемент набора данных и элементы Piece определяют весь набор данных.

Каждая часть набора данных должна определять геометрию (точки и ячейки) этой части вместе с данными, связанными с каждой точкой или ячейкой. Геометрия указывается по-разному для каждого типа набора данных, но каждая часть каждого набора данных содержит элементы PointData и CellData, определяющие данные для каждой точки и ячейки в части. Общая структура для каждого формата последовательного набора данных выглядит следующим образом:

Каждый набор данных описывает данные, связанные с его точками и ячейками, с помощью XML-элементов PointData и CellData следующим образом:

VTK позволяет связать произвольное количество массивов данных с точками и ячейками набора данных. Каждый массив данных описывается элементом DataArray, который, помимо прочего, дает каждому массиву имя.

Следующие атрибуты PointData и CellData используются для указания активных массивов по имени:

Scalars — Имя активного массива скаляров, если таковой имеется.

Vectors — Имя активного массива векторов, если таковой имеется.

Normals — Имя активного массива нормалей, если есть.

Tensors — Имя активного массива тензоров, если есть.

TCoords — Имя активного массива координат текстуры, если таковой имеется.

Некоторые наборы данных описывают свои точки и ячейки, используя различные комбинации следующих общих элементов:

Все спецификации данных и геометрии используют элементы DataArray для описания своего фактического содержимого следующим образом:

Атрибуты элементов DataArray описываются следующим образом:

type — Тип данных одного компонента массива. Это один из Int8, UInt8, Int16, UInt16, Int32, UInt32, Int64, UInt64, Float32, Float64. Примечание: 64-битные целочисленные типы поддерживаются только если включен VTK_USE_64BIT_IDS (переменная CMake — см. «CMake») или платформа 64-битная.

Name — Имя массива. Обычно это краткое описание данных, хранящихся в массиве.

NumberOfComponents — Количество компонентов на значение в массиве.

format — Способ, которым сами значения данных сохраняются в файле. Это «ascii», «binary» или «appended».

offset — Если атрибут формата равен «appended», это указывает смещение от начала раздела добавленных данных до начала данных этого массива.

Атрибут формата (format) выбирает один из трех способов хранения значений данных.:

format=”ascii” — Данные перечислены в ASCII непосредственно внутри элемента DataArray.

Пробелы используются для разделения.

format=”binary” — Данные кодируются в base64 и перечислены непрерывно внутри элемента DataArray. Данные также могут быть сжаты перед кодированием в base64. Порядок байтов данных соответствует указанному в атрибуте byte_order элемента VTKFile.

format=”appended” — Данные хранятся в разделе «appended data». Поскольку многие элементы DataArray могут хранить свои данные в этом разделе, атрибут offset используется для указания того, где начинаются данные каждого DataArray. Этот формат используется по умолчанию писателями VTK.

Раздел добавленных данных хранится в элементе AppendedData, который вложен в VTKFile после элемента набора данных:

Раздел добавленных данных начинается с первого символа после подчеркивания внутри элемента AppendedData. Подчеркивание не является частью данных, но всегда присутствует. Данные в этом разделе всегда находятся в двоичной форме, но могут быть сжаты и/или закодированы в base64. Порядок байтов данных соответствует указанному атрибутом byte_order элемента VTKFile. Данные каждого DataArray хранятся непрерывно и добавляются сразу после данных предыдущего DataArray без разделителя. Атрибут offset DataArray указывает смещение позиции файла от первого символа после подчеркивания до начала его данных.

Параллельные форматы файлов (Parallel File Formats). Форматы параллельных файлов на самом деле не хранят никаких данных в файле. Вместо этого данные разбиваются на части, каждая из которых хранится в последовательном файле того же типа набора данных.

Элемент VTKFile содержит один элемент, имя которого соответствует типу набора данных, описываемого файлом, но с префиксом «P». Мы называем его элементом параллельного набора данных, который является одним из PImageData, PRectilinearGrid, PStructuredGrid, PPolyData или PUnstructuredGrid.

Элемент параллельного набора данных и те, которые вложены внутри, указывают типы массивов данных, используемых для хранения точек, данных точек и данных ячеек (тип массивов, используемых для хранения ячеек, фиксируется VTK). Элемент на самом деле не содержит никаких данных, но вместо этого включает список элементов Piece, которые указывают источник, из которого следует читать каждую часть. Отдельные части хранятся в соответствующем последовательном формате файла. Параллельный файл должен указывать тип и структурную информацию, чтобы читатели могли обновлять информацию конвейера, фактически не читая файлы частей.

Общая структура для каждого формата параллельного набора данных выглядит следующим образом:

Каждый набор данных использует элементы PPointData и PCellData для описания типов массивов данных, связанных с его точками и ячейками.

Для наборов данных, требующих спецификации точек, следующие элементы отражают их аналоги из формата последовательного файла:

Все спецификации данных и геометрии используют элементы PDataArray для описания типов массивов данных:

Пример. Ниже приведен полный пример, определяющий vtkPolyData, представляющий куб с некоторыми скалярными данными по его точкам и граням.