OpenCASCADE BRep ファイルの入出力

OpenCASCADE では、標準のファイル形式として OpenCASCADE BRep ファイルというものを用いています。一般的に BREP というと、Boundary REPresentation (境界表現) 自体のことを差しますが、ここでは、「OpenCASCADE で表現できるトポロジー形状を保存するためのファイルフォーマット」とし区別して、BRepファイルと呼ぶことにします。

TopoDS_Shape 型になっているトポロジー形状のファイルへの保存、読み込みは、すごく簡単です。実際にコードを見てみましょう。

</p>

<h1>include &lt;iostream&gt;</h1>

<h1>include &lt;TopoDS.hxx&gt;</h1>

<h1>include &lt;gp_Pnt.hxx&gt;</h1>

<h1>include &lt;TopoDS_Solid.hxx&gt;</h1>

<h1>include &lt;BRepPrimAPI_MakeBox.hxx&gt;</h1>

<h1>include &lt;BRepTools.hxx&gt;</h1>

<p>int main(int c, char** v)
{
    // ソリッド作成
    gp_Pnt opos(0.0, 0.0, 0.0);
    BRepPrimAPI_MakeBox box(opos, 10.0, 10.0, 10.0);
    TopoDS_Solid solid = box.Solid();</p>

<pre><code>// ファイルへ出力
BRepTools::Write(solid, &amp;quot;test.brep&amp;quot;);

// ファイルから入力
TopoDS_Shape shape;
BRep_Builder bb;
BRepTools::Read(shape, &amp;quot;test.brep&amp;quot;, bb);

std::cout &amp;lt;&amp;lt; &amp;quot;Readed shape type no is &amp;quot; &amp;lt;&amp;lt; shape.ShapeType() &amp;lt;&amp;lt; std::endl;
// TopAbs_SOLID を表す、「2」が表示される

return 0;
</code></pre>

<p>}

今回のキモは、BRepTools.hxxを読み込み、BRepTools::Write() または Read() でファイルパスや TopoDS_Shape オブジェクトを指定している部分です。まあ、ほとんど説明する必要がないと思います。
Write()/Read() は、ファイルパス文字列の他、ストリームを渡すことも可能です。

// 文字列ストリームへ出力
std::ostringstream ost;
BRepTools::Write(solid, ost);
std::cout &lt;&lt; ost.str() &lt;&lt; std::endl;</p>

<p>// 文字列ストリームから入力
std::istringstream ist;
ist.str(ost.str());
BRepTools::Read(shape, ist, bb);
std::cout &lt;&lt; &quot;Readed shape type no is &quot; &lt;&lt; shape.ShapeType() &lt;&lt; std::endl;

BRep ファイルの中身は、プレーンテキストです。上の例で出力した内容は次のようになりました。

DBRep_DrawableShape</p>

<p>CASCADE Topology V1, (c) Matra-Datavision
Locations 0
Curve2ds 24
1 0 0 1 0
1 0 0 1 0
1 10 0 0 -1
1 0 0 0 1
1 0 -10 1 0
1 0 0 1 0
1 0 0 0 -1
1 0 0 0 1
1 0 0 1 0
1 0 10 1 0
1 10 0 0 -1
1 10 0 0 1
1 0 -10 1 0
1 0 10 1 0
1 0 0 0 -1
1 10 0 0 1
1 0 0 0 1
1 0 0 1 0
1 10 0 0 1
1 0 0 1 0
1 0 0 0 1
1 0 10 1 0
1 10 0 0 1
1 0 10 1 0
Curves 12
1 0 0 0 0 0 1
1 0 0 10 -0 1 0
1 0 10 0 0 0 1
1 0 0 0 -0 1 0
1 10 0 0 0 0 1
1 10 0 10 0 1 0
1 10 10 0 0 0 1
1 10 0 0 -0 1 0
1 0 0 0 1 0 -0
1 0 0 10 1 0 -0
1 0 10 0 1 0 -0
1 0 10 10 1 0 -0
Polygon3D 0
PolygonOnTriangulations 0
Surfaces 6
1 0 0 0 1 0 -0 0 0 1 0 -1 0
1 0 0 0 -0 1 0 0 0 1 1 0 -0
1 0 0 10 0 0 1 1 0 -0 -0 1 0
1 0 10 0 -0 1 0 0 0 1 1 0 -0
1 0 0 0 0 0 1 1 0 -0 -0 1 0
1 10 0 0 1 0 -0 0 0 1 0 -1 0
Triangulations 0</p>

<p>TShapes 34
Ve
1e-07
0 0 10
0 0</p>

<p>0101101
*
Ve
1e-07
0 0 0
0 0</p>

<p>0101101
*
Ed
 1e-07 1 1 0
1  1 0 0 10
2  1 1 0 0 10
2  2 2 0 0 10
0</p>

<p>0101000
-34 0 +33 0 *
Ve
1e-07
0 10 10
0 0</p>

<p>0101101
*
Ed
 1e-07 1 1 0
1  2 0 0 10
2  3 1 0 0 10
2  4 3 0 0 10
0</p>

<p>0101000
-31 0 +34 0 *
Ve
1e-07
0 10 0
0 0</p>

<p>0101101
*
Ed
 1e-07 1 1 0
1  3 0 0 10
2  5 1 0 0 10
2  6 4 0 0 10
0</p>

<p>0101000
-31 0 +29 0 *
Ed
 1e-07 1 1 0
1  4 0 0 10
2  7 1 0 0 10
2  8 5 0 0 10
0</p>

<p>0101000
-29 0 +33 0 *
Wi</p>

<p>0101000
-32 0 -30 0 +28 0 +27 0 *
Fa
0  1e-07 1 0</p>

<p>0111000
+26 0 *
Ve
1e-07
10 0 10
0 0</p>

<p>0101101
*
Ve
1e-07
10 0 0
0 0</p>

<p>0101101
*
Ed
 1e-07 1 1 0
1  5 0 0 10
2  9 6 0 0 10
2  10 2 0 0 10
0</p>

<p>0101000
-24 0 +23 0 *
Ve
1e-07
10 10 10
0 0</p>

<p>0101101
*
Ed
 1e-07 1 1 0
1  6 0 0 10
2  11 6 0 0 10
2  12 3 0 0 10
0</p>

<p>0101000
-21 0 +24 0 *
Ve
1e-07
10 10 0
0 0</p>

<p>0101101
*
Ed
 1e-07 1 1 0
1  7 0 0 10
2  13 6 0 0 10
2  14 4 0 0 10
0</p>

<p>0101000
-21 0 +19 0 *
Ed
 1e-07 1 1 0
1  8 0 0 10
2  15 6 0 0 10
2  16 5 0 0 10
0</p>

<p>0101000
-19 0 +23 0 *
Wi</p>

<p>0101000
-22 0 -20 0 +18 0 +17 0 *
Fa
0  1e-07 6 0</p>

<p>0111000
+16 0 *
Ed
 1e-07 1 1 0
1  9 0 0 10
2  17 2 0 0 10
2  18 5 0 0 10
0</p>

<p>0101000
-23 0 +33 0 *
Ed
 1e-07 1 1 0
1  10 0 0 10
2  19 2 0 0 10
2  20 3 0 0 10
0</p>

<p>0101000
-24 0 +34 0 *
Wi</p>

<p>0101000
-14 0 -22 0 +13 0 +32 0 *
Fa
0  1e-07 2 0</p>

<p>0111000
+12 0 *
Ed
 1e-07 1 1 0
1  11 0 0 10
2  21 4 0 0 10
2  22 5 0 0 10
0</p>

<p>0101000
-19 0 +29 0 *
Ed
 1e-07 1 1 0
1  12 0 0 10
2  23 4 0 0 10
2  24 3 0 0 10
0</p>

<p>0101000
-21 0 +31 0 *
Wi</p>

<p>0101000
-10 0 -18 0 +9 0 +28 0 *
Fa
0  1e-07 4 0</p>

<p>0111000
+8 0 *
Wi</p>

<p>0101000
-27 0 -10 0 +17 0 +14 0 *
Fa
0  1e-07 5 0</p>

<p>0111000
+6 0 *
Wi</p>

<p>0101000
-30 0 -9 0 +20 0 +13 0 *
Fa
0  1e-07 3 0</p>

<p>0111000
+4 0 *
Sh</p>

<p>0101100
-25 0 +15 0 -11 0 +7 0 -5 0 +3 0 *
So</p>

<p>1100000
+2 0 *</p>

<p>+1 0

onnanoko本日のまとめ

TopoDS_Shape 型のオブジェクトを保存、読み込むには BRepTools::Write() または Read() を用いる。

投稿者:

dyama

佐世保のシステムエンジニアです。詳しいプロフィールやこのブログについてはこちらをご覧ください。

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください