Избавляемся от мелких ребер
«Не навреди» — первая заповедь Shape Healing.
Сегодня мы продолжаем говорить об аномалиях в граничном представлении и способах борьбы с ними. Одной из нередко возникающих проблем является избыточно сложная граница модели. На рисунке ниже показана деталь листового металла, которая, похоже, немало претерпела, прежде чем попасть в наши руки.
Итак, требуется уменьшить количество ребер. Как это часто бывает, есть сразу несколько способов выполнить некоторую операцию в OpenCascade. Библиотека содержит как минимум два инструмента, способные объединять ребра:
- ShapeFix_Wireframe
- ShapeUpgrade_UnifySameDomain
Первый класс является частью модуля Shape Healing, содержащего множество функций для исправления «битой» или «грязно» заданной геометрии. Второй класс относится к ядру моделирования и служит для максимизации границ, «накрошенных» булевым оператором.
Несмотря на то, что оба инструмента считаются рабочими, про ShapeFix_Wireframe мы забываем сразу в силу нескольких причин. Во-первых, на эту функциональность сделано очень мало тестов, в чем нетрудно убедиться, выполнив поиск по ключевому слову "fixsmall" в нерегрессионной базе библиотеки. Отсутствие тестов — однозначный признак незрелости алгоритма. Во-вторых, ShapeFix_Wireframe не используется в других операторах библиотеки, а значит он не нашел хотя бы косвенного применения внутри геометрического ядра и не будет развиваться на этой «тяге». Наконец, этот инструмент работает не очень хорошо на произвольно взятых индустриальных моделях. Например, в случае листового изделия, представленного на картинке выше, можно получить вот такие «красивые» ребра (одно ребро вместо трех, включая «шов»):
С оператором ShapeUpgrade_UnifySameDomain дело обстоит иначе. По существу это оператор максимизации границ, являющийся необходимым ингредиентом булевых операций. В силу этого, данный класс используется гораздо чаще и на существенно более широкой выборке CAD-моделей. Об этом же свидетельствует и количество тестов на данный алгоритм (команда "unifysamedom" встречается 374 раза против 10-ти для "fixsmall"). Ниже приведен результат работы оператора в приложении CAD Processor (вершины отмечены желтым цветом):
И соответствующий код:
TopoDS_Shape inputShape = ...; double len = ...; double ang_deg = ...; ShapeUpgrade_UnifySameDomain unify(inputShape, true, false, true); unify.SetLinearTolerance(len); unify.SetAngularTolerance(ang_deg/180.0*M_PI); unify.Build(); // Set output. const TopoDS_Shape& outputShape = unify.Shape();