OCC曲线投影到面上
1 TopoDS_Edge edge0 = BRepBuilderAPI_MakeEdge(gp_Pnt(0, 0, 0), gp_Pnt(10, 10, 10)); 2 Geometry::instance()->addShape(ShapeType::Curve, edge0); 3 4 gp_Pnt pnt1(0, 10, 0); 5 gp_Pnt pnt2(10, 10, 0); 6 gp_Pnt pnt3(10, 0, 0); 7 gp_Pnt pnt4(0, 0, 0); 8 TopoDS_Edge edge1 = BRepBuilderAPI_MakeEdge(pnt1, pnt2); 9 Geometry::instance()->addShape(ShapeType::Curve, edge1); 10 TopoDS_Edge edge2 = BRepBuilderAPI_MakeEdge(pnt2, pnt3); 11 Geometry::instance()->addShape(ShapeType::Curve, edge2); 12 TopoDS_Edge edge3 = BRepBuilderAPI_MakeEdge(pnt3, pnt4); 13 Geometry::instance()->addShape(ShapeType::Curve, edge3); 14 TopoDS_Edge edge4 = BRepBuilderAPI_MakeEdge(pnt4, pnt1); 15 Geometry::instance()->addShape(ShapeType::Curve, edge4); 16 17 BRepBuilderAPI_MakeWire wire; 18 wire.Add(edge1); 19 wire.Add(edge2); 20 wire.Add(edge3); 21 wire.Add(edge4); 22 wire.Build(); 23 24 BRepBuilderAPI_MakeFace face(wire); 25 Geometry::instance()->addShape(ShapeType::Surface, face); 26 27 Standard_Real first, last; 28 Handle(Geom_Curve) curve = BRep_Tool::Curve(edge0, first, last); 29 Handle(Geom_TrimmedCurve) trimmedCurve = new Geom_TrimmedCurve(curve, first, last); 30 31 Handle(Geom_Surface) surface = BRep_Tool::Surface(face); 32 33 Handle(Geom_Curve) projCurve = GeomProjLib::Project(trimmedCurve, surface); 34 35 36 37 /** 计算端点投影 */ 38 /*@{*/ 39 gp_Pnt pntFirst(0, 0, 0); 40 gp_Pnt pntLast(10, 10, 10); 41 42 GeomAPI_ProjectPointOnSurf projFirst(pntFirst, surface); 43 GeomAPI_ProjectPointOnSurf projLast(pntLast, surface); 44 45 if (projFirst.NbPoints() != 1 || projLast.NbPoints() != 1 || projFirst.Point(1).Distance(projLast.Point(1)) < Precision::Confusion()) { 46 return; 47 } 48 pntFirst = projFirst.Point(1); 49 pntLast = projLast.Point(1); 50 51 Standard_Real newFirst, newLast; 52 if ( 53 !GeomLib_Tool::Parameter(projCurve, pntFirst, Precision::Confusion(), newFirst) || 54 !GeomLib_Tool::Parameter(projCurve, pntLast, Precision::Confusion(), newLast)) { 55 return; 56 } 57 /*@}*/ 58 59 BRepBuilderAPI_MakeEdge result(projCurve); 60 61 Geometry::instance()->addShape(ShapeType::Curve, result);