Выворачиваем тело наизнанку

/ Просмотров: 34

Обмен данными между различными CAD-системами остается краеугольной проблемой САПР. Перенос модели из одной геометрической среды в другую зачастую негативно сказывается на целостности переносимых данных. Дело усугубляется тем, что даже визуально благополучная форма может иметь серьезные скрытые патологии, которые дадут о себе знать не сразу, но позже, когда геометрия начнет «работать». Одной из множества хитрых проблем является инверсия ориентации тела. Возьмем индустриальную деталь, изображенную на картинке ниже.

Исходное тело выглядит прилично.

Анализ двугранных углов вскрывает проблему ориентации.

Анализ двугранных углов вскрывает проблему.

Красным цветом кодируются вогнутые двугранные углы, зеленым — выпуклые. Нетрудно заметить, что цвета перепутаны. Это визуальный способ проверки, причем далеко не самый эффективный. Выяснить алгоритмически, не является ли тело «вывернутым наизнанку» можно путем классификации бесконечно удаленной точки. Если точка, взятая заведомо вне объема, ограниченного телом, оказывается формально ему принадлежащей, то следует заключить, что грани нашего тела ориентированы неверно. Рисунок ниже иллюстрирует принцип такой классификации (справа — корректная ситуация, слева — нет).

Классификация Точка-Тело на бесконечно удаленной точке.

Проверить принадлежность телу бесконечно удаленной точки в библиотеке OpenCascade можно следующим образом:

bool IsFinite(const TopoDS_Solid& solid)
{
  BRepClass3d_SolidClassifier clas3d(solid);
  clas3d.PerformInfinitePoint( Precision::Confusion() );
  //
  if ( clas3d.State() == TopAbs_IN )
    return false;
  
  return true;
}

Назначить лечение в случае вывернутого тела довольно просто: нужно пройти по всем оболочкам (TopoDS_Shell) и обратить их ориентации. Метод, позволяющий проделать этот трюк на гранях, мы уже приводили. С незначительными модификациями он работает для инверсии любого типа топологического элемента.

Представим теперь сценарий для проверки и лечения модели в среде Analysis Situs. Обратите внимание на команды check-finite и invert-shells.

# Set working variables.
set datafile cad/ANC101.brep
  
# Read input geometry.
set datadir $env(ASI_TEST_DATA)
load-brep $datadir/$datafile
fit
  
# Check finiteness.
set finiteness [check-finite]
#
if { $finiteness != 1 } {
  error "Unexpected finiteness: the solid is expected to be finite initially."
}
  
# Now invert shells...
invert-shells
  
# ... and check finiteness again.
set finiteness [check-finite]
#
if { $finiteness != 0 } {
  error "Unexpected finiteness: the solid is expected to be infinite after inversion."
}
Оставьте комментарий!

Имя и сайт используются только при регистрации

Выберите человечка с поднятой рукой!

При нажатии на картинку, Ваш комментарий будет добавлен.