OpenCASCADE Make Face With Holes

eryar@163.com

OpenCASCADE提供了构造Face的类BRepBuilderAPI_MakeFace,使用这个类可以构造出带孔的面。如下图所示:

当然,要得到上图所示的结果,还可以使用Boolean操作,用一个面去Cut几个圆柱。当使用布尔操作就会涉及到一些复杂算法,如求交,重构Topo体等,比较耗时。既然可以直接在生成面的时候挖孔,这个不涉及复杂算法,速度、稳定性都比使用布尔操作要好。本文主要来介绍如何使用BRepBuilderAPI_MakeFace来生成带孔的面,及其注意事项。直接上代码:

#include <gp_Circ.hxx>
#include <gp_Pln.hxx> #include <BRepBuilderAPI_MakeEdge.hxx>
#include <BRepBuilderAPI_MakeWire.hxx>
#include <BRepBuilderAPI_MakeFace.hxx> #include <BRepTools.hxx> #pragma comment(lib, "TKernel.lib")
#pragma comment(lib, "TKMath.lib") #pragma comment(lib, "TKG2d.lib")
#pragma comment(lib, "TKG3d.lib")
#pragma comment(lib, "TKGeomBase.lib")
#pragma comment(lib, "TKGeomAlgo.lib") #pragma comment(lib, "TKBRep.lib")
#pragma comment(lib, "TKTopAlgo.lib") void makeFaceTest()
{
gp_Pln aPlane; gp_Circ aCircle1(gp::XOY(), 1.0);
gp_Circ aCircle2(gp::XOY(), 1.0);
gp_Circ aCircle3(gp::XOY(), 1.0); aCircle1.SetLocation(gp_Pnt(3.0, 3.0, 0.0));
aCircle2.SetLocation(gp_Pnt(7.0, 3.0, 0.0));
aCircle3.SetLocation(gp_Pnt(3.0, 7.0, 0.0)); BRepBuilderAPI_MakeEdge anEdgeMaker1(aCircle1);
BRepBuilderAPI_MakeEdge anEdgeMaker2(aCircle2);
BRepBuilderAPI_MakeEdge anEdgeMaker3(aCircle3); BRepBuilderAPI_MakeWire aWireMaker1(anEdgeMaker1.Edge());
BRepBuilderAPI_MakeWire aWireMaker2(anEdgeMaker2.Edge());
BRepBuilderAPI_MakeWire aWireMaker3(anEdgeMaker3.Edge()); BRepBuilderAPI_MakeFace aFaceMaker(aPlane, 0.0, 10.0, 0.0, 10.0); if (aWireMaker1.IsDone())
{
aFaceMaker.Add(aWireMaker1.Wire());
} if (aWireMaker2.IsDone())
{
aFaceMaker.Add(aWireMaker2.Wire());
} if (aWireMaker3.IsDone())
{
aFaceMaker.Add(aWireMaker3.Wire());
} if (aFaceMaker.IsDone())
{
BRepTools::Write(aFaceMaker.Shape(), "d:/face.brep");
} } int main(int argc, char* argv[])
{ makeFaceTest(); return ; }

上面代码就是在一个平面上开三个孔,最后在D盘生成face.brep文件。在Draw Test Harness中加载并显示这个文件得到:

当切换到线框显示模式时,和预期效果一致。但是当切换到着色显示模式时,发现生成的面和预期的效果刚好相反。这是什么原因呢?

在Draw Test Harness中输入命令pcruve来检查,如下图所示:

根据pcurve命令的提示得知,蓝色的方向应该反向,红色的为外环。所以得知,内环孔的方向反了。修改代码,直接将Wire的方向Reverse。修改后的代码如下:

#include <gp_Circ.hxx>
#include <gp_Pln.hxx> #include <TopoDS_Wire.hxx> #include <BRepBuilderAPI_MakeEdge.hxx>
#include <BRepBuilderAPI_MakeWire.hxx>
#include <BRepBuilderAPI_MakeFace.hxx> #include <BRepTools.hxx> #pragma comment(lib, "TKernel.lib")
#pragma comment(lib, "TKMath.lib") #pragma comment(lib, "TKG2d.lib")
#pragma comment(lib, "TKG3d.lib")
#pragma comment(lib, "TKGeomBase.lib")
#pragma comment(lib, "TKGeomAlgo.lib") #pragma comment(lib, "TKBRep.lib")
#pragma comment(lib, "TKTopAlgo.lib") void makeFaceTest()
{
gp_Pln aPlane; gp_Circ aCircle1(gp::XOY(), 1.0);
gp_Circ aCircle2(gp::XOY(), 1.0);
gp_Circ aCircle3(gp::XOY(), 1.0); aCircle1.SetLocation(gp_Pnt(3.0, 3.0, 0.0));
aCircle2.SetLocation(gp_Pnt(7.0, 3.0, 0.0));
aCircle3.SetLocation(gp_Pnt(3.0, 7.0, 0.0)); BRepBuilderAPI_MakeEdge anEdgeMaker1(aCircle1);
BRepBuilderAPI_MakeEdge anEdgeMaker2(aCircle2);
BRepBuilderAPI_MakeEdge anEdgeMaker3(aCircle3); BRepBuilderAPI_MakeWire aWireMaker1(anEdgeMaker1.Edge());
BRepBuilderAPI_MakeWire aWireMaker2(anEdgeMaker2.Edge());
BRepBuilderAPI_MakeWire aWireMaker3(anEdgeMaker3.Edge()); BRepBuilderAPI_MakeFace aFaceMaker(aPlane, 0.0, 10.0, 0.0, 10.0);
if (aWireMaker1.IsDone())
{
TopoDS_Wire aWire1 = aWireMaker1.Wire();
aWire1.Reverse(); aFaceMaker.Add(aWire1);
} if (aWireMaker2.IsDone())
{
TopoDS_Wire aWire2 = aWireMaker2.Wire();
aWire2.Reverse(); aFaceMaker.Add(aWire2);
} if (aWireMaker3.IsDone())
{
TopoDS_Wire aWire3 = aWireMaker3.Wire();
aWire3.Reverse(); aFaceMaker.Add(aWire3);
} if (aFaceMaker.IsDone())
{
BRepTools::Write(aFaceMaker.Shape(), "d:/face.brep");
}
} int main(int argc, char* argv[])
{
makeFaceTest(); return ;
}

重新加载新生成的face.brep并使用pcurve查看,得到如下图所示的效果:

从上图可知,这时得到的为预期的效果。综上所述,如果要直接使用BRepBuilderAPI_MakeFace来生成带有孔的面,需要自己为外环和内环的方向负责,opencascade对此不作检查。当面显示不正确时,可以使用Draw Test Harness的pcurve命令来检查。一个带孔的面的pcurve的规则为:外环为逆时针方向;内环孔的方向为顺时针方向。

基于直接生成的带孔的面,还可以进一步使用放样算法来造型,如拉伸,旋转等,如下图所示。这样就可以避免使用布尔操作,提高造型算法的性能和稳定性。

OpenCASCADE Make Face With Holes的更多相关文章

  1. OpenCASCADE PCurve of Topological Face

    OpenCASCADE PCurve of Topological Face eryar@163.com Abstract. OpenCASCADE provides a class BRepBuil ...

  2. OpenCASCADE AIS Manipulator

    OpenCASCADE AIS Manipulator eryar@163.com Abstract. OpenCASCADE7.1.0 introduces new built-in interac ...

  3. Convert BSpline Curve to Arc Spline in OpenCASCADE

    Convert BSpline Curve to Arc Spline in OpenCASCADE eryar@163.com Abstract. The paper based on OpenCA ...

  4. OpenCASCADE Shape Location

    OpenCASCADE Shape Location eryar@163.com Abstract. The TopLoc package of OpenCASCADE gives resources ...

  5. OpenCASCADE BRep Projection

    OpenCASCADE BRep Projection eryar@163.com 一网友发邮件问我下图所示的效果如何在OpenCASCADE中实现,我的想法是先构造出螺旋线,再将螺旋线投影到面上. ...

  6. OpenCASCADE Expression Interpreter by Flex & Bison

    OpenCASCADE Expression Interpreter by Flex & Bison eryar@163.com Abstract. OpenCASCADE provide d ...

  7. OpenCASCADE Data Exchange - 3D PDF

    OpenCASCADE Data Exchange - 3D PDF eryar@163.com Abstract. Today most 3D engineering model data are ...

  8. OpenCASCADE Interpolations and Approximations

    OpenCASCADE Interpolations and Approximations eryar@163.com Abstract. In modeling, it is often requi ...

  9. OpenCASCADE Ring Type Spring Modeling

    OpenCASCADE Ring Type Spring Modeling eryar@163.com Abstract. The general method to directly create ...

随机推荐

  1. 状态压缩dp初学__$Corn Fields$

    明天计划上是要刷状压,但是作为现在还不会状压的\(ruoruo\)来说是一件非常苦逼的事情,所以提前学了一下状压\(dp\). 鸣谢\(hmq\ juju\)的友情帮助 状态压缩动态规划 本博文的大体 ...

  2. 6、json支持

    package main import ( "encoding/json" "fmt") // Json 支持 type Response1 struct{ P ...

  3. Unified BeginFrame scheduling for Chrome

    Unified BeginFrame scheduling for Chrome http://goo.gl/D1Qxrr Status: http://crbug.com/401331 and ht ...

  4. WSGI和CGI

    https://www.zhihu.com/question/19998865 https://segmentfault.com/a/1190000003069785

  5. [笔记-图论]Dijkstra

    用于求正权有向图 上的 单源最短路 优化后时间复杂度O(mlogn) 模板 // Dijkstra // to get the minumum distance with no negtive way ...

  6. [NOIP2009提高组]最优贸易

    题目:洛谷P1073.Vijos P1754.codevs1173. 题目大意:有n点m边的图,边分有向和无向.每个点有一个价格,用这个价格可以买入或卖出一个东西.一个人从1出发,要到n,途中可以买入 ...

  7. Unity C# 设计模式(三)工厂方法模式

    定义: 定义一个创建对象的接口(父类),由子类决定需要实例化哪一个类. 这样,核心工厂类成为了一个抽象角色,不再负责产品的创建,仅提供具体工厂类所必须实现的接口,这样进一步抽象化的好处是使得工厂方法模 ...

  8. fork函数详解

    一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同, ...

  9. java RSA加密算法

    [转]RSA加密算法   RSA公钥加密算法是1977年由Ron Rivest.Adi Shamirh和LenAdleman在(美国麻省理工学院)开发的.RSA取名来自开发他们三者的名字.RSA是目前 ...

  10. rsyslog学习

    http://blog.csdn.net/zhaoyangjian724/article/details/52116809 http://blog.csdn.net/zhangxihangzhuan/ ...