Архитектура дерева модели
Для модели, сформированной с использованием объектов геометрического ядра C3D, приняты следующие соглашения:
Документ эквивалентен корневому компоненту (компоненту высшего уровня).
Компоненту всегда соответствует объект типа MbAssembly в случае формата с граничным представлением. В случае формата с полигональным представлением в качестве компонента допустим объект типа MbMesh. Ожидается, что на компонент назначены свойства, и это выражается в том, что компонент обладает атрибутами типа MbProductInfo и MbPersonOrganizationInfo.
Собственными объектами компонента могут быть объекты типа MbSolid, MbWireFrame, MbPointFrame, MbSpaceInstance (как с объектами геометрии внутри, так и содержащие элементы аннотаций MbPMI) и MbPlaneInstance для форматов с граничным представлением, либо MbMesh для полигональных форматов, которые лежат в MbAssembly.
Вложенность компонент и их позиционирование осуществляется с помощью объектов типа MbInstance. MbInstance лежит в компоненте верхнего уровня и ссылается на компонент нижнего уровня. Циклические зависимости недопустимы.
Подход, согласно которому модель для обмена данными формируется средствами геометрического ядра C3D, имеет ряд недостатков. Наиболее существенный из них заключается в том, что использование конкретных объектов и конкретной конфигурации затрудняет развитие функционала - внесение любых изменений приведёт к необходимости внесения ответных изменений у всех пользователей. Использование интерфейсов модели, компонента и вставки, реализуемых на стороне пользователя, даёт последним независимость от конкретной реализации.
В терминах интерфейсов архитектура дерева модели выглядит следующим образом:
Документ ItModelDocument() содержит в себе компонент высшего уровня.
Компоненты бывают двух типов: детали ItModelPart и сборки ItModelAssembly. Разница между ними лишь в интерпретации, оба типа могут ссылаться на компоненты более низкого уровня.
Собственными объектами компонентов могут быть объекты типа MbSolid, MbWireFrame, MbPointFrame, MbSpaceInstance и MbPlaneInstance.
Вложенность компонент и их позиционирование осуществляется с помощью объектов ItModelInstance. Циклические зависимости недопустимы.
ItModelInstanceProperties — базовый класс, предок интерфейсов ItModelPart, ItModelAssembly, ItModelInstance. В интерфейсе объявлены методы:
virtual bool SetAttributes( const c3d::AttrSPtrVector & /*attributes*/ );
virtual c3d::AttrSPtrVector GetAttributes();
virtual void GetRequirements( AnnotationSptrVector &, eTextForm ); (устаревший)
virtual void SetRequirements( const AnnotationSptrVector & ); (устаревший)
Интерфейсы ItModelPart и ItModelAssembly имеют одинаковый набор методов, поэтому их можно считать идентичными с точностью до интерпретации. Назначение свойств компонентов, визуальных свойств и технических требований реализуется посредством методов базового класса ItModelInstanceProperties.
Метод PureFileName() вызывается при экспорте и возвращает строку, смысл которой – имя файла компонента.
Методы для работы с собственными объектами:
void GetItems( std::vector< SPtr<MbItem> > & items,
MbeGettingItemType itemType,
bool includeInvisible );
void AddItems( const std::vector< SPtr<MbItem> > & items );
GetItems();
AddItems();
Метод GetItems() предназначен для выдачи элементов в контейнер с использованием фильтров типа и видимости, которые формируются на основе значений, возвращаемых методом IConvertorProperty3D:: GetIoPermission().
Метод AddItems() используется при импорте и предназначен для добавления элементов в компонент.
Методы для работы со вставками:
SPtr<ItModelInstance> PrepareInstance();
SPtr<ItModelInstance> NextInstance( bool includeInvisible );
PrepareInstance();
NextInstance();
Метод PrepareInstance() предназначен для осуществления вставки компонента при импорте.
Метод NextInstance() представляет собой итератор вставок при экспорте. Предполагается, что итератор готов к выдаче вставок с начала. Признаком окончания является возврат нулевого указателя. Значение фильтра видимости в процессе обхода соответствует результату вызова метода IConvertorProperty3D:: GetIoPermission( iop_wInvisible ).
Метод GetAnnotationItems( eTextForm textForm ) является устаревшим.
Методы для импорта через плагины:
Метод
virtual void ItModelPart::AddMappedItem( MbItem & item,
MbPlacement3D const & placement,
c3d::AttrSPtrVector const & attributes );
позволяет добавить объект с заданной локальной системой координат в корень сборки при импорте. Метод актуален только для формата IFC (cм. параграф Импорт IFC).
Аргументы:
item – объект, добавляемый в модель.
placement – локальная система координат.
Метод
virtual SPtr<MbInstance> ItModelPart::NextMappedItem() const;
возвращает объект с заданной локальной системой координат или nullptr. Метод актуален только для формата IFC (cм. параграф Импорт IFC).
Метод
virtual void ItModelPart::AddAxesGrid( c3d::ItemSPtr const & );
позволяет добавить группу конструкционных осей. Метод актуален только для формата IFC (cм. параграф Импорт IFC).
Метод
virtual c3d::ItemSPtr ItModelPart::NextAxesGrid() const;
возвращает очередную группу конструкционных осей или нуль в случае исчерпания. Метод актуален только для формата IFC (cм. параграф Импорт IFC).
Метод
virtual c3d::ItemSPtr NextSpatialAxis() const { return c3d::ItemSPtr{}; }
возвращает очередную пространственную ось или нуль в случае исчерпания.
Метод
virtual void AddSpatialAxis( c3d::ItemSPtr const & );
позволяет добавить очередную пространственную ось.
Метод
virtual c3d::ItemSPtr ItModelPart::NextBoundaryItem();
возвращает следующий объект, ограничивающий площадь или объем. Метод актуален только для формата IFC (cм. параграф Импорт IFC).
Метод
virtual SPtr<MbAssistingItem> ItModelPart::NextCoordinateSystem();
возвращает очередную систему координат или нуль в случае исчерпания. Включение и выключение метода при импорте и экспорте возможно с помощью фильтрации SetIoPermission( iop_rCS / iop_wCS ).
Методы для работы с модельным документом и сборками:
virtual void ItModelPart::AddBoundaryItem( c3d::ItemSPtr const &);
добавляет объект, ограничивающий площадь или объем.
virtual void ItModelPart::AddCoordinateSystem( SPtr<MbAssistingItem> const &);
позволяет добавить систему координат. Включение и выключение метода при импорте и экспорте возможно с помощью фильтрации SetIoPermission( iop_rCS / iop_wCS ).
Интерфейсы ItModelPart и ItModelAssembly объявлены в файле conv_model_document.h.
Вставки ItModelInstance
Наследование интерфейса вставки ItModelInstance от ItModelInstanceProperties сложилось исторически и сохранено для совместимости. В рамках сложившегося подхода корректным является только назначение собственных визуальных свойств вставке.
Метод void * GetId() позволяет различать вставки эквивалентных компонентов. Если различные вставки возвращают одинаковое значение, то эквивалентность определяется по результатам анализа содержания. В процессе экспорта конвертер стремится к оптимизации модели за счёт многократного использования эквивалентных компонент. Пользователь может предоставить информацию о том, какие компоненты точно не являются эквивалентными для сокращения вычислительных затрат при экспорте.
При экспорте для получения такой информации о вставке как локальная система координат вставки, содержимое вставки, отсутствие наполнения вставки используются методы:
bool GetPlacement( MbPlacement3D & place );
bool IsAssembly();
bool IsEmpty();
Если вставка не пуста, то в зависимости от результата метода IsAssembly() вызывается один из методов:
SPtr<ItModelAssembly> GetInstanceAssembly();
SPtr<ItModelPart> GetInstancePart();
Эти методы возвращают интерфейс компонента, на который ссылается вставка.
Для создания компонентов при импорте предназначены методы:
SPtr<ItModelAssembly> CreateAssembly(const MbPlacement3D & place,
const std::vector<SPtr<MbItem> > & componentItems,
const c3d::path_string & fileName );
SPtr<ItModelPart> CreatePart( MbPlacement3D & place,
const std::vector<SPtr<MbItem> > & componentItems,
const c3d::path_string & fileName );
Результатом работы этих методов является интерфейс компонента, размещение которого в компоненте верхнего уровня описано локальной системой координат place, компонент наполняется элементами из контейнера componentItems, ему соответствует имя файла fileName.
Для размещения во вставке ранее созданных компонентов используются методы:
bool SetAssembly( const MbPlacement3D & place,
const ItModelAssembly * existing );
bool SetPart( const MbPlacement3D & place,
const ItModelPart * existing );
Размещение компонента existing определяется локальной системой координат place.
Интерфейс ItModelInstance объявлен в файле conv_model_document.h.