在Open Cascade中創(chuàng)建基本幾何實體
Construction of Primitives in Open Cascade
eryar@163.com
一、創(chuàng)建基本圖元 Making Primitives
將用到如下的類創(chuàng)建基本圖元,包括長方體(Box)、楔形體(Wedge)、旋轉(zhuǎn)體(Revol)等。這些類提供Shell和Solid函數(shù)來返回實體(solid)和殼(shell)。
使用方法都是調(diào)用這些類的構(gòu)造函數(shù),輸入相應(yīng)的參數(shù),直接構(gòu)造出基本圖元。構(gòu)造函數(shù)的參數(shù)不同,創(chuàng)建的基本幾何實體的形狀也會不同。
注:所有旋轉(zhuǎn)體的角度值都是弧度值。
1. 創(chuàng)建長方體BRepPrimAPI_MakeBox
使用MakeBox類創(chuàng)建一個長方體,結(jié)果以一個殼或體返回。創(chuàng)建長方體的方式有如下四種:
以上創(chuàng)建方式對應(yīng)類的BRepPrimAPI_MakeBox的四種構(gòu)造函數(shù):
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);
與上圖對應(yīng)的創(chuàng)建長方體的代碼如下所示:
BRepPrimAPI_MakeBox (200.,150.,100.);
BRepPrimAPI_MakeBox (gp_Pnt(60, 60, 0), 200.,150.,100.);
BRepPrimAPI_MakeBox (gp_Pnt(60, 60, 0), gp_Pnt(200.,150.,100.));
BRepPrimAPI_MakeBox (gp_Ax2(gp_Pnt(100.,80.,70.),gp_Dir(1.,2.,1.)),80.,90.,120.);
2. 創(chuàng)建楔形體BRepPrimAPI_MakeWedge
使用類BRepPrimAPI_MakeWedge來創(chuàng)建楔形體。楔形體就是帶斜面的長方體,即帶角度的長方體。楔形體的創(chuàng)建方式與長方體的創(chuàng)建方式相似。下圖所示為構(gòu)造楔形體的兩種方式。一種是加入ltx尺寸來描述dy上的面,另一種是加入xmin,xmax,zmin,zmax來描述dy上的面。
第一種方式是第二種方式在滿足以下條件下的特例:
xmin = 0, xmax = ltx, zmin = 0, zmax = dz
創(chuàng)建一個金字塔的楔形體可以用下面的方式:
xmin = xmax = dx / 2, zmin = zmax = dz / 2
生成上圖所示的程序如下所示:
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.);
3. BRepPrimAPI_MakeOneAxis
類BRepPrimAPI_MakeOneAxis是所有旋轉(zhuǎn)體圖元的基類。旋轉(zhuǎn)體通過將曲線繞一個軸旋轉(zhuǎn)得到。它們有圓柱體、圓錐體、球體、圓環(huán)體等。
這些旋轉(zhuǎn)體對于不同的圖元有不同的構(gòu)造參數(shù),但是它們也有共同的參數(shù):
l 一個坐標(biāo)系統(tǒng);
l 一個角度,范圍為[0, 2*PI];
l 曲線的vmin,vmax參數(shù);
OneAxis構(gòu)造的結(jié)果是體Solid、殼Shell或面Face。
通常不會直接使用類BRepPrimAPI_MakeOneAxis,而是使用它的派生類。
如下圖所示描述了類的參數(shù):
4. 創(chuàng)建圓柱體BRepPrimAPI_MakeCylinder
使用類BRepPrimAPI_MakeCylinder來創(chuàng)建圓柱體。圓柱可以在默認(rèn)的坐標(biāo)系中被創(chuàng)建,也可以指定的坐標(biāo)系(gp_Ax2)中創(chuàng)建。創(chuàng)建方式如下:
l 半徑、高度創(chuàng)建一個完整的圓柱;
l 半徑、高度及角度來創(chuàng)建部分圓柱;
如下代碼所示為沿X、Y、Z偏移一定距離的四分之一的圓柱:
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.);
5. 創(chuàng)建圓錐體 BRepPrimAPI_MakeCone
使用類BRepPrimAPI_MakeCone來創(chuàng)建圓錐體。與圓柱體一樣,圓錐體可以在默認(rèn)的坐標(biāo)系中被創(chuàng)建,也可以指定的坐標(biāo)系中被創(chuàng)建。創(chuàng)建方式如下:
l 兩個半徑和高度來創(chuàng)建一個完整的圓錐。一個半徑可以為零,這樣就創(chuàng)建了一個尖頂?shù)膱A錐;
l 半徑、高度和角度來創(chuàng)建部分圓錐。
如下代碼創(chuàng)建的圓錐如下圖所示:
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);
6. 創(chuàng)建球體BRepPrimAPI_MakeSphere
使用類BRepPrimAPI_MakeSphere來創(chuàng)建球體。與圓柱體一樣,球體可以在默認(rèn)的坐標(biāo)系中被創(chuàng)建,也可以指定的坐標(biāo)系中被創(chuàng)建。有四種創(chuàng)建方式,如下圖所示:
l 一個半徑值,創(chuàng)建一個完整的球體;
l 半徑和角度,創(chuàng)建部分的球體;
l 半徑和兩個角度值,創(chuàng)建緯度上的部分的球體。兩個角度a1,a2必須滿足如下條件:PI/2 <= a1 < a2 <= PI/2
l 一個半徑和三個角度值;
實現(xiàn)上圖中球體的代碼如下:
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);
7. 創(chuàng)建圓環(huán)體BRepPrimAPI_MakeTorus
使用類BRepPrimAPI_MakeTorus來創(chuàng)建圓環(huán)體。與其它基本圖元類似,一個圓環(huán)體可以在默認(rèn)的坐標(biāo)系中創(chuàng)建,也可以在指定的坐標(biāo)系中創(chuàng)建。創(chuàng)建與與球體創(chuàng)建方式類似:
l 兩個半徑,創(chuàng)建一個完整的圓環(huán)體;
l 兩個半徑和一個角度值,創(chuàng)建部分的圓環(huán)體;
l 兩個半徑和兩個角度值,創(chuàng)建緯度上的部分圓環(huán)體;兩個角度必須滿足如下條件:0 < a2 – a1 < 2 * PI;
l 兩個半徑和三個角度值,創(chuàng)建部分的圓環(huán)體;

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);
8. 創(chuàng)建旋轉(zhuǎn)體BRepPrimAPI_MakeRevolution
使用類BRepPrimAPI_MakeRevolution來根據(jù)一條曲線和軸創(chuàng)建旋轉(zhuǎn)體。曲線可以是任意的Geom_Curve,有四種構(gòu)造方式:
l From a curve, use the full curve and make a full rotation;
l From a curve and an angle of rotation;
l From a curve and two parameters to trim the curve. The two parameters must be growing and within the curve range;
l From a curve, two parameters, and an angle. The two parameters must be growing and within the curve range.
二、創(chuàng)建掃掠體 Sweeping: Prism, Revolution and Pipe
掃掠體(Sweeps)就是一條截面(profile)沿任意軌道線(path)掃掠后得到的體。截面可以是任意的拓樸結(jié)構(gòu)。軌道線通常是曲線(curve or wire)。創(chuàng)建掃掠體的規(guī)則如下:
l 點掃掠后得到邊;Vertices generate Edges;
l 邊掃掠后得到面;Edges generate Faces;
l 線掃掠后得到殼;Wires generate Shells;
l 面掃掠后得到體;Faces generate Solids;
l 殼掃掠后得到組合體;Shells generate Composite Solids;
l A Compound generates a Compound with the sweep of all its elements;
體(Solids)和組合體(Composite Solids)的掃掠是禁止的。
包BRepPrimAPI中實現(xiàn)了三種掃掠體:稱線性掃掠體為Prism,稱旋轉(zhuǎn)掃掠體為Revol和通用的掃掠體叫作Pipe。
1. BRepPrimAPI_MakeSweep
類BRepPrimAPI_MakeSweep是掃掠體的基類。對用戶來說,沒有什么實質(zhì)的用途。
2. 創(chuàng)建拉伸體BRepPrimAPI_MakePrism
使用類BRepPrimAPI_MakePrism來創(chuàng)建線性拉伸體prism。拉伸體可從一個形狀及一個向量或一個方向來創(chuàng)建。從一個向量可以創(chuàng)建一個有限拉伸體,而從一個方向可以創(chuàng)建一個無限的或半無限的拉伸體。一個布爾的函數(shù)參數(shù)用來控制半無限和全無限的拉伸體。所有的構(gòu)造函數(shù)都有一個布爾值來控制構(gòu)造的拉伸體與原拉伸體是否共享,默認(rèn)是共享方式構(gòu)造。如下代碼為使用一個面,一個方向和一個長度來創(chuàng)建一個有限的、無限的和半無限的拉伸體。
生成上圖所示形狀的代碼如下所示:
//--- Prism a vertex -> result is an edge ---
TopoDS_Vertex V1 = BRepBuilderAPI_MakeVertex(gp_Pnt(-200.,-200.,0.));
TopoDS_Shape S1 = BRepBuilderAPI_MakePrism(V1,gp_Vec(0.,0.,100.));
//--- Prism an edge -> result is a face ---
TopoDS_Edge E = BRepBuilderAPI_MakeEdge(gp_Pnt(-150.,-150,0.), gp_Pnt(-50.,-50,0.));
TopoDS_Shape S2 = BRepPrimAPI_MakePrism(E,gp_Vec(0.,0.,100.));
//--- Prism an wire -> result is a shell ---
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.));
//--- Prism a face or a shell -> result is a solid ---
gp_Circ c = gp_Circ(gp_Ax2(gp_Pnt(200.,200.,0.gp_Dir(0.,0.,1.)), 80.);
TopoDS_Edge Ec = BRepBuilderAPI_MakeEdge(c);
TopoDS_Wire Wc = BRepBuilderAPI_MakeWire(Ec);
TopoDS_Face F = BRepBuilderAPI_MakeFace(gp::XOY(),Wc);
TopoDS_Shape S4 = BRepBuilderAPI_MakePrism(F,gp_Vec(0.,0.,100.));
3. 創(chuàng)建旋轉(zhuǎn)體BRepPrimAPI_MakeRevol
使用類BRepPrimAPI_MakeRevol來創(chuàng)建旋轉(zhuǎn)掃掠體。旋轉(zhuǎn)掃掠體由一個形狀、軸和一個角度構(gòu)造而得。類BRepPrimAPI_MakeRevol所有的構(gòu)造函數(shù)的最后一個參數(shù)是用來控制構(gòu)造的形狀與原形狀的關(guān)系,默認(rèn)為共享的方式。
生成上圖所示形狀的代碼如下所示:
//--- Revol of a vertex -> result is an edge ---
TopoDS_Vertex V1 = BRepBuilderAPI_MakeVertex(gp_Pnt(-200.,-200.,0.));
gp_Ax1 axe = gp_Ax1(gp_Pnt(-170.,-170.,0.),gp_Dir(0.,0.,1.));
TopoDS_Shape S1 = BRepPrimAPI_MakeRevol(V1,axe);
//--- Revol of an edge -> result is a face ---
TopoDS_Edge E = BRepBuilderAPI_MakeEdge(gp_Pnt(-120.,-120,0.), gp_Pnt(-120.,-120,100.));
axe = gp_Ax1(gp_Pnt(-100.,-100.,0.),gp_Dir(0.,0.,1.));
TopoDS_Shape S2 = BRepPrimAPI_MakeRevol(E,axe);
//--- Revol of a wire -> result is a shell ---
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);
axe = gp_Ax1(gp_Pnt(0.,0.,30.),gp_Dir(0.,1.,0.));
TopoDS_Shape S3 = BRepPrimAPI_MakeRevol(W,axe, 210.*PI180);
//--- Revol of a face -> result is a solid ---
gp_Circ c = gp_Circ(gp_Ax2(gp_Pnt(200.,200.,0.),gp_Dir(0.,0.,1.)), 80.);
TopoDS_Edge Ec = BRepBuilderAPI_MakeEdge(c);
TopoDS_Wire Wc = BRepBuilderPI_MakeWire(Ec);
TopoDS_Face F = BRepBuilderAPI_MakeFace(gp_Pln(gp::XOY()),Wc);
axe = gp_Ax1(gp_Pnt(290,290.,0.),gp_Dir(0.,1,0.));
TopoDS_Shape S4 = BRepPrimAPI_MakeRevol(F,axe, 90.*PI180);