ReadFoilData("D:/OCC8/AirfoilData"); //Load Airfoil points; int num = AirfoilModel->GetAirfoilPntNum(); Standard_Real x, y, z; TColgp_Array1OfPnt Poles(1, 18); for (int i = 0; i < 18; i++) { x = AirfoilModel->Xpt[i].first; y = AirfoilModel->Xpt[i].second; z = 0; Poles.SetValue(i + 1, gp_Pnt(x, y, z)); } TColgp_Array1OfPnt RPoles(1, 18); int index = 0; for (int i = 17; i < 35; i++) { x = AirfoilModel->Xpt[i].first; y = AirfoilModel->Xpt[i].second; z = 0; RPoles.SetValue(++index, gp_Pnt(x, y, z)); } Standard_Integer degree(2); Standard_Integer PNum = 18; //Standard_Integer KNum = PNum + degree + 1; //Uniform B-spline Standard_Integer KNum = PNum - 1; TColStd_Array1OfReal knots(1, KNum); for (int i = 0; i < KNum; ++i) { knots.SetValue(i + 1, i); } TColStd_Array1OfInteger mults(1, KNum); for (int i = 0; i < KNum; ++i) { if (i == 0 || i == KNum - 1) { mults.SetValue(i + 1, degree + 1); } else mults.SetValue(i + 1, 1); } Handle(Geom_BSplineCurve) topcurve = new Geom_BSplineCurve(Poles, knots, mults, degree); Handle(Geom_BSplineCurve) bottomCurve = new Geom_BSplineCurve(RPoles, knots, mults, degree); TopoDS_Edge Top_rootAirfoilEdg = BRepBuilderAPI_MakeEdge(topcurve); TopoDS_Edge bottom_rootAirfoilEdg = BRepBuilderAPI_MakeEdge(bottomCurve); TopoDS_Wire rootAirfoilWire = BRepBuilderAPI_MakeWire(Top_rootAirfoilEdg, bottom_rootAirfoilEdg); // Build the 3D wing surface by extrusion gp_Vec aWingSpan(0, 0, 7500); TopoDS_Shape myBody = BRepPrimAPI_MakePrism(rootAirfoilWire, aWingSpan); //Optional... just to identify the edges TopExp_Explorer edgeExp(myBody, TopAbs_EDGE); //edgeExp.Next(); TopoDS_Edge anEdge7 = TopoDS::Edge(edgeExp.Current()); edgeExp.Next(); TopoDS_Edge anEdge3 = TopoDS::Edge(edgeExp.Current()); edgeExp.Next(); TopoDS_Edge anEdge8 = TopoDS::Edge(edgeExp.Current()); edgeExp.Next(); TopoDS_Edge anEdge1 = TopoDS::Edge(edgeExp.Current()); edgeExp.Next(); TopoDS_Edge anEdge4 = TopoDS::Edge(edgeExp.Current()); edgeExp.Next(); TopoDS_Edge anEdge5 = TopoDS::Edge(edgeExp.Current()); edgeExp.Next(); TopoDS_Edge anEdge6 = TopoDS::Edge(edgeExp.Current()); edgeExp.Next(); TopoDS_Edge anEdge2 = TopoDS::Edge(edgeExp.Current()); //TopoDS_Wire tipAirfoilWire = BRepBuilderAPI_MakeWire(anEdge1, anEdge2); //TopoDS_Face closeTip = BRepBuilderAPI_MakeFace(tipAirfoilWire); //myBody = BRepAlgoAPI_Fuse(myBody, closeTip); //Optional... just to identify the faces TopExp_Explorer faceExp(myBody, TopAbs_FACE); TopoDS_Face aFace1 = TopoDS::Face(faceExp.Current()); faceExp.Next(); TopoDS_Face aFace2 = TopoDS::Face(faceExp.Current()); BRep_Builder Wing_Builder; TopoDS_Compound tmpWing; Wing_Builder.MakeCompound(tmpWing); m_pWingModel = tmpWing; //Wing_Builder.Add(tmpWing, myBody); // used this instead of myBody to identify the edges and faces during display //Wing_Builder.Add(tmpWing, anEdge7); // (1,1) trailing edge //Wing_Builder.Add(tmpWing, anEdge3); // (1,2) leading edge Wing_Builder.Add(tmpWing, anEdge8); // (1,3) top root airfoil Wing_Builder.Add(tmpWing, anEdge1); // (1,4) top tip airfoil Wing_Builder.Add(tmpWing, anEdge4); //edge4 duplication of edge7 which in refence means duplication of (1,2); Wing_Builder.Add(tmpWing, anEdge5); //edge5 duplication of edge7 which in refence means duplication of (1,1); Wing_Builder.Add(tmpWing, anEdge6); // (1,5) bottom root airfoil Wing_Builder.Add(tmpWing, anEdge2); // (1,6) bottom tip airfoil Wing_Builder.Add(tmpWing, aFace1); //top Wing_Builder.Add(tmpWing, aFace2); //bottom //Wing_Builder.Add(tmpWing, closeTip);