厚みのあるソリッドの作成方法ーGroupHoleとBodyFromSweepの使用例①


線分に沿い、GroupHoldを掃引すると、厚みのあるソリッドが作成できます。

BodyFromSweepの二番目のパラメータにより、CurveVectorCRのパラメータが必要のため、事前にそのCurveVectorCRを用意する必要があります。

unionCurveを定義するとき、CurveVector::BOUNDARY_TYPE_ParityRegionを渡します。

次にouterEllipseCurveとinnerEllipseCurveを作成し、それぞれのBOUNDARY_TYPEを指定します。outerEllipseCurveinnerEllipseCurveの半径と開始点はouterEllipseとinnerEllipseを経由し設定できます。

最後にBodyFromSweepを使い、ソリッドが作成できます。

void BodyFromSweepTest3(WCharCP unparsed)
{
	ElementId id = 9119;
	ElementHandle myLine(id, ACTIVEMODEL);
	CurveVectorPtr path = ICurvePathQuery::ElementToCurveVector(myLine);

	DPoint3d  startPnt, endPnt;
	DVec3d startTangent, endTangent;
	path->at(0)->GetStartEnd(startPnt, endPnt, startTangent, endTangent);
	RotMatrix rMatrix = RotMatrix::From1Vector(startTangent, 2, true);

	double innerRadius = 2.0 * uorPerMeter, outterRadius = 3.0 * uorPerMeter;

	CurveVectorPtr unionCurve = CurveVector::Create(CurveVector::BOUNDARY_TYPE_ParityRegion);

	DEllipse3d   outerEllipse = DEllipse3d::FromCenterNormalRadius(startPnt, startTangent, outterRadius);
	CurveVectorPtr outerEllipseCurve = CurveVector::CreateDisk(outerEllipse, CurveVector::BOUNDARY_TYPE_Outer);
	unionCurve->Add(outerEllipseCurve);

	DEllipse3d   innerEllipse = DEllipse3d::FromCenterNormalRadius(startPnt, startTangent, innerRadius);
	CurveVectorPtr innerEllipseCurve = CurveVector::CreateDisk(innerEllipse, CurveVector::BOUNDARY_TYPE_Inner);
	unionCurve->Add(innerEllipseCurve);

	ISolidKernelEntityPtr solid;
	EditElementHandle     sweepSolid;
	SolidUtil::Create::BodyFromSweep(solid, *unionCurve, *path, *ACTIVEMODEL, false, true, false);
	DraftingElementSchema::ToElement(sweepSolid, *solid, nullptr, *ACTIVEMODEL);
	sweepSolid.AddToModel();
}