将用到如下的類建立基本圖元,包括長方體(Box)、楔形體(Wedge)、旋轉體(Revol)等。
Construction of Primitives in Open Cascade
一、建立基本圖元 Making Primitives
将用到如下的類建立基本圖元,包括長方體(Box)、楔形體(Wedge)、旋轉體(Revol)等。這些類提供Shell和Solid函數來傳回實體(solid)和殼(shell)。
使用方法都是調用這些類的構造函數,輸入相應的參數,直接構造出基本圖元。構造函數的參數不同,建立的基本幾何實體的形狀也會不同。
注:所有旋轉體的角度值都是弧度值。
1. 建立長方體BRepPrimAPI_MakeBox
使用MakeBox類建立一個長方體,結果以一個殼或體傳回。建立長方體的方式有如下四種:
以上建立方式對應類的BRepPrimAPI_MakeBox的四種構造函數:
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);
與上圖對應的建立長方體的代碼如下所示:
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. 建立楔形體BRepPrimAPI_MakeWedge
使用類BRepPrimAPI_MakeWedge來建立楔形體。楔形體就是帶斜面的長方體,即帶角度的長方體。楔形體的建立方式與長方體的建立方式相似。下圖所示為構造楔形體的兩種方式。一種是加入ltx尺寸來描述dy上的面,另一種是加入xmin,xmax,zmin,zmax來描述dy上的面。
第一種方式是第二種方式在滿足以下條件下的特例:
xmin = 0, xmax = ltx, zmin = 0, zmax = dz
建立一個金字塔的楔形體可以用下面的方式:
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是所有旋轉體圖元的基類。旋轉體通過将曲線繞一個軸旋轉得到。它們有圓柱體、圓錐體、球體、圓環體等。
這些旋轉體對于不同的圖元有不同的構造參數,但是它們也有共同的參數:
l 一個坐标系統;
l 一個角度,範圍為[0, 2*PI];
l 曲線的vmin,vmax參數;
OneAxis構造的結果是體Solid、殼Shell或面Face。
通常不會直接使用類BRepPrimAPI_MakeOneAxis,而是使用它的派生類。
如下圖所示描述了類的參數:
4. 建立圓柱體BRepPrimAPI_MakeCylinder
使用類BRepPrimAPI_MakeCylinder來建立圓柱體。圓柱可以在預設的坐标系中被建立,也可以指定的坐标系(gp_Ax2)中建立。建立方式如下:
l 半徑、高度建立一個完整的圓柱;
l 半徑、高度及角度來建立部分圓柱;
如下代碼所示為沿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. 建立圓錐體 BRepPrimAPI_MakeCone
使用類BRepPrimAPI_MakeCone來建立圓錐體。與圓柱體一樣,圓錐體可以在預設的坐标系中被建立,也可以指定的坐标系中被建立。建立方式如下:
l 兩個半徑和高度來建立一個完整的圓錐。一個半徑可以為零,這樣就建立了一個尖頂的圓錐;
l 半徑、高度和角度來建立部分圓錐。
如下代碼建立的圓錐如下圖所示:
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. 建立球體BRepPrimAPI_MakeSphere
使用類BRepPrimAPI_MakeSphere來建立球體。與圓柱體一樣,球體可以在預設的坐标系中被建立,也可以指定的坐标系中被建立。有四種建立方式,如下圖所示:
l 一個半徑值,建立一個完整的球體;
l 半徑和角度,建立部分的球體;
l 半徑和兩個角度值,建立緯度上的部分的球體。兩個角度a1,a2必須滿足如下條件:PI/2 <= a1 < a2 <= PI/2
l 一個半徑和三個角度值;
實作上圖中球體的代碼如下:
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. 建立圓環體BRepPrimAPI_MakeTorus
使用類BRepPrimAPI_MakeTorus來建立圓環體。與其它基本圖元類似,一個圓環體可以在預設的坐标系中建立,也可以在指定的坐标系中建立。建立與與球體建立方式類似:
l 兩個半徑,建立一個完整的圓環體;
l 兩個半徑和一個角度值,建立部分的圓環體;
l 兩個半徑和兩個角度值,建立緯度上的部分圓環體;兩個角度必須滿足如下條件:0 < a2 – a1 < 2 * PI;
l 兩個半徑和三個角度值,建立部分的圓環體;
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. 建立旋轉體BRepPrimAPI_MakeRevolution
使用類BRepPrimAPI_MakeRevolution來根據一條曲線和軸建立旋轉體。曲線可以是任意的Geom_Curve,有四種構造方式:
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.
二、建立掃掠體 Sweeping: Prism, Revolution and Pipe
掃掠體(Sweeps)就是一條截面(profile)沿任意軌道線(path)掃掠後得到的體。截面可以是任意的拓樸結構。軌道線通常是曲線(curve or wire)。建立掃掠體的規則如下:
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中實作了三種掃掠體:稱線性掃掠體為Prism,稱旋轉掃掠體為Revol和通用的掃掠體叫作Pipe。
1. BRepPrimAPI_MakeSweep
類BRepPrimAPI_MakeSweep是掃掠體的基類。對使用者來說,沒有什麼實質的用途。
2. 建立拉伸體BRepPrimAPI_MakePrism
使用類BRepPrimAPI_MakePrism來建立線性拉伸體prism。拉伸體可從一個形狀及一個向量或一個方向來建立。從一個向量可以建立一個有限拉伸體,而從一個方向可以建立一個無限的或半無限的拉伸體。一個布爾的函數參數用來控制半無限和全無限的拉伸體。所有的構造函數都有一個布爾值來控制構造的拉伸體與原拉伸體是否共享,預設是共享方式構造。如下代碼為使用一個面,一個方向和一個長度來建立一個有限的、無限的和半無限的拉伸體。
生成上圖所示形狀的代碼如下所示:
//--- 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. 建立旋轉體BRepPrimAPI_MakeRevol
使用類BRepPrimAPI_MakeRevol來建立旋轉掃掠體。旋轉掃掠體由一個形狀、軸和一個角度構造而得。類BRepPrimAPI_MakeRevol所有的構造函數的最後一個參數是用來控制構造的形狀與原形狀的關系,預設為共享的方式。
//--- 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);