Классификация лица TopoDS_Face

У меня есть объект TopoDS_Face, полученный из перевода файла IGES. Если я проанализирую файл IGES, используя свой собственный алгоритм (написанный на C), который ищет грани, затем петли, на которые указывает грань, и, наконец, ребра в петле, я могу определить, является ли грань плоской или нет. плоские (полуцилиндрические в изгибах). Это делается путем проверки того, является ли ребро линией или дугой, на основе номера формы в базовом NURBS (объект 126). Линия имеет форму 1, а дуга имеет форму 2.

Какие методы/функции или другой механизм можно использовать в Open Cascade, чтобы определить, является ли TopoDS_Face плоской или полуцилиндрической (изгибы)?


person Minathe    schedule 08.04.2019    source источник


Ответы (1)


Вы можете использовать класс BRepAdaptor_Surface, чтобы получить тип поверхности TopoDS_Face:

BRepAdaptor_Surface surface = BRepAdaptor_Surface(face);
if (surface.GetType() == GeomAbs_Plane)
{
  // Surface is a plane
}
else
{
  // Surface is not a plane
}

Обновление:

Альтернативный способ определить плоскую поверхность или нет — использовать значение кривизны. Для плоских поверхностей средняя кривизна должна быть равна 0.

BRepAdaptor_Surface surface = BRepAdaptor_Surface(face);

double u = (surface.FirstUParameter() + surface.LastUParameter()) / 2.0;
double v = (surface.FirstVParameter() + surface.LastVParameter()) / 2.0;

BRepLProp_SLProps surfaceProps(surface, u, v, 2, gp::Resolution());
if (surfaceProps.MeanCurvature() == 0.0)
{
  // Surface is a plane
}
else
{
  // Surface is not a plane
}
person Alexander Trotsenko    schedule 08.04.2019
comment
Добавлен cout для печати PLANAR или NON-PLANAR, но вывод всегда НЕPLANAR, где он должен печатать PLANAR 12 раз и NON-PLANAR дважды. - person Minathe; 08.04.2019
comment
Похоже, что в модели САПР нет информации о типах поверхностей. В этом случае может помочь значение кривизны поверхности. Посмотрите на обновление ответа. - person Alexander Trotsenko; 08.04.2019
comment
BRepLProp_SLProps surfaceProps(surface, u, v, 2, gp::Resolution()); нет метода с именем surfaceProps - person Minathe; 08.04.2019
comment
Это верно, потому что surfaceProps — это имя объекта. В этой строке вызывается конструктор BRepLProp_SLProps. - person Alexander Trotsenko; 08.04.2019