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);
}
}
}
}