RU:BrepPrimAPI

Основные фигуры

Общие положения

Для описания тела в трехмерном пространстве нужно задать совокупность участков поверхностей (граней), граничивающих его объем, т.е. позволяющих отделить множество внутренних точек от внешних. Эти грани пересекаются по некоторым кривым (ребрам), а ребра граничат друг с другом точками (вершинами). Совокупность перечисленных элементов называют топологией тела.

В OpenCascade выделяют следующие топологические элементы

  • Вершина (точка)— vertex, элемент класса TopoDS_Vertex.
  • Ребро (участок кривой) — edge, элемент класса TopoDS_Edge.
  • Контур (связанная совокупность ребер и вершин) — wire, элемент класса TopoDS_Wire.
  • Грань (участок поверхности, ограниченный ребрами) — face, элемент класса TopoDS_Face.
  • Оболочка (связанная совокупность граней) — shell, элемент класса TopoDS_Shell.
  • Тело (область пространства, ограниченная оболочкой) — solid, элемент класса TopoDS_Solid.
  • Составной элементTopoDS_Compound.
  • Составное телоTopoDS_CompSolid.

Все эти элементы имеют общее название фигура — shape, объект класса TopoDS_Shape.

Но прежде, чем описывать работу с элементами топологии, рассмотрим примитивы, предоставляемые системой. Это параллелепипед (box), клин (wedge), цилиндр (cylinder), конус (cone), шар (sphere), тор (torus).

Параллелепипед (Box)

Построение параллелепипеда выполняется процедурами класса BRepPrimAPI_MakeBox. Он имеет несколько конструкторов наиболее общий из которых

   BRepPrimAPI_MakeBox (const gp_Ax2 &Axes, const Standard_Real dx,
      const Standard_Real dy, const Standard_Real dz)

позволяет построить параллелепипед со сторонами dx, dy, dz, направленными вдоль координатных осей, задаваемых системой координат Axes.

Пример. Параллелепипед со сторонами $dx = 2, dy = 3, dz = 1$, начало локальной системы координат (угол параллелепипеда) находится в точке $(1,1,1)$, с главным направлением (осью $z$), направленной по вектору $(1.,2.,3.)$ и осью $x$, направленной по $(-3.,0.,1.))$ строится так:

// Локальная система координат
   gp_Ax2 axes(gp_Pnt(1.,1.,1.),gp_Dir(1.,2.,3.),
    gp_Dir(-3.,0.,1.));
// Создаем объект
   Standard_Real dx, dy, dz;
   dx = 2.; dy = 3.; dz = 1.;
   BRepPrimAPI_MakeBox makeBox(axes,dx,dy,dz);
// Фигура параллелепипеда
   TopoDS_Shape shape = makeBox.Shape();;
   Handle(AIS_Shape) aisShape = new AIS_Shape(shape);
// Отображаем
   myAISContext->Display(aisShape,Standard_True);
OCC_Box01.jpg

Кроме описанного выше конструктора, имеются его "усеченные" варианты.

  • Создание параллелепипеда в начале мировой системы координат (локальная система координат совпадает с мировой)
   BRepPrimAPI_MakeBox(const Standard_Real dx, const Standard_Real dy,
      const Standard_Real dz)
  • Создание параллелепипеда в точке P (оси локальной системы координат параллельны осям мировой, а начало сдвинуто в точку P)
   BRepPrimAPI_MakeBox (const gp_Pnt &P,
      const Standard_Real dx, const Standard_Real dy, const Standard_Real dz)
  • Создание параллелепипеда с противоположными вершинами, расположенными в точках P1 и P2 в начале мировой системы координат (оси локальной системы координат параллельны осям мировой)
    BRepPrimAPI_MakeBox (const gp_Pnt &P1, const gp_Pnt &P2)

Клин (Wedge)

Параллелепипед является частным случаем клина (усеченного), построение которого выполняется процедурами класса BRepPrimAPI_MakeWedge. Наиболее общий конструктор класса имеет вид

    BRepPrimAPI_MakeWedge (const gp_Ax2 &Axes, const Standard_Real dx,
       const Standard_Real dy, const Standard_Real dz, const Standard_Real xmin,
       const Standard_Real zmin, const Standard_Real xmax, const Standard_Real zmax)

Первый параметр Axes задает локальную систему координат, в которой строится фигура. Клин представляет собой два прямоугольника-основания, соединенных боковыми сторонами-трапециями. Одно основание-прямоугольник лежит в плоскости $y=0$, его угол находится в начале координат, а стороны направлены по координатным осям и имеют длины $dx$, $dz$. Второе основание лежит в плоскости $y=dy$. Это прямоугольник, противоположные углы которого имеют координаты (xmin, zmin) и (xmax, zmax).

В частности, при xmin = zmin = 0, xmax = dx, zmax = dz, мы получаем параллелепипед, при xmin = xmax = dx/2, zmin = 0, zmax = dz — равнобочный клин, а при xmin = xmax = dx/2, zmin = zmax = dz/2 — равнобочную пирамиду.

Другие конструкторы позволяют задавать частные случаи клина.

  • Создание клина в мировой системе координат
    BRepPrimAPI_MakeWedge (const Standard_Real dx, const Standard_Real dy,
       const Standard_Real dz, const Standard_Real xmin, const Standard_Real zmin,
       const Standard_Real xmax, const Standard_Real zmax)
  • Усеченный равнобочный клин с шириной верхнего основания ltx относительно мировой и локальной систем координат:. Данный случай получается из общего при xmin = dx/2 - ltx/2, xmax = dx/2 + ltx/2, zmin = 0, zmax = dz,
    BRepPrimAPI_MakeWedge (const gp_Ax2 &Axes, const Standard_Real dx,
       const Standard_Real dy, const Standard_Real dz, const Standard_Real ltx)

    BRepPrimAPI_MakeWedge (const Standard_Real dx, const Standard_Real dy,
       const Standard_Real dz, const Standard_Real ltx)

Пример. Будем строить усеченную пирамиду с нижним основанием — единичным квадратом $0 \le x, y \le 1$ в плоскости $(x, y)$, верхним основанием $0 \le x \le 0.25$, $0.125 \le y \le 0.25$, лежащим в плоскости $z=1$. Таким образом, ось $y$ локальной системы координат должна быть направлена по оси $z$ мировой системы, ось $z$ по оси $x$, а ось $x$ — по $y$. Вот соответствующий участок программы:

// Локальная система координат
   gp_Ax2 axes(gp_Pnt(0.,0.,0.),gp_Dir(1.,0.,0.),gp_Dir(0.,1.,0.));
// Клин
   BRepPrimAPI_MakeWedge makeWedge(axes,1.,1.,1.,0.,0.125,0.25,0.25);
   TopoDS_Shape shape = makeWedge.Shape();
// Отображение
   Handle(AIS_Shape) aisShape = new AIS_Shape(shape);
   myAISContext->SetColor(aisShape,Quantity_NOC_RED,Standard_False);
   myAISContext->SetMaterial(aisShape,Graphic3d_NOM_PLASTIC,Standard_False);
   myAISContext->Display(aisShape,Standard_True);
OCC_Wedge02.jpg

Можно построить пирамиду-клин в мировых координатах, а затем выполнить преобразование системы координат. Это преобразование должно переводить ось $y$ в ось $z$, ось $z$ в ось $x$, а $x$ в $y$. Итак:

// Клин
   BRepPrimAPI_MakeWedge makeWedge(1.,1.,1.,0.,0.125,0.25,0.25);
   TopoDS_Shape shape = makeWedge.Shape();
// Преобраование системы координат
   gp_Ax2 axes(gp_Pnt(0.,0.,0.),gp_Dir(0.,1.,0.),gp_Dir(0.,0.,1.));
   gp_Trsf transform;
   transform.SetTransformation(gp_Ax3(axes));
   TopLoc_Location location(transform);
   shape.Move(location);
// Отображение
   Handle(AIS_Shape) aisShape = new AIS_Shape(shape);
   myAISContext->SetColor(aisShape,Quantity_NOC_RED,Standard_False);
   myAISContext->SetMaterial(aisShape,Graphic3d_NOM_PLASTIC,Standard_False);
   myAISContext->Display(aisShape,Standard_True);

Результат тот же самый.

Цилиндр (Cylinder)

Под цилиндром в данном случае понимается прямой круговой цилиндр, точнее часть цилиндра, получающаяся при повороте отрезка на некоторый угол. В локальной системе координат вращение выполняется относительно оси $z$, нижнее основание лежит в плоскости $(x, y)$, угол поворота отсчитывается от оси $x$ в направлении против часовой стрелки, если смотреть на плоскость с положительных значений $z$.

    BRepPrimAPI_MakeCylinder (const gp_Ax2 &Axes, const Standard_Real R,
       const Standard_Real H, const Standard_Real Angle)

Здесь, как и выше, Axes задает локальную систему координат, R — радиус цилиндра, H — высота, а Angle — угол поворота. Доступны также конструкторы со значениями параметров "по умолчанию":
    BRepPrimAPI_MakeCylinder (const Standard_Real R, const Standard_Real H)

    BRepPrimAPI_MakeCylinder (const Standard_Real R, const Standard_Real H,
       const Standard_Real Angle)

    BRepPrimAPI_MakeCylinder (const gp_Ax2 &Axes, const Standard_Real R,
       const Standard_Real H)

Конус (Cone)

Конус (точнее прямой, круговой конус) определяется положением локальной системы координат, радиусами нижней и верхней круговых граней (они перпендикулярны оси конуса) и расстоянием между ними. Ось конуса совпадает с осью $z$, а нижняя грань лежит в плоскости $(x, y)$. Конус может представлять собой сектор кругового конуса, задаваемый некоторым углом поворота образующей прямой. Конструктор класса имеет вид

   BRepPrimAPI_MakeCone (const gp_Ax2 &Axes, const Standard_Real R1,
      const Standard_Real R2, const Standard_Real H, const Standard_Real angle)

Здесь Axes — локальная система координат, R1 — радиус нижнего основания, R2 — радиус верхнего основания, H — высота конуса, расстояние между основаниями, а Angle — угол поворота образующей. При R1=R2 конус переходит в цилиндр.
Доступны также следующие конструкторы:
    BRepPrimAPI_MakeCone (const Standard_Real R1, const Standard_Real R2,
       const Standard_Real H)

    BRepPrimAPI_MakeCone (const Standard_Real R1, const Standard_Real R2,
       const Standard_Real H, const Standard_Real angle)

    BRepPrimAPI_MakeCone (const gp_Ax2 &Axes, const Standard_Real R1,
       const Standard_Real R2, const Standard_Real H)

Шар (Sphere)

Процедуры класса BRepPrimAPI_MakeSphere позволяют построить часть шара, ограниченного участком сферы и плоскостями сечения. Участок сферы лежит между двумя меридианами и двумя широтами. Центр сферы расположен в начале локальной системы координат, а ось сферических координат направлена по оси $z$. Угол меридиана $\varphi$ отсчитывается от оси $x$ против часовой стрелки, $(0 \le \varphi \le 2\pi)$, а углы широт $\theta_1$ и $\theta_2$ — от экватора. Они должны удовлетворять соотношению $( -\pi/2 \le \theta_1 < \theta_2 \le \pi/2)$.
В частности, при $\theta_1 = -\pi/2$, $\theta_2 = +\pi/2$ получается полный шар, при $\theta_1 = -\pi/2$, $\theta_2 = 0$ — нижняя половина (южное полушарие), а при $\theta_1 = 0$, $\theta_2 = +\pi/2$ — верхняя половина (северное полушарие).

Приведем несколько конструкторов класса. Шар радиуса R с центром в начале координат формирует конструктор

   BRepPrimAPI_MakeSphere (const Standard_Real R)

Шар радиуса R с центром в точке Center задается так:
   BRepPrimAPI_MakeSphere (const gp_Pnt &Center, const Standard_Real R)

В общем случае, как сказано выше, шар задается локальной системой координат, радиусом и тремя углами:
   BRepPrimAPI_MakeSphere (const gp_Ax2 &Axis, const Standard_Real R,
      const Standard_Real theta1, const Standard_Real theta2, const Standard_Real phi)

Пример. Построим область шара единичного радиуса с центром в начале координат, соответствующую параметрам $\varphi = \pi/4$, $\theta_1 = \pi/8$, $\theta_2 = \pi/4$.

// Параметры фигуры
   Standard_Real r, phi, theta1, theta2;
   r = 1;
   theta1 = M_PI / 8.;
   theta2 = M_PI / 4.;
   phi = M_PI / 4.;
// Построение и отображение
   BRepPrimAPI_MakeSphere makeSphere(r, theta1, theta2, phi);
   TopoDS_Shape shape = makeSphere.Shape();
   Handle(AIS_Shape) aisShape = new AIS_Shape(shape);
   myAISContext->Display(aisShape,Standard_True);
OCC_sphere02.JPG

Тор (Torus)

Тор представляет собой фигуру, получаемую (в локальной системе координат) при вращении окружности, лежащей в плоскости $(x, z)$ с центром на оси $x$, вокруг оси $z$. Тор определяется локальной системой координат и двумя радиусами: большим ]]$r_1$]] и меньшим $r_2$. Параметрами на поверхности тора служат углы $\varphi$ и $\theta$, изменяющиеся в диапазоне от 0 до $2\pi$. Для построения тора (или его части) предназначен класс BRepPrimAPI_MakeTorus.
В общем случае участок тора задается следующими параметрами

  • Локальной системой координат фигуры. Если она не задана, то фигура строится в мировой системе координат. Центр тора располагается в начале координат. Линия центров (окружность радиуса $r_1$) лежит в плоскости $(x, y)$.
  • Радиусом $r_1$ окружности центров.
  • Радиусом $r_2$ окружностей-образующих.
  • Углом $\varphi$, отсчитываемого от оси $x$ против часовой стрелки, до которого строится часть тора. Этот угол может лежать в диапазоне от 0 до $2\pi$.
  • Углами $\theta_1$ и $\theta_2$, отсекающими часть поверхности тора вдоль образующей. При этом предполагается, что угол $\theta_1$ меньше $\theta_2$, так что выполнено неравенство $0 < \theta_2-\theta_1 \le 2\pi$.

Рассмотрим несколько конструкторов класса. Полный тор описывается конструктором

   BRepPrimAPI_MakeTorus (const Standard_Real R1, const Standard_Real R2)

а часть тора с полным набором параметров конструктором
   BRepPrimAPI_MakeTorus (const gp_Ax2 &Axes, const Standard_Real R1,
      const Standard_Real R2, const Standard_Real theta1,
      const Standard_Real theta2, const Standard_Real phi)

Обратим внимание на то, что построение части тора выполняется несколько странным образом, как показывает приведенный ниже пример.

   Standard_Real r1, r2;
   Standard_Real phi, theta1, theta2;
   r1 = 1.;
   r2 = 0.2;
   phi = M_PI / 4.;
   theta1 = 0.;
   theta2 = 3.*M_PI / 4.;
   BRepPrimAPI_MakeTorus makeTorus(r1, r2, theta1, theta2, phi);
   TopoDS_Shape shape = makeTorus.Shape();
//
   Handle(AIS_Shape) aisShape = new AIS_Shape(shape);
   myAISContext->Display(aisShape,Standard_True);
OCC_torus01.JPG