寸法の表示方法(OCCT)

OpenCascadeで3D寸法表記の方法を説明します。

AIS_Dimensionクラスを使用して寸法を表示

  • 3Dでの寸法表記には簡易的な方法として2つの方法があります。
    • PrsDim_Dimensionクラスを利用する
    • 拡張機能(XDE)を使用し寸法を表示する
  • XDEを使用の方は寸法表示だけでなく、幾何公差やPMI(製造情報)をモデルとリンクできるため高機能ですが、若干複雑であるため今回はPrsDim_Dimensionクラスを活用した寸法表示を紹介します。
任意の2点間の長さ寸法の表示

2点間の寸法を表示するにはPrsDim_Dimensionクラスを継承したPrsDim_LengthDimensionクラスを使用します。
寸法表示の各種設定はPrs3d_DimensionAspectオブジェクトを変更することで調整できます。

//寸法取得座標と寸法表示平面の設定
gp_Pnt p1(0, 300, 0);
gp_Pnt p2(200, 300, 0);
gp_Ax3 plane = gp_Ax3(gp_Pnt(0, 0, 0), gp_Dir(0, 0, 1), gp_Dir(1, 0, 0));

//PrsDim_LengthDimensionオブジェクトの作成
Handle(PrsDim_LengthDimension) d1 = new PrsDim_LengthDimension(p1, p2, plane);

d1->SetMeasuredGeometry(p1, p2, plane);
d1->SetFlyout(100);	//引き出し線長さの設定

//Prs3d_DimensionAspectオブジェクトの作成
Handle(Prs3d_DimensionAspect) dAspect = new Prs3d_DimensionAspect();

//各種描写の設定
dAspect->SetCommonColor(Quantity_NOC_GREEN);	//寸法線、矢印、テキストの色を設定
dAspect->TextAspect()->SetColor(Quantity_NOC_YELLOW);	//テキストの色を設定
dAspect->ArrowAspect()->SetLength(16);	//矢印の長さを設定する
dAspect->TextAspect()->SetVerticalJustification(Graphic3d_VTA_BOTTOM);	//テキストの(垂直方向)位置を設定

//描写設定を寸法オブジェクトに登録
d1->SetDimensionAspect(dAspect);

m_AISContext->Display(d1, true);
直径寸法の表示

直径寸法を表示するにはPrsDim_Dimensionクラスを継承したPrsDim_DiameterDimensionクラスを使用します。
円柱(ソリッド)から円柱側面を抽出し、直径寸法を表示しています。

//寸法表示の為の円柱オブジェクトを作成
BRepPrimAPI_MakeCylinder Cyl(50, 300);
Handle(AIS_InteractiveObject) aio = new AIS_Shape(Cyl.Solid());
aio->SetTransparency(0.5);
m_AISContext->Display(aio, true);

//Prs3d_DimensionAspectオブジェクトの作成
Handle(Prs3d_DimensionAspect) dAspect = new Prs3d_DimensionAspect();

//各種描写の設定
dAspect->SetCommonColor(Quantity_NOC_GREEN);	//寸法線、矢印、テキストの色を設定
dAspect->TextAspect()->SetColor(Quantity_NOC_YELLOW);	//テキストの色を設定
dAspect->ArrowAspect()->SetLength(16);	//矢印の長さを設定
dAspect->TextAspect()->SetVerticalJustification(Graphic3d_VTA_BOTTOM);	//テキストの(垂直方向)位置を設定
dAspect->SetTextHorizontalPosition(Prs3d_DTHP_Right);  //テキストの水平方向を設定
dAspect->SetArrowOrientation(Prs3d_DAO_External);  //矢印の向きを設定
dAspect->SetExtensionSize(50);  //延長線の長さを設定

//円柱オブジェクトから円柱側面を抽出
Handle(AIS_Shape) ais = Handle(AIS_Shape)::DownCast(aio);
TopoDS_Shape aShape = ais->Shape();

for (TopExp_Explorer fExpl(aShape, TopAbs_FACE); fExpl.More(); fExpl.Next())
{
	const TopoDS_Face& curFace = static_cast<const TopoDS_Face&>(fExpl.Current());

	Handle(Geom_Surface) surf = BRep_Tool::Surface(curFace);
	if (!surf.IsNull())
	{
     //サーフェスが円柱側面の場合
		if (surf->IsKind(STANDARD_TYPE(Geom_CylindricalSurface)))
		{
		    //PrsDim_DiameterDimensionオブジェクトの作成
            Handle(PrsDim_DiameterDimension) d1 = new PrsDim_DiameterDimension(fExpl.Current());
			//描写設定を寸法オブジェクトに登録
            d1->SetDimensionAspect(dAspect);
			
			if (!d1.IsNull())
			{
				m_AISContext->Display(d1,true);
			}
		}
	}
}

参照サイト