用点分割边(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; } }
更多精彩请关注公众号

浙公网安备 33010602011771号