OpenCasCade 教程-瓶子 (2)

3. 瓶子主体

 

3.1. 柱体轮廓

生成瓶子主体,需要创建一个实心的柱体。最简单的方法是用先前创建的底面轮廓沿着一个方向推移:OCC的功能很合适这样的操作。OCC可以根据一个形状和一个方向生成实体:

 

形状

生成

Vertex 顶点

Edge  

Edge

Face  表面

Wire 网格

Shell  

Face 表面

Solid  

Shell

Compound of Solids 组合体

 

7

当前的轮廓是一个wire,根据上面的表,应该通过wire获得face,再通过face生成solid

 

BRepBuilderAPI_MakeFace 类创建face。如前面所说, face是一个由闭合wire组成的表面轮廓的一部分。通常,BRepBuilderAPI_MakeFace类可以将一个或多个wire生成face

如果wire在一个平面上,则surface将自动生成。

 

TopoDS_Face myFaceProfile = BRepBuilderAPI_MakeFace(myWireProfile);

 

BRepPrimAPI 开发包提供了很多类来创建拓扑图元:boxes, cones, cylinders, spheres, 等等。 其中 BRepPrimAPI_MakePrism 类。 上面的柱体可以这个创建:

 

gp_Vec aPrismVec(0 , 0 , myHeight);

 

TopoDS_Shape myBody = BRepPrimAPI_MakePrism(myFaceProfile , aPrismVec);

 

 

3.2. 圆角

瓶体现在已经生成,但边棱比较尖锐生硬。现在要用OCC的圆角方面的功能来圆滑它。

圆角的方法有很多,比如沿着一条线,或者棱线,我们这里采用比较简单的方法:

圆角所有的边

 

圆角半径 myThickness / 12

 

8

在尖锐的边上圆角使用 BRepFilletAPI_MakeFillet 类。使用方法:

 

使用 BRepFilletAPI_MakeFillet 类的构造函数传入需要圆角的图形。

 

 使用Add函数添加要圆角的边和半径。

 

Shape函数返回圆角结果。

 

BRepFilletAPI_MakeFillet mkFillet(myBody);

 

为了添加圆角的参数边,必须知道图形都有哪些边。最好的解决方法是通过遍历获得形体的所有边。这里面用到TopExp_Explorer类提供的功能和TopoDS_Shape类提供的数据结构,下面我们通过程序来看一下通过遍历,将边作为参数传入圆角类的过程:

 

TopExp_Explorer aEdgeExplorer(myBody , TopAbs_EDGE);

 

while(aEdgeExplorer.More())

{

TopoDS_Edge aEdge = TopoDS::Edge(aEdgeExplorer.Current()); //Add edge to fillet algorithm

...

aEdgeExplorer.Next();

}

 

mkFillet.Add(myThickness / 12. , aEdge);

 

myBody = mkFillet.Shape();

 

 

 

 

 

3.3. 瓶颈

要添加瓶颈,需生成一个园柱并把它焊到瓶体上;园柱的位置在瓶体的顶面,半径设定myThickness/4,高度设定myHeight/10

为了定位园柱,要用gp_Ax2类来定义一个右手坐标系,这个坐标系可以由一个点和两个方向来定义,这两个方向分别是法线方向和X轴方向,Y轴方向可以由这两个方向计算得出。

 

瓶子体上面的中心,在世界坐标系中的坐标是(0,0,myHeight),法线是Z轴。所以,局部坐标系可以这们定义:

 

gp_Pnt neckLocation(0 , 0 , myHeight);

gp_Dir neckNormal = gp::DZ();

gp_Ax2 neckAx2(neckLocation , neckNormal);

 

生成圆柱可以使用图元构造开发包中的BRepPrimAPI_MakeCylinder 类。 需要以下信息:

圆柱所在的坐标系

半径和高度

 

Standard_Real myNeckRadius = myThickness / 4.;

Standard_Real myNeckHeight = myHeight / 10;

TopoDS_Shape myNeck = BRepPrimAPI_MakeCylinder(neckAx2 , myNeckRadius , myNeckHeight);

 

现在要把瓶体和瓶颈2个部分连接在一起。

BRepAlgoAPI 开发包中提供了图元间的布尔运算。包括交,并,差 三种运算。

BRepAlgoAPI_Fuse 可以将2个图元焊接在一起:

 

myBody = BRepAlgoAPI_Fuse(myBody , myNeck);

 

3.4. 将瓶子镂空

一个真正的瓶子是用来装液体的,所以要镂空,下面看看OCC镂空这个瓶子,将其变成有厚度的实体的步骤:

从初始的实体中移除一个或多个面得到第一个镂空实体的面W1;

生成一个平行于W1的面W2,两个面之间的距离是D,如果D为正,则W2在初始实体的外面,否则在里面;

通过W1和W2生成实体;

 

9 

为了生成一个有厚度的实体,可以生成一个BRepOffsetAPI_MakeThickSolid类的实例,给它传递以下值:

 

要镂空的图形

需要计算的公差

两个面W1和W2之间的厚度(距离D)

从原始的实体中移除面而生成的第一个面W1;

 

这一步最不好做的是从图形中找到要移除的面:瓶颈园柱体的顶面;

在几何体上的一个平面

瓶子上的最高的面(按Z轴来说);

 

有了这个面的这些特征,可以再次遍历瓶子的所有面并找到这个面:

for(TopExp_Explorer aFaceExplorer(myBody,TopAbs_FACE);aFaceExplorer.More(); aFaceExplorer.Next()){

TopoDS_Face aFace = TopoDS::Face(aFaceExplorer.Current());

TopoDS_Face aFace = TopoDS::Face(aFaceExplorer.Current());

}

 

为了检测每个面,需要找到它的表面。有一个工具类可以处理图形的几何属性:BRep_Tool类,这个类常见的用法有:

 

对于表面:可以处理表面上的面;

对于曲线:可以处理曲线上的边;

对于向量:可以处理向量上的点;

 

Handle(Geom_Surface) aSurface = BRep_Tool::Surface(aFace);

 

可以看出,BRep_Tool::Surface方法返回一个Geom_Surface类的实例,这个实例是通过句柄分配;

但是,Geom_Surface类并不提供aSurface对象的实际类型的信息,这个引用的类型可能是Geom_PlaneGeom_CylindricalSurface等;

类似Geom_Surface,所有的对象是通过句柄分配,这些对象是从Standard_Transient派生出来的。

在这里与类型相关的两个有用的方法是:

 

DynamicType方法:可以得出对象的实际类型

IsKind方法:可以计算一个对象是否是从某种类型派生出来的

 

DynamicType方法返回对象的实际类型,但是要用它和已知类型比较来得出aSurface是一个平面,还是一个园柱侧面或其它类型;

为了用所给定的类型和要找的类型相比较,可以使用STANDARD_TYPE宏。这个宏返回一个类的类型:

 

if(aSurface->DynamicType() == STANDARD_TYPE(Geom_Plane)){ ... }

 

如果比较的结果为真,可以得出aSurface的实际类型是Geom_Plane

接下来,可以在Standard_Transient中找到另一个有用的方法,把它从Geom_Surface转化为Geom_Plane,这个方法是DownCast方法;正如它的名字一样,这个静态方法用来把一种给定的类型转化为另一种类型:

 

Handle(Geom_Plane) aPlane = Handle(Geom_Plane)::DownCast(aSurface);

 

记住,转化的目的是为了找到瓶子所有表面中最顶部的平面。、

现在假设有了这两个全局变量:

 

TopoDS_Face faceToRemove; Standard_Real zMax = -1;

 

接下来,使用Geom_Plane::Location方法就很容易找到在Z方向上哪个面的原始点最大,比如:

gp_Pnt aPnt = aPlane->Location();

Standard_Real aZ = aPnt.Z();

if(aZ > zMax)

{

zMax = aZ;

faceToRemove = aFace;

}

 

现在已经找到的瓶颈的顶面。在生成一个镂空的实体前,最后要做的一步是要把这个面放在一个链表中。因为有可能从原始的实体中移除一个或多个面,所以,BRepOffsetAPI_MakeThickSolid构造函数中传进去的参数是一个面的链表;

Open CASCADE为不同的的对象提供了多种集合,Geom包中对象的集合类都在TColGeom包中;gp包中的对象的集合类都在TColgp包中。

图形的集合是在TopTools包中。由于BRepOffsetAPI_MakeThickSolid需要一个列表,因此,使用TopTools_ListOfShape类:

 

TopTools_ListOfShape facesToRemove; facesToRemove.Append(faceToRemove);

 

现在,所有必须的数据都准备好了,现在可以调用BRepOffsetAPI_MakeThickSolid构造函数来生成一个镂空的实体了:

 

MyBody = BRepOffsetAPI_MakeThickSolid(myBody , facesToRemove , -myThickness / 50 , 1.e-3);

 

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
opencascade-7.4.0-vc14-64.exe 是OpenCASCADE开源几何建模工具的一个安装程序。OpenCASCADE是一个用于开发CAD/CAM/CAE、3D建模和数据交换软件的开源三维几何建模工具包,提供了丰富的几何处理和模型分析功能。 这个安装程序的版本号为7.4.0,适用于使用Visual Studio 2017 (vc14)编译环境的64位Windows操作系统。安装程序主要用于将OpenCASCADE库和相关文件安装到计算机系统中,以便开发人员能够在其开发的软件中使用OpenCASCADE的功能和特性。 通过运行opencascade-7.4.0-vc14-64.exe,用户可以按照安装向导的指示完成安装过程。安装程序通常会将OpenCASCADE库文件、示例代码、文档和其他必要的文件复制到指定的目录中。一旦安装完成,用户就可以在其开发环境中配置OpenCASCADE库,并开始使用OpenCASCADE的几何建模和分析功能。 OpenCASCADE具有广泛的应用领域,包括CAD软件、建筑设计、工业设计、仿真和分析等。开发人员可以使用OpenCASCADE的API来创建和编辑3D几何模型,执行各种几何操作,如裁剪、旋转、平移等,进行模型分析,如求交、求交集等,并进行数据交换与转换,使得用户能够与其他CAD软件进行数据的互操作。 总之,opencascade-7.4.0-vc14-64.exe 是OpenCASCADE开源几何建模工具的安装程序,允许用户在64位Windows系统上使用Visual Studio 2017编译环境来开发应用程序,利用OpenCASCADE的功能和特性进行几何建模、分析和数据交换。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值