• <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>

            eryar

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

            OpenCascade BRep 格式描述之二

            Posted on 2013-07-22 21:50 eryar 閱讀(7094) 評(píng)論(11)  編輯 收藏 引用 所屬分類: 2.OpenCASCADE

            OpenCascade BRep Format Description

            eryar@163.com

            摘要Abstract:本文結(jié)合OpenCascade的BRep格式描述文檔和源程序,對BRep格式進(jìn)行分析,詳細(xì)說明BRep的數(shù)據(jù)組織形式。結(jié)合源程序,可以對OpenCascade中Modeling Data模塊中的模型數(shù)據(jù)結(jié)構(gòu)進(jìn)行理解。

            關(guān)鍵字Key Words:OpenCascade, BRep Format, ModelingData

             

            一、實(shí)例分析

            OpenCascade的data目錄中的face1.brep文件:

             

              1 DBRep_DrawableShape
              2 
              3 CASCADE Topology V1, (c) Matra-Datavision
              4 Locations 5
              5 1
              6               1               0               0            -0.4 
              7               0               1               0               0 
              8               0               0               1               0 
              9 1
             10               1               0               0            -0.4 
             11               0               1               0               0 
             12               0               0               1               0 
             13 1
             14               1               0               0             0.8 
             15               0               1               0               0 
             16               0               0               1               0 
             17 1
             18               1               0               0             0.8 
             19               0               1               0               0 
             20               0               0               1               0 
             21 2  1 1 2 1 3 1 4 1 0
             22 Curve2ds 8
             23 1 0 0.8 1 0 
             24 2 0 0 1 0 0 1 0.8
             25 1 1.82347658193698 0 0 1 
             26 1 1 -1.77459666924148 1 0 
             27 1 4.45970872524261 0 0 1 
             28 1 1 -0.225403330758516 1 0 
             29 1 0 0 1 0 
             30 2 0 0 1 0 0 1 0.8
             31 Curves 4
             32 2 0 0 0.8 0 0 1 1 0 0 0 1 0 0.8
             33 1 -0.2 0.774596669241484 0 0 0 1 
             34 1 -0.2 -0.774596669241484 0 0 0 1 
             35 2 0 0 0 0 0 1 1 0 0 0 1 0 0.8
             36 Polygon3D 0
             37 PolygonOnTriangulations 0
             38 Surfaces 4
             39 2 0 0 0 0 0 1 1 0 0 0 1 0 0.8
             40 1 0 0 0.8 0 0 1 1 0 0 0 1 0 
             41 1 -1 -1 -1 1 0 0 0 0 1 0 -1 0 
             42 1 0 0 0 0 0 1 1 0 0 0 1 0 
             43 Triangulations 0
             44 
             45 TShapes 10
             46 Ve
             47 2.0000002e-007
             48 -0.2 0.774596669241483 0.8
             49 0 0
             50 
             51 0101101
             52 *
             53 Ve
             54 2.0000002e-007
             55 -0.2 -0.774596669241484 0.8
             56 0 0
             57 
             58 0101101
             59 *
             60 Ed
             61  1e-007 1 1 0
             62 1  1 0 1.82347658193698 4.45970872524261
             63 2  1 1 0 1.82347658193698 4.45970872524261
             64 2  2 2 0 1.82347658193698 4.45970872524261
             65 0
             66 
             67 0101000
             68 +10 0 -9 0 *
             69 Ve
             70 2.0000002e-007
             71 -0.2 0.774596669241483 0
             72 0 0
             73 
             74 0101101
             75 *
             76 Ed
             77  1e-008 1 1 0
             78 1  2 0 0 0.8
             79 2  3 1 0 0 0.8
             80 2  4 3 5 0 0.8
             81 0
             82 
             83 0101000
             84 +7 0 -10 0 *
             85 Ve
             86 2.0000002e-007
             87 -0.2 -0.774596669241484 0
             88 0 0
             89 
             90 0101101
             91 *
             92 Ed
             93  1e-008 1 1 0
             94 1  3 0 0 0.8
             95 2  5 1 0 0 0.8
             96 2  6 3 5 0 0.8
             97 0
             98 
             99 0101000
            100 +5 0 -9 0 *
            101 Ed
            102  1e-007 1 1 0
            103 1  4 0 1.82347658193698 4.45970872524261
            104 2  7 1 0 1.82347658193698 4.45970872524261
            105 2  8 4 0 1.82347658193698 4.45970872524261
            106 0
            107 
            108 0101000
            109 +7 0 -5 0 *
            110 Wi
            111 
            112 0101100
            113 -8 0 -6 0 +4 0 +3 0 *
            114 Fa
            115 0  1e-007 1 0
            116 
            117 0101000
            118 +2 0 *
            119 
            120 +1 0 
            121 0
            122 
            123 


            顯示結(jié)果如下圖所示:

            wps_clip_image-13242

            Figure 1. Wireframe mode

            wps_clip_image-31210

            Figure 2. Shaded mode

            二、結(jié)論

            因?yàn)镺penCascade的Brep格式是自己的格式,只用到了ModelingData模塊,不使用DataExchange模塊,可以作為數(shù)據(jù)交換的一種格式。

            三、參考資料

            1. BNF范式:http://hi.baidu.com/xuyingming2012/item/9060029141427bd81b49df9e

            2. BRep Format Description

            3. OpenCascade source code

             

             

             

            Feedback

            # re: OpenCascade BRep 格式描述之二  回復(fù)  更多評(píng)論   

            2014-10-26 22:44 by 佚名
            博主您好!
            讀您的博客受益非淺,我有個(gè)問題想請教,通過頂點(diǎn)vertex生成face,然后explorer face里面的vertex,發(fā)現(xiàn)face里的頂點(diǎn)與原來的頂點(diǎn)不相同,就是用issame也找不出相同的頂點(diǎn),不知道什么原因,后來輸出頂點(diǎn)坐標(biāo)發(fā)現(xiàn)坐標(biāo)值有誤差,是不是因?yàn)榫鹊脑颍恐x謝!

            # re: OpenCascade BRep 格式描述之二  回復(fù)  更多評(píng)論   

            2014-10-27 17:56 by eryar
            @佚名
            您好!

            不知道你用的哪個(gè)類的函數(shù) issame()?

            可以貼出相關(guān)代碼看看

            # re: OpenCascade BRep 格式描述之二  回復(fù)  更多評(píng)論   

            2014-10-28 12:01 by 佚名
            TopoDS_Face WhiteFace, BrownFace, RedFace, PinkFace;
            TopoDS_Edge Edge1, Edge2, Edge3, Edge4, Edge5, Edge6, Edge7;
            TopoDS_Wire Wire1;
            gp_Pnt P1, P2, P3, P4, P5, P6, P7;

            gp_Sphere sphere (gp_Ax3(gp_Pnt(0,0,0),gp_Dir(1,0,0)),150);

            WhiteFace = BRepBuilderAPI_MakeFace(sphere,0.1,0.7,0.2,0.9);

            //////////////////////////////////

            P1.SetCoord(-15,200,10);
            P2.SetCoord(5,204,0);
            P3.SetCoord(15,200,0);
            P4.SetCoord(-15,20,15);
            P5.SetCoord(-5,20,0);
            P6.SetCoord(15,20,35);
            TColgp_Array2OfPnt array(1,3,1,2);
            array.SetValue(1,1,P1);
            array.SetValue(2,1,P2);
            array.SetValue(3,1,P3);
            array.SetValue(1,2,P4);
            array.SetValue(2,2,P5);
            array.SetValue(3,2,P6);
            Handle (Geom_BSplineSurface) curve = GeomAPI_PointsToBSplineSurface(array,3,8,GeomAbs_C2,0.001);

            RedFace = BRepBuilderAPI_MakeFace(curve);

            ////////////////////

            gp_Circ circle(gp_Ax2(gp_Pnt(0,0,0),gp_Dir(1,0,0)),80);
            Edge1 = BRepBuilderAPI_MakeEdge(circle,0,PI);

            Edge2 = BRepBuilderAPI_MakeEdge(gp_Pnt(0,0,-80),gp_Pnt(0,-10,40));
            Edge3 = BRepBuilderAPI_MakeEdge(gp_Pnt(0,-10,40),gp_Pnt(0,0,80));

            TopoDS_Wire YellowWire;
            BRepBuilderAPI_MakeWire MW1(Edge1,Edge2,Edge3);
            if (MW1.IsDone()) {
            YellowWire = MW1;
            }

            BrownFace = BRepBuilderAPI_MakeFace(YellowWire);


            /////////////

            P1.SetCoord(35,-200,40);
            P2.SetCoord(50,-204,30);
            P3.SetCoord(65,-200,30);
            P4.SetCoord(35,-20,45);
            P5.SetCoord(45,-20,30);
            P6.SetCoord(65,-20,65);
            TColgp_Array2OfPnt array2(1,3,1,2);
            array2.SetValue(1,1,P1);
            array2.SetValue(2,1,P2);
            array2.SetValue(3,1,P3);
            array2.SetValue(1,2,P4);
            array2.SetValue(2,2,P5);
            array2.SetValue(3,2,P6);

            Handle (Geom_BSplineSurface) BSplineSurf = GeomAPI_PointsToBSplineSurface(array2,3,8,GeomAbs_C2,0.001);

            TopoDS_Face aFace = BRepBuilderAPI_MakeFace(BSplineSurf);

            //2d lines
            gp_Pnt2d P12d(0.9,0.1);
            gp_Pnt2d P22d(0.2,0.7);
            gp_Pnt2d P32d(0.02,0.1);

            Handle (Geom2d_Line) line1 = new Geom2d_Line(P12d,gp_Dir2d((0.2-0.9),(0.7-0.1)));
            Handle (Geom2d_Line) line2 = new Geom2d_Line(P22d,gp_Dir2d((0.02-0.2),(0.1-0.7)));
            Handle (Geom2d_Line) line3 = new Geom2d_Line(P32d,gp_Dir2d((0.9-0.02),(0.1-0.1)));


            //Edges are on the BSpline surface
            Edge1 = BRepBuilderAPI_MakeEdge(line1,BSplineSurf,0,P12d.Distance(P22d));
            Edge2 = BRepBuilderAPI_MakeEdge(line2,BSplineSurf,0,P22d.Distance(P32d));
            Edge3 = BRepBuilderAPI_MakeEdge(line3,BSplineSurf,0,P32d.Distance(P12d));
            Wire1 = BRepBuilderAPI_MakeWire(Edge1,Edge2,Edge3);
            Wire1.Reverse();
            PinkFace = BRepBuilderAPI_MakeFace(aFace,Wire1);
            TopExp_Explorer ex;
            TopoDS_Shape s;
            for(ex.Init(PinkFace,TopAbs_EDGE);ex.More(); ex.Next())
            {
            s=ex.Current();
            Edge4=TopoDS::Edge(s);
            if(Edge4.IsEqual(Edge2))
            Edge3=Edge3;

            }
            這是在mfc例2中的部分代碼,for循環(huán)式我加的,問題是PinkFace 明明由edge1、2、3 生成,為什么explorer PinkFace 中的edge就找不到與edge2相同的邊呢?僅能找到與edge1相同的邊,這種不確定的結(jié)果讓人無法捉摸。
            另外博主有沒有好辦法,在不改occ庫代碼的情況下,給每個(gè)topods_shape一個(gè)全局唯一標(biāo)識(shí)號(hào)或標(biāo)識(shí)名稱。我試用hashcode,但不知如何正確設(shè)置它的上限,似乎它有可能重復(fù),不能當(dāng)作唯一標(biāo)識(shí)符。

            # re: OpenCascade BRep 格式描述之二  回復(fù)  更多評(píng)論   

            2014-10-28 18:16 by eryar
            @佚名
            inline Standard_Boolean TopoDS_Shape::IsEqual (const TopoDS_Shape& other) const
            {
            return (myTShape == other.myTShape) &&
            (myLocation == other.myLocation) &&
            (myOrient == other.myOrient);
            }
            函數(shù)IsEqual()的作用是:
            Returns True if two shapes are partners, i.e. if they share the same TShape. Locations and Orientations may differ.
            根據(jù)上面的代碼可知只是判斷是不是共享了相同的TShape,如果朝向Orientation不同,返回值也是不同的。看你前面將wire1.Reverse(),可能朝向會(huì)不同。
            ==================================
            TopoDS_Shape的HashCode產(chǎn)生函數(shù)代碼如下:
            Standard_Integer TopoDS_Shape::HashCode(const Standard_Integer Upper) const
            {
            //PKV
            const Standard_Integer aI = (Standard_Integer) ptrdiff_t(myTShape.operator->());
            const Standard_Integer aHS = ::HashCode(aI,Upper);
            const Standard_Integer aHL = myLocation.HashCode(Upper);
            return (aHS^aHL)%Upper;
            }
            應(yīng)該取個(gè)大一點(diǎn)的Upper。

            也可參考Singleton模式,使用一個(gè)static的std::map<std::string, TopoDS_Shape>自己來根據(jù)名字映射TopoDS_Shape,這就像Draw Test Harness中一樣了。

            # re: OpenCascade BRep 格式描述之二  回復(fù)  更多評(píng)論   

            2014-10-29 10:17 by 佚名
            謝謝博主!
            我試過了,即使不reverse,用issame也找不到與原來對應(yīng)的邊,我原以為頂點(diǎn)、邊、面、體自底而上構(gòu)建模型會(huì)逐級(jí)引用,這樣便于建立共享邊界的圖元,現(xiàn)在看來這一規(guī)則不成立,也許它僅在一個(gè)shape內(nèi)成立。
            我現(xiàn)在使用的是static的std::map<std::int, TopoDS_Shape>的問題,似乎它也不能解決反向檢索的問題,比如你可以指定繪制一個(gè)編號(hào)為1的shape,但反過來,你在繪圖區(qū)感知到了一個(gè)shape,不能確定它的編號(hào)是1還是其它。以前采用給topods_shape增加公共成員變量的方法來識(shí)別。后來為了避免修改occ庫保持原庫的完整性放棄了。

            # re: OpenCascade BRep 格式描述之二  回復(fù)  更多評(píng)論   

            2014-10-29 10:26 by 佚名
            補(bǔ)充一點(diǎn),如果保存成Handle(TopoDS_Shape)采用正向檢索也能解決問題,但該方法有局限性,效率太低,當(dāng)圖元上萬甚至更多時(shí)及近癱瘓。

            # re: OpenCascade BRep 格式描述之二  回復(fù)  更多評(píng)論   

            2014-10-29 14:11 by eryar
            @佚名
            在繪圖區(qū)感知到了一個(gè)shape,直接對其操作即可,為什么又要得到其ID?

            如果一定要這個(gè)ID,可以通過SetOwner()將ID設(shè)置到AIS_InteractiveObject中去,這樣在感知到shape時(shí)可以取出ID了。

            # re: OpenCascade BRep 格式描述之二  回復(fù)  更多評(píng)論   

            2014-11-10 09:59 by 佚名
            id是CAE建模的需要,這點(diǎn)和CAD不同,比如有幾千個(gè)點(diǎn),要在某兩點(diǎn)之間連線,用id指定點(diǎn),再如選擇其中的幾百個(gè)點(diǎn)連成spline,沒有編號(hào)操作難度大。謝謝您提的建議,我研究研究setowner。

            # re: OpenCascade BRep 格式描述之二  回復(fù)  更多評(píng)論   

            2014-11-10 22:47 by eryar
            @佚名
            哦。

            那可以看看
            SetOwner (const Handle< Standard_Transient > &ApplicativeEntity);
            //Allows you to attribute the owner ApplicativeEntity to
            //an Interactive Object. This can be a shape for a set of
            //sub-shapes or a sub-shape for sub-shapes which it
            //is composed of. The owner takes the form of a transient.

            SetOwner把一個(gè)指針數(shù)據(jù)放到AIS_InteractiveObject中去了,所以你也可以將ID放進(jìn)去。

            # re: OpenCascade BRep 格式描述之二  回復(fù)  更多評(píng)論   

            2014-11-13 17:02 by 佚名
            “SetOwner把一個(gè)指針數(shù)據(jù)放到AIS_InteractiveObject中去了,所以你也可以將ID放進(jìn)去“。
            本人水平有限,真沒看出看來怎么放一個(gè)ID(int數(shù))到AIS_InteractiveObject中,博主能否以示例代碼告知,比如我想給Handle(AIS_Shape) Point 賦一個(gè)ID號(hào)為整數(shù)3,該怎么做?謝謝!

            # re: OpenCascade BRep 格式描述之二  回復(fù)  更多評(píng)論   

            2014-11-15 18:01 by eryar
            @佚名
            SetOwner可以將一塊內(nèi)存設(shè)置到AIS_Shape中去,
            所以你可以將ID或其他數(shù)據(jù)組織成一個(gè)結(jié)構(gòu)體或類,需要時(shí)取出轉(zhuǎn)換一下即可。
            国内精品伊人久久久久| 国产精品免费看久久久| 久久精品不卡| 久久婷婷五月综合成人D啪| 亚洲色婷婷综合久久| 91精品观看91久久久久久 | 熟妇人妻久久中文字幕| 久久国产热精品波多野结衣AV| 久久精品草草草| 亚洲国产精品18久久久久久| 国产精品毛片久久久久久久| 亚洲精品无码专区久久同性男| 亚洲级αV无码毛片久久精品 | av午夜福利一片免费看久久| 国产精品一区二区久久精品无码 | 婷婷久久香蕉五月综合加勒比| 久久国产乱子精品免费女| 久久亚洲sm情趣捆绑调教| 久久成人国产精品二三区| 亚洲精品美女久久久久99| 久久影视综合亚洲| 欧美一区二区精品久久| 久久久无码精品亚洲日韩蜜臀浪潮| 久久精品国产影库免费看| 亚洲成色WWW久久网站| 亚洲精品WWW久久久久久| 精品无码久久久久久国产| 99久久婷婷免费国产综合精品| 久久99热这里只频精品6| 久久精品?ⅴ无码中文字幕| 欧美777精品久久久久网| A狠狠久久蜜臀婷色中文网| 久久久久久人妻无码| 精品久久久久久国产| 狠狠色丁香久久婷婷综合蜜芽五月| 国产成人久久精品麻豆一区| 国产91久久精品一区二区| 国产成人久久激情91| 国产国产成人精品久久| 国产视频久久| 青青久久精品国产免费看|