在Open Cascade中創(chuàng)建基本幾何實(shí)體
Construction of Primitives in Open Cascade
eryar@163.com
一、創(chuàng)建基本圖元 Making Primitives
將用到如下的類(lèi)創(chuàng)建基本圖元,包括長(zhǎng)方體(Box)、楔形體(Wedge)、旋轉(zhuǎn)體(Revol)等。這些類(lèi)提供Shell和Solid函數(shù)來(lái)返回實(shí)體(solid)和殼(shell)。
使用方法都是調(diào)用這些類(lèi)的構(gòu)造函數(shù),輸入相應(yīng)的參數(shù),直接構(gòu)造出基本圖元。構(gòu)造函數(shù)的參數(shù)不同,創(chuàng)建的基本幾何實(shí)體的形狀也會(huì)不同。
注:所有旋轉(zhuǎn)體的角度值都是弧度值。
1. 創(chuàng)建長(zhǎng)方體BRepPrimAPI_MakeBox
使用MakeBox類(lèi)創(chuàng)建一個(gè)長(zhǎng)方體,結(jié)果以一個(gè)殼或體返回。創(chuàng)建長(zhǎng)方體的方式有如下四種:
以上創(chuàng)建方式對(duì)應(yīng)類(lèi)的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);
與上圖對(duì)應(yīng)的創(chuàng)建長(zhǎ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
使用類(lèi)BRepPrimAPI_MakeWedge來(lái)創(chuàng)建楔形體。楔形體就是帶斜面的長(zhǎng)方體,即帶角度的長(zhǎng)方體。楔形體的創(chuàng)建方式與長(zhǎng)方體的創(chuàng)建方式相似。下圖所示為構(gòu)造楔形體的兩種方式。一種是加入ltx尺寸來(lái)描述dy上的面,另一種是加入xmin,xmax,zmin,zmax來(lái)描述dy上的面。
第一種方式是第二種方式在滿(mǎn)足以下條件下的特例:
xmin = 0, xmax = ltx, zmin = 0, zmax = dz
創(chuàng)建一個(gè)金字塔的楔形體可以用下面的方式:
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
類(lèi)BRepPrimAPI_MakeOneAxis是所有旋轉(zhuǎn)體圖元的基類(lèi)。旋轉(zhuǎn)體通過(guò)將曲線繞一個(gè)軸旋轉(zhuǎn)得到。它們有圓柱體、圓錐體、球體、圓環(huán)體等。
這些旋轉(zhuǎn)體對(duì)于不同的圖元有不同的構(gòu)造參數(shù),但是它們也有共同的參數(shù):
l 一個(gè)坐標(biāo)系統(tǒng);
l 一個(gè)角度,范圍為[0, 2*PI];
l 曲線的vmin,vmax參數(shù);
OneAxis構(gòu)造的結(jié)果是體Solid、殼Shell或面Face。
通常不會(huì)直接使用類(lèi)BRepPrimAPI_MakeOneAxis,而是使用它的派生類(lèi)。
如下圖所示描述了類(lèi)的參數(shù):
4. 創(chuàng)建圓柱體BRepPrimAPI_MakeCylinder
使用類(lèi)BRepPrimAPI_MakeCylinder來(lái)創(chuàng)建圓柱體。圓柱可以在默認(rèn)的坐標(biāo)系中被創(chuàng)建,也可以指定的坐標(biāo)系(gp_Ax2)中創(chuàng)建。創(chuàng)建方式如下:
l 半徑、高度創(chuàng)建一個(gè)完整的圓柱;
l 半徑、高度及角度來(lái)創(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
使用類(lèi)BRepPrimAPI_MakeCone來(lái)創(chuàng)建圓錐體。與圓柱體一樣,圓錐體可以在默認(rèn)的坐標(biāo)系中被創(chuàng)建,也可以指定的坐標(biāo)系中被創(chuàng)建。創(chuàng)建方式如下:
l 兩個(gè)半徑和高度來(lái)創(chuàng)建一個(gè)完整的圓錐。一個(gè)半徑可以為零,這樣就創(chuàng)建了一個(gè)尖頂?shù)膱A錐;
l 半徑、高度和角度來(lái)創(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
使用類(lèi)BRepPrimAPI_MakeSphere來(lái)創(chuàng)建球體。與圓柱體一樣,球體可以在默認(rèn)的坐標(biāo)系中被創(chuàng)建,也可以指定的坐標(biāo)系中被創(chuàng)建。有四種創(chuàng)建方式,如下圖所示:
l 一個(gè)半徑值,創(chuàng)建一個(gè)完整的球體;
l 半徑和角度,創(chuàng)建部分的球體;
l 半徑和兩個(gè)角度值,創(chuàng)建緯度上的部分的球體。兩個(gè)角度a1,a2必須滿(mǎn)足如下條件:PI/2 <= a1 < a2 <= PI/2
l 一個(gè)半徑和三個(gè)角度值;
實(shí)現(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
使用類(lèi)BRepPrimAPI_MakeTorus來(lái)創(chuàng)建圓環(huán)體。與其它基本圖元類(lèi)似,一個(gè)圓環(huán)體可以在默認(rèn)的坐標(biāo)系中創(chuàng)建,也可以在指定的坐標(biāo)系中創(chuàng)建。創(chuàng)建與與球體創(chuàng)建方式類(lèi)似:
l 兩個(gè)半徑,創(chuàng)建一個(gè)完整的圓環(huán)體;
l 兩個(gè)半徑和一個(gè)角度值,創(chuàng)建部分的圓環(huán)體;
l 兩個(gè)半徑和兩個(gè)角度值,創(chuàng)建緯度上的部分圓環(huán)體;兩個(gè)角度必須滿(mǎn)足如下條件:0 < a2 – a1 < 2 * PI;
l 兩個(gè)半徑和三個(gè)角度值,創(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
使用類(lèi)BRepPrimAPI_MakeRevolution來(lái)根據(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 點(diǎn)掃掠后得到邊;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中實(shí)現(xiàn)了三種掃掠體:稱(chēng)線性?huà)呗芋w為Prism,稱(chēng)旋轉(zhuǎn)掃掠體為Revol和通用的掃掠體叫作Pipe。
1. BRepPrimAPI_MakeSweep
類(lèi)BRepPrimAPI_MakeSweep是掃掠體的基類(lèi)。對(duì)用戶(hù)來(lái)說(shuō),沒(méi)有什么實(shí)質(zhì)的用途。
2. 創(chuàng)建拉伸體BRepPrimAPI_MakePrism
使用類(lèi)BRepPrimAPI_MakePrism來(lái)創(chuàng)建線性拉伸體prism。拉伸體可從一個(gè)形狀及一個(gè)向量或一個(gè)方向來(lái)創(chuàng)建。從一個(gè)向量可以創(chuàng)建一個(gè)有限拉伸體,而從一個(gè)方向可以創(chuàng)建一個(gè)無(wú)限的或半無(wú)限的拉伸體。一個(gè)布爾的函數(shù)參數(shù)用來(lái)控制半無(wú)限和全無(wú)限的拉伸體。所有的構(gòu)造函數(shù)都有一個(gè)布爾值來(lái)控制構(gòu)造的拉伸體與原拉伸體是否共享,默認(rèn)是共享方式構(gòu)造。如下代碼為使用一個(gè)面,一個(gè)方向和一個(gè)長(zhǎng)度來(lái)創(chuàng)建一個(gè)有限的、無(wú)限的和半無(wú)限的拉伸體。
生成上圖所示形狀的代碼如下所示:
//--- 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
使用類(lèi)BRepPrimAPI_MakeRevol來(lái)創(chuàng)建旋轉(zhuǎn)掃掠體。旋轉(zhuǎn)掃掠體由一個(gè)形狀、軸和一個(gè)角度構(gòu)造而得。類(lèi)BRepPrimAPI_MakeRevol所有的構(gòu)造函數(shù)的最后一個(gè)參數(shù)是用來(lái)控制構(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);