OpenCASCADE では、標準のファイル形式として OpenCASCADE BRep ファイルというものを用いています。一般的に BREP というと、Boundary REPresentation (境界表現) 自体のことを差しますが、ここでは、「OpenCASCADE で表現できるトポロジー形状を保存するためのファイルフォーマット」とし区別して、BRepファイルと呼ぶことにします。
TopoDS_Shape 型になっているトポロジー形状のファイルへの保存、読み込みは、すごく簡単です。実際にコードを見てみましょう。
[cpp]
include <iostream>
include <TopoDS.hxx>
include <gp_Pnt.hxx>
include <TopoDS_Solid.hxx>
include <BRepPrimAPI_MakeBox.hxx>
include <BRepTools.hxx>
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();
// ファイルへ出力
BRepTools::Write(solid, "test.brep");
// ファイルから入力
TopoDS_Shape shape;
BRep_Builder bb;
BRepTools::Read(shape, "test.brep", bb);
std::cout << "Readed shape type no is " << shape.ShapeType() << std::endl;
// TopAbs_SOLID を表す、「2」が表示される
return 0;
}
[/cpp]
今回のキモは、BRepTools.hxxを読み込み、BRepTools::Write() または Read() でファイルパスや TopoDS_Shape オブジェクトを指定している部分です。まあ、ほとんど説明する必要がないと思います。
Write()/Read() は、ファイルパス文字列の他、ストリームを渡すことも可能です。
[cpp]
// 文字列ストリームへ出力
std::ostringstream ost;
BRepTools::Write(solid, ost);
std::cout << ost.str() << std::endl;
// 文字列ストリームから入力
std::istringstream ist;
ist.str(ost.str());
BRepTools::Read(shape, ist, bb);
std::cout << "Readed shape type no is " << shape.ShapeType() << std::endl;
[/cpp]
BRep ファイルの中身は、プレーンテキストです。上の例で出力した内容は次のようになりました。
[cpp]
DBRep_DrawableShape
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
TShapes 34
Ve
1e-07
0 0 10
0 0
0101101
*
Ve
1e-07
0 0 0
0 0
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
0101000
-34 0 +33 0 *
Ve
1e-07
0 10 10
0 0
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
0101000
-31 0 +34 0 *
Ve
1e-07
0 10 0
0 0
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
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
0101000
-29 0 +33 0 *
Wi
0101000
-32 0 -30 0 +28 0 +27 0 *
Fa
0 1e-07 1 0
0111000
+26 0 *
Ve
1e-07
10 0 10
0 0
0101101
*
Ve
1e-07
10 0 0
0 0
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
0101000
-24 0 +23 0 *
Ve
1e-07
10 10 10
0 0
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
0101000
-21 0 +24 0 *
Ve
1e-07
10 10 0
0 0
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
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
0101000
-19 0 +23 0 *
Wi
0101000
-22 0 -20 0 +18 0 +17 0 *
Fa
0 1e-07 6 0
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
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
0101000
-24 0 +34 0 *
Wi
0101000
-14 0 -22 0 +13 0 +32 0 *
Fa
0 1e-07 2 0
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
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
0101000
-21 0 +31 0 *
Wi
0101000
-10 0 -18 0 +9 0 +28 0 *
Fa
0 1e-07 4 0
0111000
+8 0 *
Wi
0101000
-27 0 -10 0 +17 0 +14 0 *
Fa
0 1e-07 5 0
0111000
+6 0 *
Wi
0101000
-30 0 -9 0 +20 0 +13 0 *
Fa
0 1e-07 3 0
0111000
+4 0 *
Sh
0101100
-25 0 +15 0 -11 0 +7 0 -5 0 +3 0 *
So
1100000
+2 0 *
+1 0
[/cpp]
本日のまとめ
TopoDS_Shape 型のオブジェクトを保存、読み込むには BRepTools::Write() または Read() を用いる。