Open CASCADE基础介绍(2)

原创 2008年10月27日 12:36:00

Open CASCADE基础介绍(2

一些OCC的基础知识,愿与各位OCC爱好者共同学习;mail:tongabcd@yeah.net

 

一:关于体的类

BRepBuilderAPI_MakeVertex

创建点;

 

BRepBuilderAPI_MakeEdge

此类用来创建边;

比如,由直线生成边:

gp_Lin line(gp_Ax1(gp_Pnt(10,10,10),gp_Dir(1,0,0)));

       WhiteEdge = BRepBuilderAPI_MakeEdge(line,-20,10);

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

gp_Elips Elips(gp_Ax2(gp_Pnt(10,0,0),gp_Dir(1,1,1)),60,30);

       RedEdge = BRepBuilderAPI_MakeEdge(Elips,0,PI/2);

下面是由曲线生成边:

Handle (Geom_BezierCurve) curve = new Geom_BezierCurve(array);

BRepBuilderAPI_MakeEdge ME (curve);

GreenEdge = ME;

V3 = ME.Vertex1();

V4 = ME.Vertex2();

 

BRepBuilderAPI_MakeWire

用来创建一个Wire类;

 

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

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

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();

       }

 

BRepBuilderAPI_MakeFace

生成一个面;有多种生成面的方法;

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

BRepBuilderAPI_MakeFace(curve);

--通过一个Wire生成面:

BrownFace = BRepBuilderAPI_MakeFace(YellowWire);

Bnd_Box2d:

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

示例:

Bnd_Box2d aCBox;                                                   

Geom2dAdaptor_Curve GACC (C);                                      

BndLib_Add2dCurve::Add (GACC,Precision::Approximation(),aCBox);

 

Bnd_Box:

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

BRepPrimAPI_MakeBox

用来生成一个立方体;

构造一个立方体可以是两个对角点,一个角点及三个方向长度,可以是非轴对称的:

TopoDS_Shape B2 = BRepPrimAPI_MakeBox (gp_Ax2(gp_Pnt(-200.,-80.,-70.), gp_Dir(1.,2.,1.)),       80.,90.,120.);

使用方法

TopoDS_Face& BottomFace() ;.可以得到立方体的底面;同样,用其它类似的方法可以获得顶面等;

方法TopoDS_Solid& Solid() ;可以将box转化为一个Solid;

方法TopoDS_Shell& Shell() ;可以将box转化为一个shell;

 

BRepPrimAPI_MakeCylinder

用来生成一个园柱体或园柱体的一部分;

比如:   

TopoDS_Shape C2 = BRepPrimAPI_MakeCylinder (gp_Ax2(gp_Pnt(200.,0.,200.), gp_Dir(0.,1.,0.)),40.,110.,210.*PI180);

 

BRepPrimAPI_MakeCone

生成一个园锥或园锥的一部分;

 

BRepPrimAPI_MakeSphere

生成球体或球体的一部分,可以是U方向切一部分或V方向切一部分;

 

BRepPrimAPI_MakeTorus

生成环或环的一部分;

 

BRepPrimAPI_MakeWedge

生成一个楔块或楔块的一部分;

 

BRepPrimAPI_MakePrism

生成一个线性的swept,称为Prisms;它的基类是BRepPrimAPI_MakeSweep类;BRepPrimAPI_MakeSweep类的基类是

BRepBuilderAPI_MakeShape

注意,原始基本图形不可以包含任何实体:

应用此类时:

--顶点“推移”成边:

TopoDS_Vertex V1 = BRepBuilderAPI_MakeVertex(gp_Pnt(-200.,-200.,0.));

       Handle(AIS_Shape) ais1 = new AIS_Shape(V1); 

       TopoDS_Shape S1 = BRepPrimAPI_MakePrism(V1,gp_Vec(0.,0.,100.));

       Handle(AIS_Shape) ais2 = new AIS_Shape(S1);

--边“推移”成面:.

TopoDS_Edge E = BRepBuilderAPI_MakeEdge(gp_Pnt(-150.,-150,0.), gp_Pnt(-50.,-50,0.));

       Handle(AIS_Shape) ais3 = new AIS_Shape(E);

       myAISContext->Display(ais3,Standard_False);

       TopoDS_Shape S2 = BRepPrimAPI_MakePrism(E,gp_Vec(0.,0.,100.));

--Wires “推移”成Shells.

       TopoDS_Edge E1 = BRepBuilderAPI_MakeEdge(gp_Pnt(0.,0.,0.), gp_Pnt(50.,0.,0.));

       TopoDS_Edge E2 = BRepBuilderAPI_MakeEdge(gp_Pnt(50.,0.,0.), gp_Pnt(50.,50.,0.));

       TopoDS_Edge E3 = BRepBuilderAPI_MakeEdge(gp_Pnt(50.,50.,0.), gp_Pnt(0.,0.,0.));

       TopoDS_Wire W = BRepBuilderAPI_MakeWire(E1,E2,E3);

       TopoDS_Shape S3 = BRepPrimAPI_MakePrism(W,gp_Vec(0.,0.,100.));

--Faces “推移”成Solids.

TopoDS_Face F = BRepBuilderAPI_MakeFace(gp_Pln(gp::XOY()),Wc);

       Handle(AIS_Shape) ais7 = new AIS_Shape(F);

       myAISContext->Display(ais7,Standard_False);

       TopoDS_Shape S4 = BRepPrimAPI_MakePrism(F,gp_Vec(0.,0.,100.));

--Shells “推移”成复合实体

 

BRepPrimAPI_MakeRevol

一个回转sweep体;

类继承关系和前面类似:BRepBuilderAPI_MakeShape--BRepPrimAPI_MakeSweep-->BRepPrimAPI_MakeRevol

,对于角度而言,范围是[02PI],默认值是2PI,生成规则:

- Vertex -> Edge.

- Edge -> Face.

- Wire -> Shell.

- Face-> Solid.

- Shell-> CompSolid.

 

BRepOffsetAPI_MakePipe

可以生成一个管道

类继承关系是:BRepBuilderAPI_MakeShape--BRepPrimAPI_MakeSweep-->BRepOffsetAPI_MakePipe

 

以下为生成一个管道的示例过程:

--利用生成一个WIRE,作为管道的路径:

Handle(Geom_BezierCurve) curve = new Geom_BezierCurve(CurvePoles);

       TopoDS_Edge E = BRepBuilderAPI_MakeEdge(curve);

       TopoDS_Wire W = BRepBuilderAPI_MakeWire(E);

--生成一个面,作为生成管道的截面:

gp_Circ c = gp_Circ(gp_Ax2(gp_Pnt(0.,0.,0.),gp_Dir(0.,1.,0.)),10.);

       TopoDS_Edge Ec = BRepBuilderAPI_MakeEdge(c);

       TopoDS_Wire Wc = BRepBuilderAPI_MakeWire(Ec);

       TopoDS_Face F = BRepBuilderAPI_MakeFace(gp_Pln(gp::ZOX()),Wc);

--利用前两步生成的路径和截面来生成pipe:

TopoDS_Shape S = BRepOffsetAPI_MakePipe(W,F);

Handle(AIS_Shape) ais2 = new AIS_Shape(S);

 

BRepOffsetAPI_ThruSections

此类继承自BRepBuilderAPI_MakeShape:创建一个loft,通过一组给定的sections,生成一个shell或一个solid;通常,sectionwire;但是第一个和最后一个section可以是

vertices;

比如:

BRepOffsetAPI_ThruSections generator(Standard_False,Standard_True);

       generator.AddWire(W1);

       generator.AddWire(W2);

       generator.AddWire(W3);

       generator.AddWire(W4);

       generator.Build();

       TopoDS_Shape S1 = generator.Shape();

       Handle(AIS_Shape) ais1 = new AIS_Shape(S1);

 

BRepBuilderAPI_MakePolygon

创建一个polygonal wires,可以通过一组点或向量生成,也可以先生成一个空的对象,再添加点。

示例1

BRepBuilderAPI_MakePolygon P;

       P.Add(gp_Pnt(0.,0.,0.));

       P.Add(gp_Pnt(200.,0.,0.));

       P.Add(gp_Pnt(200.,200.,0.));

       P.Add(gp_Pnt(0.,200.,0.));

       P.Add(gp_Pnt(0.,0.,0.));

       TopoDS_Wire W = P.Wire();

示例2

TopoDS_Wire wprof = BRepBuilderAPI_MakePolygon(gp_Pnt(0.,0.,0.),gp_Pnt(-60.,-60.,-200.));

 

BRepOffsetAPI_MakeEvolved

创建一个可展图形,它是通过一个planar spine (face or wire)和一个rofile (wire)来生成的,它是一个非循环的sweep (pipe),profile沿着spline;自相交点将被移除;

比如:

--沿着一个splinesweep一个profile;

Standard_EXPORT BRepOffsetAPI_MakeEvolved(const TopoDS_Face& Spine,const TopoDS_Wire& Profil,const GeomAbs_JoinType Join = GeomAbs_Arc,const Standard_Boolean

AxeProf = Standard_True,const Standard_Boolean Solid = Standard_False,const Standard_Boolean ProfOnSpine = Standard_False,const Standard_Real Tol = 0.0000001);

 

AxeProf参数如果为true,R0,X,Y,Z;如果solid为真,结果为一个solid或复合的solids;

示例:

TopoDS_Shape

 S = BRepOffsetAPI_MakeEvolved(W,wprof,GeomAbs_Arc,Standard_True,Standard_False,Standard_True,0.0001);

 

BRepBuilderAPI_ModifyShape

当使用BRepTools来创建一个修改类,主要有以下派生类:

--BRepBuilderAPI_Copy:处理一个图形的拷贝;

--BRepBuilderAPI_Transform BRepBuilderAPI_GTransform:用来对一个图形应用几何变形;

--BRepBuilderAPI_NurbsConvert:用来将一个图形转化为NURBS几何体;

--BRepOffsetAPI_DraftAngle:创建一个tapered图形;

 

BRepOffsetAPI_DraftAngle

创建一个tapered图形;一般过程是:

--初始化构造算法;

--输入要taper的特征面;

--实现算法;

--生成结果;

示例:

TopoDS_Shape S = BRepPrimAPI_MakeBox(200.,300.,150.);

      

       BRepOffsetAPI_DraftAngle adraft(S);

       TopExp_Explorer Ex;

       for (Ex.Init(S,TopAbs_FACE); Ex.More(); Ex.Next()) {

              TopoDS_Face F = TopoDS::Face(Ex.Current());

              Handle(Geom_Plane) surf = Handle(Geom_Plane)::DownCast(BRep_Tool::Surface(F));

              gp_Pln apln = surf->Pln();

              gp_Dir dirF = apln.Axis().Direction();

              if (dirF.IsNormal(gp_Dir(0.,0.,1.),Precision::Angular()))

                     adraft.Add(F, gp_Dir(0.,0.,1.), 15.*PI180, gp_Pln(gp::XOY()));

       }

       ais1->Set(adraft.Shape());


二:关于布尔等实体修改操作相关

BRepAlgoAPI_BooleanOperation

此类的基类是BRepBuilderAPI_MakeShape类,它是一个抽象类;

可以应用的操作有:BOP_SECTION BOP_COMMONBOP_FUSEBOP_CUTBOP_CUT21

有时会产生错误,无法达到想要的结果,根据返回值,可以得到错误信息,含义是:

0OK

1 对象创建完成,但结果为空;

2:源图形为空;

3:参数类型检查错误;

4:不能为DSFiller分配内存;

5:此种类型参数的Builder无法工作;

6:不允许的操作;

7:不能为Builder分配内存;

>100 参见Builder错误信息;

相关的方法介绍:

--TopTools_ListOfShape& SectionEdges()方法:返回一组截面的边,它们在布尔操作过程中生成;

--Standard_Boolean HasDeleted()方法:如果至少一个图形对象被删除了,返回为真;

--Standard_Boolean HasGenerated()方法:如果至少生成了一个图形,返回为真;

--Standard_Boolean HasModified()方法:如果至少一个图形被修改了,返回为真;

--TopTools_ListOfShape& Generated(const TopoDS_Shape& S) 方法:返回生成以后的图形的集合;

--TopTools_ListOfShape& Modified2(const TopoDS_Shape& aS)方法:返回修改后的图形的集合;

--Standard_Boolean IsDeleted(const TopoDS_Shape& aS)方法:如果图形S已经被删除,返回为真,即结果图形中不包括图形S

-BOP_Operation Operation()方法:返回布尔操作的类型;

 

布尔操作类

包括有BRepAlgoAPI_Cut类, BRepAlgoAPI_Fuse类,BRepAlgoAPI_Common类:布尔交集;

 

BRepAlgoAPI_Section

计算两个图形或几何体的截面,几何对象可以是平面的表面,转化为face.

示例:

给定两个图形S1S2,计算在S1S2上的边,在新曲线上生成近似值,结果在第一部分上而不在第二部分上:

Standard_Boolean PerformNow = Standard_False;

BRepBoolAPI_Section S(S1,S2,PerformNow);

S.ComputePCurveOn1(Standard_True);

S.Approximation(Standard_True);

S.Build();

TopoDS_Shape R = S.Shape();

 

如果结果为空,调用NotDone()

常见方法:

--BRepAlgoAPI_Section(const Handle(Geom_Surface)& Sf1,const Handle(Geom_Surface)& Sf2,const Standard_Boolean

PerformNow = Standard_True);

用来生成线:

--两个图形SH1SH2

--图形SH和平面P1

--表面SF和图形SH

--两个表面SF1SF2

参数PerformNow如果为真,将直接计算结果,如果为假,表示后面将通过Build()这个函数来计算结果;

生成后的图形是由方法Shape()得出的;

这些相交的边是独立的,不在一个链表上,也不在一个wire上,如果不存在一个相交边,返回结果为空;

示例:

--计算相交的基本边--利用这些基本边创建一个相交线--决定相交线在两个图形的哪个图形的参数空间;

TopoDS_Shape S1 = ... , S2 = ... ;

Standard_Boolean PerformNow = Standard_False;

BRepAlgoAPI_Section S ( S1, S2, PerformNow );

S.ComputePCurveOn1 (Standard_True);

S.Approximation (Standard_True);

S.Build();

TopoDS_Shape R = S.Shape();

 

BRepFilletAPI_LocalOperation

基类是BRepBuilderAPI_MakeShape

构造在一个shell的边的园角;常用方法有

--void Add(const TopoDS_Edge& E)  = 0;builder上添加一个轮廓线;

--void ResetContour(const Standard_Integer IC)  = 0;重置索引为IC的轮廓线;

--Standard_Integer NbContours() const = 0;返回轮廓线的数目;

--Standard_Integer Contour(const TopoDS_Edge& E) const = 0;返回边E的轮廓线的索引,如果边E不在轮廓线内,返回为O

--Standard_Integer NbEdges(const Standard_Integer I) const = 0;返回在轮廓线I中的边数;

--void Remove(const TopoDS_Edge& E)  = 0;移除一个边;

--Standard_Real Length(const Standard_Integer IC) const = 0;得到某个轮廓线的长度;

--TopoDS_Vertex FirstVertex(const Standard_Integer IC) const = 0;返回某个轮廓线的第一个顶点;LastVertex方法返回最后一个顶点;

--Abscissa方法,返回某个顶点的横坐标;

--Standard_Boolean ClosedAndTangent(const Standard_Integer IC) const如果某个轮廓线是封闭切线,返回为真;

--Standard_Boolean Closed(const Standard_Integer IC) const = 0;如果某个轮廓线是封闭,返回为真;

--Reset()  = 0;重置所有;

 

BRepFilletAPI_MakeFillet

创建一个园角;

示例一:

对一个BOX园角:

BRepFilletAPI_MakeFillet fillet(Box);

 

for (TopExp_Explorer ex(Box,TopAbs_EDGE); ex.More(); ex.Next()) {

       TopoDS_Edge Edge =TopoDS::Edge(ex.Current());

       fillet.Add(20,Edge);

}

 

示例二:

两个BOX,合并后园角;

TopoDS_Shape fusedShape = BRepAlgoAPI_Fuse(S1,S2);

BRepFilletAPI_MakeFillet fill(fusedShape);

for (TopExp_Explorer ex1(fusedShape,TopAbs_EDGE); ex1.More(); ex1.Next()) {

       TopoDS_Edge E =TopoDS::Edge(ex1.Current());

       fill.Add(E);

}

 

for (Standard_Integer i = 1;i<=fill.NbContours();i++) {

       Standard_Real longueur(fill.Length(i));

       Standard_Real Rad(0.15*longueur);

       fill.SetRadius(Rad,i, 1);

}

 

TopoDS_Shape blendedFusedSolids = fill.Shape();

Handle(AIS_Shape) aBlend = new AIS_Shape(blendedFusedSolids);

 

示例三:

只园角其中一条边:

BRepFilletAPI_MakeFillet Rake(theBox);

TopExp_Explorer ex(theBox,TopAbs_EDGE);

ex.Next();

ex.Next();

ex.Next();

ex.Next();

Rake.Add(8,50,TopoDS::Edge(ex.Current()));

Rake.Build();

if (Rake.IsDone() ){

       TopoDS_Shape evolvedBox = Rake.Shape();

       ais1->Set(evolvedBox);

}

 

示例四:

园角一个园柱:

BRepFilletAPI_MakeFillet fillet(theCylinder);

TColgp_Array1OfPnt2d TabPoint2(1,20);

 

for (Standard_Integer i=0; i<=19; i++) {

       gp_Pnt2d Point2d(i*2*PI/19,60*cos(i*PI/19-PI/2)+10);

       TabPoint2.SetValue(i+1,Point2d);

}

 

TopExp_Explorer exp2(theCylinder,TopAbs_EDGE);

fillet.Add(TabPoint2,TopoDS::Edge(exp2.Current()));

fillet.Build();

if (fillet.IsDone() ){

       TopoDS_Shape LawEvolvedCylinder = fillet.Shape();

       ais3->Set(LawEvolvedCylinder);

       myAISContext->Redisplay(ais3,Standard_False);

       myAISContext->SetCurrentObject(ais3,Standard_False);

}

 

BRepFilletAPI_MakeChamfer

创建一个倒角;

基类:BRepFilletAPI_LocalOperation

可以设置相关参数,比如倒角两个距离,角度等参数;

示例:

BRepFilletAPI_MakeChamfer MC(theBox);

// add all the edges to chamfer

TopTools_IndexedDataMapOfShapeListOfShape M;

TopExp::MapShapesAndAncestors(theBox,TopAbs_EDGE,TopAbs_FACE,M);

for (Standard_Integer i = 1;i<=M.Extent();i++) {

       TopoDS_Edge E = TopoDS::Edge(M.FindKey(i));

       TopoDS_Face F = TopoDS::Face(M.FindFromIndex(i).First());

       MC.Add(5,5,E,F);

       }

BRepBuilderAPI_MakeShell

生成一个表面的外壳,注意,一个图形的外壳,不是一个由表面和厚度定义的实体模型,如果想要创建这种壳,需要使用BRepOffsetAPI_MakeOffsetShape,一个外壳是由一系列相互通过普通的边连接起来的面;如果表面是C2连续的,外壳将只有一个面;如果表面不是C2连续的,将把一些面细分成所有的面都是C2连续的,结果是外壳包含所有这些面;通过一个非C2连续的表面来生成一个外壳,一般过程是:--构造一个外壳对象--实现算法--生成结果;

注意:表面分解的这些C2面并没有缝合在一起,需要使用BRepOffsetAPI_Sewing,如果想实现带厚度的外壳,需要使用BRepOffsetAPI_MakeOffsetShape类;

【第二回】使用OCCT实现对一个瓶子建模的总结

1.      建模一个瓶子的第一步是建立瓶子底部的轮廓profile。 首先是建立半边轮廓,然后再通过mirror(反射),生成另外一边轮廓,接着就把这两个半边轮廓连接起来形成一个闭环。 在建立...

Open CASCADE基础介绍(4)

Open CASCADE基础介绍(4)gp_Trsf类定义一个矩阵变换的类--可以定义平移、旋转、缩放的矩阵;--可以对称于一个点,一条线,一个平面;示例一:对称于一个点:gp_Trsf theTra...

OpenCasCade打开sta文件造成面或实体只显示边框的解决办法

今天想完成项目保存建模结果的功能,但是在把所有的数据导出到外部文件保存成为".sta"格式的文件后再次打开该数据文件时发现数据框架里完整地恢复了保存之前的所有数据,而且调用函数把模型显示出来时点和网格...

Open_CASCADE基础介绍

  • 2012年01月22日 18:11
  • 351KB
  • 下载

open cascade 基础介绍

  • 2014年08月10日 20:59
  • 454KB
  • 下载

在Open Cascade中创建基本几何实体

一、创建基本图元 Making Primitives 将用到如下的类创建基本图元,包括长方体(Box)、楔形体(Wedge)、旋转体(Revol)等。这些类提供Shell和Solid函数来返...

Open+CASCADE中文教程

  • 2012年04月12日 17:59
  • 262KB
  • 下载

Open_CASCADE学习笔记-曲面建模

  • 2012年10月18日 09:58
  • 490KB
  • 下载

VS 下 Open Cascade Source Code 编译及自定义工程设置

源码编译: 工程编译顺序:Foundation Classes (file FoundationClasses.*)Modeling Data (file ModelingData.*)Modelin...
  • Augusdi
  • Augusdi
  • 2012年08月29日 08:56
  • 3517

Open+CASCADE中文教程

  • 2012年07月28日 14:06
  • 264KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Open CASCADE基础介绍(2)
举报原因:
原因补充:

(最多只允许输入30个字)