OpenCASCADE开发指南<十一>:OCC基本三维几何体建模类BRepBuilderAPI、BRepPrimAPI介绍

1 BRepBuilderAPI类

1.1 BRepBuilderAPI_MakeVertex类

BRepBuilderAPI_MakeVertex类用来创建点;

1.2 BRepBuilderAPI_MakeEdge类

BRepBuilderAPI_MakeEdge类用来创建边;

比如由直线生成边:

cpp 复制代码
gp_Lin line(gp_Ax1(gp_Pnt(10,10,10),gp_Dir(1,0,0)));
WhiteEdge = BRepBuilderAPI_MakeEdge(line,-20,10);

下面为生成四分之一圆边:

cpp 复制代码
gp_Elips Elips(gp_Ax2(gp_Pnt(10,0,0),gp_Dir(1,1,1)),60,30);
RedEdge = BRepBuilderAPI_MakeEdge(Elips,0,PI/2);

下面是由曲线生成边:

cpp 复制代码
Handle (Geom_BezierCurve) curve = new Geom_BezierCurve(array);
BRepBuilderAPI_MakeEdge ME (curve);
GreenEdge = ME;
V3 = ME.Vertex1();
V4 = ME.Vertex2();

1.3 BRepBuilderAPI_MakeWire类

BRepBuilderAPI_MakeWire类用来创建一个线框。

用一个Wire和一个边来生成一个新的Wire:

cpp 复制代码
ExistingWire = BRepBuilderAPI_MakeWire(Edge2);
Edge3 = BRepBuilderAPI_MakeEdge(gp_Pnt(-300,0,-80),gp_Pnt(-90,20,-30));
BRepBuilderAPI_MakeWire MW1(ExistingWire,Edge3);
if (MW1.IsDone()) 
{YellowWire = MW1;}

用一个Wire和添加边的方法来生成Wire:

cpp 复制代码
BRepBuilderAPI_MakeWire MW;
MW.Add(ExistingWire2);
MW.Add(Edge5);
MW.Add(Edge6);
MW.Add(Edge7);
 if (MW.IsDone()) {
 WhiteWire = MW.Wire();
 LastEdge = MW.Edge();
LastVertex = MW.Vertex();

1.4 BRepBuilderAPI_MakeFace类

BRepBuilderAPI_MakeFace类用来生成一个面,有多种生成面的方法;

--通过一个封闭曲线生成面:

cpp 复制代码
BRepBuilderAPI_MakeFace(curve);

--通过一个Wire生成面:

cpp 复制代码
BrownFace = BRepBuilderAPI_MakeFace(YellowWire);

1.5 Bnd_Box2d类

定义一个二维空间的边界盒,可以得出边界盒各个点的值,有时,在某个方向是无限大,这种情况下,称为在此方向上是开放的,示例:

cpp 复制代码
Bnd_Box2d aCBox;                                                   
Geom2dAdaptor_Curve GACC (C);                                      
BndLib_Add2dCurve::Add (GACC,Precision::Approximation(),aCBox);

1.6 Bnd_Box类

定义一个三维空间的边界盒,可以扩大或缩小边界盒,也可以合并两个轴对齐边界盒;

2 BRepPrimAPI类

2.1 BRepPrimAPI_MakeBox类

使用MakeBox类创建一个长方体,结果以一个壳或体返回。创建长方体的方式有如下四种:

以上创建方式对应类的BRepPrimAPI_MakeBox的四种构造函数:

cpp 复制代码
Standard_EXPORT   BRepPrimAPI_MakeBox(const Standard_Real dx,const Standard_Real dy,const Standard_Real dz);
Standard_EXPORT   BRepPrimAPI_MakeBox(const gp_Pnt& P,const Standard_Real dx,const Standard_Real dy,const Standard_Real dz);
Standard_EXPORT   BRepPrimAPI_MakeBox(const gp_Pnt& P1,const gp_Pnt& P2);
Standard_EXPORT   BRepPrimAPI_MakeBox(const gp_Ax2& Axes,const Standard_Real dx,const Standard_Real dy,const Standard_Real dz);

2.2 BRepPrimAPI_MakeWedge类

使用类BRepPrimAPI_MakeWedge来创建楔形体。楔形体就是带斜面的长方体,即带角度的长方体。楔形体的创建方式与长方体的创建方式相似。下图所示为构造楔形体的两种方式。一种是加入ltx尺寸来描述dy上的面,另一种是加入xmin,xmax,zmin,zmax来描述dy上的面。

第一种方式是第二种方式在满足以下条件下的特例:

cpp 复制代码
xmin = 0, xmax = ltx, zmin = 0, zmax = dz

创建一个金字塔的楔形体可以用下面的方式:

cpp 复制代码
xmin = xmax = dx / 2, zmin = zmax = dz / 2


生成上图所示的程序如下所示:

cpp 复制代码
TopoDS_Shape S1 = BRepPrimAPI_MakeWedge(60.,100.,80.,20.); 
TopoDS_Shape S2 = BRepPrimAPI_MakeWedge(gp_Ax2(gp_Pnt(100.,100.,0.),gp_Dir(0.,0.,1.)), 
                                    60.,50.,80.,25.,-10.,40.,70.); 

2.3 BRepPrimAPI_MakeOneAxis类

BRepPrimAPI_MakeOneAxis类是所有旋转体图元的基类。旋转体通过将曲线绕一个轴旋转得到。它们有圆柱体、圆锥体、球体、圆环体等。这些旋转体对于不同的图元有不同的构造参数,但是它们也有共同的参数:

  • 一个坐标系统;
  • 一个角度,范围为[0, 2*PI];
  • 曲线的vmin,vmax参数;

OneAxis构造的结果是体Solid、壳Shell或面Face。通常不会直接使用类BRepPrimAPI_MakeOneAxis,而是使用它的派生类。

如下图所示描述了类的参数:

2.4 BRepPrimAPI_MakeCylinder类

使用类BRepPrimAPI_MakeCylinder来创建圆柱体。圆柱可以在默认的坐标系中被创建,也可以指定的坐标系(gp_Ax2)中创建。创建方式如下:

  1. 半径、高度创建一个完整的圆柱;
  2. 半径、高度及角度来创建部分圆柱;

如下代码所示为沿X、Y、Z偏移一定距离的四分之一的圆柱:

cpp 复制代码
Standard_Real X = 20;
Standard_Real Y = 10;
Standard_Real Z = 15;
Standard_Real R = 10;
Standard_Real DY = 30;
// Make the system of coordinates.
gp_Ax2 axes = gp::ZOX();
axes.Translate(gp_Vec(X, Y, Z));
TopoDS_Face F = BRepPrimAPI_MakeCylinder(axes, R, DY, PI/2.);

2.5 BRepPrimAPI_MakeCone

使用类BRepPrimAPI_MakeCone来创建圆锥体。与圆柱体一样,圆锥体可以在默认的坐标系中被创建,也可以指定的坐标系中被创建。创建方式如下:

1)两个半径和高度来创建一个完整的圆锥。一个半径可以为零,这样就创建了一个尖顶的圆锥;

2)半径、高度和角度来创建部分圆锥。

如下代码创建的圆锥如下图所示:

cpp 复制代码
TopoDS_Shape C1 = BRepPrimAPI_MakeCone (50.,25.,200.); 
TopoDS_Shape C2 = BRepPrimAPI_MakeCone(gp_Ax2(gp_Pnt(100.,100.,0.), 
                                          gp_Dir(0.,0.,1.)), 605.,0.,150.,210.*PI180); 

2.6 BRepPrimAPI_MakeSphere类

使用类BRepPrimAPI_MakeSphere来创建球体。与圆柱体一样,球体可以在默认的坐标系中被创建,也可以指定的坐标系中被创建。有四种创建方式,如下图所示:

  • 一个半径值,创建一个完整的球体;
  • 半径和角度,创建部分的球体;
  • 半径和两个角度值,创建纬度上的部分的球体。两个角度a1,a2必须满足如下条件:PI/2 <= a1 < a2 <= PI/2
  • 一个半径和三个角度值;


    实现上图中球体的代码如下:
cpp 复制代码
TopoDS_Shape S1 = BRepPrimAPI_MakeSphere(gp_Pnt(-200.,-250.,0.),80.); 
TopoDS_Shape S2 = BRepPrimAPI_MakeSphere(100.,120.*PI180); 
TopoDS_Shape S3 = BRepPrimAPI_MakeSphere(gp_Pnt(200.,250.,0.),100., -60.*PI180, 60.*PI180); 
TopoDS_Shape S4 = BRepPrimAPI_MakeSphere(gp_Pnt(0.,0.,-300.),150., -45.*PI180, 45.*PI180, 45.*PI180);

2.7 BRepPrimAPI_MakeTorus类

使用类BRepPrimAPI_MakeTorus来创建圆环体。与其它基本图元类似,一个圆环体可以在默认的坐标系中创建,也可以在指定的坐标系中创建。创建与与球体创建方式类似:

  • 两个半径,创建一个完整的圆环体;
  • 两个半径和一个角度值,创建部分的圆环体;
  • 两个半径和两个角度值,创建纬度上的部分圆环体;两个角度必须满足如下条件:0 < a2 -- a1 < 2 * PI;
  • 两个半径和三个角度值,创建部分的圆环体;

实现上图中环的代码如下:

cpp 复制代码
TopoDS_Shape S1 = BRepPrimAPI_MakeTorus(60.,20.); 
TopoDS_Shape S2 = BRepPrimAPI_MakeTorus(gp_Ax2(gp_Pnt(100.,100.,0.),gp_Dir(1.,1.,1.)), 50.,20.,210.*PI180); 
TopoDS_Shape S3 = BRepPrimAPI_MakeTorus(gp_Ax2(gp_Pnt(-200.,-150.,-100),gp_Dir(0.,1.,0.)), 
                                    60.,20.,-45.*PI180,45.*PI180,90.*PI180); 
相关推荐
唐诺4 小时前
几种广泛使用的 C++ 编译器
c++·编译器
冷眼看人间恩怨5 小时前
【Qt笔记】QDockWidget控件详解
c++·笔记·qt·qdockwidget
红龙创客5 小时前
某狐畅游24校招-C++开发岗笔试(单选题)
开发语言·c++
Lenyiin5 小时前
第146场双周赛:统计符合条件长度为3的子数组数目、统计异或值为给定值的路径数目、判断网格图能否被切割成块、唯一中间众数子序列 Ⅰ
c++·算法·leetcode·周赛·lenyiin
yuanbenshidiaos7 小时前
c++---------数据类型
java·jvm·c++
十年一梦实验室8 小时前
【C++】sophus : sim_details.hpp 实现了矩阵函数 W、其导数,以及其逆 (十七)
开发语言·c++·线性代数·矩阵
taoyong0018 小时前
代码随想录算法训练营第十一天-239.滑动窗口最大值
c++·算法
这是我588 小时前
C++打小怪游戏
c++·其他·游戏·visual studio·小怪·大型·怪物
fpcc8 小时前
跟我学c++中级篇——C++中的缓存利用
c++·缓存
呆萌很8 小时前
C++ 集合 list 使用
c++