OpenCASCADE でソリッドのブーリアン演算(とボリューム計算)を行う

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

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

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