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);
?
PDF Version: Construction of Primitives in Open Cascade
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
