Лечение модели

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

Избавляемся от мелких ребер

«Не навреди» — первая заповедь Shape Healing.

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

Мелкие ребра на исходной модели.

Итак, требуется уменьшить количество ребер. Как это часто бывает, есть сразу несколько способов выполнить некоторую операцию в OpenCascade. Библиотека содержит как минимум два инструмента, способные объединять ребра:

  • ShapeFix_Wireframe
  • ShapeUpgrade_UnifySameDomain

Первый класс является частью модуля Shape Healing, содержащего множество функций для исправления «битой» или «грязно» заданной геометрии. Второй класс относится к ядру моделирования и служит для максимизации границ, «накрошенных» булевым оператором.

Несмотря на то, что оба инструмента считаются рабочими, про ShapeFix_Wireframe мы забываем сразу в силу нескольких причин. Во-первых, на эту функциональность сделано очень мало тестов, в чем нетрудно убедиться, выполнив поиск по ключевому слову "fixsmall" в нерегрессионной базе библиотеки. Отсутствие тестов — однозначный признак незрелости алгоритма. Во-вторых, ShapeFix_Wireframe не используется в других операторах библиотеки, а значит он не нашел хотя бы косвенного применения внутри геометрического ядра и не будет развиваться на этой «тяге». Наконец, этот инструмент работает не очень хорошо на произвольно взятых индустриальных моделях. Например, в случае листового изделия, представленного на картинке выше, можно получить вот такие «красивые» ребра (одно ребро вместо трех, включая «шов»):

Некорректный результат ShapeFix_Wireframe.

С оператором ShapeUpgrade_UnifySameDomain дело обстоит иначе. По существу это оператор максимизации границ, являющийся необходимым ингредиентом булевых операций. В силу этого, данный класс используется гораздо чаще и на существенно более широкой выборке CAD-моделей. Об этом же свидетельствует и количество тестов на данный алгоритм (команда "unifysamedom" встречается 374 раза против 10-ти для "fixsmall"). Ниже приведен результат работы оператора в приложении CAD Processor (вершины отмечены желтым цветом):

Результат работы ShapeUpgrade_UnifySameDomain.

И соответствующий код:

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();