获取TopoDS_Shape的平面

给定一个TopoDS_Shape,如何判断其是一个2D图形,及所在平面的参数呢?

TopoDS_Shape可以是面、wire或其它类型的实体。

 以下代码将Shape分成面和其它类型进行判断。如果是面,则判断面是否是平面或近似平面;如果是其它类型,则使用

OpenCASCADE的查找平面的类(BRepLib_FindSurface,根据形状中的边查找平面)。

bool IsPlane(const TopoDS_Face &F, gp_Pln& pln, Standard_Real tol)
    {
        BRepAdaptor_Surface BASur(F);
        GeomAbs_SurfaceType type = BASur.GetType();
     //平面类型
if (type == GeomAbs_Plane) { pln = BASur.Plane(); return true; }
     //判断一个点阵是否在同一平面上
else { double Umin = BASur.FirstUParameter(); double Umax = BASur.LastUParameter(); double Vmin = BASur.FirstVParameter(); double Vmax = BASur.LastVParameter(); double dbUDelta = (Umax - Umin) / 3.0; double dbVDelta = (Vmax - Vmin) / 3.0; TColgp_Array1OfPnt PtArr(0, 15); for (int i = 0; i < 4; i++) { double U = Umin + dbUDelta * i; for (int j = 0; j < 4; j++) { double V = Vmin + dbVDelta * j; PtArr.SetValue(i * 4 + j, BASur.Value(U, V)); } } GProp_PEquation PE(PtArr, tol);//1e-2 if (PE.IsPlanar()) { pln = PE.Plane(); return true; } } return false; } bool getShapePlane(const TopoDS_Shape &S, gp_Pln &pln, Standard_Real tol) { bool b = false; if (S.IsNull()) return b; //平面直接返回 if (S.ShapeType() == TopAbs_FACE) b = IsPlane(TopoDS::Face(S), pln, tol); //根据边查平面 else { BRepLib_FindSurface finder(S.Located(TopLoc_Location()), tol/*-1*/, true); if (!finder.Found()) return b; pln = GeomAdaptor_Surface(finder.Surface()).Plane(); pln.Transform(S.Location().Transformation()); b = true; } return b; }

 

更多精彩请关注公众号

posted @ 2021-03-14 22:41  YiShan-CADCAM  阅读(1168)  评论(0)    收藏  举报