青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

eryar

PipeCAD - Plant Piping Design Software.
RvmTranslator - Translate AVEVA RVM to OBJ, glTF, etc.
posts - 603, comments - 590, trackbacks - 0, articles - 0

OpenCASCADE Make Primitives-Box

Posted on 2014-11-16 22:22 eryar 閱讀(4773) 評論(0)  編輯 收藏 引用 所屬分類: 2.OpenCASCADE

OpenCASCADE Make Primitives-Box

eryar@163.com

Abstract. By making a simple box to demonstrate the BRep data structure of the OpenCASCADE. The construction method is different from BRepPrimAPI_MakeBox. In the paper construct the box from vertex, edge to solid, while in BRepPrimAPI_MakeBox from solid, shell to vertex. From the construction, the BRep data structure in OpenCASCADE also can be called the Winged-Edge data structure.

Key Words. OpenCASCADE, BRep, Box, The Winged-Edge Structure

1. Introduction

OpenCASCADE的Toolit TKPrim中提供了基本圖元的創(chuàng)建功能,像Box, Cylinder, Sphere等等。直接使用Package BRepPrimAPI中的功能,可以方便地創(chuàng)建出基本圖元,而不用關(guān)心其內(nèi)部的數(shù)據(jù)結(jié)構(gòu)。

wps_clip_image-27189

Figure 1. BRepPrimAPI Package classes

為了理解ModelingData模塊中OpenCASCADE的邊界表示法BRep數(shù)據(jù)結(jié)構(gòu),決定參考其實現(xiàn),自己來創(chuàng)建出基本圖元,進(jìn)而理解其中的BRep數(shù)據(jù)結(jié)構(gòu)。本文以最簡單的長方體Box入手,從點、邊到體的創(chuàng)建出一個形狀。并將構(gòu)造的形狀在Draw Test Harness中進(jìn)行顯示,且進(jìn)行布爾運算,來驗證構(gòu)造結(jié)果的正確性。

2.Make a Face of the Box

在OpenCASCADE的包BRepPrim中,構(gòu)造長方體的方式是形狀的根結(jié)點出發(fā)到葉子結(jié)點,即從Shell到Face到Wire最后到Vertex,如下圖所示:

wps_clip_image-5617

Figure 2.1 Data structure of a Shape

為了程序演示的清晰,本文中采用與OpenCASCADE中相反的方式,即先從葉子結(jié)點出發(fā),逐步回到根結(jié)點,即先構(gòu)造出頂點、邊最后到實體。長方體由六個面構(gòu)成,所以先從一個面開始來構(gòu)造。將一個面構(gòu)造成功后,其他六個面的構(gòu)造方法就相同了。

構(gòu)造使用了BRep_Builder,在創(chuàng)建相應(yīng)的拓樸的同時可以將其相關(guān)的幾何信息設(shè)置進(jìn)去。如創(chuàng)建頂點Vertex時,可以將點的坐標(biāo)信息及容差值設(shè)置進(jìn)去,代碼如下所示:

BRep_Builder aBuilder;

// make vertex of the box.
aBuilder.MakeVertex(aVertices[0], aPoints[0], Precision::Confusion());
aBuilder.MakeVertex(aVertices[
1], aPoints[1], Precision::Confusion());
aBuilder.MakeVertex(aVertices[
2], aPoints[2], Precision::Confusion());
aBuilder.MakeVertex(aVertices[
3], aPoints[3], Precision::Confusion());
aBuilder.MakeVertex(aVertices[
4], aPoints[4], Precision::Confusion());
aBuilder.MakeVertex(aVertices[
5], aPoints[5], Precision::Confusion());
aBuilder.MakeVertex(aVertices[
6], aPoints[6], Precision::Confusion());
aBuilder.MakeVertex(aVertices[
7], aPoints[7], Precision::Confusion());

創(chuàng)建邊的同時,將其邊中的三維曲線信息也設(shè)置進(jìn)去,代碼如下所示:

// make edges of the box.
aBuilder.MakeEdge(aEdges[0], new Geom_Line(aLines[0]), Precision::Confusion());
aBuilder.MakeEdge(aEdges[
1], new Geom_Line(aLines[1]), Precision::Confusion());
aBuilder.MakeEdge(aEdges[
2], new Geom_Line(aLines[2]), Precision::Confusion());
aBuilder.MakeEdge(aEdges[
3], new Geom_Line(aLines[3]), Precision::Confusion());

aBuilder.MakeEdge(aEdges[
4], new Geom_Line(aLines[4]), Precision::Confusion());
aBuilder.MakeEdge(aEdges[
5], new Geom_Line(aLines[5]), Precision::Confusion());
aBuilder.MakeEdge(aEdges[
6], new Geom_Line(aLines[6]), Precision::Confusion());
aBuilder.MakeEdge(aEdges[
7], new Geom_Line(aLines[7]), Precision::Confusion());

aBuilder.MakeEdge(aEdges[
8], new Geom_Line(aLines[8]), Precision::Confusion());
aBuilder.MakeEdge(aEdges[
9], new Geom_Line(aLines[9]), Precision::Confusion());
aBuilder.MakeEdge(aEdges[
10],new Geom_Line(aLines[10]),Precision::Confusion());
aBuilder.MakeEdge(aEdges[
11],new Geom_Line(aLines[11]),Precision::Confusion());

創(chuàng)建的邊Edge還需要與頂點Vertex關(guān)聯(lián)上,且需要注意頂點的反向,示例代碼如下所示:

// set the vertex info of the edges.
// edge 0:
{
    TopoDS_Vertex V1 
= aVertices[0];
    TopoDS_Vertex V2 
= aVertices[1];

    V2.Reverse();

    aBuilder.Add(aEdges[
0], V1);
    aBuilder.Add(aEdges[
0], V2);

  aBuilder.UpdateVertex(V1, ElCLib::Parameter(aLines[
0], aPoints[0]), 
      aEdges[
0], Precision::Confusion());
  aBuilder.UpdateVertex(V2, ElCLib::Parameter(aLines[
0], aPoints[1]), 
      aEdges[
0], Precision::Confusion());

    BRepTools::Update(aEdges[
0]);
}

接著創(chuàng)建Wire,創(chuàng)建Wire時需要注意邊的反向,從而構(gòu)造成一個閉合的Wire,代碼如下所示:

// make wires of the box.
aBuilder.MakeWire(aWires[0]);

// wire 1: bottom
{
    TopoDS_Edge E1 
= aEdges[0];
    TopoDS_Edge E2 
= aEdges[1];
    TopoDS_Edge E3 
= aEdges[2];
    TopoDS_Edge E4 
= aEdges[3];

    E3.Reverse();
    E4.Reverse();

    aBuilder.Add(aWires[
0], E1);
    aBuilder.Add(aWires[
0], E2);
    aBuilder.Add(aWires[
0], E3);
    aBuilder.Add(aWires[
0], E4);
    
    BRepTools::Update(aWires[
0]);
}

關(guān)鍵是面的創(chuàng)建及面創(chuàng)建后,設(shè)置邊與面的關(guān)聯(lián)信息,即PCurve的信息。如果沒有PCurve的信息,可視化顯示就不能正確顯示出面,即網(wǎng)格化算法會失敗。長方體底面的創(chuàng)建及PCurve設(shè)置代碼如下所示:

// make faces of the box.
aBuilder.MakeFace(aFaces[0],new Geom_Plane(aPlanes[0]),Precision::Confusion());
aBuilder.Add(aFaces[
0], aWires[0]);
// set bottom pcurve info of between the edge and surface.
{
    
// pcurve 0:
    double u = 0.0;
    
double v = 0.0;
    
double du = 0.0;
    
double dv = 0.0;
    gp_Dir DX 
= aPlanes[0].XAxis().Direction();
    gp_Dir DY 
= aPlanes[0].YAxis().Direction();

    ElSLib::Parameters(aPlanes[
0], aLines[0].Location(), u, v);
    du 
= aLines[0].Direction() * DX;
    dv 
= aLines[0].Direction() * DY;

    aBuilder.UpdateEdge(aEdges[
0], new Geom2d_Line(gp_Lin2d(gp_Pnt2d(u, v), 
        gp_Dir2d(du, dv))), aFaces[
0], Precision::Confusion());
    
// pcurve 1:
    ElSLib::Parameters(aPlanes[0], aLines[1].Location(), u, v);
    du 
= aLines[1].Direction() * DX;
    dv 
= aLines[1].Direction() * DY;

    aBuilder.UpdateEdge(aEdges[
1], new Geom2d_Line(gp_Lin2d(gp_Pnt2d(u, v), 
        gp_Dir2d(du, dv))), aFaces[
0], Precision::Confusion());
    
// pcurve 2:
    ElSLib::Parameters(aPlanes[0], aLines[2].Location(), u, v);
    du 
= aLines[2].Direction() * DX;
    dv 
= aLines[2].Direction() * DY;

    aBuilder.UpdateEdge(aEdges[
2], new Geom2d_Line(gp_Lin2d(gp_Pnt2d(u, v), 
        gp_Dir2d(du, dv))), aFaces[
0], Precision::Confusion());
    
// pcurve 3:
    ElSLib::Parameters(aPlanes[0], aLines[3].Location(), u, v);
    du 
= aLines[3].Direction() * DX;
    dv 
= aLines[3].Direction() * DY;

    aBuilder.UpdateEdge(aEdges[
3], new Geom2d_Line(gp_Lin2d(gp_Pnt2d(u, v), 
        gp_Dir2d(du, dv))), aFaces[
0], Precision::Confusion());
}

歷經(jīng)艱辛,最后終于將一個面創(chuàng)建出來了,且可以在Draw Test Harness中顯示,如下圖所示:

wps_clip_image-17990

Figure 2.2 A Face of the Box in Draw Test Harness

如上圖所示,在Darw Test Harness中,邊的顏色是有講究的,說明如下:

In Draw Test Harness, shapes are displayed using isoparametric curves. There is color coding for the Edges:

v A red edge is an isolated edge, which belongs to no faces;

v A green edge is a free boundary edge, which belongs to one face;

v A yello edge is shared edge, which belongs to at least two faces;

wps_clip_image-27097

Figure 2.3 Color Coding for Edges in Draw Test Harness

如上圖所示,紅色的邊表示此邊不屬于任何一個面;綠色的邊表示此邊只屬于一個面;黃色的面表示此面至少屬于兩個面。

wps_clip_image-13274

Figure 2.4 Shared Edges of the Box

如上圖所示,當(dāng)創(chuàng)建出長方體的三個面時,側(cè)面與上下兩個底面相連的邊顯示成了黃色。其他邊都是綠色。

3.Finish the Box

將長方體的六個面按上述方式創(chuàng)建完畢后,需要驗證其正確性。于是將生成的數(shù)據(jù)導(dǎo)出為Brep格式,并與其他基本體進(jìn)行布爾運算。

當(dāng)導(dǎo)出的長方體為Shell時進(jìn)行布爾運算會得到的也是殼體,如下圖所示的結(jié)果:

wps_clip_image-88

Figure 3.1 Box Shell Cut a Cylinder

當(dāng)導(dǎo)出的長方體為Solid時,若面的方式未正確設(shè)置,則布爾運算會失敗,如下圖所示:

wps_clip_image-331

Figure 3.2 Box Solid Cut a Cylinder

如上圖所示,長方體與圓柱體的交線都已經(jīng)計算出來了,但由于面的方向不對,不知道去除哪些面,保留哪些面。

將面的方向正確設(shè)置后,導(dǎo)出為Solid,進(jìn)行布爾運算,結(jié)果正確,如下圖所示:

wps_clip_image-22873

Figure 3.3 Box Cut Cylinder

測試用的Tcl腳本代碼如下所示:

#
# Tcl script to test the box BRep data.
# eryar@163.com
# 2014-11-16 21:55
# OpenCASCADE6.8.0

pload ALL

restore d
:/box.brep b

pcylinder c 
1.5 2

bop b c 
bopcut r

vdisplay r

4.Conclusion

通過創(chuàng)建基本圖元,從而進(jìn)一步來理解OpenCASCADE中的邊界表示BRep的數(shù)據(jù)結(jié)構(gòu)。需要注意的事項有:

v 創(chuàng)建邊時,需要設(shè)置邊中幾何曲線的范圍;

v 創(chuàng)建邊時,需要設(shè)置正確與邊相關(guān)頂點的方向;

v 創(chuàng)建環(huán)時,需要確保環(huán)中邊的參數(shù)曲線PCurve能在參數(shù)空間中閉合;

v 創(chuàng)建面后,需要在邊中設(shè)置與面相關(guān)的幾何信息;

v 創(chuàng)建體時,需要所有面的方向正確;

注:最后發(fā)現(xiàn)前不久寫的一篇文章有誤,說OpenCASCADE的BRep不是翼邊結(jié)構(gòu)。其實從邊出發(fā)是可以找到與點、面相關(guān)的信息的。因為OpenCASCADE中拓樸結(jié)構(gòu)中有包含關(guān)系,所以頂點信息已經(jīng)包含在邊中了,直接遍歷邊即可得到與此邊相關(guān)的頂點信息。所以,這樣看來OpenCASCADE中的BRep表示法也是翼邊的數(shù)據(jù)結(jié)構(gòu)。

原文如下:

邊界表示方式比較。因為一般的書籍上都詳細(xì)重點描述了邊界表示中以為邊為核心的翼邊數(shù)據(jù)結(jié)構(gòu),所以有人想從這方面來給OpenCASCADE中的Brep表示法來給個說法。結(jié)合上面的類圖可知,從邊出發(fā)并不能訪問到與這條邊相關(guān)的其他信息,如頂點的信息。如果硬是想在這里給個名分,倒是從點出發(fā)可以找到邊及面的幾何信息,所以O(shè)penCASCADE中的Brep表示法應(yīng)該更像是以點為基礎(chǔ)的表示方法。OpenNURBS中通過ON_BrepTrim,可以訪問其他的信息,而ON_BrepTrim與邊ON_BrepEdge的意義有些相似,所以應(yīng)該是以邊為核心的翼邊結(jié)構(gòu)了。

5. References

1. OpenCASCADE BRep vs. OpenNURBS Brep. OpenCASCADE BRep vs. OpenNURBS BRep

 

PDF Version and Source Code: OpenCASCADE Make Primitives-Box

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲高清视频在线| 免费久久99精品国产自| 亚洲精品视频在线| 国产欧美精品日韩精品| 久久精品国产91精品亚洲| 小处雏高清一区二区三区 | 国产美女扒开尿口久久久| 一本久久青青| 亚洲午夜在线视频| 欧美在线三区| 美女成人午夜| 亚洲日本久久| 亚洲一区二区在线播放| 欧美一区二区三区四区在线| 午夜精品福利在线| 久久一区二区精品| 欧美日韩国产在线播放| 国产日韩欧美在线播放不卡| 亚洲黄色片网站| 午夜日韩电影| 亚洲国产视频a| 最新国产精品拍自在线播放| 亚洲精品少妇网址| 欧美一区二区三区日韩| 免费亚洲电影| 午夜精品久久久久久久久久久久久| 久久色在线播放| 国产精品大片免费观看| 亚洲电影第1页| 香蕉久久夜色| 99在线精品视频| 欧美**字幕| 国产真实乱偷精品视频免| 一本一本久久a久久精品牛牛影视| 久久精品免费电影| 一区二区三区高清| 欧美不卡一卡二卡免费版| 国产香蕉久久精品综合网| 在线视频亚洲欧美| 亚洲成人在线视频播放| 一本色道久久| 欧美成人嫩草网站| 在线观看欧美| 久久夜色精品国产| 午夜欧美精品| 亚洲福利电影| 久久精品国产亚洲一区二区三区| 国产亚洲欧美色| 99精品国产在热久久婷婷| 亚洲综合日本| 亚洲精品在线一区二区| 午夜久久久久| 国产精品中文在线| 香蕉久久久久久久av网站| 欧美一区二区三区四区夜夜大片| 欧美亚洲一区二区三区| 一本大道久久精品懂色aⅴ| 欧美高清在线| 亚洲人成免费| 91久久精品国产91久久性色tv| 久久精品综合一区| 激情国产一区| 欧美成人a∨高清免费观看| 久久在线视频在线| 亚洲成人在线视频网站| 欧美sm重口味系列视频在线观看| 久久久久国产精品午夜一区| 樱桃成人精品视频在线播放| 免费在线观看日韩欧美| 欧美成人a∨高清免费观看| 亚洲精品欧美精品| 亚洲精选中文字幕| 国产精品一区久久| 久久噜噜亚洲综合| 久久人人九九| 久久久久久免费| 亚洲欧洲日产国产网站| 亚洲精品一区二区三区福利| 欧美久久久久久| 亚洲欧美中文日韩在线| 欧美一区二区视频网站| 久久精品一区四区| 9久草视频在线视频精品| 午夜精品影院| 亚洲电影在线免费观看| 国产亚洲福利| 国产伦精品一区二区三区高清版| 欧美视频第二页| 美日韩精品免费| 免费观看成人鲁鲁鲁鲁鲁视频| 欧美三级第一页| 欧美精品电影在线| 好看不卡的中文字幕| 欧美日韩不卡合集视频| 亚洲毛片网站| 亚洲小视频在线观看| 久久精品免费播放| 欧美fxxxxxx另类| 国产精品久久久久久妇女6080| 中国成人黄色视屏| 欧美视频精品一区| 欧美黄污视频| 国产精品久久久久久久久久妞妞| 久久五月婷婷丁香社区| 欧美日韩精品免费观看| 欧美在线一二三区| 亚洲激情在线观看| 亚洲欧美综合一区| 亚洲综合久久久久| 国产一区二区三区成人欧美日韩在线观看 | 久久久久久久久久久一区| 亚洲美女免费精品视频在线观看| 中日韩男男gay无套| 午夜精品成人在线| 欧美体内she精视频| 久久―日本道色综合久久| 欧美高清你懂得| 亚洲第一精品久久忘忧草社区| 亚洲精品欧美日韩| 99精品视频免费全部在线| 亚洲国产成人av在线| 久久九九99| 亚洲一区二区三区四区视频| 欧美激情一区在线观看| 亚洲一区二区三区精品在线观看 | 在线精品视频一区二区三四| 一区二区三区视频在线看| 亚洲日本免费电影| 久久影院午夜片一区| 久久婷婷成人综合色| 国产精品夜夜夜一区二区三区尤| 亚洲人体一区| 一个色综合av| 欧美日韩一级黄| 99视频精品免费观看| 一区二区三区日韩欧美| 欧美日韩中文字幕在线视频| 夜夜精品视频| 欧美亚洲视频| 国模吧视频一区| 久久久不卡网国产精品一区| 久久亚洲精品网站| 亚洲国产成人久久综合一区| 久久午夜国产精品| 亚洲国产精品成人精品| 亚洲精品国产精品国自产在线 | 欧美国产精品日韩| 91久久黄色| 亚洲制服丝袜在线| 国产精品专区一| 欧美在线视频观看| 欧美国产日韩精品| 亚洲少妇最新在线视频| 国产精品乱子久久久久| 欧美一级午夜免费电影| 女女同性女同一区二区三区91| 91久久在线视频| 欧美日韩中文另类| 久久成人精品无人区| 激情久久久久| 欧美jizzhd精品欧美巨大免费| 亚洲黄色片网站| 亚洲欧美不卡| 影音先锋中文字幕一区| 欧美久久久久久久久久| 亚洲淫性视频| 欧美激情一级片一区二区| 亚洲影视综合| 在线日韩日本国产亚洲| 欧美视频一区二区三区四区| 欧美在线一二三区| 日韩亚洲欧美精品| 久久婷婷久久| 亚洲一区二区在线免费观看视频| 国产一区二区三区在线观看免费 | 亚洲欧美国产制服动漫| 久久国产婷婷国产香蕉| 亚洲国产精品久久久久久女王| 亚洲精品一区二区三区av| 久久国产精品高清| 国内精品免费在线观看| 亚洲一区二区三区四区五区黄| 狂野欧美一区| 久久天堂国产精品| 激情成人亚洲| 欧美日韩在线一区| 久久久久看片| 午夜亚洲伦理| 中国成人黄色视屏| 欧美福利电影网| 欧美主播一区二区三区美女 久久精品人 | 久久精品亚洲国产奇米99| 99精品视频免费观看| 欧美激情第1页| 毛片精品免费在线观看| 欧美中文字幕视频| 亚洲欧美激情在线视频| 亚洲色图在线视频| 一区二区三区视频在线| 亚洲蜜桃精久久久久久久|