判断TopoDS_Edge或TopoDS_Wire是否为直线或圆

 

 

1.判断一个边或环是否是直线,一般是判断曲线的类型是否是GeomAbs_line就可以了。

代码如下:

BRepAdaptor_CompCurve C;
        C.Initialize(W, false);
        if (C.GetType() == GeomAbs_Line)
        {
            TopoDS_Vertex sv, ev;
            TopExp::Vertices(W, sv, ev);
            SP = BRep_Tool::Pnt(sv);
            EP = BRep_Tool::Pnt(ev);
        }

如果判断边或环在给定精度范围内是否为直线,可以使用GProp_PEquation类。

代码如下:

//先取曲线上的几个点
GCPnts_UniformAbscissa UA(C, 6); TColgp_Array1OfPnt anArrayofPnt(1, 6); for (int i = 1; i <= 6; i++) anArrayofPnt.SetValue(i, C.Value(UA.Parameter(i))); //判断采样点是否在一条直线上 GProp_PEquation PE(anArrayofPnt, tol); if (PE.IsLinear()) { TopoDS_Vertex sv, ev; TopExp::Vertices(W, sv, ev); SP = BRep_Tool::Pnt(sv); EP = BRep_Tool::Pnt(ev); }

2.同样的,判断边或环是否是圆,一般是判断曲线的类型是否是GeomAbs_Circle就可以了。

代码如下:

BRepAdaptor_CompCurve C;
        C.Initialize(W, false);
        if (C.GetType() == GeomAbs_Circle)
        {
            gp_Circ cir = C.Circle();
            P = cir.Location();
            R = cir.Radius();
            XDir = cir.XAxis().Direction();
            YDir = cir.YAxis().Direction();
        }

如果判断边或环在给定精度范围内是否为圆,可以计算采样点是否在同一个圆上即可。

代码如下:

//先取曲线上的几个点
GCPnts_UniformAbscissa UA(C, 6);
            gp_Pnt p1 = C.Value(UA.Parameter(1));
            gp_Pnt p2 = C.Value(UA.Parameter(2));
            gp_Pnt p3 = C.Value(UA.Parameter(3));
            gp_Pnt p4 = C.Value(UA.Parameter(4));
            gp_Pnt p5 = C.Value(UA.Parameter(5));
            gp_Pnt p6 = C.Value(UA.Parameter(6));
//判断构造的圆是否相同(中心位置相同,且半径相同)
            GC_MakeCircle mc1(p1, p3, p5);
            GC_MakeCircle mc2(p2, p4, p6);
            if (mc1.IsDone() &&
                mc2.IsDone())
            {
                gp_Circ cir = mc1.Value()->Circ();
                P = cir.Location();
                R = cir.Radius();

                gp_Dir norDir = cir.Axis().Direction();
                XDir = gp_Dir(gp_Vec(P, C.Value(C.FirstParameter())));
                YDir = norDir.Crossed(XDir);

                gp_Circ cir2 = mc2.Value()->Circ();
                gp_Pnt P2 = cir2.Location();
                Standard_Real R2 = cir2.Radius();
                if (P.IsEqual(P2, tol) &&
                    Abs(R - R2) <= tol)
                    return true;
            }

 

更多精彩请关注公众号

posted @ 2021-04-05 21:32  YiShan-CADCAM  阅读(1684)  评论(0)    收藏  举报