У меня есть объект TopoDS_Face
, полученный из перевода файла IGES. Если я проанализирую файл IGES, используя свой собственный алгоритм (написанный на C), который ищет грани, затем петли, на которые указывает грань, и, наконец, ребра в петле, я могу определить, является ли грань плоской или нет. плоские (полуцилиндрические в изгибах). Это делается путем проверки того, является ли ребро линией или дугой, на основе номера формы в базовом NURBS (объект 126). Линия имеет форму 1, а дуга имеет форму 2.
Какие методы/функции или другой механизм можно использовать в Open Cascade, чтобы определить, является ли TopoDS_Face
плоским или полуцилиндрическим (изгибом)?
Вы можете использовать класс 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
}
Похоже, что в модели САПР нет информации о типах поверхностей. В этом случае может помочь значение кривизны поверхности. Посмотрите на обновление ответа.
BRepLProp_SLProps surfaceProps(surface, u, v, 2, gp::Resolution());
нет метода с названием surfaceProps
Это правда, потому что surfaceProps
— это имя объекта. В этой строке вызывается конструктор BRepLProp_SLProps
.
Добавлен
cout
для печати PLANAR или NON-PLANAR, но вывод всегда НЕPLANAR, где он должен печатать PLANAR 12 раз и NON-PLANAR дважды.