diff --git a/samples/qt/Tutorial/src/MakeBottle.cxx b/samples/qt/Tutorial/src/MakeBottle.cxx index ebe45b9f01..d965af3f21 100755 --- a/samples/qt/Tutorial/src/MakeBottle.cxx +++ b/samples/qt/Tutorial/src/MakeBottle.cxx @@ -54,164 +54,138 @@ TopoDS_Shape -MakeBottle(const Standard_Real myWidth , const Standard_Real myHeight , - const Standard_Real myThickness) +MakeBottle(const Standard_Real myWidth, const Standard_Real myHeight, + const Standard_Real myThickness) { - //Profile : Define Support Points - gp_Pnt aPnt1(-myWidth / 2. , 0 , 0); - gp_Pnt aPnt2(-myWidth / 2. , -myThickness / 4. , 0); - gp_Pnt aPnt3(0 , -myThickness / 2. , 0); - gp_Pnt aPnt4(myWidth / 2. , -myThickness / 4. , 0); - gp_Pnt aPnt5(myWidth / 2. , 0 , 0); + // Profile : Define Support Points + gp_Pnt aPnt1(-myWidth / 2., 0, 0); + gp_Pnt aPnt2(-myWidth / 2., -myThickness / 4., 0); + gp_Pnt aPnt3(0, -myThickness / 2., 0); + gp_Pnt aPnt4(myWidth / 2., -myThickness / 4., 0); + gp_Pnt aPnt5(myWidth / 2., 0, 0); - //Profile : Define the Geometry - Handle(Geom_TrimmedCurve) aArcOfCircle = GC_MakeArcOfCircle(aPnt2,aPnt3 ,aPnt4); - Handle(Geom_TrimmedCurve) aSegment1 = GC_MakeSegment(aPnt1 , aPnt2); - Handle(Geom_TrimmedCurve) aSegment2 = GC_MakeSegment(aPnt4 , aPnt5); + // Profile : Define the Geometry + Handle(Geom_TrimmedCurve) anArcOfCircle = GC_MakeArcOfCircle(aPnt2,aPnt3,aPnt4); + Handle(Geom_TrimmedCurve) aSegment1 = GC_MakeSegment(aPnt1, aPnt2); + Handle(Geom_TrimmedCurve) aSegment2 = GC_MakeSegment(aPnt4, aPnt5); - //Profile : Define the Topology - TopoDS_Edge aEdge1 = BRepBuilderAPI_MakeEdge(aSegment1); - TopoDS_Edge aEdge2 = BRepBuilderAPI_MakeEdge(aArcOfCircle); - TopoDS_Edge aEdge3 = BRepBuilderAPI_MakeEdge(aSegment2); - TopoDS_Wire aWire = BRepBuilderAPI_MakeWire(aEdge1 , aEdge2 , aEdge3); + // Profile : Define the Topology + TopoDS_Edge anEdge1 = BRepBuilderAPI_MakeEdge(aSegment1); + TopoDS_Edge anEdge2 = BRepBuilderAPI_MakeEdge(anArcOfCircle); + TopoDS_Edge anEdge3 = BRepBuilderAPI_MakeEdge(aSegment2); + TopoDS_Wire aWire = BRepBuilderAPI_MakeWire(anEdge1, anEdge2, anEdge3); - //Complete Profile - gp_Ax1 xAxis = gp::OX(); - gp_Trsf aTrsf; + // Complete Profile + gp_Ax1 xAxis = gp::OX(); + gp_Trsf aTrsf; aTrsf.SetMirror(xAxis); + BRepBuilderAPI_Transform aBRepTrsf(aWire, aTrsf); + TopoDS_Shape aMirroredShape = aBRepTrsf.Shape(); + TopoDS_Wire aMirroredWire = TopoDS::Wire(aMirroredShape); - BRepBuilderAPI_Transform aBRepTrsf(aWire , aTrsf); - TopoDS_Shape aMirroredShape = aBRepTrsf.Shape(); - TopoDS_Wire aMirroredWire = TopoDS::Wire(aMirroredShape); - - BRepBuilderAPI_MakeWire mkWire; - + BRepBuilderAPI_MakeWire mkWire; mkWire.Add(aWire); mkWire.Add(aMirroredWire); - TopoDS_Wire myWireProfile = mkWire.Wire(); - //Body : Prism the Profile - TopoDS_Face myFaceProfile = BRepBuilderAPI_MakeFace(myWireProfile); - gp_Vec aPrismVec(0 , 0 , myHeight); + // Body : Prism the Profile + TopoDS_Face myFaceProfile = BRepBuilderAPI_MakeFace(myWireProfile); + gp_Vec aPrismVec(0, 0, myHeight); + TopoDS_Shape myBody = BRepPrimAPI_MakePrism(myFaceProfile, aPrismVec); - TopoDS_Shape myBody = BRepPrimAPI_MakePrism(myFaceProfile , aPrismVec); + // Body : Apply Fillets + BRepFilletAPI_MakeFillet mkFillet(myBody); + TopExp_Explorer anEdgeExplorer(myBody, TopAbs_EDGE); + while(anEdgeExplorer.More()){ + TopoDS_Edge anEdge = TopoDS::Edge(anEdgeExplorer.Current()); + //Add edge to fillet algorithm + mkFillet.Add(myThickness / 12., anEdge); + anEdgeExplorer.Next(); + } - //Body : Apply Fillets - BRepFilletAPI_MakeFillet mkFillet(myBody); - TopExp_Explorer aEdgeExplorer(myBody , TopAbs_EDGE); + myBody = mkFillet.Shape(); - while(aEdgeExplorer.More()){ - - TopoDS_Edge aEdge = TopoDS::Edge(aEdgeExplorer.Current()); + // Body : Add the Neck + gp_Pnt neckLocation(0, 0, myHeight); + gp_Dir neckAxis = gp::DZ(); + gp_Ax2 neckAx2(neckLocation, neckAxis); - //Add edge to fillet algorithm - mkFillet.Add(myThickness / 12. , aEdge); + Standard_Real myNeckRadius = myThickness / 4.; + Standard_Real myNeckHeight = myHeight / 10.; - aEdgeExplorer.Next(); - } + BRepPrimAPI_MakeCylinder MKCylinder(neckAx2, myNeckRadius, myNeckHeight); + TopoDS_Shape myNeck = MKCylinder.Shape(); - myBody = mkFillet.Shape(); + myBody = BRepAlgoAPI_Fuse(myBody, myNeck); - //Body : Add the Neck - gp_Pnt neckLocation(0 , 0 , myHeight); - gp_Dir neckNormal = gp::DZ(); - gp_Ax2 neckAx2(neckLocation , neckNormal); + // Body : Create a Hollowed Solid + TopoDS_Face faceToRemove; + Standard_Real zMax = -1; - Standard_Real myNeckRadius = myThickness / 4.; - Standard_Real myNeckHeight = myHeight / 10; - - BRepPrimAPI_MakeCylinder MKCylinder(neckAx2 , myNeckRadius , myNeckHeight); - TopoDS_Shape myNeck = MKCylinder.Shape(); - - myBody = BRepAlgoAPI_Fuse(myBody , myNeck); - - //Body : Create a Hollowed Solid - TopoDS_Face faceToRemove; - Standard_Real zMax = -1; - - for(TopExp_Explorer aFaceExplorer(myBody , TopAbs_FACE) ; aFaceExplorer.More() ; aFaceExplorer.Next()){ - - TopoDS_Face aFace = TopoDS::Face(aFaceExplorer.Current()); - - //Check if is the top face of the bottle's neck - Handle(Geom_Surface) aSurface = BRep_Tool::Surface(aFace); - - if(aSurface->DynamicType() == STANDARD_TYPE(Geom_Plane)){ - - Handle(Geom_Plane) aPlane = Handle(Geom_Plane)::DownCast(aSurface); - - gp_Pnt aPnt = aPlane->Location(); - Standard_Real aZ = aPnt.Z(); - - if(aZ > zMax){ - - zMax = aZ; + for(TopExp_Explorer aFaceExplorer(myBody, TopAbs_FACE); aFaceExplorer.More(); aFaceExplorer.Next()){ + TopoDS_Face aFace = TopoDS::Face(aFaceExplorer.Current()); + // Check if is the top face of the bottle’s neck + Handle(Geom_Surface) aSurface = BRep_Tool::Surface(aFace); + if(aSurface->DynamicType() == STANDARD_TYPE(Geom_Plane)){ + Handle(Geom_Plane) aPlane = Handle(Geom_Plane)::DownCast(aSurface); + gp_Pnt aPnt = aPlane->Location(); + Standard_Real aZ = aPnt.Z(); + if(aZ > zMax){ + zMax = aZ; faceToRemove = aFace; - } - } - } + } + } + } - TopTools_ListOfShape facesToRemove; - - facesToRemove.Append(faceToRemove); + TopTools_ListOfShape facesToRemove; + facesToRemove.Append(faceToRemove); + myBody = BRepOffsetAPI_MakeThickSolid(myBody, facesToRemove, -myThickness / 50, 1.e-3); + // Threading : Create Surfaces + Handle(Geom_CylindricalSurface) aCyl1 = new Geom_CylindricalSurface(neckAx2, myNeckRadius * 0.99); + Handle(Geom_CylindricalSurface) aCyl2 = new Geom_CylindricalSurface(neckAx2, myNeckRadius * 1.05); - myBody = BRepOffsetAPI_MakeThickSolid(myBody , facesToRemove , -myThickness / 50 , 1.e-3); + // Threading : Define 2D Curves + gp_Pnt2d aPnt(2. * M_PI, myNeckHeight / 2.); + gp_Dir2d aDir(2. * M_PI, myNeckHeight / 4.); + gp_Ax2d anAx2d(aPnt, aDir); - - //return myBody; - //Threading : Create Surfaces - Handle(Geom_CylindricalSurface) aCyl1 = new Geom_CylindricalSurface(neckAx2 , myNeckRadius * 0.99); - Handle(Geom_CylindricalSurface) aCyl2 = new Geom_CylindricalSurface(neckAx2 , myNeckRadius * 1.05); - - //Threading : Define 2D Curves - gp_Pnt2d aPnt(2. * M_PI , myNeckHeight / 2.); - gp_Dir2d aDir(2. * M_PI , myNeckHeight / 4.); - gp_Ax2d aAx2d(aPnt , aDir); - - Standard_Real aMajor = 2. * M_PI; + Standard_Real aMajor = 2. * M_PI; Standard_Real aMinor = myNeckHeight / 10; - Handle(Geom2d_Ellipse) anEllipse1 = new Geom2d_Ellipse(aAx2d , aMajor , aMinor); - Handle(Geom2d_Ellipse) anEllipse2 = new Geom2d_Ellipse(aAx2d , aMajor , aMinor / 4); + Handle(Geom2d_Ellipse) anEllipse1 = new Geom2d_Ellipse(anAx2d, aMajor, aMinor); + Handle(Geom2d_Ellipse) anEllipse2 = new Geom2d_Ellipse(anAx2d, aMajor, aMinor / 4); + Handle(Geom2d_TrimmedCurve) anArc1 = new Geom2d_TrimmedCurve(anEllipse1, 0, M_PI); + Handle(Geom2d_TrimmedCurve) anArc2 = new Geom2d_TrimmedCurve(anEllipse2, 0, M_PI); + gp_Pnt2d anEllipsePnt1 = anEllipse1->Value(0); + gp_Pnt2d anEllipsePnt2 = anEllipse1->Value(M_PI); - Handle(Geom2d_TrimmedCurve) aArc1 = new Geom2d_TrimmedCurve(anEllipse1 , 0 , M_PI); - Handle(Geom2d_TrimmedCurve) aArc2 = new Geom2d_TrimmedCurve(anEllipse2 , 0 , M_PI); + Handle(Geom2d_TrimmedCurve) aSegment = GCE2d_MakeSegment(anEllipsePnt1, anEllipsePnt2); + // Threading : Build Edges and Wires + TopoDS_Edge anEdge1OnSurf1 = BRepBuilderAPI_MakeEdge(anArc1, aCyl1); + TopoDS_Edge anEdge2OnSurf1 = BRepBuilderAPI_MakeEdge(aSegment, aCyl1); + TopoDS_Edge anEdge1OnSurf2 = BRepBuilderAPI_MakeEdge(anArc2, aCyl2); + TopoDS_Edge anEdge2OnSurf2 = BRepBuilderAPI_MakeEdge(aSegment, aCyl2); + TopoDS_Wire threadingWire1 = BRepBuilderAPI_MakeWire(anEdge1OnSurf1, anEdge2OnSurf1); + TopoDS_Wire threadingWire2 = BRepBuilderAPI_MakeWire(anEdge1OnSurf2, anEdge2OnSurf2); + BRepLib::BuildCurves3d(threadingWire1); + BRepLib::BuildCurves3d(threadingWire2); - gp_Pnt2d anEllipsePnt1 = anEllipse1->Value(0); - gp_Pnt2d anEllipsePnt2 = anEllipse1->Value(M_PI); - - Handle(Geom2d_TrimmedCurve) aSegment = GCE2d_MakeSegment(anEllipsePnt1 , anEllipsePnt2); + // Create Threading + BRepOffsetAPI_ThruSections aTool(Standard_True); + aTool.AddWire(threadingWire1); + aTool.AddWire(threadingWire2); + aTool.CheckCompatibility(Standard_False); - //Threading : Build Edges and Wires - TopoDS_Edge aEdge1OnSurf1 = BRepBuilderAPI_MakeEdge(aArc1 , aCyl1); - TopoDS_Edge aEdge2OnSurf1 = BRepBuilderAPI_MakeEdge(aSegment , aCyl1); - TopoDS_Edge aEdge1OnSurf2 = BRepBuilderAPI_MakeEdge(aArc2 , aCyl2); - TopoDS_Edge aEdge2OnSurf2 = BRepBuilderAPI_MakeEdge(aSegment , aCyl2); + TopoDS_Shape myThreading = aTool.Shape(); - TopoDS_Wire threadingWire1 = BRepBuilderAPI_MakeWire(aEdge1OnSurf1 , aEdge2OnSurf1); - TopoDS_Wire threadingWire2 = BRepBuilderAPI_MakeWire(aEdge1OnSurf2 , aEdge2OnSurf2); + // Building the Resulting Compound + TopoDS_Compound aRes; + BRep_Builder aBuilder; + aBuilder.MakeCompound (aRes); + aBuilder.Add (aRes, myBody); + aBuilder.Add (aRes, myThreading); - BRepLib::BuildCurves3d(threadingWire1); - BRepLib::BuildCurves3d(threadingWire2); - - //Create Threading - BRepOffsetAPI_ThruSections aTool(Standard_True); - - aTool.AddWire(threadingWire1); - aTool.AddWire(threadingWire2); - aTool.CheckCompatibility(Standard_False); - - TopoDS_Shape myThreading = aTool.Shape(); - - //Building the resulting compound - TopoDS_Compound aRes; - BRep_Builder aBuilder; - aBuilder.MakeCompound (aRes); - - aBuilder.Add (aRes, myBody); - aBuilder.Add (aRes, myThreading); - - return aRes; + return aRes; } +