用点分割边(Split TopoDS_Edge at gp_Pnt)

 

  拓扑边TopoDS_Edge的底层数据是Geom_Curve,如果想截取边的一部分,可以限定Geom_Curve的参数区间,构建修剪曲线Geom_TrimmedCurve,最后再有修剪曲线创建边就可以了。

TopoDS_Edge E=...;
TopoDS_Edge partOfE;
Standard_Real startParam(0.), endParam(0.); Handle(Geom_Curve) c = BRep_Tool::Curve(E, startParam, endParam);//得到底层曲线
//有时底层曲线没有创建,要手动创建
if(c.IsNull())
{
BRepLib::BuildCurves3d(E,
1.0e-5, GeomAbs_C1);//创建曲线 c = BRep_Tool::Curve(E, startParam, endParam);
}
if (!c.IsNull()) {
  //截取曲线并创建边 Handle(Geom_TrimmedCurve) tc
= new Geom_TrimmedCurve(c, startParam, (startParam+endParam)/2);//例如截取边的的一半
   partOfE = BRepBuilderAPI_MakeEdge(tc); 
}

如何在一个点处截断边呢?

首先要先得到该点在曲线上的参数。

gp_Pnt pnt=...
TopoDS_Edge E=...;
TopoDS_Edge E1,E2;
Standard_Real startParam(0.), endParam(0.);
Handle(Geom_Curve) c = BRep_Tool::Curve(E, startParam, endParam);//得到底层曲线
//有时底层曲线没有创建,要手动创建
if(c.IsNull())
{
    BRepLib::BuildCurves3d(E, 1.0e-5, GeomAbs_C1);//创建曲线
    c = BRep_Tool::Curve(E, startParam, endParam);
}
if (!c.IsNull())
{
//投影点到曲线上,并获取投影点处的参数
GeomAPI_ProjectPointOnCurve ppc(pnt, c);
Standard_Real param = ppc.LowerDistanceParameter();
//如果投影点参数小于起始参数或大于终止参数,则分割失败  

if (startParam - param > 0.00001 || param - endParam > 0.00001)
      return false;

//如果正好等于起始参数或等于终止参数,则一边是原始边,另一边为NULL
else if (Abs(param - startParam) <= Precision::Confusion())
  E1 = E;
else if (Abs(param - endParam) <= Precision::Confusion())
  E2 = E;

//处于起始和终止参数中间,则构建两个新边
else
{
  E1 = BRepBuilderAPI_MakeEdge(c, startParam, param);
  E1.Orientation(E.Orientation());//同向
  E2 = BRepBuilderAPI_MakeEdge(c, param, endParam);
  E2.Orientation(E.Orientation());//同向
  if (E.Orientation() == TopAbs_REVERSED)
  {
    TopoDS_Edge e = E1;
    E1 = E2;
    E2 = e;
  }
}

 

更多精彩请关注公众号

posted @ 2021-03-17 22:13  YiShan-CADCAM  阅读(943)  评论(0)    收藏  举报