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); 
相关推荐
Mr.Z.41118 分钟前
【历年CSP-S复赛第一题】暴力解法与正解合集(2019-2022)
c++
Death20022 分钟前
使用Qt进行TCP和UDP网络编程
网络·c++·qt·tcp/ip
郭二哈33 分钟前
C++——list
开发语言·c++·list
黑不溜秋的1 小时前
C++ 语言特性29 - 协程介绍
开发语言·c++
一丝晨光1 小时前
C++、Ruby和JavaScript
java·开发语言·javascript·c++·python·c·ruby
￴ㅤ￴￴ㅤ9527超级帅2 小时前
LeetCode hot100---二叉树专题(C++语言)
c++·算法·leetcode
_GR2 小时前
每日OJ题_牛客_牛牛冲钻五_模拟_C++_Java
java·数据结构·c++·算法·动态规划
Death2002 小时前
Qt 中的 QListWidget、QTreeWidget 和 QTableWidget:简化的数据展示控件
c语言·开发语言·c++·qt·c#
六点半8882 小时前
【C++】速通涉及 “vector” 的经典OJ编程题
开发语言·c++·算法·青少年编程·推荐算法
coduck_S12004zbj3 小时前
csp-j模拟五补题报告
c++·算法·图论