OpenCASCADE でソリッドモデル同士のブーリアン演算とボリューム計算を行うサンプルコードを書いてみました。
コードは次のとおり。
#include <stdio.h>
#include <TopoDS.hxx>
#include <gp_Pnt.hxx>
#include <TopoDS_Solid.hxx>
#include <BRepPrimAPI_MakeBox.hxx>
#include <BRepAlgoAPI_Common.hxx>
#include <BRepGProp.hxx>
#include <GProp_GProps.hxx>
int main(int c, char** v)
{
// s1 というソリッドを作成
gp_Pnt opos1(0.0, 0.0, 0.0);
BRepPrimAPI_MakeBox box1(opos1, 10.0, 10.0, 10.0);
TopoDS_Solid s1 = box1.Solid();
// s2 というソリッドを作成
gp_Pnt opos2(2.0, 3.0, 5.0);
BRepPrimAPI_MakeBox box2(opos2, 10.0, 10.0, 10.0);
TopoDS_Solid s2 = box2.Solid();
// ブーリアン演算オブジェクトを s1 と s2 で作成
BRepAlgoAPI_Common bo(s1, s2);
// ブーリアン演算オブジェクトのオペレーションを指定
// BOP_COMMON: s1 と s2 の共通部分を得る
// BOP_FUSE: s1 と s2 を結合したものを得る
// BOP_CUT: s1 を s2 でカットしたものを得る
// BOP_CUT21: s1 で s1 をカットしたものを得る
// BOP_SECTION: s1 と s2 のセクションを得る
bo.SetOperation(BOP_CUT);
// 計算の実行
bo.Build();
// エラーが発生していなかったら
if (!bo.ErrorStatus()) {
TopoDS_Shape S = bo.Shape();
// GPropsオブジェクト(ボリュームや重心位置を得るツール)を作成
GProp_GProps gprops;
BRepGProp::VolumeProperties(S, gprops);
Standard_Real vol = gprops.Mass(); // ボリュームを得る
printf("volome: %f\n", vol);
}
return bo.ErrorStatus();
}
BRepAlgoAPI_Common クラスは、名前に Common の文字がありますが、上のとおり setOperation() で指定すれば、コモン演算(共通部分を得る)だけではなく、カットしたり結合したりすることもできます。
ビルド方法は次のとおり。
g++ -g -lTKernel -lTKMath -lTKBO -lTKTopAlgo -lTKPrim -L/usr/lib/opencas -I/usr/include/opencascade -o solid solid.cxx