Формат хранения геометрической модели
Понятия и термины
Напомним, что сериализация – это процесс преобразования объекта (класса) в последовательность байтов с целью сохранения в буфере памяти (файле). Десериализация – обратный процесс восстановления объекта из последовательности байтов.
Потоковые операции – это операции записи и чтения модели и ее объектов (работа с потоками записи и чтения).
Объекты, которые могут сериализоваться (представлять себя в виде последовательности байтов), будем называть потоковыми.
Кластером будем называть непрерывный участок памяти (последовательность байтов), а файловым пространством – набор кластеров. Файловое пространство имеет одну точку записи (чтения) – позицию в текущем кластере.
Принципы записи геометрической модели
Геометрическая модель C3D может записываться в сериализованном виде (в виде последовательности байтов) в набор файловых пространств.
Все основные объекты геометрической модели являются потоковыми, то есть умеют писать и читать себя в файловое пространство. Каждый объект модели записывается, начиная с последнего незаполненного кластера текущего файлового пространства.
Запись геометрической модели начинается с объекта MbModel.
Каждый объект модели сначала записывает данные своего родительского объекта (если он существует), затем собственные данные и объекты, которые он содержит или на которые ссылается.
После завершения записи объекта MbModel геометрическая модель полностью сериализована в набор файловых пространств.
Далее вызовом специальной функции формируется единый последовательный буфер в памяти, куда записывается специальный заголовок и последовательно копируются данные всех кластеров файловых пространств.
Сформированный таким образом буфер памяти, содержащий данные геометрической модели в виде последовательности байтов, может быть передан куда-либо для последующего восстановления модели или записан в файл.
Компактный формат C3D
Компактный формат обеспечивает компактную и быструю запись данных геометрической модели в буфер памяти (файл) и обеспечивает чтение модели из буфера памяти (файла) целиком.
Особенностями компактного формата являются:
Минимум накладных расходов при записи и чтении модели.
Компактность хранения данных.
Возможность чтения модели целиком.
Информация о структуре модели и отдельных объектах доступна только после прочтения всей модели.
Чтение объектов модели в произвольном порядке и импорт отдельных объектов невозможны.
Компактный формат помещает все данные модели в одно файловое пространство, то есть подразумевает наличие только одной точки записи или чтения данных – текущий кластер данного файлового пространства.
Рис. 1 показывает структуру сериализованных данных геометрической модели перед сохранением в последовательный буфер памяти при использовании компактного формата:
Рис. 1
Во время записи модели, если геометрический объект содержит внутри себя другой объект или ссылается на другой объект, то последний записывается внутри ссылающегося на него объекта.
Объект, на который ссылаются несколько объектов, объявляется регистрируемым. Такой объект во время первой своей записи регистрируется в специальной таблице регистрируемых объектов. Все последующие записываемые объекты, ссылающиеся на данный регистрируемый объект, содержат только ссылку на запись в таблице.
Рис. 2 показывает структуру хранения данных геометрической модели в последовательном буфере памяти:
Рис. 2
Расширенный формат C3D
Расширенный формат обеспечивает независимое хранение объектов геометрической модели. Помимо данных объектов модели, он хранит информацию о позициях их хранения и краткое оглавление модели, что позволяет получить сведения о структуре модели без ее полного чтения, а также дает возможность выборочного чтения объектов модели.
Особенности расширенного формата:
Независимое хранение объектов, которое обеспечивает возможность выборочного чтения объектов модели.
Наличие оглавления модели с данными об объектах модели и ссылками на позиции их хранения.
Некоторое увеличение размера хранимых данных.
Расширенный формат записывает объекты модели в несколько файловых пространств, то есть обеспечивает несколько точек записи (чтения) данных – текущий кластер в каждом файловом пространстве.
Рис. 3
Рис. 3 показывает структуру сериализованных данных геометрической модели перед сохранением в последовательный буфер памяти при использовании расширенного формата.
Объекты каждого уровня модели записываются в отдельное файловое пространство (количество используемых файловых пространств определяется глубиной вложенности объектов модели).
Рис. 4 показывает структуру хранения данных геометрической модели в последовательном буфере памяти при использовании расширенного формата:
Рис. 4
Оглавление модели в расширенном формате
Расширенный формат реализует генерацию дерева геометрической модели и его запись/чтение в буфере памяти (файле).
Дерево создается для всех объектов геометрической модели типа MbItem и записывается как оглавление модели в отдельное файловое пространство, ссылка на которое добавляется в заголовок файла.
Оглавление модели, записываемое в файл, содержит:
Данные узлов дерева модели.
Каждый узел дерева хранит информацию для одного объекта геометрической модели. В узле хранятся следующие данные:
Уникальный ID узла в дереве модели.
Тип объекта (MbeSpaceType).
Имя объекта (SimpleName).
Габарит объекта.
Информация об атрибутах объекта.
Список непосредственных потомков узла.
Позиция записи/чтения объекта в файле.
Данные о корнях дерева модели.
Оглавление модели может быть прочитано отдельно от всей модели, что позволяет получить сведения о структуре модели и основных ее объектах без полной загрузки модели. Используя данные оглавления модели, можно выбрать и прочитать отдельные объекты модели.
Работа с исполнениями
Расширенный формат C3D предоставляет возможность работы с исполнениями (вариантами реализации модели):
Модель с исполнениями может быть сохранена (сериализована) в файл в расширенном формате с помощью класса writer_ex и прочитана с помощью класса reader_ex.
Прочитав дерево модели из файла с исполнениями, можно посмотреть иерархию исполнений, выбрать исполнение и прочитать его содержимое как отдельную модель.
При чтении файла с исполнениями без использования дерева модели (например, с помощью прямого вызова функции ReadModelItems()) будет прочитано первое по порядку (умолчательное) исполнение.
Модель с исполнениями представляет собой объект MbModel, содержащий набор сборок (объектов MbAssembly), каждая из которых представляет собой одно исполнение (содержит объекты одного исполнения) и имеет атрибут типа at_Embodiment. Первая по порядку сборка является умолчательным исполнением.
Сборка считается исполнением и обрабатывается как исполнение, только если она находится непосредственно в корне модели и имеет атрибут типа at_Embodiment. Объекты MbAssembly, содержащиеся внутри какого-либо исполнения (глубже корня в дереве модели), обрабатываются как обычные сборки.
Атрибут типа at_Embodiment служит индикатором исполнения. Он должен содержать имя (SimpleName) текущего исполнения и имя (SimpleName) родительского исполнения (или UNDEFINED_SNAME, если родителя нет).
Чтобы обеспечить возможность просмотра иерархии исполнений и выборочного чтения, модель с исполнениями должна записываться с помощью класса writer_ex. После этого модель с исполнениями должна читаться с помощью класса reader_ex.
При чтении файла с исполнениями может быть прочитано только одно исполнение.
Если читать файл с исполнениями обычным способом, то есть без использования дерева модели (например, с помощью прямого вызова функции ReadModelItems()), то будет прочитано первое по порядку (умолчательное) исполнение.
Чтобы прочитать любое другое исполнение, надо сначала прочитать дерево модели. Затем, используя дерево модели, можно посмотреть иерархию исполнений, выбрать исполнение и прочитать его содержимое как отдельную модель.