Manifold Geometry // Многообразная Геометрия

Вопросы и ответы

Подписаться на эту рубрику по RSS

Вопросы от читателей, часть 3

Следуя примеру из документации OCCT (Tutorial) я обнаружил, что функция MakeBottle возвращает объект типа TopoDS_Shape, который представляет собой структуру данных модели. Но мне непонятно, каким образом получить геометрические данные из объекта. По-видимому, существует механизм извлечения геометрических данных, но какой именно?

OpenCascade, в отличие от, например, ACIS, очень скрупулезно отделяет геометрию от топологии. На практике это проявляется в том, что геометрические примитивы (наследники Geom_Geometry) нельзя получить из топологических носителей (наследников TopoDS_Shape) напрямую. Верно и обратное: из геометрии нет прямого доступа к топологии. Чтобы извлечь геометрию граничного элемента (грани, ребра или вершины) нужно использовать специальный инструмент: BRep_Tool. Например, в нем есть метод, возвращающий поверхность: BRep_Tool::Surface().

Взять геометрию всей модели «сразу» — нет, так не получится. Геометрия распределена по граничным элементам (TopoDS_Face, TopoDS_Edge и TopoDS_Vertex). Все прочие топологические элементы геометрии не содержат, но они, тем не менее, нужны, так как их вложенность друг в друга формирует структуру модели. Например, «сплошное тело» (TopoDS_Solid) может содержать несколько «оболочек» (TopoDS_Shell).

Правильно ли я понимаю, что определение объекта TopoDS_Shape эквивалентно определению Solid в топологии модели OCCT?

Нет, TopoDS_Shape — это абстрактный базовый тип для всех топологических элементов. По сути это указатель на абсолютно любую модель B-Rep в вашем приложении. Посмотрите на первую диаграмму по этой ссылке. Каждый светло-серый прямоугольник в ней отвечает тому или иному наследнику TopoDS_Shape.

В целом, похоже, будет нелишне расписать модель данных OpenCascade более детально. Постараюсь сделать это в одной из будущих заметок.